#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
namespace boost { namespace spirit
{
    struct nil_t {};
}}
namespace boost {
namespace mpl {
namespace aux {
template< typename F > struct template_arity;
}
}
}
namespace boost { namespace mpl {
template< bool C_ > struct bool_;
typedef bool_<true> true_;
typedef bool_<false> false_;
}}
namespace boost { namespace mpl {
template< bool C_ > struct bool_
{
    static const bool value = C_;
    typedef bool_ type;
    typedef bool value_type;
    operator bool() const { return this->value; }
};
template< bool C_ >
bool const bool_<C_>::value;
}}
namespace boost {
template< typename T > struct is_integral : mpl::bool_< false > { };
template<> struct is_integral< unsigned char > : mpl::bool_< true > { }; template<> struct is_integral< unsigned char const > : mpl::bool_< true > { }; template<> struct is_integral< unsigned char volatile > : mpl::bool_< true > { }; template<> struct is_integral< unsigned char const volatile > : mpl::bool_< true > { };
template<> struct is_integral< unsigned short > : mpl::bool_< true > { }; template<> struct is_integral< unsigned short const > : mpl::bool_< true > { }; template<> struct is_integral< unsigned short volatile > : mpl::bool_< true > { }; template<> struct is_integral< unsigned short const volatile > : mpl::bool_< true > { };
template<> struct is_integral< unsigned int > : mpl::bool_< true > { }; template<> struct is_integral< unsigned int const > : mpl::bool_< true > { }; template<> struct is_integral< unsigned int volatile > : mpl::bool_< true > { }; template<> struct is_integral< unsigned int const volatile > : mpl::bool_< true > { };
template<> struct is_integral< unsigned long > : mpl::bool_< true > { }; template<> struct is_integral< unsigned long const > : mpl::bool_< true > { }; template<> struct is_integral< unsigned long volatile > : mpl::bool_< true > { }; template<> struct is_integral< unsigned long const volatile > : mpl::bool_< true > { };
template<> struct is_integral< signed char > : mpl::bool_< true > { }; template<> struct is_integral< signed char const > : mpl::bool_< true > { }; template<> struct is_integral< signed char volatile > : mpl::bool_< true > { }; template<> struct is_integral< signed char const volatile > : mpl::bool_< true > { };
template<> struct is_integral< signed short > : mpl::bool_< true > { }; template<> struct is_integral< signed short const > : mpl::bool_< true > { }; template<> struct is_integral< signed short volatile > : mpl::bool_< true > { }; template<> struct is_integral< signed short const volatile > : mpl::bool_< true > { };
template<> struct is_integral< signed int > : mpl::bool_< true > { }; template<> struct is_integral< signed int const > : mpl::bool_< true > { }; template<> struct is_integral< signed int volatile > : mpl::bool_< true > { }; template<> struct is_integral< signed int const volatile > : mpl::bool_< true > { };
template<> struct is_integral< signed long > : mpl::bool_< true > { }; template<> struct is_integral< signed long const > : mpl::bool_< true > { }; template<> struct is_integral< signed long volatile > : mpl::bool_< true > { }; template<> struct is_integral< signed long const volatile > : mpl::bool_< true > { };
template<> struct is_integral< bool > : mpl::bool_< true > { }; template<> struct is_integral< bool const > : mpl::bool_< true > { }; template<> struct is_integral< bool volatile > : mpl::bool_< true > { }; template<> struct is_integral< bool const volatile > : mpl::bool_< true > { };
template<> struct is_integral< char > : mpl::bool_< true > { }; template<> struct is_integral< char const > : mpl::bool_< true > { }; template<> struct is_integral< char volatile > : mpl::bool_< true > { }; template<> struct is_integral< char const volatile > : mpl::bool_< true > { };
template<> struct is_integral< wchar_t > : mpl::bool_< true > { }; template<> struct is_integral< wchar_t const > : mpl::bool_< true > { }; template<> struct is_integral< wchar_t volatile > : mpl::bool_< true > { }; template<> struct is_integral< wchar_t const volatile > : mpl::bool_< true > { };
template<> struct is_integral< unsigned long long > : mpl::bool_< true > { }; template<> struct is_integral< unsigned long long const > : mpl::bool_< true > { }; template<> struct is_integral< unsigned long long volatile > : mpl::bool_< true > { }; template<> struct is_integral< unsigned long long const volatile > : mpl::bool_< true > { };
template<> struct is_integral< long long > : mpl::bool_< true > { }; template<> struct is_integral< long long const > : mpl::bool_< true > { }; template<> struct is_integral< long long volatile > : mpl::bool_< true > { }; template<> struct is_integral< long long const volatile > : mpl::bool_< true > { };
}
namespace boost {
template< typename T > struct is_float : mpl::bool_< false > { };
template<> struct is_float< float > : mpl::bool_< true > { }; template<> struct is_float< float const > : mpl::bool_< true > { }; template<> struct is_float< float volatile > : mpl::bool_< true > { }; template<> struct is_float< float const volatile > : mpl::bool_< true > { };
template<> struct is_float< double > : mpl::bool_< true > { }; template<> struct is_float< double const > : mpl::bool_< true > { }; template<> struct is_float< double volatile > : mpl::bool_< true > { }; template<> struct is_float< double const volatile > : mpl::bool_< true > { };
template<> struct is_float< long double > : mpl::bool_< true > { }; template<> struct is_float< long double const > : mpl::bool_< true > { }; template<> struct is_float< long double volatile > : mpl::bool_< true > { }; template<> struct is_float< long double const volatile > : mpl::bool_< true > { };
}
namespace boost {
namespace type_traits {
template <bool b1, bool b2, bool b3 = false, bool b4 = false, bool b5 = false, bool b6 = false, bool b7 = false>
struct ice_or;
template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
struct ice_or
{
    static const bool value = true;
};
template <>
struct ice_or<false, false, false, false, false, false, false>
{
    static const bool value = false;
};
}
}
namespace boost {
namespace detail {
template< typename T >
struct is_arithmetic_impl
{
    static const bool value = (::boost::type_traits::ice_or< ::boost::is_integral<T>::value, ::boost::is_float<T>::value >::value);
};
}
template< typename T > struct is_arithmetic : mpl::bool_< ::boost::detail::is_arithmetic_impl<T>::value > { };
}
namespace boost {
template< typename T > struct is_void : mpl::bool_< false > { };
template<> struct is_void< void > : mpl::bool_< true > { };
template<> struct is_void< void const > : mpl::bool_< true > { };
template<> struct is_void< void volatile > : mpl::bool_< true > { };
template<> struct is_void< void const volatile > : mpl::bool_< true > { };
}
namespace boost {
namespace detail {
template <typename T>
struct is_fundamental_impl
    : ::boost::type_traits::ice_or<
          ::boost::is_arithmetic<T>::value
        , ::boost::is_void<T>::value
        >
{
};
}
template< typename T > struct is_fundamental : mpl::bool_< ::boost::detail::is_fundamental_impl<T>::value > { };
}
namespace boost {
template< typename T > struct is_array : mpl::bool_< false > { };
template< typename T, std::size_t N > struct is_array< T[N] > : mpl::bool_< true > { };
template< typename T, std::size_t N > struct is_array< T const[N] > : mpl::bool_< true > { };
template< typename T, std::size_t N > struct is_array< T volatile[N] > : mpl::bool_< true > { };
template< typename T, std::size_t N > struct is_array< T const volatile[N] > : mpl::bool_< true > { };
}
namespace boost {
template< typename T > struct is_reference : mpl::bool_< false > { };
template< typename T > struct is_reference< T& > : mpl::bool_< true > { };
}
namespace boost {
namespace detail {
template <typename T>
struct add_reference_impl
{
    typedef T& type;
};
template< typename T > struct add_reference_impl<T&> { typedef T& type; };
template<> struct add_reference_impl<void> { typedef void type; };
template<> struct add_reference_impl<void const> { typedef void const type; };
template<> struct add_reference_impl<void volatile> { typedef void volatile type; };
template<> struct add_reference_impl<void const volatile> { typedef void const volatile type; };
}
template< typename T > struct add_reference { typedef typename detail::add_reference_impl<T>::type type; };
}
namespace boost {
namespace type_traits {
typedef char yes_type;
struct no_type
{
   char padding[8];
};
}
}
namespace boost {
namespace type_traits {
template <bool b1, bool b2, bool b3 = true, bool b4 = true, bool b5 = true, bool b6 = true, bool b7 = true>
struct ice_and;
template <bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7>
struct ice_and
{
    static const bool value = false;
};
template <>
struct ice_and<true, true, true, true, true, true, true>
{
    static const bool value = true;
};
}
}
namespace boost {
namespace type_traits {
template <bool b>
struct ice_not
{
    static const bool value = true;
};
template <>
struct ice_not<true>
{
    static const bool value = false;
};
}
}
namespace boost {
namespace type_traits {
template <int b1, int b2>
struct ice_eq
{
    static const bool value = (b1 == b2);
};
template <int b1, int b2>
struct ice_ne
{
    static const bool value = (b1 != b2);
};
template <int b1, int b2> bool const ice_eq<b1,b2>::value;
template <int b1, int b2> bool const ice_ne<b1,b2>::value;
}
}
namespace boost {
namespace detail {
struct any_conversion
{
    template <typename T> any_conversion(const volatile T&);
    template <typename T> any_conversion(T&);
};
template <typename T> struct checker
{
    static boost::type_traits::no_type _m_check(any_conversion ...);
    static boost::type_traits::yes_type _m_check(T, int);
};
template <typename From, typename To>
struct is_convertible_basic_impl
{
    static From _m_from;
    static bool const value = sizeof( detail::checker<To>::_m_check(_m_from, 0) )
        == sizeof(::boost::type_traits::yes_type);
};
template <typename From, typename To>
struct is_convertible_impl
{
    typedef typename add_reference<From>::type ref_type;
    static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_convertible_basic_impl<ref_type,To>::value, ::boost::type_traits::ice_not< ::boost::is_array<To>::value >::value >::value);
};
    template<> struct is_convertible_impl< void,void > { static const bool value = (true); }; template<> struct is_convertible_impl< void,void const > { static const bool value = (true); }; template<> struct is_convertible_impl< void,void volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void,void const volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void const,void > { static const bool value = (true); }; template<> struct is_convertible_impl< void const,void const > { static const bool value = (true); }; template<> struct is_convertible_impl< void const,void volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void const,void const volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void volatile,void > { static const bool value = (true); }; template<> struct is_convertible_impl< void volatile,void const > { static const bool value = (true); }; template<> struct is_convertible_impl< void volatile,void volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void volatile,void const volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void const volatile,void > { static const bool value = (true); }; template<> struct is_convertible_impl< void const volatile,void const > { static const bool value = (true); }; template<> struct is_convertible_impl< void const volatile,void volatile > { static const bool value = (true); }; template<> struct is_convertible_impl< void const volatile,void const volatile > { static const bool value = (true); };
template< typename To > struct is_convertible_impl< void,To > { static const bool value = (false); };
template< typename From > struct is_convertible_impl< From,void > { static const bool value = (false); };
template< typename To > struct is_convertible_impl< void const,To > { static const bool value = (false); };
template< typename To > struct is_convertible_impl< void volatile,To > { static const bool value = (false); };
template< typename To > struct is_convertible_impl< void const volatile,To > { static const bool value = (false); };
template< typename From > struct is_convertible_impl< From,void const > { static const bool value = (false); };
template< typename From > struct is_convertible_impl< From,void volatile > { static const bool value = (false); };
template< typename From > struct is_convertible_impl< From,void const volatile > { static const bool value = (false); };
}
template< typename From, typename To > struct is_convertible : mpl::bool_< (::boost::detail::is_convertible_impl<From,To>::value) > { };
template<> struct is_convertible< float,char > : mpl::bool_< true > { }; template<> struct is_convertible< float,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< float,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< float,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< float,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< float,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< float,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< float,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< float,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< float,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< float,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< float const,char > : mpl::bool_< true > { }; template<> struct is_convertible< float const,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< float const,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< float const,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< float const,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< float const,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< float const,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< float const,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< float const,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< float const,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< float const,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,char > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< float volatile,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,char > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< float const volatile,unsigned long long > : mpl::bool_< true > { };
template<> struct is_convertible< double,char > : mpl::bool_< true > { }; template<> struct is_convertible< double,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< double,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< double,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< double,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< double,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< double,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< double,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< double,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< double,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< double,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< double const,char > : mpl::bool_< true > { }; template<> struct is_convertible< double const,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< double const,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< double const,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< double const,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< double const,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< double const,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< double const,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< double const,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< double const,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< double const,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,char > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< double volatile,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,char > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< double const volatile,unsigned long long > : mpl::bool_< true > { };
template<> struct is_convertible< long double,char > : mpl::bool_< true > { }; template<> struct is_convertible< long double,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< long double,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< long double,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< long double,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< long double,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< long double,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< long double,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< long double,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< long double,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,char > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,char > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double volatile,unsigned long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,char > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,signed char > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,unsigned char > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,signed short > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,unsigned short > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,signed int > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,unsigned int > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,signed long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,unsigned long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,signed long long > : mpl::bool_< true > { }; template<> struct is_convertible< long double const volatile,unsigned long long > : mpl::bool_< true > { };
}
namespace boost {
namespace type_traits {
struct false_result
{
    template <typename T> struct result_
    {
        static const bool value = false;
    };
};
}}
namespace boost {
namespace type_traits {
template <class R>
struct is_function_ptr_helper
{
    static const bool value = false;
};
template <class R>
struct is_function_ptr_helper<R (*)()> { static const bool value = true; };
template <class R,class T0>
struct is_function_ptr_helper<R (*)(T0)> { static const bool value = true; };
template <class R,class T0,class T1>
struct is_function_ptr_helper<R (*)(T0,T1)> { static const bool value = true; };
template <class R,class T0,class T1,class T2>
struct is_function_ptr_helper<R (*)(T0,T1,T2)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22,class T23>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23)> { static const bool value = true; };
template <class R,class T0,class T1,class T2,class T3,class T4,class T5,class T6,class T7,class T8,class T9,class T10,class T11,class T12,class T13,class T14,class T15,class T16,class T17,class T18,class T19,class T20,class T21,class T22,class T23,class T24>
struct is_function_ptr_helper<R (*)(T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,T21,T22,T23,T24)> { static const bool value = true; };
}
}
namespace boost {
namespace detail {
template<bool is_ref = true>
struct is_function_chooser
    : ::boost::type_traits::false_result
{
};
template <>
struct is_function_chooser<false>
{
    template< typename T > struct result_
        : ::boost::type_traits::is_function_ptr_helper<T*>
    {
    };
};
template <typename T>
struct is_function_impl
    : is_function_chooser< ::boost::is_reference<T>::value >
        ::template result_<T>
{
};
}
template< typename T > struct is_function : mpl::bool_< ::boost::detail::is_function_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T> struct cv_traits_imp {};
template <typename T>
struct cv_traits_imp<T*>
{
    static const bool is_const = false;
    static const bool is_volatile = false;
    typedef T unqualified_type;
};
template <typename T>
struct cv_traits_imp<const T*>
{
    static const bool is_const = true;
    static const bool is_volatile = false;
    typedef T unqualified_type;
};
template <typename T>
struct cv_traits_imp<volatile T*>
{
    static const bool is_const = false;
    static const bool is_volatile = true;
    typedef T unqualified_type;
};
template <typename T>
struct cv_traits_imp<const volatile T*>
{
    static const bool is_const = true;
    static const bool is_volatile = true;
    typedef T unqualified_type;
};
}
}
namespace boost {
template< typename T > struct remove_cv { typedef typename detail::cv_traits_imp<T*>::unqualified_type type; };
template< typename T > struct remove_cv<T&> { typedef T& type; };
template< typename T, std::size_t N > struct remove_cv<T const[N]> { typedef T type[N]; };
template< typename T, std::size_t N > struct remove_cv<T volatile[N]> { typedef T type[N]; };
template< typename T, std::size_t N > struct remove_cv<T const volatile[N]> { typedef T type[N]; };
}
namespace boost {
namespace detail {
template <typename T> struct is_union_impl
{
   static const bool value = false;
};
}
template< typename T > struct is_union : mpl::bool_< ::boost::detail::is_union_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <class U> ::boost::type_traits::yes_type is_class_tester(void(U::*)(void));
template <class U> ::boost::type_traits::no_type is_class_tester(...);
template <typename T>
struct is_class_impl
{
    static const bool value = (::boost::type_traits::ice_and< sizeof(is_class_tester<T>(0)) == sizeof(::boost::type_traits::yes_type), ::boost::type_traits::ice_not< ::boost::is_union<T>::value >::value >::value);
};
}
template< typename T > struct is_class : mpl::bool_< ::boost::detail::is_class_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T>
struct is_class_or_union
{
   static const bool value = (::boost::type_traits::ice_or< ::boost::is_class<T>::value , ::boost::is_union<T>::value >::value);
};
struct int_convertible
{
    int_convertible(int);
};
template <bool is_typename_arithmetic_or_reference = true>
struct is_enum_helper
{
    template <typename T> struct type
    {
        static const bool value = false;
    };
};
template <>
struct is_enum_helper<false>
{
    template <typename T> struct type
        : ::boost::is_convertible<T,::boost::detail::int_convertible>
    {
    };
};
template <typename T> struct is_enum_impl
{
   typedef ::boost::add_reference<T> ar_t;
   typedef typename ar_t::type r_type;
   static const bool selector = (::boost::type_traits::ice_or< ::boost::is_arithmetic<T>::value , ::boost::is_reference<T>::value , ::boost::is_function<T>::value , is_class_or_union<T>::value >::value);
    typedef ::boost::detail::is_enum_helper<selector> se_t;
    typedef typename se_t::template type<r_type> helper;
    static const bool value = helper::value;
};
template<> struct is_enum_impl< void > { static const bool value = (false); };
template<> struct is_enum_impl< void const > { static const bool value = (false); };
template<> struct is_enum_impl< void volatile > { static const bool value = (false); };
template<> struct is_enum_impl< void const volatile > { static const bool value = (false); };
}
template< typename T > struct is_enum : mpl::bool_< ::boost::detail::is_enum_impl<T>::value > { };
}
namespace boost {
namespace type_traits {
template <typename T>
struct is_mem_fun_pointer_impl
{
    static const bool value = false;
};
template <class R, class T >
struct is_mem_fun_pointer_impl<R (T::*)() > { static const bool value = true; };
template <class R, class T >
struct is_mem_fun_pointer_impl<R (T::*)() const > { static const bool value = true; };
template <class R, class T >
struct is_mem_fun_pointer_impl<R (T::*)() volatile > { static const bool value = true; };
template <class R, class T >
struct is_mem_fun_pointer_impl<R (T::*)() const volatile > { static const bool value = true; };
template <class R, class T , class T0>
struct is_mem_fun_pointer_impl<R (T::*)( T0) > { static const bool value = true; };
template <class R, class T , class T0>
struct is_mem_fun_pointer_impl<R (T::*)( T0) const > { static const bool value = true; };
template <class R, class T , class T0>
struct is_mem_fun_pointer_impl<R (T::*)( T0) volatile > { static const bool value = true; };
template <class R, class T , class T0>
struct is_mem_fun_pointer_impl<R (T::*)( T0) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) > { static const bool value = true; };
template <class R, class T , class T0 , class T1>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23) const volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) volatile > { static const bool value = true; };
template <class R, class T , class T0 , class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 , class T8 , class T9 , class T10 , class T11 , class T12 , class T13 , class T14 , class T15 , class T16 , class T17 , class T18 , class T19 , class T20 , class T21 , class T22 , class T23 , class T24>
struct is_mem_fun_pointer_impl<R (T::*)( T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24) const volatile > { static const bool value = true; };
}
}
namespace boost {
template< typename T > struct is_member_function_pointer : mpl::bool_< ::boost::type_traits::is_mem_fun_pointer_impl<T>::value > { };
}
namespace boost {
template< typename T > struct is_member_pointer : mpl::bool_< ::boost::is_member_function_pointer<T>::value > { };
template< typename T, typename U > struct is_member_pointer< U T::* > : mpl::bool_< true > { };
}
namespace boost {
namespace detail {
template< typename T > struct is_pointer_helper
{
    static const bool value = false;
};
template< typename T > struct is_pointer_helper<T*> { static const bool value = true; };
template< typename T > struct is_pointer_helper<T* const> { static const bool value = true; };
template< typename T > struct is_pointer_helper<T* volatile> { static const bool value = true; };
template< typename T > struct is_pointer_helper<T* const volatile> { static const bool value = true; };
template< typename T >
struct is_pointer_impl
{
    static const bool value = (::boost::type_traits::ice_and< ::boost::detail::is_pointer_helper<T>::value , ::boost::type_traits::ice_not< ::boost::is_member_pointer<T>::value >::value >::value);
};
}
template< typename T > struct is_pointer : mpl::bool_< ::boost::detail::is_pointer_impl<T>::value > { };
}
namespace boost{
namespace detail{
template <typename T, bool small_>
struct ct_imp2
{
   typedef const T& param_type;
};
template <typename T>
struct ct_imp2<T, true>
{
   typedef const T param_type;
};
template <typename T, bool isp, bool b1>
struct ct_imp
{
   typedef const T& param_type;
};
template <typename T, bool isp>
struct ct_imp<T, isp, true>
{
   typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
};
template <typename T, bool b1>
struct ct_imp<T, true, b1>
{
   typedef T const param_type;
};
}
template <typename T>
struct call_traits
{
public:
   typedef T value_type;
   typedef T& reference;
   typedef const T& const_reference;
   typedef typename detail::ct_imp<
      T,
      ::boost::is_pointer<T>::value,
      ::boost::is_arithmetic<T>::value
   >::param_type param_type;
};
template <typename T>
struct call_traits<T&>
{
   typedef T& value_type;
   typedef T& reference;
   typedef const T& const_reference;
   typedef T& param_type;
};
template <typename T, std::size_t N>
struct call_traits<T [N]>
{
private:
   typedef T array_type[N];
public:
   typedef const T* value_type;
   typedef array_type& reference;
   typedef const array_type& const_reference;
   typedef const T* const param_type;
};
template <typename T, std::size_t N>
struct call_traits<const T [N]>
{
private:
   typedef const T array_type[N];
public:
   typedef const T* value_type;
   typedef array_type& reference;
   typedef const array_type& const_reference;
   typedef const T* const param_type;
};
}
#include <assert.h>
namespace boost {
  template <class T>
  struct type {};
}
namespace boost { namespace mpl {
template< std::size_t N > struct size_t;
}}
namespace boost { namespace mpl {
template< std::size_t N >
struct size_t
{
    static const std::size_t value = N;
    typedef size_t type;
    typedef std::size_t value_type;
    typedef mpl::size_t< static_cast<std::size_t>((value + 1)) > next;
    typedef mpl::size_t< static_cast<std::size_t>((value - 1)) > prior;
    operator std::size_t() const { return static_cast<std::size_t>(this->value); }
};
template< std::size_t N >
std::size_t const mpl::size_t< N >::value;
}}
namespace boost {
template <typename T> struct alignment_of;
namespace detail {
template <typename T>
struct alignment_of_hack
{
    char c;
    T t;
    alignment_of_hack();
};
template <unsigned A, unsigned S>
struct alignment_logic
{
    static const std::size_t value = A < S ? A : S;
};
template< typename T >
struct alignment_of_impl
{
    static const std::size_t value = (::boost::detail::alignment_logic< sizeof(detail::alignment_of_hack<T>) - sizeof(T), sizeof(T) >::value);
};
}
template< typename T > struct alignment_of : mpl::size_t< ::boost::detail::alignment_of_impl<T>::value > { };
template <typename T>
struct alignment_of<T&>
    : alignment_of<T*>
{
};
template<> struct alignment_of<void> : mpl::size_t< 0 > { };
template<> struct alignment_of<void const> : mpl::size_t< 0 > { };
template<> struct alignment_of<void volatile> : mpl::size_t< 0 > { };
template<> struct alignment_of<void const volatile> : mpl::size_t< 0 > { };
}
namespace boost {
namespace mpl {
struct void_;
}
}
namespace boost {
namespace mpl {
struct void_ { typedef void_ type; };
template< typename T >
struct is_void_
    : false_
{
};
template<>
struct is_void_<void_>
    : true_
{
};
}
}
namespace boost {
namespace mpl {
template<
      typename T
    , typename Tag
    , typename Arity
    >
struct lambda;
}
}
namespace boost { namespace mpl {
template< int N > struct int_;
}}
namespace boost {
namespace mpl {
template< int N > struct arg;
}
}
namespace boost {
namespace mpl {
namespace algo_ {
template<
      bool C
    , typename T1
    , typename T2
    >
struct if_c
{
    typedef T1 type;
};
template<
      typename T1
    , typename T2
    >
struct if_c<false,T1,T2>
{
    typedef T2 type;
};
template<
      typename C = void_
    , typename T1 = void_
    , typename T2 = void_
    >
struct if_
{
 private:
    typedef if_c<
          static_cast<bool>(C::value)
        , T1
        , T2
        > almost_type_;
 public:
    typedef typename almost_type_::type type;
   
};
} using namespace algo_;
namespace algo_ { template<> struct if_< void_,void_,void_ > { template< typename T1,typename T2,typename T3 , typename T4 =void_ ,typename T5 =void_ > struct apply : if_< T1,T2,T3 > { }; }; } using namespace algo_; template<> struct lambda< algo_:: if_< void_,void_,void_ > , void_ , int_<-1> > { typedef algo_:: if_< void_,void_,void_ > type; }; namespace aux { template< typename T1,typename T2,typename T3 > struct template_arity< algo_:: if_< T1,T2,T3 > > { static const int value = 3; }; template<> struct template_arity< algo_:: if_< void_,void_,void_ > > { static const int value = -1; }; }
template <class T1, class T2, class T3, class T4> struct bind3;
template <template <class T1, class T2, class T3> class F, class tag> struct quote3;
namespace aux
{
  template <
      typename T
    , typename U1,typename U2,typename U3,typename U4,typename U5
  > struct resolve_bind_arg;
  template<
        typename T
      , typename Arg
      >
  struct replace_unnamed_arg;
}
template<
      typename T1, typename T2, typename T3
    >
struct bind3<quote3<if_, void_>, T1, T2, T3>
{
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
     private:
        typedef quote3<if_, void_> a0;
        typedef mpl::arg< 1> n1;
        typedef aux::replace_unnamed_arg< T1,n1 > r1;
        typedef typename r1::type a1;
        typedef typename r1::next_arg n2;
        typedef typename aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 >::type t1;
        typedef aux::replace_unnamed_arg< T2,n2 > r2;
        typedef typename r2::type a2;
        typedef typename r2::next_arg n3;
        typedef typename aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > f2;
        typedef aux::replace_unnamed_arg< T3,n3 > r3;
        typedef typename r3::type a3;
        typedef typename r3::next_arg n4;
        typedef typename aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > f3;
        typedef typename if_<t1,f2,f3>::type f_;
     public:
        typedef typename f_::type type;
    };
};
}
}
namespace boost {
namespace detail {
template <typename T>
struct is_scalar_impl
{
   static const bool value = (::boost::type_traits::ice_or< ::boost::is_arithmetic<T>::value, ::boost::is_enum<T>::value, ::boost::is_pointer<T>::value, ::boost::is_member_pointer<T>::value >::value);
};
template <> struct is_scalar_impl<void>{ static const bool value = false; };
template <> struct is_scalar_impl<void const>{ static const bool value = false; };
template <> struct is_scalar_impl<void volatile>{ static const bool value = false; };
template <> struct is_scalar_impl<void const volatile>{ static const bool value = false; };
}
template< typename T > struct is_scalar : mpl::bool_< ::boost::detail::is_scalar_impl<T>::value > { };
}
namespace boost {
template< typename T > struct is_POD;
namespace detail {
template <typename T> struct is_pod_impl
{
    static const bool value = (::boost::type_traits::ice_or< ::boost::is_scalar<T>::value, ::boost::is_void<T>::value, false >::value);
};
template <typename T, std::size_t sz>
struct is_pod_impl<T[sz]>
    : is_pod_impl<T>
{
};
template<> struct is_pod_impl< void > { static const bool value = (true); };
template<> struct is_pod_impl< void const > { static const bool value = (true); };
template<> struct is_pod_impl< void volatile > { static const bool value = (true); };
template<> struct is_pod_impl< void const volatile > { static const bool value = (true); };
}
template< typename T > struct is_POD : mpl::bool_< ::boost::detail::is_pod_impl<T>::value > { };
template< typename T > struct is_pod : mpl::bool_< ::boost::detail::is_pod_impl<T>::value > { };
}
namespace boost{
template <bool x> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
template<int x> struct static_assert_test{};
}
namespace boost {
namespace detail {
class alignment_dummy;
typedef void (*function_ptr)();
typedef int (alignment_dummy::*member_ptr);
typedef int (alignment_dummy::*member_function_ptr)();
template <bool found, std::size_t target, class TestType>
struct lower_alignment_helper
{
    typedef char type;
    enum { value = true };
};
template <std::size_t target, class TestType>
struct lower_alignment_helper<false,target,TestType>
{
    enum { value = (alignment_of<TestType>::value == target) };
    typedef typename mpl::if_c<value, TestType, char>::type type;
};
template <typename T>
struct has_one_T
{
  T data;
};
template <std::size_t target>
union lower_alignment
{
    enum { found0 = false };
    typename lower_alignment_helper< found0,target,char >::type t0; enum { found1 = lower_alignment_helper<found0,target,char >::value }; typename lower_alignment_helper< found1,target,short >::type t1; enum { found2 = lower_alignment_helper<found1,target,short >::value }; typename lower_alignment_helper< found2,target,int >::type t2; enum { found3 = lower_alignment_helper<found2,target,int >::value }; typename lower_alignment_helper< found3,target,long >::type t3; enum { found4 = lower_alignment_helper<found3,target,long >::value }; typename lower_alignment_helper< found4,target,float >::type t4; enum { found5 = lower_alignment_helper<found4,target,float >::value }; typename lower_alignment_helper< found5,target,double >::type t5; enum { found6 = lower_alignment_helper<found5,target,double >::value }; typename lower_alignment_helper< found6,target,long double >::type t6; enum { found7 = lower_alignment_helper<found6,target,long double >::value }; typename lower_alignment_helper< found7,target,void* >::type t7; enum { found8 = lower_alignment_helper<found7,target,void* >::value }; typename lower_alignment_helper< found8,target,function_ptr >::type t8; enum { found9 = lower_alignment_helper<found8,target,function_ptr >::value }; typename lower_alignment_helper< found9,target,member_ptr >::type t9; enum { found10 = lower_alignment_helper<found9,target,member_ptr >::value }; typename lower_alignment_helper< found10,target,member_function_ptr >::type t10; enum { found11 = lower_alignment_helper<found10,target,member_function_ptr >::value }; typename lower_alignment_helper< found11,target,boost::detail::has_one_T<char> >::type t11; enum { found12 = lower_alignment_helper<found11,target,boost::detail::has_one_T<char> >::value }; typename lower_alignment_helper< found12,target,boost::detail::has_one_T<short> >::type t12; enum { found13 = lower_alignment_helper<found12,target,boost::detail::has_one_T<short> >::value }; typename lower_alignment_helper< found13,target,boost::detail::has_one_T<int> >::type t13; enum { found14 = lower_alignment_helper<found13,target,boost::detail::has_one_T<int> >::value }; typename lower_alignment_helper< found14,target,boost::detail::has_one_T<long> >::type t14; enum { found15 = lower_alignment_helper<found14,target,boost::detail::has_one_T<long> >::value }; typename lower_alignment_helper< found15,target,boost::detail::has_one_T<float> >::type t15; enum { found16 = lower_alignment_helper<found15,target,boost::detail::has_one_T<float> >::value }; typename lower_alignment_helper< found16,target,boost::detail::has_one_T<double> >::type t16; enum { found17 = lower_alignment_helper<found16,target,boost::detail::has_one_T<double> >::value }; typename lower_alignment_helper< found17,target,boost::detail::has_one_T<long double> >::type t17; enum { found18 = lower_alignment_helper<found17,target,boost::detail::has_one_T<long double> >::value }; typename lower_alignment_helper< found18,target,boost::detail::has_one_T<void*> >::type t18; enum { found19 = lower_alignment_helper<found18,target,boost::detail::has_one_T<void*> >::value }; typename lower_alignment_helper< found19,target,boost::detail::has_one_T<function_ptr> >::type t19; enum { found20 = lower_alignment_helper<found19,target,boost::detail::has_one_T<function_ptr> >::value }; typename lower_alignment_helper< found20,target,boost::detail::has_one_T<member_ptr> >::type t20; enum { found21 = lower_alignment_helper<found20,target,boost::detail::has_one_T<member_ptr> >::value }; typename lower_alignment_helper< found21,target,boost::detail::has_one_T<member_function_ptr> >::type t21; enum { found22 = lower_alignment_helper<found21,target,boost::detail::has_one_T<member_function_ptr> >::value };
};
union max_align
{
    char t0; short t1; int t2; long t3; float t4; double t5; long double t6; void* t7; function_ptr t8; member_ptr t9; member_function_ptr t10; boost::detail::has_one_T<char> t11; boost::detail::has_one_T<short> t12; boost::detail::has_one_T<int> t13; boost::detail::has_one_T<long> t14; boost::detail::has_one_T<float> t15; boost::detail::has_one_T<double> t16; boost::detail::has_one_T<long double> t17; boost::detail::has_one_T<void*> t18; boost::detail::has_one_T<function_ptr> t19; boost::detail::has_one_T<member_ptr> t20; boost::detail::has_one_T<member_function_ptr> t21;
};
template<int TAlign, int Align>
struct is_aligned
{
    static const bool value = (TAlign >= Align) & (TAlign % Align == 0);
};
}
template<std::size_t Align>
struct is_pod< ::boost::detail::lower_alignment<Align> >
{
        static const std::size_t value = true;
};
template <int Align>
class type_with_alignment
{
    typedef detail::lower_alignment<Align> t1;
    typedef typename mpl::if_c<
          ::boost::detail::is_aligned< ::boost::alignment_of<t1>::value,Align >::value
        , t1
        , detail::max_align
        >::type align_t;
    static const std::size_t found = alignment_of<align_t>::value;
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( found >= Align ) >)> boost_static_assert_typedef_197;
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( found % Align == 0 ) >)> boost_static_assert_typedef_198;
 public:
    typedef align_t type;
};
namespace align {
struct __attribute__((__aligned__(2))) a2 {};
struct __attribute__((__aligned__(4))) a4 {};
struct __attribute__((__aligned__(8))) a8 {};
struct __attribute__((__aligned__(16))) a16 {};
struct __attribute__((__aligned__(32))) a32 {};
}
template<> class type_with_alignment<1> { public: typedef char type; };
template<> class type_with_alignment<2> { public: typedef align::a2 type; };
template<> class type_with_alignment<4> { public: typedef align::a4 type; };
template<> class type_with_alignment<8> { public: typedef align::a8 type; };
template<> class type_with_alignment<16> { public: typedef align::a16 type; };
template<> class type_with_alignment<32> { public: typedef align::a32 type; };
namespace detail {
template<> struct is_pod_impl< ::boost::align::a2 > { static const bool value = (true); };
template<> struct is_pod_impl< ::boost::align::a4 > { static const bool value = (true); };
template<> struct is_pod_impl< ::boost::align::a8 > { static const bool value = (true); };
template<> struct is_pod_impl< ::boost::align::a16 > { static const bool value = (true); };
template<> struct is_pod_impl< ::boost::align::a32 > { static const bool value = (true); };
}
}
namespace boost {
template< typename T > struct remove_reference { typedef T type; };
template< typename T > struct remove_reference<T&> { typedef T type; };
}
namespace boost { namespace mpl { namespace aux {
template< typename T >
struct nested_type_wknd
    : T::type
{
};
}}}
namespace boost {
namespace mpl {
namespace aux {
template< long C_ >
struct not_impl
    : bool_<!C_>
{
};
}
template<
      typename T = void_
    >
struct not_
    : aux::not_impl<
          ::boost::mpl::aux::nested_type_wknd<T>::value
        >
{
   
};
template<> struct not_< void_ > { template< typename T1 , typename T2 =void_ ,typename T3 =void_ ,typename T4 =void_ ,typename T5 =void_ > struct apply : not_< T1 > { }; }; template<> struct lambda< not_< void_ > , void_ , int_<-1> > { typedef not_< void_ > type; }; namespace aux { template< typename T1 > struct template_arity< not_< T1 > > { static const int value = 1; }; template<> struct template_arity< not_< void_ > > { static const int value = -1; }; }
}
}
namespace boost {
template< typename T > struct is_volatile : mpl::bool_< ::boost::detail::cv_traits_imp<T*>::is_volatile > { };
template< typename T > struct is_volatile< T& > : mpl::bool_< false > { };
}
namespace boost {
namespace detail {
template <typename T>
struct has_trivial_copy_impl
{
   static const bool value = (::boost::type_traits::ice_and< ::boost::type_traits::ice_or< ::boost::is_pod<T>::value, false >::value, ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value >::value);
};
}
template< typename T > struct has_trivial_copy : mpl::bool_< ::boost::detail::has_trivial_copy_impl<T>::value > { };
}
namespace boost {
template< typename T > struct has_nothrow_copy : mpl::bool_< ::boost::has_trivial_copy<T>::value > { };
}
namespace boost {
namespace detail {
template <typename RefT>
class reference_content
{
private:
    RefT content_;
public:
    ~reference_content()
    {
    }
    reference_content(RefT r)
        : content_( r )
    {
    }
    reference_content(const reference_content& operand)
        : content_( operand.content_ )
    {
    }
private:
    reference_content& operator=(const reference_content&);
public:
    RefT get() const
    {
        return content_;
    }
};
template <typename T = mpl::void_> struct make_reference_content;
template <typename T>
struct make_reference_content
{
    typedef T type;
};
template <typename T>
struct make_reference_content< T& >
{
    typedef reference_content<T&> type;
};
template <>
struct make_reference_content< mpl::void_ >
{
    template <typename T>
    struct apply
        : make_reference_content<T>
    {
    };
    typedef mpl::void_ type;
};
}
template <typename T>
struct has_nothrow_copy<
      ::boost::detail::reference_content< T& >
    >
    : mpl::true_
{
};
}
namespace boost {
namespace detail {
struct none_helper{};
typedef int none_helper::*none_t ;
}
}
#include <functional>
namespace boost {
template<class OptionalPointee>
inline
bool equal_pointees ( OptionalPointee const& x, OptionalPointee const& y )
{
  return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
}
template<class OptionalPointee>
struct equal_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
{
  bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
    { return equal_pointees(x,y) ; }
} ;
template<class OptionalPointee>
inline
bool less_pointees ( OptionalPointee const& x, OptionalPointee const& y )
{
  return !y ? false : ( !x ? true : (*x) < (*y) ) ;
}
template<class OptionalPointee>
struct less_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
{
  bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
    { return less_pointees(x,y) ; }
} ;
}
namespace boost {
class InPlaceFactoryBase ;
class TypedInPlaceFactoryBase ;
namespace optional_detail {
template <class T>
class aligned_storage
{
    union dummy_u
    {
        char data[ sizeof(T) ];
        typename type_with_alignment<
          ::boost::alignment_of<T>::value >::type aligner_;
    } dummy_ ;
  public:
    void const* address() const { return &dummy_.data[0]; }
    void * address() { return &dummy_.data[0]; }
} ;
template<class T>
struct types_when_isnt_ref
{
  typedef T const& reference_const_type ;
  typedef T & reference_type ;
  typedef T const* pointer_const_type ;
  typedef T * pointer_type ;
  typedef T const& argument_type ;
} ;
template<class T>
struct types_when_is_ref
{
  typedef typename remove_reference<T>::type raw_type ;
  typedef raw_type& reference_const_type ;
  typedef raw_type& reference_type ;
  typedef raw_type* pointer_const_type ;
  typedef raw_type* pointer_type ;
  typedef raw_type& argument_type ;
} ;
struct optional_tag {} ;
template<class T>
class optional_base : public optional_tag
{
  private :
    typedef typename detail::make_reference_content<T>::type internal_type ;
    typedef aligned_storage<internal_type> storage_type ;
    typedef types_when_isnt_ref<T> types_when_not_ref ;
    typedef types_when_is_ref<T> types_when_ref ;
    typedef optional_base<T> this_type ;
  protected :
    typedef T value_type ;
    typedef mpl::true_ is_reference_tag ;
    typedef mpl::false_ is_not_reference_tag ;
    typedef typename is_reference<T>::type is_reference_predicate ;
    typedef typename mpl::if_<is_reference_predicate,types_when_ref,types_when_not_ref>::type types ;
    typedef bool (this_type::*unspecified_bool_type)() const;
    typedef typename types::reference_type reference_type ;
    typedef typename types::reference_const_type reference_const_type ;
    typedef typename types::pointer_type pointer_type ;
    typedef typename types::pointer_const_type pointer_const_type ;
    typedef typename types::argument_type argument_type ;
    optional_base()
      :
      m_initialized(false) {}
    optional_base ( detail::none_t const& )
      :
      m_initialized(false) {}
    optional_base ( argument_type val )
      :
      m_initialized(false)
    {
      construct(val);
    }
    optional_base ( optional_base const& rhs )
      :
      m_initialized(false)
    {
      if ( rhs.is_initialized() )
        construct(rhs.get_impl());
    }
    template<class Expr>
    explicit optional_base ( Expr const& expr, Expr const* tag )
      :
      m_initialized(false)
    {
      construct(expr,tag);
    }
    ~optional_base() { destroy() ; }
    void assign ( optional_base const& rhs )
      {
        destroy();
        if ( rhs.is_initialized() )
          construct(rhs.get_impl());
      }
    void assign ( argument_type val )
      {
        destroy();
        construct(val);
      }
    void assign ( detail::none_t const& ) { destroy(); }
    template<class Expr>
    void assign_expr ( Expr const& expr, Expr const* tag )
      {
        destroy();
        construct(expr,tag);
      }
  public :
    void reset() { destroy(); }
    void reset ( argument_type val ) { assign(val); }
    pointer_const_type get_ptr() const { return m_initialized ? get_ptr_impl() : 0 ; }
    pointer_type get_ptr() { return m_initialized ? get_ptr_impl() : 0 ; }
    bool is_initialized() const { return m_initialized ; }
  protected :
    void construct ( argument_type val )
     {
       new (m_storage.address()) internal_type(val) ;
       m_initialized = true ;
     }
    template<class Expr>
    void construct ( Expr const& factory, InPlaceFactoryBase const* )
     {
       typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::mpl::not_<is_reference_predicate>::value ) >)> boost_static_assert_typedef_268 ;
       factory.template apply<value_type>(m_storage.address()) ;
       m_initialized = true ;
     }
    template<class Expr>
    void construct ( Expr const& factory, TypedInPlaceFactoryBase const* )
     {
       typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::mpl::not_<is_reference_predicate>::value ) >)> boost_static_assert_typedef_277 ;
       factory.apply(m_storage.address()) ;
       m_initialized = true ;
     }
    template<class Expr>
    void construct ( Expr const& expr, void const* )
     {
       new (m_storage.address()) internal_type(expr) ;
       m_initialized = true ;
     }
    void destroy()
      {
        if ( m_initialized )
          destroy_impl(is_reference_predicate()) ;
      }
    unspecified_bool_type safe_bool() const { return m_initialized ? &this_type::is_initialized : 0 ; }
    reference_const_type get_impl() const { return dereference(get_object(), is_reference_predicate() ) ; }
    reference_type get_impl() { return dereference(get_object(), is_reference_predicate() ) ; }
    pointer_const_type get_ptr_impl() const { return cast_ptr(get_object(), is_reference_predicate() ) ; }
    pointer_type get_ptr_impl() { return cast_ptr(get_object(), is_reference_predicate() ) ; }
  private :
    internal_type const* get_object() const { return static_cast<internal_type const*>(m_storage.address()); }
    internal_type * get_object() { return static_cast<internal_type *> (m_storage.address()); }
    reference_const_type dereference( internal_type const* p, is_not_reference_tag ) const { return *p ; }
    reference_type dereference( internal_type* p, is_not_reference_tag ) { return *p ; }
    reference_const_type dereference( internal_type const* p, is_reference_tag ) const { return p->get() ; }
    reference_type dereference( internal_type* p, is_reference_tag ) { return p->get() ; }
    void destroy_impl ( is_not_reference_tag ) { get_impl().~T() ; m_initialized = false ; }
    void destroy_impl ( is_reference_tag ) { m_initialized = false ; }
    pointer_const_type cast_ptr( internal_type const* p, is_not_reference_tag ) const { return p ; }
    pointer_type cast_ptr( internal_type * p, is_not_reference_tag ) { return p ; }
    bool m_initialized ;
    storage_type m_storage ;
} ;
}
template<class T>
class optional : public optional_detail::optional_base<T>
{
    typedef optional_detail::optional_base<T> base ;
    typedef typename base::unspecified_bool_type unspecified_bool_type ;
  public :
    typedef optional<T> this_type ;
    typedef typename base::value_type value_type ;
    typedef typename base::reference_type reference_type ;
    typedef typename base::reference_const_type reference_const_type ;
    typedef typename base::pointer_type pointer_type ;
    typedef typename base::pointer_const_type pointer_const_type ;
    typedef typename base::argument_type argument_type ;
    optional() : base() {}
    optional( detail::none_t const& none_ ) : base(none_) {}
    optional ( argument_type val ) : base(val) {}
    template<class U>
    explicit optional ( optional<U> const& rhs )
      :
      base()
    {
      if ( rhs.is_initialized() )
        this->construct(rhs.get());
    }
    template<class Expr>
    explicit optional ( Expr const& expr ) : base(expr,&expr) {}
    optional ( optional const& rhs ) : base(rhs) {}
    ~optional() {}
    template<class Expr>
    optional& operator= ( Expr expr )
      {
        this->assign_expr(expr,&expr);
        return *this ;
      }
    template<class U>
    optional& operator= ( optional<U> const& rhs )
      {
        this->destroy();
        if ( rhs.is_initialized() )
        {
          this->assign(rhs.get());
        }
        return *this ;
      }
    optional& operator= ( optional const& rhs )
      {
        this->assign( rhs ) ;
        return *this ;
      }
    optional& operator= ( argument_type val )
      {
        this->assign( val ) ;
        return *this ;
      }
    optional& operator= ( detail::none_t const& none_ )
      {
        this->assign( none_ ) ;
        return *this ;
      }
    reference_const_type get() const { ((void)0) ; return this->get_impl(); }
    reference_type get() { ((void)0) ; return this->get_impl(); }
    pointer_const_type operator->() const { ((void)0) ; return this->get_ptr_impl() ; }
    pointer_type operator->() { ((void)0) ; return this->get_ptr_impl() ; }
    reference_const_type operator *() const { return this->get() ; }
    reference_type operator *() { return this->get() ; }
    operator unspecified_bool_type() const { return this->safe_bool() ; }
       bool operator!() const { return !this->is_initialized() ; }
} ;
template<class T>
inline
typename optional<T>::reference_const_type
get ( optional<T> const& opt )
{
  return opt.get() ;
}
template<class T>
inline
typename optional<T>::reference_type
get ( optional<T>& opt )
{
  return opt.get() ;
}
template<class T>
inline
typename optional<T>::pointer_const_type
get ( optional<T> const* opt )
{
  return opt->get_ptr() ;
}
template<class T>
inline
typename optional<T>::pointer_type
get ( optional<T>* opt )
{
  return opt->get_ptr() ;
}
template<class T>
inline
typename optional<T>::pointer_const_type
get_pointer ( optional<T> const& opt )
{
  return opt.get_ptr() ;
}
template<class T>
inline
typename optional<T>::pointer_type
get_pointer ( optional<T>& opt )
{
  return opt.get_ptr() ;
}
template<class T>
inline
bool operator == ( optional<T> const& x, optional<T> const& y )
{ return equal_pointees(x,y); }
template<class T>
inline
bool operator < ( optional<T> const& x, optional<T> const& y )
{ return less_pointees(x,y); }
template<class T>
inline
bool operator != ( optional<T> const& x, optional<T> const& y )
{ return !( x == y ) ; }
template<class T>
inline
bool operator > ( optional<T> const& x, optional<T> const& y )
{ return y < x ; }
template<class T>
inline
bool operator <= ( optional<T> const& x, optional<T> const& y )
{ return !( y < x ) ; }
template<class T>
inline
bool operator >= ( optional<T> const& x, optional<T> const& y )
{ return !( x < y ) ; }
template<class T>
inline
bool operator == ( optional<T> const& x, detail::none_t const& )
{ return equal_pointees(x, optional<T>() ); }
template<class T>
inline
bool operator < ( optional<T> const& x, detail::none_t const& )
{ return less_pointees(x,optional<T>() ); }
template<class T>
inline
bool operator != ( optional<T> const& x, detail::none_t const& y )
{ return !( x == y ) ; }
template<class T>
inline
bool operator > ( optional<T> const& x, detail::none_t const& y )
{ return y < x ; }
template<class T>
inline
bool operator <= ( optional<T> const& x, detail::none_t const& y )
{ return !( y < x ) ; }
template<class T>
inline
bool operator >= ( optional<T> const& x, detail::none_t const& y )
{ return !( x < y ) ; }
template<class T>
inline
bool operator == ( detail::none_t const& x, optional<T> const& y )
{ return equal_pointees(optional<T>() ,y); }
template<class T>
inline
bool operator < ( detail::none_t const& x, optional<T> const& y )
{ return less_pointees(optional<T>() ,y); }
template<class T>
inline
bool operator != ( detail::none_t const& x, optional<T> const& y )
{ return !( x == y ) ; }
template<class T>
inline
bool operator > ( detail::none_t const& x, optional<T> const& y )
{ return y < x ; }
template<class T>
inline
bool operator <= ( detail::none_t const& x, optional<T> const& y )
{ return !( y < x ) ; }
template<class T>
inline
bool operator >= ( detail::none_t const& x, optional<T> const& y )
{ return !( x < y ) ; }
namespace optional_detail {
template<class T>
inline
void optional_swap ( optional<T>& x, optional<T>& y )
{
  if ( !x && !!y )
  {
    x.reset(*y);
    y.reset();
  }
  else if ( !!x && !y )
  {
    y.reset(*x);
    x.reset();
  }
  else if ( !!x && !!y )
  {
    using std::swap ;
    swap(*x,*y);
  }
}
}
template<class T> inline void swap ( optional<T>& x, optional<T>& y )
{
  optional_detail::optional_swap(x,y);
}
}
namespace boost
{
template<class E> void throw_exception(E const & e)
{
    throw e;
}
}
namespace boost { namespace spirit
{
    namespace impl
    {
        template <typename T>
        struct no_base {};
        template <typename T>
        struct safe_bool_impl
        {
            typedef T* TP;
            TP stub;
            typedef TP safe_bool_impl::*type;
        };
    }
    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;
        }
    };
}}
namespace boost { namespace spirit { namespace impl
{
    template <typename T>
    struct match_attr_traits
    {
        typedef typename
            boost::optional<T>::reference_const_type
        const_reference;
        static void
        convert(boost::optional<T>& dest, const_reference src)
        { dest.reset(src); }
        static void
        convert(boost::optional<T>& dest, ... )
        { dest.reset(); }
        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();
        }
        template <typename ValueT>
        static void
        set_value(boost::optional<T>& dest, ValueT const& val, mpl::false_)
        {
            dest.reset(val);
        }
        template <typename ValueT>
        static void
        set_value(boost::optional<T>& dest, ValueT const& val, mpl::true_)
        {
            dest.get() = val;
        }
    };
}}}
namespace boost {
template< typename T > struct add_const { typedef T const type; };
template< typename T > struct add_const<T&> { typedef T& type; };
}
namespace boost { namespace spirit
{
    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)
        {
            ;
            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;
    };
    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)
        {
            ;
            len += other.length();
        }
        bool operator_bool() const
        {
            return len >= 0;
        }
    private:
        std::ptrdiff_t len;
    };
}}
namespace boost { namespace spirit
{
    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
    {
        ;
        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& other)
    {
        std::swap(len, other.len);
    }
}}
#include <iterator>
namespace boost { namespace spirit {
    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;
        };
    };
    struct parser_tag_base {};
    struct parser_address_tag : parser_tag_base
    {
        parser_id id() const
        { return parser_id(reinterpret_cast<std::size_t>(this)); }
    };
    template <int N>
    struct parser_tag : parser_tag_base
    {
        static parser_id id()
        { return parser_id(std::size_t(N)); }
    };
    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;
    };
}}
namespace boost { namespace detail {
template <class Iterator>
struct iterator_traits
    : std::iterator_traits<Iterator>
{};
using std::distance;
}}
namespace boost { namespace spirit
{
    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;
        }
    };
    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& ,
            IteratorT const& ) const
        {
            return match<AttrT>(length, val);
        }
        template <typename MatchT, typename IteratorT>
        void group_match(
            MatchT& ,
            parser_id const& ,
            IteratorT const& ,
            IteratorT const& ) const {}
        template <typename Match1T, typename Match2T>
        void concat_match(Match1T& l, Match2T const& r) const
        {
            l.concat(r);
        }
    };
    template <typename MatchPolicyT, typename T>
    struct match_result
    {
        typedef typename MatchPolicyT::template result<T>::type type;
    };
    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);
        }
    };
    template <
        typename IterationPolicyT = iteration_policy,
        typename MatchPolicyT = match_policy,
        typename ActionPolicyT = action_policy>
    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) {}
    };
    struct scanner_base {};
    template <
        typename IteratorT = char const*,
        typename PoliciesT = scanner_policies<> >
    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) {}
        bool
        at_end() const
        {
            typedef typename PoliciesT::iteration_policy_t iteration_policy_t;
            return iteration_policy_t::at_end(*this);
        }
        value_t
        operator*() const
        {
            typedef typename PoliciesT::iteration_policy_t iteration_policy_t;
            return iteration_policy_t::filter(iteration_policy_t::get(*this));
        }
        scanner const&
        operator++() const
        {
            typedef typename PoliciesT::iteration_policy_t iteration_policy_t;
            iteration_policy_t::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);
    };
    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;
    };
}}
namespace boost { namespace spirit
{
    template <typename ParserT, typename ActionT>
    class action;
    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 {};
    template <typename ParserT, typename ScannerT>
    struct parser_result
    {
        typedef typename ParserT::template result<ScannerT>::type type;
    };
    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);
        }
    };
    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) {}
    };
    template <typename IteratorT, typename DerivedT>
    parse_info<IteratorT>
    parse(
        IteratorT const& first,
        IteratorT const& last,
        parser<DerivedT> const& p);
    template <typename CharT, typename DerivedT>
    parse_info<CharT const*>
    parse(
        CharT const* str,
        parser<DerivedT> const& p);
}}
namespace boost { namespace spirit
{
    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());
    }
    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);
    }
}}
namespace boost {
template <typename T> T*
addressof(T& v)
{
  return reinterpret_cast<T*>(
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
}
}
namespace boost
{
template<class T> class reference_wrapper
{
public:
    typedef T type;
    explicit reference_wrapper(T& t): t_(boost::addressof(t)) {}
    operator T& () const { return *t_; }
    T& get() const { return *t_; }
    T* get_pointer() const { return t_; }
private:
    T* t_;
};
template<class T> inline reference_wrapper<T> const ref(T & t)
{
    return reference_wrapper<T>(t);
}
template<class T> inline reference_wrapper<T const> const cref(T const & t)
{
    return reference_wrapper<T const>(t);
}
template<typename T>
class is_reference_wrapper
    : public mpl::false_
{
};
template<typename T>
class is_reference_wrapper<reference_wrapper<T> >
    : public mpl::true_
{
};
template<typename T>
class unwrap_reference
{
 public:
    typedef T type;
};
template<typename T>
class unwrap_reference<reference_wrapper<T> >
{
 public:
    typedef T type;
};
}
namespace boost { namespace spirit {
    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);
        }
        template <typename CharT>
        inline typename
        std::char_traits<CharT>::int_type
        to_int_type(CharT c)
        {
            return std
                ::char_traits<CharT>::to_int_type(c);
        }
        template <typename CharT>
        inline CharT
        to_char_type(typename
            std::char_traits<CharT>::int_type c)
        {
            return std
                ::char_traits<CharT>::to_char_type(c);
        }
        inline bool
        isalnum_(char c)
        {
            using namespace std;
            return isalnum(to_int_type(c));
        }
        inline bool
        isalpha_(char c)
        {
            using namespace std;
            return isalpha(to_int_type(c));
        }
        inline bool
        iscntrl_(char c)
        {
            using namespace std;
            return iscntrl(to_int_type(c));
        }
        inline bool
        isdigit_(char c)
        {
            using namespace std;
            return isdigit(to_int_type(c));
        }
        inline bool
        isgraph_(char c)
        {
            using namespace std;
            return isgraph(to_int_type(c));
        }
        inline bool
        islower_(char c)
        {
            using namespace std;
            return islower(to_int_type(c));
        }
        inline bool
        isprint_(char c)
        {
            using namespace std;
            return isprint(to_int_type(c));
        }
        inline bool
        ispunct_(char c)
        {
            using namespace std;
            return ispunct(to_int_type(c));
        }
        inline bool
        isspace_(char c)
        {
            using namespace std;
            return isspace(to_int_type(c));
        }
        inline bool
        isupper_(char c)
        {
            using namespace std;
            return isupper(to_int_type(c)); }
        inline bool
        isxdigit_(char c)
        {
            using namespace std;
            return isxdigit(to_int_type(c));
        }
        inline bool
        isblank_(char c)
        {
            return (c == ' ' || c == '\t');
        }
        inline char
        tolower_(char c)
        {
            using namespace std;
            return to_char_type<char>(tolower(to_int_type(c)));
        }
        inline char
        toupper_(char c)
        {
            using namespace std;
            return to_char_type<char>(toupper(to_int_type(c)));
        }
}}}
namespace boost { namespace spirit {
    template <typename BaseT>
    struct no_skipper_iteration_policy;
    template <typename BaseT = iteration_policy>
    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);
        }
    };
    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 = iteration_policy>
    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;
    };
    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);
    template <typename CharT, typename ParserT, typename SkipT>
    parse_info<CharT const*>
    parse(
        CharT const* str,
        parser<ParserT> const& p,
        parser<SkipT> const& skip);
    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;
}}
namespace boost { namespace spirit {
    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<
                    typename ScannerT::iteration_policy_t>,
                typename ScannerT::match_policy_t,
                typename ScannerT::action_policy_t
            > policies_t;
            scanner<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);
                scan.skip(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);
                scan.skip(scan);
                return parse_info<IteratorT>(
                    first, hit, hit && (first == last),
                    hit.length());
            }
        };
    }
    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());
    }
    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);
    }
}}
namespace boost { namespace spirit {
    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<
                    typename ScannerT::iteration_policy_t>,
                typename ScannerT::match_policy_t,
                typename ScannerT::action_policy_t
            > policies_t;
            scan.skip(scan);
            RT hit = s.parse(scan.change_policies(policies_t(scan)));
            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<
                    typename ScannerT::iteration_policy_t>,
                typename ScannerT::match_policy_t,
                typename ScannerT::action_policy_t
            > policies_t;
            scan.skip(scan);
            RT hit = p.parse_main(scan.change_policies(policies_t(scan)));
            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<
                    typename ScannerT::iteration_policy_t>,
                typename ScannerT::match_policy_t,
                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);
        }
        template <typename T>
        struct to_longest_alternative
        {
            typedef T result_t;
            static result_t const&
            convert(T const& a)
            { 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)
            {
                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)
            { 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)
            {
                return result_t(
                    to_shortest_alternative<A>::convert(alt.left()),
                    to_shortest_alternative<B>::convert(alt.right()));
            }
        };
    }
}}
namespace boost { namespace spirit {
    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;
                    return scan.create_match(1, ch, save, scan.first);
                }
            }
            return scan.no_match();
        }
    };
    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;
    }
    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);
    }
    template <typename CharT = char>
    struct range : public char_parser<range<CharT> >
    {
        range(CharT first_, CharT last_)
        : first(first_), last(last_)
        {
            ;
        }
        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);
    }
    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);
    }
    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 IteratorT>
    inline strlit<IteratorT>
    str_p(IteratorT first, IteratorT last)
    {
        return strlit<IteratorT>(first, last);
    }
    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();
    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;
    }
    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();
    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();
    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();
    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();
    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();
    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();
    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();
    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();
    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();
    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();
    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();
    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();
    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')
            {
                ++scan;
                ++len;
            }
            if (!scan.at_end() && *scan == '\n')
            {
                ++scan;
                ++len;
            }
            if (len)
                return scan.create_match(len, nil_t(), save, scan.first);
            return scan.no_match();
        }
    };
    eol_parser const eol_p = eol_parser();
    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();
    inline strlit<char const*> const
    pizza_p(char const* your_favorite_pizza)
    {
        return your_favorite_pizza;
    }
}}
namespace boost {
template< typename T > struct is_const : mpl::bool_< ::boost::detail::cv_traits_imp<T*>::is_const > { };
template< typename T > struct is_const< T& > : mpl::bool_< false > { };
}
namespace boost {
namespace detail {
template <typename T>
struct has_trivial_assign_impl
{
   static const bool value = (::boost::type_traits::ice_and< ::boost::type_traits::ice_or< ::boost::is_pod<T>::value, false >::value, ::boost::type_traits::ice_not< ::boost::is_const<T>::value >::value, ::boost::type_traits::ice_not< ::boost::is_volatile<T>::value >::value >::value);
};
}
template< typename T > struct has_trivial_assign : mpl::bool_< ::boost::detail::has_trivial_assign_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T>
struct has_trivial_ctor_impl
{
   static const bool value = (::boost::type_traits::ice_or< ::boost::is_pod<T>::value, false >::value);
};
}
template< typename T > struct has_trivial_constructor : mpl::bool_< ::boost::detail::has_trivial_ctor_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T>
struct has_trivial_dtor_impl
{
   static const bool value = (::boost::type_traits::ice_or< ::boost::is_pod<T>::value, false >::value);
};
}
template< typename T > struct has_trivial_destructor : mpl::bool_< ::boost::detail::has_trivial_dtor_impl<T>::value > { };
}
namespace boost {
template< typename T > struct has_nothrow_constructor : mpl::bool_< ::boost::has_trivial_constructor<T>::value > { };
}
namespace boost {
template< typename T > struct has_nothrow_assign : mpl::bool_< ::boost::has_trivial_assign<T>::value > { };
}
namespace boost {
template< typename T, typename U > struct is_same : mpl::bool_< false > { };
template< typename T > struct is_same< T,T > : mpl::bool_< true > { };
}
namespace boost {
namespace detail {
template <typename B, typename D>
struct bd_helper
{
    template <typename T>
    static type_traits::yes_type check(D const volatile *, T);
    static type_traits::no_type check(B const volatile *, int);
};
template<typename B, typename D>
struct is_base_and_derived_impl2
{
    struct Host
    {
        operator B const volatile *() const;
        operator D const volatile *();
    };
    static const bool value = sizeof(bd_helper<B,D>::check(Host(), 0)) == sizeof(type_traits::yes_type);
};
template <typename B, typename D>
struct is_base_and_derived_impl3
{
    static const bool value = false;
};
template <bool ic1, bool ic2, bool iss>
struct is_base_and_derived_select
{
   template <class T, class U>
   struct rebind
   {
      typedef is_base_and_derived_impl3<T,U> type;
   };
};
template <>
struct is_base_and_derived_select<true,true,false>
{
   template <class T, class U>
   struct rebind
   {
      typedef is_base_and_derived_impl2<T,U> type;
   };
};
template <typename B, typename D>
struct is_base_and_derived_impl
{
    typedef typename remove_cv<B>::type ncvB;
    typedef typename remove_cv<D>::type ncvD;
    typedef is_base_and_derived_select<
       ::boost::is_class<B>::value,
       ::boost::is_class<D>::value,
       ::boost::is_same<B,D>::value> selector;
    typedef typename selector::template rebind<ncvB,ncvD> binder;
    typedef typename binder::type bound_type;
    static const bool value = bound_type::value;
};
}
template< typename Base, typename Derived > struct is_base_and_derived : mpl::bool_< (::boost::detail::is_base_and_derived_impl<Base,Derived>::value) > { };
template< typename Base, typename Derived > struct is_base_and_derived< Base&,Derived > : mpl::bool_< false > { };
template< typename Base, typename Derived > struct is_base_and_derived< Base,Derived& > : mpl::bool_< false > { };
template< typename Base, typename Derived > struct is_base_and_derived< Base&,Derived& > : mpl::bool_< false > { };
}
namespace boost {
namespace detail {
template <typename T>
struct is_compound_impl
{
   static const bool value = (::boost::type_traits::ice_not< ::boost::is_fundamental<T>::value >::value);
};
}
template< typename T > struct is_compound : mpl::bool_< ::boost::detail::is_compound_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T>
struct empty_helper_t1 : public T
{
    empty_helper_t1();
    int i[256];
};
struct empty_helper_t2 { int i[256]; };
template <typename T, bool is_a_class = false>
struct empty_helper
{
    static const bool value = false;
};
template <typename T>
struct empty_helper<T, true>
{
    static const bool value = (sizeof(empty_helper_t1<T>) == sizeof(empty_helper_t2));
};
template <typename T>
struct is_empty_impl
{
    typedef typename remove_cv<T>::type cvt;
    static const bool value = ( ::boost::type_traits::ice_or< ::boost::detail::empty_helper<cvt,::boost::is_class<T>::value>::value , false >::value );
};
template<> struct is_empty_impl< void > { static const bool value = (false); };
template<> struct is_empty_impl< void const > { static const bool value = (false); };
template<> struct is_empty_impl< void volatile > { static const bool value = (false); };
template<> struct is_empty_impl< void const volatile > { static const bool value = (false); };
}
template< typename T > struct is_empty : mpl::bool_< ::boost::detail::is_empty_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T>
struct is_object_impl
{
   static const bool value = (::boost::type_traits::ice_and< ::boost::type_traits::ice_not< ::boost::is_reference<T>::value>::value, ::boost::type_traits::ice_not< ::boost::is_void<T>::value>::value, ::boost::type_traits::ice_not< ::boost::is_function<T>::value>::value >::value);
};
}
template< typename T > struct is_object : mpl::bool_< ::boost::detail::is_object_impl<T>::value > { };
}
namespace boost {
namespace detail {
template <typename T>
struct is_stateless_impl
{
  static const bool value = (::boost::type_traits::ice_and< ::boost::has_trivial_constructor<T>::value, ::boost::has_trivial_copy<T>::value, ::boost::has_trivial_destructor<T>::value, ::boost::is_class<T>::value, ::boost::is_empty<T>::value >::value);
};
}
template< typename T > struct is_stateless : mpl::bool_< ::boost::detail::is_stateless_impl<T>::value > { };
}
namespace boost
{
template <class T1, class T2>
class compressed_pair;
namespace details
{
   template <class T1, class T2, bool IsSame, bool FirstEmpty, bool SecondEmpty>
   struct compressed_pair_switch;
   template <class T1, class T2>
   struct compressed_pair_switch<T1, T2, false, false, false>
      {static const int value = 0;};
   template <class T1, class T2>
   struct compressed_pair_switch<T1, T2, false, true, true>
      {static const int value = 3;};
   template <class T1, class T2>
   struct compressed_pair_switch<T1, T2, false, true, false>
      {static const int value = 1;};
   template <class T1, class T2>
   struct compressed_pair_switch<T1, T2, false, false, true>
      {static const int value = 2;};
   template <class T1, class T2>
   struct compressed_pair_switch<T1, T2, true, true, true>
      {static const int value = 4;};
   template <class T1, class T2>
   struct compressed_pair_switch<T1, T2, true, false, false>
      {static const int value = 5;};
   template <class T1, class T2, int Version> class compressed_pair_imp;
   using std::swap;
   template <typename T>
   inline void cp_swap(T& t1, T& t2)
   {
      swap(t1, t2);
   }
   template <class T1, class T2>
   class compressed_pair_imp<T1, T2, 0>
   {
   public:
      typedef T1 first_type;
      typedef T2 second_type;
      typedef typename call_traits<first_type>::param_type first_param_type;
      typedef typename call_traits<second_type>::param_type second_param_type;
      typedef typename call_traits<first_type>::reference first_reference;
      typedef typename call_traits<second_type>::reference second_reference;
      typedef typename call_traits<first_type>::const_reference first_const_reference;
      typedef typename call_traits<second_type>::const_reference second_const_reference;
      compressed_pair_imp() {}
      compressed_pair_imp(first_param_type x, second_param_type y)
         : first_(x), second_(y) {}
      compressed_pair_imp(first_param_type x)
         : first_(x) {}
      compressed_pair_imp(second_param_type y)
         : second_(y) {}
      first_reference first() {return first_;}
      first_const_reference first() const {return first_;}
      second_reference second() {return second_;}
      second_const_reference second() const {return second_;}
      void swap(::boost::compressed_pair<T1, T2>& y)
      {
         cp_swap(first_, y.first());
         cp_swap(second_, y.second());
      }
   private:
      first_type first_;
      second_type second_;
   };
   template <class T1, class T2>
   class compressed_pair_imp<T1, T2, 1>
      : private T1
   {
   public:
      typedef T1 first_type;
      typedef T2 second_type;
      typedef typename call_traits<first_type>::param_type first_param_type;
      typedef typename call_traits<second_type>::param_type second_param_type;
      typedef typename call_traits<first_type>::reference first_reference;
      typedef typename call_traits<second_type>::reference second_reference;
      typedef typename call_traits<first_type>::const_reference first_const_reference;
      typedef typename call_traits<second_type>::const_reference second_const_reference;
      compressed_pair_imp() {}
      compressed_pair_imp(first_param_type x, second_param_type y)
         : first_type(x), second_(y) {}
      compressed_pair_imp(first_param_type x)
         : first_type(x) {}
      compressed_pair_imp(second_param_type y)
         : second_(y) {}
      first_reference first() {return *this;}
      first_const_reference first() const {return *this;}
      second_reference second() {return second_;}
      second_const_reference second() const {return second_;}
      void swap(::boost::compressed_pair<T1,T2>& y)
      {
         cp_swap(second_, y.second());
      }
   private:
      second_type second_;
   };
   template <class T1, class T2>
   class compressed_pair_imp<T1, T2, 2>
      : private T2
   {
   public:
      typedef T1 first_type;
      typedef T2 second_type;
      typedef typename call_traits<first_type>::param_type first_param_type;
      typedef typename call_traits<second_type>::param_type second_param_type;
      typedef typename call_traits<first_type>::reference first_reference;
      typedef typename call_traits<second_type>::reference second_reference;
      typedef typename call_traits<first_type>::const_reference first_const_reference;
      typedef typename call_traits<second_type>::const_reference second_const_reference;
      compressed_pair_imp() {}
      compressed_pair_imp(first_param_type x, second_param_type y)
         : second_type(y), first_(x) {}
      compressed_pair_imp(first_param_type x)
         : first_(x) {}
      compressed_pair_imp(second_param_type y)
         : second_type(y) {}
      first_reference first() {return first_;}
      first_const_reference first() const {return first_;}
      second_reference second() {return *this;}
      second_const_reference second() const {return *this;}
      void swap(::boost::compressed_pair<T1,T2>& y)
      {
         cp_swap(first_, y.first());
      }
   private:
      first_type first_;
   };
   template <class T1, class T2>
   class compressed_pair_imp<T1, T2, 3>
      : private T1,
        private T2
   {
   public:
      typedef T1 first_type;
      typedef T2 second_type;
      typedef typename call_traits<first_type>::param_type first_param_type;
      typedef typename call_traits<second_type>::param_type second_param_type;
      typedef typename call_traits<first_type>::reference first_reference;
      typedef typename call_traits<second_type>::reference second_reference;
      typedef typename call_traits<first_type>::const_reference first_const_reference;
      typedef typename call_traits<second_type>::const_reference second_const_reference;
      compressed_pair_imp() {}
      compressed_pair_imp(first_param_type x, second_param_type y)
         : first_type(x), second_type(y) {}
      compressed_pair_imp(first_param_type x)
         : first_type(x) {}
      compressed_pair_imp(second_param_type y)
         : second_type(y) {}
      first_reference first() {return *this;}
      first_const_reference first() const {return *this;}
      second_reference second() {return *this;}
      second_const_reference second() const {return *this;}
      void swap(::boost::compressed_pair<T1,T2>&) {}
   };
   template <class T1, class T2>
   class compressed_pair_imp<T1, T2, 4>
      : private T1
   {
   public:
      typedef T1 first_type;
      typedef T2 second_type;
      typedef typename call_traits<first_type>::param_type first_param_type;
      typedef typename call_traits<second_type>::param_type second_param_type;
      typedef typename call_traits<first_type>::reference first_reference;
      typedef typename call_traits<second_type>::reference second_reference;
      typedef typename call_traits<first_type>::const_reference first_const_reference;
      typedef typename call_traits<second_type>::const_reference second_const_reference;
      compressed_pair_imp() {}
      compressed_pair_imp(first_param_type x, second_param_type)
         : first_type(x) {}
      compressed_pair_imp(first_param_type x)
         : first_type(x) {}
      first_reference first() {return *this;}
      first_const_reference first() const {return *this;}
      second_reference second() {return *this;}
      second_const_reference second() const {return *this;}
      void swap(::boost::compressed_pair<T1,T2>&) {}
   private:
   };
   template <class T1, class T2>
   class compressed_pair_imp<T1, T2, 5>
   {
   public:
      typedef T1 first_type;
      typedef T2 second_type;
      typedef typename call_traits<first_type>::param_type first_param_type;
      typedef typename call_traits<second_type>::param_type second_param_type;
      typedef typename call_traits<first_type>::reference first_reference;
      typedef typename call_traits<second_type>::reference second_reference;
      typedef typename call_traits<first_type>::const_reference first_const_reference;
      typedef typename call_traits<second_type>::const_reference second_const_reference;
      compressed_pair_imp() {}
      compressed_pair_imp(first_param_type x, second_param_type y)
         : first_(x), second_(y) {}
      compressed_pair_imp(first_param_type x)
         : first_(x), second_(x) {}
      first_reference first() {return first_;}
      first_const_reference first() const {return first_;}
      second_reference second() {return second_;}
      second_const_reference second() const {return second_;}
      void swap(::boost::compressed_pair<T1, T2>& y)
      {
         cp_swap(first_, y.first());
         cp_swap(second_, y.second());
      }
   private:
      first_type first_;
      second_type second_;
   };
}
template <class T1, class T2>
class compressed_pair
   : private ::boost::details::compressed_pair_imp<T1, T2,
             ::boost::details::compressed_pair_switch<
                    T1,
                    T2,
                    ::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
                    ::boost::is_empty<T1>::value,
                    ::boost::is_empty<T2>::value>::value>
{
private:
   typedef details::compressed_pair_imp<T1, T2,
             ::boost::details::compressed_pair_switch<
                    T1,
                    T2,
                    ::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
                    ::boost::is_empty<T1>::value,
                    ::boost::is_empty<T2>::value>::value> base;
public:
   typedef T1 first_type;
   typedef T2 second_type;
   typedef typename call_traits<first_type>::param_type first_param_type;
   typedef typename call_traits<second_type>::param_type second_param_type;
   typedef typename call_traits<first_type>::reference first_reference;
   typedef typename call_traits<second_type>::reference second_reference;
   typedef typename call_traits<first_type>::const_reference first_const_reference;
   typedef typename call_traits<second_type>::const_reference second_const_reference;
            compressed_pair() : base() {}
            compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
   explicit compressed_pair(first_param_type x) : base(x) {}
   explicit compressed_pair(second_param_type y) : base(y) {}
   first_reference first() {return base::first();}
   first_const_reference first() const {return base::first();}
   second_reference second() {return base::second();}
   second_const_reference second() const {return base::second();}
   void swap(compressed_pair& y) { base::swap(y); }
};
template <class T>
class compressed_pair<T, T>
   : private details::compressed_pair_imp<T, T,
             ::boost::details::compressed_pair_switch<
                    T,
                    T,
                    ::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
                    ::boost::is_empty<T>::value,
                    ::boost::is_empty<T>::value>::value>
{
private:
   typedef details::compressed_pair_imp<T, T,
             ::boost::details::compressed_pair_switch<
                    T,
                    T,
                    ::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
                    ::boost::is_empty<T>::value,
                    ::boost::is_empty<T>::value>::value> base;
public:
   typedef T first_type;
   typedef T second_type;
   typedef typename call_traits<first_type>::param_type first_param_type;
   typedef typename call_traits<second_type>::param_type second_param_type;
   typedef typename call_traits<first_type>::reference first_reference;
   typedef typename call_traits<second_type>::reference second_reference;
   typedef typename call_traits<first_type>::const_reference first_const_reference;
   typedef typename call_traits<second_type>::const_reference second_const_reference;
            compressed_pair() : base() {}
            compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
   explicit
      compressed_pair(first_param_type x) : base(x) {}
   first_reference first() {return base::first();}
   first_const_reference first() const {return base::first();}
   second_reference second() {return base::second();}
   second_const_reference second() const {return base::second();}
   void swap(::boost::compressed_pair<T,T>& y) { base::swap(y); }
};
template <class T1, class T2>
inline
void
swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
{
   x.swap(y);
}
}
namespace boost { namespace spirit {
    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;
    };
    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;
    };
}}
namespace boost { namespace spirit {
    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& ) const {}
    };
    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();
    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;
    };
    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); }
    };
    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
    {
        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() {}
    };
    const inhibit_case_parser_gen nocase_d = inhibit_case_parser_gen();
    const inhibit_case_parser_gen as_lower_d = inhibit_case_parser_gen();
    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;
    };
    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);
        }
        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();
    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())
                {
                    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);
        }
        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();
    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.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_); }
    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.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_); }
    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.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_); }
}}
#include <cmath>
namespace boost { namespace spirit {
    struct sign_parser;
    namespace impl
    {
        template <typename ScannerT>
        bool
        extract_sign(ScannerT const& scan, std::size_t& count)
        {
            count = 0;
            bool neg = *scan == '-';
            if (neg || (*scan == '+'))
            {
                ++scan;
                ++count;
                return neg;
            }
            return false;
        }
        template<const int Radix>
        struct radix_traits;
        template<>
        struct radix_traits<2>
        {
            template<typename CharT>
            static bool is_valid(CharT ch)
            {
                return ('0' == ch || '1' == ch);
            }
            template<typename CharT>
            static int digit(CharT ch)
            {
                return ch - '0';
            }
        };
        template<>
        struct radix_traits<8>
        {
            template<typename CharT>
            static bool is_valid(CharT ch)
            {
                return ('0' <= ch && ch <= '7');
            }
            template<typename CharT>
            static int digit(CharT ch)
            {
                return ch - '0';
            }
        };
        template<>
        struct radix_traits<10>
        {
            template<typename CharT>
            static bool is_valid(CharT ch)
            {
                return impl::isdigit_(ch);
            }
            template<typename CharT>
            static int digit(CharT ch)
            {
                return ch - '0';
            }
        };
        template<>
        struct radix_traits<16>
        {
            template<typename CharT>
            static bool is_valid(CharT ch)
            {
                return impl::isxdigit_(ch);
            }
            template<typename CharT>
            static int digit(CharT ch)
            {
                if (impl::isdigit_(ch))
                    return ch - '0';
                return impl::tolower_(ch) - 'a' + 10;
            }
        };
        template <int Radix>
        struct positive_accumulate
        {
            template <typename T>
            static bool check(T const& n, T const& prev)
            {
                return n < prev;
            }
            template <typename T, typename CharT>
            static void add(T& n, CharT ch)
            {
                n += radix_traits<Radix>::digit(ch);
            }
        };
        template <int Radix>
        struct negative_accumulate
        {
            template <typename T>
            static bool check(T const& n, T const& prev)
            {
                return n > prev;
            }
            template <typename T, typename CharT>
            static void add(T& n, CharT ch)
            {
                n -= radix_traits<Radix>::digit(ch);
            }
        };
        template <int Radix, typename Accumulate>
        struct extract_int_base
        {
            template <typename ScannerT, typename T>
            static bool
            f(ScannerT& scan, T& n)
            {
                T prev = n;
                n *= Radix;
                if (Accumulate::check(n, prev))
                    return false;
                prev = n;
                Accumulate::add(n, *scan);
                if (Accumulate::check(n, prev))
                    return false;
                return true;
            }
        };
        template <bool Bounded>
        struct extract_int_
        {
            template <
                int Radix,
                unsigned MinDigits,
                int MaxDigits,
                typename Accumulate
            >
            struct apply
            {
                typedef extract_int_base<Radix, Accumulate> base;
                typedef radix_traits<Radix> check;
                template <typename ScannerT, typename T>
                static bool
                f(ScannerT& scan, T& n, std::size_t& count)
                {
                    std::size_t i = 0;
                    for (; (i < MaxDigits) && !scan.at_end()
                        && check::is_valid(*scan);
                        ++i, ++scan, ++count)
                    {
                        if (!base::f(scan, n))
                            return false;
                    }
                    return i >= MinDigits;
                }
            };
        };
        template <>
        struct extract_int_<false>
        {
            template <
                int Radix,
                unsigned MinDigits,
                int MaxDigits,
                typename Accumulate
            >
            struct apply
            {
                typedef extract_int_base<Radix, Accumulate> base;
                typedef radix_traits<Radix> check;
                template <typename ScannerT, typename T>
                static bool
                f(ScannerT& scan, T& n, std::size_t& count)
                {
                    std::size_t i = 0;
                    for (; !scan.at_end() && check::is_valid(*scan);
                        ++i, ++scan, ++count)
                    {
                        if (!base::f(scan, n))
                            return false;
                    }
                    return i >= MinDigits;
                }
            };
        };
        template <
            int Radix, unsigned MinDigits, int MaxDigits,
            typename Accumulate = positive_accumulate<Radix>
        >
        struct extract_int
        {
            template <typename ScannerT, typename T>
            static bool
            f(ScannerT& scan, T& n, std::size_t& count)
            {
                return extract_int_<(MaxDigits >= 0)>::template
                    apply<Radix, MinDigits, MaxDigits, Accumulate>::
                        f(scan, n, count);
            }
        };
        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>::
                        f(scan, n, count))
                    {
                        return scan.create_match(count, n, save, scan.first);
                    }
                }
                return scan.no_match();
            }
        };
        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<Radix> > extract_int_neg_t;
                typedef extract_int<Radix, MinDigits, MaxDigits>
                    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 scan.no_match();
            }
        };
        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))
                {
                    if (RT hit = RealPoliciesT::parse_frac_n(scan))
                    {
                        hit.value(hit.value()
                            * std::
                                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
                {
                    if (!got_a_number)
                        return scan.no_match();
                    e_hit = RealPoliciesT::parse_exp(scan);
                    if (RealPoliciesT::expect_dot && !e_hit)
                        return scan.no_match();
                }
                if (e_hit)
                {
                    if (RT e_n_hit = RealPoliciesT::parse_exp_n(scan))
                    {
                        n *= std::
                            pow(T(10), T(e_n_hit.value()));
                        count += e_n_hit.length() + e_hit.length();
                    }
                    else
                    {
                        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);
            }
        };
    }
}}
namespace boost { namespace spirit
{
    template <
        typename T = unsigned,
        int Radix = 10,
        unsigned MinDigits = 1,
        int MaxDigits = -1
    >
    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);
        }
    };
    template <
        typename T = unsigned,
        int Radix = 10,
        unsigned MinDigits = 1,
        int MaxDigits = -1
    >
    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);
        }
    };
    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>();
    namespace impl
    {
        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();
    template <typename T>
    struct ureal_parser_policies
    {
        static const bool allow_leading_dot = true;
        static const bool allow_trailing_dot = true;
        static const 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);
        }
    };
    template <
        typename T = double,
        typename RealPoliciesT = ureal_parser_policies<T>
    >
    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<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> >();
    template <typename T>
    struct strict_ureal_parser_policies : public ureal_parser_policies<T>
    {
        static const bool expect_dot = true;
    };
    template <typename T>
    struct strict_real_parser_policies : public real_parser_policies<T>
    {
        static const 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> >();
}}
namespace boost
{
    namespace spirit
    {
    struct default_parser_context_base
    {
        template <typename DerivedT>
        struct aux {};
    };
    struct parser_context_base {};
    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; }
    };
    template <typename ContextT, typename DerivedT>
    struct context_aux : public ContextT::base_t::template aux<DerivedT> {};
    template<typename ScannerT>
    struct parser_scanner_linker : public ScannerT
    {
        parser_scanner_linker(ScannerT const scan_) : ScannerT(scan_) {}
    };
    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); }
    };
    }
}
namespace boost { namespace spirit {
    template <typename FirstT, typename RestT>
    struct subrule_list;
    template <int ID, typename DefT, typename ContextT>
    struct subrule_parser;
    namespace impl {
        template <int N, typename ListT>
        struct get_subrule
        {
            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> >
        {
            typedef DefT type;
        };
        template <int ID>
        struct get_subrule<ID, nil_t>
        {
            typedef nil_t type;
        };
        template <typename T1, typename T2>
        struct get_result_t {
            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
        {
            static const 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);
            }
        };
}}}
namespace boost { namespace spirit {
    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<
                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<
                typename
                    rebind_scanner_iterator<ScannerT, IteratorT>::type,
                ListT>
            subrules_scanner_t;
            return subrules_scanner_t(
                    ScannerT::change_iterator(first, last),
                    list);
        }
        ListT const& list;
    };
    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;
    };
    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;
    };
    template <int ID, typename ContextT = parser_context<> >
    struct subrule;
    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;
        static const 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
        {
            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;
    };
    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;
        static const 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;
            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);;
        }
        template <typename DefT>
        subrule_parser<ID, DefT, ContextT>
        operator=(parser<DefT> const& rhs) const
        {
            return subrule_parser<ID, DefT, ContextT>(*this, rhs.derived());
        }
    private:
        subrule& operator=(subrule const&);
        template <int ID2, typename ContextT2>
        subrule& operator=(subrule<ID2, ContextT2> const&);
    };
}}
typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( 1 > 0 ) >)> boost_static_assert_typedef_30;
#include <assert.h>
namespace boost
{
template<class T> inline void checked_delete(T * x)
{
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x;
}
template<class T> inline void checked_array_delete(T * x)
{
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete [] x;
}
template<class T> struct checked_deleter
{
    typedef void result_type;
    typedef T * argument_type;
    void operator()(T * x) const
    {
        boost::checked_delete(x);
    }
};
template<class T> struct checked_array_deleter
{
    typedef void result_type;
    typedef T * argument_type;
    void operator()(T * x) const
    {
        boost::checked_array_delete(x);
    }
};
}
namespace boost
{
template<class T> class scoped_ptr
{
private:
    T * ptr;
    scoped_ptr(scoped_ptr const &);
    scoped_ptr & operator=(scoped_ptr const &);
    typedef scoped_ptr<T> this_type;
public:
    typedef T element_type;
    explicit scoped_ptr(T * p = 0): ptr(p)
    {
    }
    explicit scoped_ptr(std::auto_ptr<T> p): ptr(p.release())
    {
    }
    ~scoped_ptr()
    {
        boost::checked_delete(ptr);
    }
    void reset(T * p = 0)
    {
        ((void)0);
        this_type(p).swap(*this);
    }
    T & operator*() const
    {
        ((void)0);
        return *ptr;
    }
    T * operator->() const
    {
        ((void)0);
        return ptr;
    }
    T * get() const
    {
        return ptr;
    }
    typedef T * this_type::*unspecified_bool_type;
    operator unspecified_bool_type() const
    {
        return ptr == 0? 0: &this_type::ptr;
    }
    bool operator! () const
    {
        return ptr == 0;
    }
    void swap(scoped_ptr & b)
    {
        T * tmp = b.ptr;
        b.ptr = ptr;
        ptr = tmp;
    }
};
template<class T> inline void swap(scoped_ptr<T> & a, scoped_ptr<T> & b)
{
    a.swap(b);
}
template<class T> inline T * get_pointer(scoped_ptr<T> const & p)
{
    return p.get();
}
}
namespace boost { namespace spirit {
    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;
        };
        template <
            typename DerivedT
          , typename EmbedT
          , typename T0 = nil_t
          , typename T1 = nil_t
          , typename T2 = nil_t
        >
        class rule_base;
        class rule_base_access
        {
            template <
                typename DerivedT
              , typename EmbedT
              , typename T0
              , typename T1
              , typename T2
            >
           friend class rule_base;
            template <typename RuleT>
            static typename RuleT::abstract_parser_t*
            get(RuleT const& r)
            {
                return r.get();
            }
        };
        template <
            typename DerivedT
          , typename EmbedT
          , typename T0
          , typename T1
          , typename T2
        >
        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;
                linked_scanner_t scan_wrap(scan); linked_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);;
            }
            template <typename ScannerT>
            typename parser_result<DerivedT, ScannerT>::type
            parse_main(ScannerT const& scan) const
            {
                typename parser_result<DerivedT, ScannerT>::type hit;
                DerivedT const * derivedThis =
                    static_cast<DerivedT const *>(this);
                if (rule_base_access::get(*derivedThis))
                {
                    typename ScannerT::iterator_t s(scan.first);
                    hit = rule_base_access::get(*derivedThis)
                            ->do_parse_virtual(scan);
                    scan.group_match(hit, this->id(), s, scan.first);
                }
                else
                {
                    hit = scan.no_match();
                }
                return hit;
            }
        };
        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;
        };
        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;
        };
    }
}}
namespace boost { namespace spirit {
    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 const* ptr)
        : ptr(ptr) {}
        scoped_ptr<abstract_parser_t> ptr;
    };
}}
#include <assert.h>
#include <pthread.h>
namespace boost
{
namespace detail
{
class lightweight_mutex
{
private:
    pthread_mutex_t m_;
    lightweight_mutex(lightweight_mutex const &);
    lightweight_mutex & operator=(lightweight_mutex const &);
public:
    lightweight_mutex()
    {
        pthread_mutex_init(&m_, 0);
    }
    ~lightweight_mutex()
    {
        pthread_mutex_destroy(&m_);
    }
    class scoped_lock;
    friend class scoped_lock;
    class scoped_lock
    {
    private:
        pthread_mutex_t & m_;
        scoped_lock(scoped_lock const &);
        scoped_lock & operator=(scoped_lock const &);
    public:
        scoped_lock(lightweight_mutex & m): m_(m.m_)
        {
            pthread_mutex_lock(&m_);
        }
        ~scoped_lock()
        {
            pthread_mutex_unlock(&m_);
        }
    };
};
}
}
namespace boost
{
class bad_weak_ptr: public std::exception
{
public:
    virtual char const * what() const throw()
    {
        return "boost::bad_weak_ptr";
    }
};
namespace detail
{
class sp_counted_base
{
private:
    typedef detail::lightweight_mutex mutex_type;
public:
    sp_counted_base(): use_count_(1), weak_count_(1)
    {
    }
    virtual ~sp_counted_base()
    {
    }
    virtual void dispose() = 0;
    virtual void destruct()
    {
        delete this;
    }
    virtual void * get_deleter(std::type_info const & ti) = 0;
    void add_ref_copy()
    {
        mutex_type::scoped_lock lock(mtx_);
        ++use_count_;
    }
    void add_ref_lock()
    {
        mutex_type::scoped_lock lock(mtx_);
        if(use_count_ == 0) boost::throw_exception(boost::bad_weak_ptr());
        ++use_count_;
    }
    void release()
    {
        {
            mutex_type::scoped_lock lock(mtx_);
            long new_use_count = --use_count_;
            if(new_use_count != 0) return;
        }
        dispose();
        weak_release();
    }
    void weak_add_ref()
    {
        mutex_type::scoped_lock lock(mtx_);
        ++weak_count_;
    }
    void weak_release()
    {
        long new_weak_count;
        {
            mutex_type::scoped_lock lock(mtx_);
            new_weak_count = --weak_count_;
        }
        if(new_weak_count == 0)
        {
            destruct();
        }
    }
    long use_count() const
    {
        mutex_type::scoped_lock lock(mtx_);
        return use_count_;
    }
private:
    sp_counted_base(sp_counted_base const &);
    sp_counted_base & operator= (sp_counted_base const &);
    long use_count_;
    long weak_count_;
    mutable mutex_type mtx_;
};
template<class P, class D> class sp_counted_base_impl: public sp_counted_base
{
private:
    P ptr;
    D del;
    sp_counted_base_impl(sp_counted_base_impl const &);
    sp_counted_base_impl & operator= (sp_counted_base_impl const &);
    typedef sp_counted_base_impl<P, D> this_type;
public:
    sp_counted_base_impl(P p, D d): ptr(p), del(d)
    {
    }
    virtual void dispose()
    {
        del(ptr);
    }
    virtual void * get_deleter(std::type_info const & ti)
    {
        return ti == typeid(D)? &del: 0;
    }
};
class weak_count;
class shared_count
{
private:
    sp_counted_base * pi_;
    friend class weak_count;
public:
    shared_count(): pi_(0)
    {
    }
    template<class P, class D> shared_count(P p, D d): pi_(0)
    {
        try
        {
            pi_ = new sp_counted_base_impl<P, D>(p, d);
        }
        catch(...)
        {
            d(p);
            throw;
        }
    }
    template<class Y>
    explicit shared_count(std::auto_ptr<Y> & r): pi_(new sp_counted_base_impl< Y *, checked_deleter<Y> >(r.get(), checked_deleter<Y>()))
    {
        r.release();
    }
    ~shared_count()
    {
        if(pi_ != 0) pi_->release();
    }
    shared_count(shared_count const & r): pi_(r.pi_)
    {
        if(pi_ != 0) pi_->add_ref_copy();
    }
    explicit shared_count(weak_count const & r);
    shared_count & operator= (shared_count const & r)
    {
        sp_counted_base * tmp = r.pi_;
        if(tmp != 0) tmp->add_ref_copy();
        if(pi_ != 0) pi_->release();
        pi_ = tmp;
        return *this;
    }
    void swap(shared_count & r)
    {
        sp_counted_base * tmp = r.pi_;
        r.pi_ = pi_;
        pi_ = tmp;
    }
    long use_count() const
    {
        return pi_ != 0? pi_->use_count(): 0;
    }
    bool unique() const
    {
        return use_count() == 1;
    }
    friend inline bool operator==(shared_count const & a, shared_count const & b)
    {
        return a.pi_ == b.pi_;
    }
    friend inline bool operator<(shared_count const & a, shared_count const & b)
    {
        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
    }
    void * get_deleter(std::type_info const & ti) const
    {
        return pi_? pi_->get_deleter(ti): 0;
    }
};
class weak_count
{
private:
    sp_counted_base * pi_;
    friend class shared_count;
public:
    weak_count(): pi_(0)
    {
    }
    weak_count(shared_count const & r): pi_(r.pi_)
    {
        if(pi_ != 0) pi_->weak_add_ref();
    }
    weak_count(weak_count const & r): pi_(r.pi_)
    {
        if(pi_ != 0) pi_->weak_add_ref();
    }
    ~weak_count()
    {
        if(pi_ != 0) pi_->weak_release();
    }
    weak_count & operator= (shared_count const & r)
    {
        sp_counted_base * tmp = r.pi_;
        if(tmp != 0) tmp->weak_add_ref();
        if(pi_ != 0) pi_->weak_release();
        pi_ = tmp;
        return *this;
    }
    weak_count & operator= (weak_count const & r)
    {
        sp_counted_base * tmp = r.pi_;
        if(tmp != 0) tmp->weak_add_ref();
        if(pi_ != 0) pi_->weak_release();
        pi_ = tmp;
        return *this;
    }
    void swap(weak_count & r)
    {
        sp_counted_base * tmp = r.pi_;
        r.pi_ = pi_;
        pi_ = tmp;
    }
    long use_count() const
    {
        return pi_ != 0? pi_->use_count(): 0;
    }
    friend inline bool operator==(weak_count const & a, weak_count const & b)
    {
        return a.pi_ == b.pi_;
    }
    friend inline bool operator<(weak_count const & a, weak_count const & b)
    {
        return std::less<sp_counted_base *>()(a.pi_, b.pi_);
    }
};
inline shared_count::shared_count(weak_count const & r): pi_(r.pi_)
{
    if(pi_ != 0)
    {
        pi_->add_ref_lock();
    }
    else
    {
        boost::throw_exception(boost::bad_weak_ptr());
    }
}
}
}
namespace boost
{
template<class T> class weak_ptr;
template<class T> class enable_shared_from_this;
namespace detail
{
struct static_cast_tag {};
struct const_cast_tag {};
struct dynamic_cast_tag {};
struct polymorphic_cast_tag {};
template<class T> struct shared_ptr_traits
{
    typedef T & reference;
};
template<> struct shared_ptr_traits<void>
{
    typedef void reference;
};
template<> struct shared_ptr_traits<void const>
{
    typedef void reference;
};
template<> struct shared_ptr_traits<void volatile>
{
    typedef void reference;
};
template<> struct shared_ptr_traits<void const volatile>
{
    typedef void reference;
};
template<class T, class Y> void sp_enable_shared_from_this(boost::enable_shared_from_this<T> * pe, Y * px, shared_count const & pn)
{
    if(pe != 0) pe->_internal_weak_this._internal_assign(px, pn);
}
inline void sp_enable_shared_from_this(void const volatile *, void const volatile *, shared_count const &)
{
}
}
template<class T> class shared_ptr
{
private:
    typedef shared_ptr<T> this_type;
public:
    typedef T element_type;
    typedef T value_type;
    typedef T * pointer;
    typedef typename detail::shared_ptr_traits<T>::reference reference;
    shared_ptr(): px(0), pn()
    {
    }
    template<class Y>
    explicit shared_ptr(Y * p): px(p), pn(p, checked_deleter<Y>())
    {
        detail::sp_enable_shared_from_this(p, p, pn);
    }
    template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)
    {
        detail::sp_enable_shared_from_this(p, p, pn);
    }
    shared_ptr & operator=(shared_ptr const & r)
    {
        px = r.px;
        pn = r.pn;
        return *this;
    }
    template<class Y>
    explicit shared_ptr(weak_ptr<Y> const & r): pn(r.pn)
    {
        px = r.px;
    }
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn)
    {
    }
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, detail::static_cast_tag): px(static_cast<element_type *>(r.px)), pn(r.pn)
    {
    }
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, detail::const_cast_tag): px(const_cast<element_type *>(r.px)), pn(r.pn)
    {
    }
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, detail::dynamic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
    {
        if(px == 0)
        {
            pn = detail::shared_count();
        }
    }
    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, detail::polymorphic_cast_tag): px(dynamic_cast<element_type *>(r.px)), pn(r.pn)
    {
        if(px == 0)
        {
            boost::throw_exception(std::bad_cast());
        }
    }
    template<class Y>
    explicit shared_ptr(std::auto_ptr<Y> & r): px(r.get()), pn()
    {
        Y * tmp = r.get();
        pn = detail::shared_count(r);
        detail::sp_enable_shared_from_this(tmp, tmp, pn);
    }
    template<class Y>
    shared_ptr & operator=(shared_ptr<Y> const & r)
    {
        px = r.px;
        pn = r.pn;
        return *this;
    }
    template<class Y>
    shared_ptr & operator=(std::auto_ptr<Y> & r)
    {
        this_type(r).swap(*this);
        return *this;
    }
    void reset()
    {
        this_type().swap(*this);
    }
    template<class Y> void reset(Y * p)
    {
        ((void)0);
        this_type(p).swap(*this);
    }
    template<class Y, class D> void reset(Y * p, D d)
    {
        this_type(p, d).swap(*this);
    }
    reference operator* () const
    {
        ((void)0);
        return *px;
    }
    T * operator-> () const
    {
        ((void)0);
        return px;
    }
    T * get() const
    {
        return px;
    }
    typedef T * this_type::*unspecified_bool_type;
    operator unspecified_bool_type() const
    {
        return px == 0? 0: &this_type::px;
    }
    bool operator! () const
    {
        return px == 0;
    }
    bool unique() const
    {
        return pn.unique();
    }
    long use_count() const
    {
        return pn.use_count();
    }
    void swap(shared_ptr<T> & other)
    {
        std::swap(px, other.px);
        pn.swap(other.pn);
    }
    template<class Y> bool _internal_less(shared_ptr<Y> const & rhs) const
    {
        return pn < rhs.pn;
    }
    void * _internal_get_deleter(std::type_info const & ti) const
    {
        return pn.get_deleter(ti);
    }
private:
    template<class Y> friend class shared_ptr;
    template<class Y> friend class weak_ptr;
    T * px;
    detail::shared_count pn;
};
template<class T, class U> inline bool operator==(shared_ptr<T> const & a, shared_ptr<U> const & b)
{
    return a.get() == b.get();
}
template<class T, class U> inline bool operator!=(shared_ptr<T> const & a, shared_ptr<U> const & b)
{
    return a.get() != b.get();
}
template<class T, class U> inline bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b)
{
    return a._internal_less(b);
}
template<class T> inline void swap(shared_ptr<T> & a, shared_ptr<T> & b)
{
    a.swap(b);
}
template<class T, class U> shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::static_cast_tag());
}
template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::const_cast_tag());
}
template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::dynamic_cast_tag());
}
template<class T, class U> shared_ptr<T> shared_static_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::static_cast_tag());
}
template<class T, class U> shared_ptr<T> shared_dynamic_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::dynamic_cast_tag());
}
template<class T, class U> shared_ptr<T> shared_polymorphic_cast(shared_ptr<U> const & r)
{
    return shared_ptr<T>(r, detail::polymorphic_cast_tag());
}
template<class T, class U> shared_ptr<T> shared_polymorphic_downcast(shared_ptr<U> const & r)
{
    ((void)0);
    return shared_static_cast<T>(r);
}
template<class T> inline T * get_pointer(shared_ptr<T> const & p)
{
    return p.get();
}
template<class E, class T, class Y> std::basic_ostream<E, T> & operator<< (std::basic_ostream<E, T> & os, shared_ptr<Y> const & p)
{
    os << p.get();
    return os;
}
template<class D, class T> D * get_deleter(shared_ptr<T> const & p)
{
    return static_cast<D *>(p._internal_get_deleter(typeid(D)));
}
}
namespace boost { namespace spirit {
    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()) {}
            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:
            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())
            {}
            self_t &operator = (self_t const &other)
            {
                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()
        {
            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)
        {
            if (max_id == id)
                max_id--;
            else
                free_ids.push_back(id);
        }
        template <typename TagT, typename IdT>
        inline IdT
        object_with_id_base<TagT, IdT>::acquire_object_id()
        {
            {
                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);
        }
    }
}}
namespace boost
{
template<class T> class weak_ptr
{
private:
    typedef weak_ptr<T> this_type;
public:
    typedef T element_type;
    weak_ptr(): px(0), pn()
    {
    }
    template<class Y>
    weak_ptr(weak_ptr<Y> const & r): pn(r.pn)
    {
        px = r.lock().get();
    }
    template<class Y>
    weak_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn)
    {
    }
    template<class Y>
    weak_ptr & operator=(weak_ptr<Y> const & r)
    {
        px = r.lock().get();
        pn = r.pn;
        return *this;
    }
    template<class Y>
    weak_ptr & operator=(shared_ptr<Y> const & r)
    {
        px = r.px;
        pn = r.pn;
        return *this;
    }
    shared_ptr<T> lock() const
    {
        if(expired())
        {
            return shared_ptr<element_type>();
        }
        try
        {
            return shared_ptr<element_type>(*this);
        }
        catch(bad_weak_ptr const &)
        {
            return shared_ptr<element_type>();
        }
    }
    long use_count() const
    {
        return pn.use_count();
    }
    bool expired() const
    {
        return pn.use_count() == 0;
    }
    void reset()
    {
        this_type().swap(*this);
    }
    void swap(this_type & other)
    {
        std::swap(px, other.px);
        pn.swap(other.pn);
    }
    void _internal_assign(T * px2, detail::shared_count const & pn2)
    {
        px = px2;
        pn = pn2;
    }
    template<class Y> bool _internal_less(weak_ptr<Y> const & rhs) const
    {
        return pn < rhs.pn;
    }
private:
    template<class Y> friend class weak_ptr;
    template<class Y> friend class shared_ptr;
    T * px;
    detail::weak_count pn;
};
template<class T, class U> inline bool operator<(weak_ptr<T> const & a, weak_ptr<U> const & b)
{
    return a._internal_less(b);
}
template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b)
{
    a.swap(b);
}
template<class T> shared_ptr<T> make_shared(weak_ptr<T> const & r)
{
    return r.lock();
}
}
namespace boost { namespace spirit {
template <typename DerivedT, typename ContextT>
struct grammar;
template <typename GrammarT, typename ScannerT>
struct grammar_definition
{
    typedef typename GrammarT::template definition<ScannerT> type;
};
    namespace impl
    {
    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)
        {
        }
        grammar_helper_list& operator=(grammar_helper_list const& x)
        {
            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(); }
    private:
        vector_t helpers;
    };
    struct grammartract_helper_list;
    struct grammartract_helper_list
    {
        template<typename GrammarT>
        static grammar_helper_list<GrammarT>&
        do_(GrammarT const* g)
        {
            return g->helpers;
        }
    };
    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 =
                grammartract_helper_list::do_(target_grammar);
            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()));
            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;
    };
    template<typename DerivedT, typename ContextT, typename ScannerT>
    inline typename DerivedT::template definition<ScannerT> &
    get_definition(grammar<DerivedT, ContextT> const* self)
    {
        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;
        static ptr_t helper;
        if (!boost::make_shared(helper).get())
            new helper_t(helper);
        return boost::make_shared(helper)->define(self);
    }
    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);
        }
    };
    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)
    {
        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 =
            grammartract_helper_list::do_(self);
        std::for_each(helpers.rbegin(), helpers.rend(),
            std::bind2nd(std::mem_fun(&helper_base_t::undefine), self));
    }
    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 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;
        };
        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;
            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);
        }
    private:
        DerivedT const &target_grammar;
    };
    }
}}
namespace boost { namespace spirit {
template <typename DerivedT, typename ContextT = parser_context<> >
struct grammar
    : public parser<DerivedT>
    , public ContextT::base_t
    , public context_aux<ContextT, DerivedT>
    , public impl::object_with_id<impl::grammar_tag>
{
    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;
        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);
    }
    template <int N>
    impl::entry_grammar<DerivedT, N, ContextT>
    use_parser() const
    { return impl::entry_grammar<DerivedT, N, ContextT>( this->derived()); }
    private: friend struct impl::grammartract_helper_list; mutable impl::grammar_helper_list<self_t> helpers;
};
}}
namespace boost { namespace spirit {
    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();
            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;
    };
}}
namespace boost { namespace spirit {
    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 {};
}}
namespace boost { namespace spirit {
    struct sequence_parser_gen;
    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();
        }
    };
    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<typename as_parser<A>::type,
                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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    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;
            {
                iterator_t save = scan.first;
                if (result_t ma = this->left().parse(scan))
                {
                    save = scan.first;
                    if (result_t mb = this->right().parse(scan))
                    {
                        scan.concat_match(ma, mb);
                        return ma;
                    }
                    else
                    {
                        scan.first = save;
                        return ma;
                    }
                }
                scan.first = save;
            }
            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<typename as_parser<A>::type,
                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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    struct alternative_parser_gen;
    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;
            {
                iterator_t save = scan.first;
                if (result_t hit = this->left().parse(scan))
                    return hit;
                scan.first = save;
            }
            return this->right().parse(scan);
        }
    };
    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<typename as_parser<A>::type,
                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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    struct difference_parser_gen;
    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();
        }
    };
    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<typename as_parser<A>::type,
                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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    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.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<typename as_parser<A>::type,
                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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    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<typename as_parser<A>::type,
                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);
}}
namespace boost { namespace spirit {
    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());
    }
}}
namespace boost { namespace spirit {
    struct kleene_star_parser_gen;
    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;
                }
            }
        }
    };
    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);
}}
namespace boost { namespace spirit {
    template <typename S>
    inline kleene_star<S>
    operator*(parser<S> const& a)
    {
        return kleene_star<S>(a.derived());
    }
}}
namespace boost { namespace spirit {
    struct positive_parser_gen;
    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;
        }
    };
    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);
}}
namespace boost { namespace spirit {
    template <typename S>
    inline positive<S>
    operator+(parser<S> const& a)
    {
        return positive<S>(a.derived());
    }
}}
namespace boost { namespace spirit {
    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);
}}
namespace boost { namespace spirit {
    template <typename S>
    optional<S>
    operator!(parser<S> const& a)
    {
        return optional<S>(a.derived());
    }
}}
namespace boost { namespace spirit {
    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);
}}
namespace boost { namespace spirit {
    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);
    }
}}
namespace boost { namespace spirit {
namespace impl
{
    struct parser_type_traits_base {
        static const bool is_alternative = false;
        static const bool is_sequence = false;
        static const bool is_sequential_or = false;
        static const bool is_intersection = false;
        static const bool is_difference = false;
        static const bool is_exclusive_or = false;
        static const bool is_optional = false;
        static const bool is_kleene_star = false;
        static const bool is_positive = false;
    };
    template <typename ParserT>
    struct parser_type_traits : public parser_type_traits_base {
    };
    template <typename A, typename B>
    struct parser_type_traits<alternative<A, B> >
    : public parser_type_traits_base {
        static const bool is_alternative = true;
    };
    template <typename A, typename B>
    struct parser_type_traits<sequence<A, B> >
    : public parser_type_traits_base {
        static const bool is_sequence = true;
    };
    template <typename A, typename B>
    struct parser_type_traits<sequential_or<A, B> >
    : public parser_type_traits_base {
        static const bool is_sequential_or = true;
    };
    template <typename A, typename B>
    struct parser_type_traits<intersection<A, B> >
    : public parser_type_traits_base {
        static const bool is_intersection = true;
    };
    template <typename A, typename B>
    struct parser_type_traits<difference<A, B> >
    : public parser_type_traits_base {
        static const bool is_difference = true;
    };
    template <typename A, typename B>
    struct parser_type_traits<exclusive_or<A, B> >
    : public parser_type_traits_base {
        static const bool is_exclusive_or = true;
    };
    template <typename S>
    struct parser_type_traits<optional<S> >
    : public parser_type_traits_base {
        static const bool is_optional = true;
    };
    template <typename S>
    struct parser_type_traits<kleene_star<S> >
    : public parser_type_traits_base {
        static const bool is_kleene_star = true;
    };
    template <typename S>
    struct parser_type_traits<positive<S> >
    : public parser_type_traits_base {
        static const bool is_positive = true;
    };
}
}}
namespace boost { namespace spirit {
template <typename T>
struct is_parser
{
    static const bool value = (::boost::is_base_and_derived<parser<T>, T>::value);
};
template <typename UnaryT>
struct is_unary_composite {
    static const bool value = (::boost::is_convertible< typename UnaryT::parser_category_t, unary_parser_category>::value);
};
template <typename ActionT>
struct is_action_parser {
    static const bool value = (::boost::is_convertible< typename ActionT::parser_category_t, action_parser_category>::value);
};
template <typename BinaryT>
struct is_binary_composite {
    static const bool value = (::boost::is_convertible< typename BinaryT::parser_category_t, binary_parser_category>::value);
};
template <typename CompositeT>
struct is_composite_parser {
    static const bool value = ( ::boost::spirit::is_unary_composite<CompositeT>::value || ::boost::spirit::is_binary_composite<CompositeT>::value);
};
template <typename ParserT>
struct is_alternative {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_alternative);
};
template <typename ParserT>
struct is_sequence {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_sequence);
};
template <typename ParserT>
struct is_sequential_or {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_sequential_or);
};
template <typename ParserT>
struct is_intersection {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_intersection);
};
template <typename ParserT>
struct is_difference {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_difference);
};
template <typename ParserT>
struct is_exclusive_or {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_exclusive_or);
};
template <typename ParserT>
struct is_optional {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_optional);
};
template <typename ParserT>
struct is_kleene_star {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_kleene_star);
};
template <typename ParserT>
struct is_positive {
    static const bool value = ( ::boost::spirit::impl::parser_type_traits<ParserT>::is_positive);
};
template <typename UnaryT>
struct unary_subject {
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_unary_composite<UnaryT>::value ) >)> boost_static_assert_typedef_183;
    typedef typename UnaryT::subject_t type;
};
template <typename UnaryT>
inline typename unary_subject<UnaryT>::type const &
get_unary_subject(UnaryT const &unary_)
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_unary_composite<UnaryT>::value ) >)> boost_static_assert_typedef_199;
    return unary_.subject();
}
template <typename BinaryT>
struct binary_left_subject {
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_binary_composite<BinaryT>::value ) >)> boost_static_assert_typedef_215;
    typedef typename BinaryT::left_t type;
};
template <typename BinaryT>
struct binary_right_subject {
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_binary_composite<BinaryT>::value ) >)> boost_static_assert_typedef_222;
    typedef typename BinaryT::right_t type;
};
template <typename BinaryT>
inline typename binary_left_subject<BinaryT>::type const &
get_binary_left_subject(BinaryT const &binary_)
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_binary_composite<BinaryT>::value ) >)> boost_static_assert_typedef_239;
    return binary_.left();
}
template <typename BinaryT>
inline typename binary_right_subject<BinaryT>::type const &
get_binary_right_subject(BinaryT const &binary_)
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_binary_composite<BinaryT>::value ) >)> boost_static_assert_typedef_247;
    return binary_.right();
}
template <typename ActionT>
struct action_subject {
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_action_parser<ActionT>::value ) >)> boost_static_assert_typedef_262;
    typedef typename ActionT::subject_t type;
};
template <typename ActionT>
inline typename action_subject<ActionT>::type const &
get_action_subject(ActionT const &action_)
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_action_parser<ActionT>::value ) >)> boost_static_assert_typedef_278;
    return action_.subject();
}
template <typename ActionT>
struct semantic_action {
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_action_parser<ActionT>::value ) >)> boost_static_assert_typedef_293;
    typedef typename ActionT::predicate_t type;
};
template <typename ActionT>
inline typename semantic_action<ActionT>::type const &
get_semantic_action(ActionT const &action_)
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ::boost::spirit::is_action_parser<ActionT>::value ) >)> boost_static_assert_typedef_309;
    return action_.predicate();
}
}}
namespace boost {
namespace spirit {
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
    {}
};
template<typename ScannerT = scanner<> >
struct no_actions_scanner
{
    typedef scanner_policies<
        typename ScannerT::iteration_policy_t,
        typename ScannerT::match_policy_t,
        no_actions_action_policy<typename ScannerT::action_policy_t>
    > policies_t;
    typedef typename
        rebind_scanner_policies<ScannerT, policies_t>::type type;
};
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)));
    }
};
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());
    }
};
const no_actions_parser_gen no_actions_d = no_actions_parser_gen();
}
}
namespace boost { namespace spirit {
    template <typename CondT, bool positive = true>
    struct condition_parser : parser<condition_parser<CondT, positive> >
    {
        typedef condition_parser<CondT, positive> self_t;
        condition_parser(CondT const& cond_) : cond(cond_) {}
        template <typename ScannerT>
        typename parser_result<self_t, ScannerT>::type
        parse(ScannerT const& scan) const
        {
            if (positive == cond())
                return scan.empty_match();
            else
                return scan.no_match();
        }
        condition_parser<CondT, !positive>
        negate() const
        { return condition_parser<CondT, !positive>(cond); }
    private:
        CondT cond;
    };
    template <typename CondT, bool positive>
    inline condition_parser<CondT, !positive>
    operator~(condition_parser<CondT, positive> const& p)
    { return p.negate(); }
    struct empty_match_parser_gen;
    struct negated_empty_match_parser_gen;
    template <typename SubjectT>
    struct negated_empty_match_parser;
    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;
                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);
            bool matches = this->subject().parse(scan);
            if (!matches)
            {
                scan.first = save;
                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(); }
    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();
}}
#include <bitset>
namespace boost { namespace spirit { namespace utility { namespace impl {
    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; }
    };
    template <typename CharT>
    struct range_compare {
        bool operator()(range<CharT> const& x, range<CharT> const& y) const
        { return x.first < y.first; }
    };
    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;
    };
}}}}
namespace boost { namespace spirit {
    namespace utility { namespace impl {
        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);
        }
        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)
        {
            ;
            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)
        {
            ;
            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 boost { namespace spirit {
    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;
    };
    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> {};
}}
namespace boost { namespace spirit {
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;
}
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;
}
}}
namespace boost { namespace spirit {
namespace utility { namespace impl {
    template <typename CharT, typename CharT2>
    void construct_chset(boost::shared_ptr<basic_chset<CharT> >& ptr,
            CharT2 const* definition);
}}
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;
};
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); }
inline chset<unsigned short>
chset_p(unsigned short ch)
{ return chset<unsigned short>(ch); }
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); }
inline chset<long long>
chset_p(long long ch)
{ return chset<long long>(ch); }
inline chset<unsigned long long>
chset_p(unsigned long long ch)
{ return chset<unsigned long long>(ch); }
}}
namespace boost { namespace spirit {
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
namespace impl {
    template <typename CharT>
    inline boost::spirit::range<CharT> const&
    full()
    {
        static boost::spirit::range<CharT> full_(
            std::numeric_limits<CharT>::min(),
            std::numeric_limits<CharT>::max());
        return full_;
    }
    template <typename CharT>
    inline boost::spirit::range<CharT> const&
    empty()
    {
        static boost::spirit::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& )
{
    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;
}
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& , 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& )
{
    return impl::empty<CharT>();
}
template <typename CharT>
inline chset<CharT>
operator-(nothing_parser, chset<CharT> const& )
{
    return impl::empty<CharT>();
}
template <typename CharT>
inline chset<CharT>
operator^(nothing_parser, chset<CharT> const& b)
{
    return b;
}
}}
namespace boost { namespace spirit {
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);
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);
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);
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);
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);
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);
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);
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);
}}
namespace boost { namespace spirit {
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;
        }
    }
}}
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); }
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_);
}
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;
}
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;
}
template <typename CharT>
inline void
chset<CharT>::set(range<CharT> const& arg_)
{
    utility::impl::detach(ptr);
    ptr->set(arg_.first, arg_.last);
}
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());
    }
}
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;
}
}}
namespace boost { namespace spirit {
const unsigned long c_escapes = 1;
const unsigned long lex_escapes = c_escapes << 1;
namespace impl {
    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)
        {
            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))
                                    {
                                        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;
                                    }
                                }
                                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'))
                                    {
                                        scan.first = save;
                                        return scan.no_match();
                                    }
                                    if (c >= '0' && c <= '7')
                                    {
                                        oct <<= 3;
                                        oct |= c - '0';
                                        ++scan.first;
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                                unescaped = oct;
                            }
                            break;
                        default:
                            if (Flags & c_escapes)
                            {
                                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();
        }
    };
    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 & )
        {
            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 - CharT('\\'))
                | (CharT('\\') >>
                    ( oct_parser_t()
                     | as_lower_d[CharT('x')] >> hex_parser_t()
                     | (anychar_p - as_lower_d[CharT('x')] - oct_parser_t())
                    )
                ));
            ;
            return p.parse(scan);
        }
    };
}
}}
namespace boost { namespace spirit {
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;
};
template <unsigned long Flags, typename CharT>
struct escape_char_action_parser_gen;
template <unsigned long Flags, typename CharT = char>
struct escape_char_parser :
    public parser<escape_char_parser<Flags, CharT> > {
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( Flags == c_escapes || Flags == lex_escapes ) >)> boost_static_assert_typedef_118;
    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);
    }
};
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>();
}}
namespace boost { namespace spirit {
    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 result;
            std::ptrdiff_t len = functor(scan, result);
            if (len < 0)
                return scan.no_match();
            else
                return scan.create_match(std::size_t(len), result, s, scan.first);
        }
    };
}}
namespace boost { namespace spirit {
    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
        {
            typename parser_result<self_t, ScannerT>::type hit(0);
            std::size_t n = m_exact;
            for (std::size_t i = 0; i < n; ++i)
            {
                typename parser_result<self_t, ScannerT>::type next
                    = this->subject().parse(scan);
                if (!next)
                    return scan.no_match();
                hit.concat(next);
            }
            return hit;
        }
        template <typename ScannerT>
        struct result
        {
            typedef typename match_result<ScannerT, nil_t>::type type;
        };
    private:
        ExactT m_exact;
    };
    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
        {
            ;
            typename parser_result<self_t, ScannerT>::type hit(0);
            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;
                typename parser_result<self_t, ScannerT>::type next
                    = this->subject().parse(scan);
                if (!next)
                {
                    if (i >= n1)
                    {
                        scan.first = save;
                        break;
                    }
                    else
                    {
                        return scan.no_match();
                    }
                }
                hit.concat(next);
            }
            return hit;
        }
        template <typename ScannerT>
        struct result
        {
            typedef typename match_result<ScannerT, nil_t>::type type;
        };
    private:
        MinT m_min;
        MaxT m_max;
    };
    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
        {
            typename parser_result<self_t, ScannerT>::type hit(0);
            std::size_t n = m_min;
            for (std::size_t i = 0; ; ++i)
            {
                typename ScannerT::iterator_t save = scan.first;
                typename parser_result<self_t, ScannerT>::type next
                    = this->subject().parse(scan);
                if (!next)
                {
                    if (i >= n)
                    {
                        scan.first = save;
                        break;
                    }
                    else
                    {
                        return scan.no_match();
                    }
                }
                hit.concat(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;
        };
    }
    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);
    }
}}
namespace boost { namespace spirit {
struct non_nested_refactoring { typedef non_nested_refactoring embed_t; };
struct self_nested_refactoring { typedef self_nested_refactoring embed_t; };
namespace impl {
    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& )
        {
            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);
        }
    };
    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);
        }
    };
    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 boost { namespace spirit {
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:
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( boost::is_convertible<typename BinaryT::parser_category_t, binary_parser_category>::value ) ) >)> boost_static_assert_typedef_59;
    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<>();
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:
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( boost::is_convertible<typename BinaryT::parser_category_t, binary_parser_category>::value ) ) >)> boost_static_assert_typedef_142;
    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<>();
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:
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( boost::is_convertible<typename ActionT::parser_category_t, action_parser_category>::value ) ) >)> boost_static_assert_typedef_224;
    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<>();
}}
namespace boost { namespace spirit {
struct is_nested {};
struct non_nested {};
struct is_lexeme {};
struct non_lexeme {};
namespace impl {
    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);
        }
    };
    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& , 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);
        }
    };
    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 & , ScannerT const& scan,
            OpenT const& open, ExprT const& expr, CloseT const& close)
        {
            return select_confix_parse_lexeme<LexemeT>::parse((
                            open
                        >> (expr - close)
                        >> close
                    ), scan);
        }
    };
    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 boost { namespace spirit {
template<typename NestedT = non_nested, typename LexemeT = non_lexeme>
struct confix_parser_gen;
template <
    typename OpenT, typename ExprT, typename CloseT, typename CategoryT,
    typename NestedT = non_nested, typename LexemeT = non_lexeme
>
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;
};
template<typename NestedT, typename LexemeT>
struct confix_parser_gen
{
    template<typename StartT, typename ExprT, typename EndT>
    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
    >
    operator()(
        StartT const &start_, ExprT const &expr_, EndT const &end_) const
    {
        typedef typename as_parser<StartT>::type start_t;
        typedef typename as_parser<ExprT>::type expr_t;
        typedef typename as_parser<EndT>::type end_t;
        typedef
            typename as_parser<ExprT>::type::parser_category_t
            parser_category_t;
        typedef
            confix_parser<
                start_t, expr_t, end_t, parser_category_t, NestedT, LexemeT
            >
            return_t;
        return return_t(
            as_parser<StartT>::convert(start_),
            as_parser<ExprT>::convert(expr_),
            as_parser<EndT>::convert(end_)
        );
    }
    template<typename StartT, typename ExprT, typename EndT>
    confix_parser<
        typename as_parser<StartT>::type,
        typename as_parser<ExprT>::type,
        typename as_parser<EndT>::type,
        plain_parser_category,
        NestedT,
        LexemeT
    >
    direct(StartT const &start_, ExprT const &expr_, EndT const &end_) const
    {
        typedef typename as_parser<StartT>::type start_t;
        typedef typename as_parser<ExprT>::type expr_t;
        typedef typename as_parser<EndT>::type end_t;
        typedef plain_parser_category parser_category_t;
        typedef
            confix_parser<
                start_t, expr_t, end_t, parser_category_t, NestedT, LexemeT
            >
            return_t;
        return return_t(
            as_parser<StartT>::convert(start_),
            as_parser<ExprT>::convert(expr_),
            as_parser<EndT>::convert(end_)
        );
    }
};
const confix_parser_gen<non_nested, non_lexeme> confix_p =
    confix_parser_gen<non_nested, non_lexeme>();
template<typename NestedT>
struct comment_parser_gen
{
    template<typename StartT>
    confix_parser<
        typename as_parser<StartT>::type,
        kleene_star<anychar_parser>,
        alternative<eol_parser, end_parser>,
        unary_parser_category,
        NestedT,
        is_lexeme
    >
    operator() (StartT const &start_) const
    {
        typedef typename as_parser<StartT>::type start_t;
        typedef kleene_star<anychar_parser> expr_t;
        typedef alternative<eol_parser, end_parser> end_t;
        typedef unary_parser_category parser_category_t;
        typedef
            confix_parser<
                start_t, expr_t, end_t, parser_category_t, NestedT, is_lexeme
            >
            return_t;
        return return_t(
            as_parser<StartT>::convert(start_),
            *anychar_p,
            eol_p | end_p
        );
    }
    template<typename StartT, typename EndT>
    confix_parser<
        typename as_parser<StartT>::type,
        kleene_star<anychar_parser>,
        typename as_parser<EndT>::type,
        unary_parser_category,
        NestedT,
        is_lexeme
    >
    operator() (StartT const &start_, EndT const &end_) const
    {
        typedef typename as_parser<StartT>::type start_t;
        typedef kleene_star<anychar_parser> expr_t;
        typedef typename as_parser<EndT>::type end_t;
        typedef unary_parser_category parser_category_t;
        typedef
            confix_parser<
                start_t, expr_t, end_t, parser_category_t, NestedT, is_lexeme
            >
            return_t;
        return return_t(
            as_parser<StartT>::convert(start_),
            *anychar_p,
            as_parser<EndT>::convert(end_)
        );
    }
};
const comment_parser_gen<non_nested> comment_p =
    comment_parser_gen<non_nested>();
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;
};
template<typename OpenT, typename CloseT>
inline
comment_nest_parser<
    typename as_parser<OpenT>::type,
    typename as_parser<CloseT>::type
>
    comment_nest_p(OpenT const &open, CloseT const &close)
{
    return
        comment_nest_parser<
            typename as_parser<OpenT>::type,
            typename as_parser<CloseT>::type
        >(
            as_parser<OpenT>::convert(open),
            as_parser<CloseT>::convert(close)
        );
}
}}
namespace boost { namespace spirit {
struct no_list_endtoken { typedef no_list_endtoken embed_t; };
namespace impl {
    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& ,
            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);
        }
    };
    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& ,
            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);
        }
    };
    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& ,
            ItemT const &item, DelimT const &delim, EndT const &end)
        {
            return (
                    (item - (end | delim))
                >> *(delim >> (item - (end | delim)))
                >> !(delim >> end)
            ).parse(scan);
        }
    };
    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& ,
            ItemT const &item, DelimT const &delim, no_list_endtoken const&)
        {
            return (
                    (item - delim)
                >> *(delim >> (item - delim))
            ).parse(scan);
        }
    };
    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 boost { namespace spirit {
template <
    typename ItemT, typename DelimT, typename EndT = no_list_endtoken,
    typename CategoryT = plain_parser_category
>
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;
};
template <typename CharT = char>
struct list_parser_gen :
    public list_parser<kleene_star<anychar_parser>, chlit<CharT> >
{
    typedef list_parser_gen<CharT> self_t;
    list_parser_gen()
    : list_parser<kleene_star<anychar_parser>, chlit<CharT> >
        (*anychar_p, chlit<CharT>(','))
    {}
    template<typename DelimT>
    list_parser<
        kleene_star<anychar_parser>,
        typename as_parser<DelimT>::type,
        no_list_endtoken,
        unary_parser_category
    >
    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,
                typename item_t::parser_category_t>
            return_t;
        return return_t(
            as_parser<ItemT>::convert(item_),
            as_parser<DelimT>::convert(delim_)
        );
    }
    template<typename ItemT, typename DelimT, typename EndT>
    list_parser<
        typename as_parser<ItemT>::type,
        typename as_parser<DelimT>::type,
        typename as_parser<EndT>::type
    >
    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,
                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_)
        );
    }
    template<typename ItemT, typename DelimT>
    list_parser<
        typename as_parser<ItemT>::type,
        typename as_parser<DelimT>::type,
        no_list_endtoken,
        plain_parser_category
    >
    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_)
        );
    }
    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
    >
    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_)
        );
    }
};
const list_parser_gen<> list_p = list_parser_gen<>();
}}
namespace boost {
    namespace spirit {
template <typename CharT = char, typename TailT = chset<CharT> >
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;
};
template <typename CharT = char, typename TailT = chset<CharT> >
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;
};
template <typename ScannerT = scanner<> >
class dynamic_distinct_parser
{
public:
    typedef typename ScannerT::value_t char_t;
    typedef
        rule<typename lexeme_scanner<ScannerT>::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;
};
template <typename ScannerT = scanner<> >
class dynamic_distinct_directive
{
public:
    typedef typename ScannerT::value_t char_t;
    typedef
        rule<typename lexeme_scanner<ScannerT>::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;
};
    }
}
#include <deque>
namespace boost
{
  namespace detail {
   template <class Category, class T, class Distance, class Pointer, class Reference>
   struct iterator_base : std::iterator<Category, T, Distance, Pointer, Reference> {};
  }
  template <class Category, class T, class Distance = std::ptrdiff_t,
            class Pointer = T*, class Reference = T&>
   struct iterator : detail::iterator_base<Category, T, Distance, Pointer, Reference> {};
}
namespace boost {
namespace mpl {
template<
      typename C = void_
    , typename F1 = void_
    , typename F2 = void_
    >
struct apply_if
{
 private:
    typedef typename if_<C,F1,F2>::type nullary_func_;
 public:
    typedef typename nullary_func_::type type;
   
};
template<
      bool C
    , typename F1
    , typename F2
    >
struct apply_if_c
{
 private:
    typedef typename if_c<C,F1,F2>::type nullary_func_;
 public:
    typedef typename nullary_func_::type type;
};
template<> struct apply_if< void_,void_,void_ > { template< typename T1,typename T2,typename T3 , typename T4 =void_ ,typename T5 =void_ > struct apply : apply_if< T1,T2,T3 > { }; }; template<> struct lambda< apply_if< void_,void_,void_ > , void_ , int_<-1> > { typedef apply_if< void_,void_,void_ > type; }; namespace aux { template< typename T1,typename T2,typename T3 > struct template_arity< apply_if< T1,T2,T3 > > { static const int value = 3; }; template<> struct template_arity< apply_if< void_,void_,void_ > > { static const int value = -1; }; }
}
}
namespace boost {
namespace mpl {
template<
      typename T = void_
    >
struct identity
{
    typedef T type;
   
};
template<
      typename T = void_
    >
struct make_identity
{
    typedef identity<T> type;
   
};
template<> struct identity< void_ > { template< typename T1 , typename T2 =void_ ,typename T3 =void_ ,typename T4 =void_ ,typename T5 =void_ > struct apply : identity< T1 > { }; }; template<> struct lambda< identity< void_ > , void_ , int_<-1> > { typedef identity< void_ > type; }; namespace aux { template< typename T1 > struct template_arity< identity< T1 > > { static const int value = 1; }; template<> struct template_arity< identity< void_ > > { static const int value = -1; }; }
template<> struct make_identity< void_ > { template< typename T1 , typename T2 =void_ ,typename T3 =void_ ,typename T4 =void_ ,typename T5 =void_ > struct apply : make_identity< T1 > { }; }; template<> struct lambda< make_identity< void_ > , void_ , int_<-1> > { typedef make_identity< void_ > type; }; namespace aux { template< typename T1 > struct template_arity< make_identity< T1 > > { static const int value = 1; }; template<> struct template_arity< make_identity< void_ > > { static const int value = -1; }; }
}
}
namespace boost {
namespace mpl {
template<> struct arg<-1>
{
    static int const value = -1;
   
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
        typedef U1 type;
     private:
        static bool const nv = !is_void_<type>::value;
        typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( nv ) >)> boost_static_assert_typedef_22;
    };
};
template<> struct arg<1>
{
    static int const value = 1;
    typedef arg<2> next;
   
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
        typedef U1 type;
     private:
        static bool const nv = !is_void_<type>::value;
        typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( nv ) >)> boost_static_assert_typedef_43;
    };
};
template<> struct arg<2>
{
    static int const value = 2;
    typedef arg<3> next;
   
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
        typedef U2 type;
     private:
        static bool const nv = !is_void_<type>::value;
        typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( nv ) >)> boost_static_assert_typedef_64;
    };
};
template<> struct arg<3>
{
    static int const value = 3;
    typedef arg<4> next;
   
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
        typedef U3 type;
     private:
        static bool const nv = !is_void_<type>::value;
        typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( nv ) >)> boost_static_assert_typedef_85;
    };
};
template<> struct arg<4>
{
    static int const value = 4;
    typedef arg<5> next;
   
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
        typedef U4 type;
     private:
        static bool const nv = !is_void_<type>::value;
        typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( nv ) >)> boost_static_assert_typedef_106;
    };
};
template<> struct arg<5>
{
    static int const value = 5;
    typedef arg<6> next;
   
    template<
          typename U1 = void_, typename U2 = void_, typename U3 = void_
        , typename U4 = void_, typename U5 = void_
        >
    struct apply
    {
        typedef U5 type;
     private:
        static bool const nv = !is_void_<type>::value;
        typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( nv ) >)> boost_static_assert_typedef_127;
    };
};
}
}
namespace boost {
namespace mpl {
typedef arg< -1 > _;
namespace placeholders {
using boost::mpl::_;
}
typedef arg<1> _1;
namespace placeholders {
using boost::mpl::_1;
}
typedef arg<2> _2;
namespace placeholders {
using boost::mpl::_2;
}
typedef arg<3> _3;
namespace placeholders {
using boost::mpl::_3;
}
typedef arg<4> _4;
namespace placeholders {
using boost::mpl::_4;
}
typedef arg<5> _5;
namespace placeholders {
using boost::mpl::_5;
}
typedef arg<6> _6;
namespace placeholders {
using boost::mpl::_6;
}
}
}
namespace boost {
struct no_traversal_tag {};
struct incrementable_traversal_tag {};
struct single_pass_traversal_tag
  : incrementable_traversal_tag {};
struct forward_traversal_tag
  : single_pass_traversal_tag {};
struct bidirectional_traversal_tag
  : forward_traversal_tag {};
struct random_access_traversal_tag
  : bidirectional_traversal_tag {};
namespace detail
{
  template <class Cat>
  struct old_category_to_traversal
    : mpl::apply_if<
          is_convertible<Cat,std::random_access_iterator_tag>
        , mpl::identity<random_access_traversal_tag>
        , mpl::apply_if<
              is_convertible<Cat,std::bidirectional_iterator_tag>
            , mpl::identity<bidirectional_traversal_tag>
            , mpl::apply_if<
                  is_convertible<Cat,std::forward_iterator_tag>
                , mpl::identity<forward_traversal_tag>
                , mpl::apply_if<
                      is_convertible<Cat,std::input_iterator_tag>
                    , mpl::identity<single_pass_traversal_tag>
                    , mpl::apply_if<
                          is_convertible<Cat,std::output_iterator_tag>
                        , mpl::identity<incrementable_traversal_tag>
                        , void
                      >
                  >
              >
          >
      >
  {};
  template <class Traversal>
  struct pure_traversal_tag
    : mpl::apply_if<
          is_convertible<Traversal,random_access_traversal_tag>
        , mpl::identity<random_access_traversal_tag>
        , mpl::apply_if<
              is_convertible<Traversal,bidirectional_traversal_tag>
            , mpl::identity<bidirectional_traversal_tag>
            , mpl::apply_if<
                  is_convertible<Traversal,forward_traversal_tag>
                , mpl::identity<forward_traversal_tag>
                , mpl::apply_if<
                      is_convertible<Traversal,single_pass_traversal_tag>
                    , mpl::identity<single_pass_traversal_tag>
                    , mpl::apply_if<
                          is_convertible<Traversal,incrementable_traversal_tag>
                        , mpl::identity<incrementable_traversal_tag>
                        , void
                      >
                  >
              >
          >
      >
  {
  };
}
template <class Cat>
struct iterator_category_to_traversal
  : mpl::apply_if<
        is_convertible<Cat,incrementable_traversal_tag>
      , mpl::identity<Cat>
      , detail::old_category_to_traversal<Cat>
    >
{};
template <class Iterator = mpl::_1>
struct iterator_traversal
  : iterator_category_to_traversal<
        typename boost::detail::iterator_traits<Iterator>::iterator_category
    >
{};
}
namespace boost { namespace mpl {
namespace aux {
template< bool C_, typename T1, typename T2, typename T3, typename T4 >
struct or_impl
    : true_
{
};
template< typename T1, typename T2, typename T3, typename T4 >
struct or_impl< false,T1,T2,T3,T4 >
    : or_impl<
          ::boost::mpl::aux::nested_type_wknd<T1>::value
        , T2, T3, T4
        , false_
        >
{
};
template<>
struct or_impl<
          false
        , false_, false_, false_, false_
        >
    : false_
{
};
}
template<
      typename T1 = void_
    , typename T2 = void_
    , typename T3 = false_, typename T4 = false_, typename T5 = false_
    >
struct or_
    : aux::or_impl<
          ::boost::mpl::aux::nested_type_wknd<T1>::value
        , T2, T3, T4, T5
        >
{
   
};
template<> struct or_< void_,void_ > { template< typename T1,typename T2 , typename T3 =void_ ,typename T4 =void_ ,typename T5 =void_ > struct apply : or_< T1,T2 > { }; }; template<> struct lambda< or_< void_,void_ > , void_ , int_<-1> > { typedef or_< void_,void_ > type; }; namespace aux { template< typename T1,typename T2,typename T3,typename T4,typename T5 > struct template_arity< or_< T1,T2,T3,T4,T5 > > { static const int value = 5; }; template<> struct template_arity< or_< void_,void_ > > { static const int value = -1; }; }
}}
namespace boost
{
  template <typename A, typename B>
  struct is_interoperable
    : mpl::or_<
          is_convertible< A, B >
        , is_convertible< B, A > >
  {
  };
}
namespace boost { namespace mpl {
namespace aux {
template< bool C_, typename T1, typename T2, typename T3, typename T4 >
struct and_impl
    : false_
{
};
template< typename T1, typename T2, typename T3, typename T4 >
struct and_impl< true,T1,T2,T3,T4 >
    : and_impl<
          ::boost::mpl::aux::nested_type_wknd<T1>::value
        , T2, T3, T4
        , true_
        >
{
};
template<>
struct and_impl<
          true
        , true_, true_, true_, true_
        >
    : true_
{
};
}
template<
      typename T1 = void_
    , typename T2 = void_
    , typename T3 = true_, typename T4 = true_, typename T5 = true_
    >
struct and_
    : aux::and_impl<
          ::boost::mpl::aux::nested_type_wknd<T1>::value
        , T2, T3, T4, T5
        >
{
   
};
template<> struct and_< void_,void_ > { template< typename T1,typename T2 , typename T3 =void_ ,typename T4 =void_ ,typename T5 =void_ > struct apply : and_< T1,T2 > { }; }; template<> struct lambda< and_< void_,void_ > , void_ , int_<-1> > { typedef and_< void_,void_ > type; }; namespace aux { template< typename T1,typename T2,typename T3,typename T4,typename T5 > struct template_arity< and_< T1,T2,T3,T4,T5 > > { static const int value = 5; }; template<> struct template_arity< and_< void_,void_ > > { static const int value = -1; }; }
}}
namespace boost { struct use_default; }
namespace boost { namespace detail {
struct input_output_iterator_tag
  : std::input_iterator_tag
{
    operator std::output_iterator_tag() const
    {
        return std::output_iterator_tag();
    }
};
template <class ValueParam, class Reference>
struct iterator_writability_disabled
  : is_const<ValueParam>
{};
template <class Traversal, class ValueParam, class Reference>
struct iterator_facade_default_category
  : mpl::apply_if<
        mpl::and_<
            is_reference<Reference>
          , is_convertible<Traversal,forward_traversal_tag>
        >
      , mpl::apply_if<
            is_convertible<Traversal,random_access_traversal_tag>
          , mpl::identity<std::random_access_iterator_tag>
          , mpl::if_<
                is_convertible<Traversal,bidirectional_traversal_tag>
              , std::bidirectional_iterator_tag
              , std::forward_iterator_tag
            >
        >
      , typename mpl::apply_if<
            mpl::and_<
                is_convertible<Traversal, single_pass_traversal_tag>
              , is_convertible<Reference, ValueParam>
            >
          , mpl::identity<std::input_iterator_tag>
          , mpl::identity<Traversal>
        >
    >
{
};
template <class T>
struct is_iterator_category
  : mpl::or_<
        is_convertible<T,std::input_iterator_tag>
      , is_convertible<T,std::output_iterator_tag>
    >
{
};
template <class T>
struct is_iterator_traversal
  : is_convertible<T,incrementable_traversal_tag>
{};
template <class Category, class Traversal>
struct iterator_category_with_traversal
  : Category, Traversal
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( !(is_convertible< typename iterator_category_to_traversal<Category>::type , Traversal >::value) ) >)> boost_static_assert_typedef_158;
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( is_iterator_category<Category>::value ) >)> boost_static_assert_typedef_160;
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( !is_iterator_category<Traversal>::value ) >)> boost_static_assert_typedef_161;
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( !is_iterator_traversal<Category>::value ) >)> boost_static_assert_typedef_162;
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( is_iterator_traversal<Traversal>::value ) >)> boost_static_assert_typedef_164;
};
template <class Traversal, class ValueParam, class Reference>
struct facade_iterator_category_impl
{
    typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( !is_iterator_category<Traversal>::value ) >)> boost_static_assert_typedef_175;
    typedef typename iterator_facade_default_category<
        Traversal,ValueParam,Reference
    >::type category;
    typedef typename mpl::if_<
        is_same<
            Traversal
          , typename iterator_category_to_traversal<category>::type
        >
      , category
      , iterator_category_with_traversal<category,Traversal>
    >::type type;
};
template <class CategoryOrTraversal, class ValueParam, class Reference>
struct facade_iterator_category
  : mpl::apply_if<
        is_iterator_category<CategoryOrTraversal>
      , mpl::identity<CategoryOrTraversal>
      , facade_iterator_category_impl<CategoryOrTraversal,ValueParam,Reference>
    >
{
};
}}
namespace boost
{
  namespace iterators
  {
    template<bool>
    struct enabled
    {
      template<typename T>
      struct base
      {
        typedef T type;
      };
    };
    template<>
    struct enabled<false>
    {
      template<typename T>
      struct base
      {
      };
    };
    template <class Cond,
              class Return>
    struct enable_if
      : enabled<(Cond::value)>::template base<Return>
    {
    };
  }
}
namespace boost {
namespace detail {
template <typename T>
struct add_pointer_impl
{
    typedef typename remove_reference<T>::type no_ref_type;
    typedef no_ref_type* type;
};
}
template< typename T > struct add_pointer { typedef typename detail::add_pointer_impl<T>::type type; };
}
namespace boost {
namespace detail {
template <typename T, bool is_vol>
struct remove_const_helper
{
    typedef T type;
};
template <typename T>
struct remove_const_helper<T, true>
{
    typedef T volatile type;
};
template <typename T>
struct remove_const_impl
{
    typedef typename remove_const_helper<
          typename cv_traits_imp<T*>::unqualified_type
        , ::boost::is_volatile<T>::value
        >::type type;
};
}
template< typename T > struct remove_const { typedef typename detail::remove_const_impl<T>::type type; };
template< typename T > struct remove_const<T&> { typedef T& type; };
template< typename T, std::size_t N > struct remove_const<T const[N]> { typedef T type[N]; };
template< typename T, std::size_t N > struct remove_const<T const volatile[N]> { typedef T volatile type[N]; };
}
namespace boost
{
  template <class I, class V, class TC, class R, class D> class iterator_facade;
  namespace detail
  {
    template <
        class Facade1
      , class Facade2
      , class Return
    >
    struct enable_if_interoperable
      : ::boost::iterators::enable_if<
           mpl::or_<
               is_convertible<Facade1, Facade2>
             , is_convertible<Facade2, Facade1>
           >
         , Return
        >
    {
    };
    template <
        class ValueParam
      , class CategoryOrTraversal
      , class Reference
      , class Difference
    >
    struct iterator_facade_types
    {
        typedef typename facade_iterator_category<
            CategoryOrTraversal, ValueParam, Reference
        >::type iterator_category;
        typedef typename remove_const<ValueParam>::type value_type;
        typedef typename mpl::apply_if<
            detail::iterator_writability_disabled<ValueParam,Reference>
          , add_pointer<typename add_const<value_type>::type>
          , add_pointer<value_type>
        >::type pointer;
    };
    template <class T>
    struct operator_arrow_proxy
    {
        operator_arrow_proxy(T const* px) : m_value(*px) {}
        const T* operator->() const { return &m_value; }
        operator const T*() const { return &m_value; }
        T m_value;
    };
    template <class Value, class Reference, class Pointer>
    struct operator_arrow_result
    {
        typedef typename mpl::if_<
            is_reference<Reference>
          , Pointer
          , operator_arrow_proxy<Value>
        >::type type;
        static type make(Reference x)
        {
            return type(&x);
        }
    };
    template <class Iterator>
    class operator_brackets_proxy
    {
        typedef typename Iterator::reference reference;
        typedef typename Iterator::value_type value_type;
     public:
        operator_brackets_proxy(Iterator const& iter)
          : m_iter(iter)
        {}
        operator reference() const
        {
            return *m_iter;
        }
        operator_brackets_proxy& operator=(value_type const& val)
        {
            *m_iter = val;
            return *this;
        }
     private:
        Iterator m_iter;
    };
    template <class Value, class Reference>
    struct use_operator_brackets_proxy
      : mpl::and_<
            boost::is_POD<Value>
          , iterator_writability_disabled<Value,Reference>
        >
    {};
    template <class Iterator, class Value, class Reference>
    struct operator_brackets_result
    {
        typedef typename mpl::if_<
            use_operator_brackets_proxy<Value,Reference>
          , Value
          , operator_brackets_proxy<Iterator>
        >::type type;
    };
    template <class Iterator>
    operator_brackets_proxy<Iterator> make_operator_brackets_result(Iterator const& iter, mpl::false_)
    {
        return operator_brackets_proxy<Iterator>(iter);
    }
    template <class Iterator>
    typename Iterator::value_type make_operator_brackets_result(Iterator const& iter, mpl::true_)
    {
      return *iter;
    }
  }
  class iterator_core_access
  {
      template <class I, class V, class TC, class R, class D> friend class iterator_facade;
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator ==( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator !=( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator <( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator >( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator <=( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator >=( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs);
      template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > friend typename detail::enable_if_interoperable< Derived1, Derived2, typename Derived1::difference_type >::type operator -( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs)
      ;
      template <class Derived, class V, class TC, class R, class D> friend Derived operator+ (iterator_facade<Derived, V, TC, R, D> const& , typename Derived::difference_type)
      ;
      template <class Derived, class V, class TC, class R, class D> friend Derived operator+ (typename Derived::difference_type , iterator_facade<Derived, V, TC, R, D> const&)
      ;
      template <class Facade>
      static typename Facade::reference dereference(Facade const& f)
      {
          return f.dereference();
      }
      template <class Facade>
      static void increment(Facade& f)
      {
          f.increment();
      }
      template <class Facade>
      static void decrement(Facade& f)
      {
          f.decrement();
      }
      template <class Facade1, class Facade2>
      static bool equal(Facade1 const& f1, Facade2 const& f2)
      {
          return f1.equal(f2);
      }
      template <class Facade>
      static void advance(Facade& f, typename Facade::difference_type n)
      {
          f.advance(n);
      }
      template <class Facade1, class Facade2>
      static typename Facade1::difference_type distance_to(
                                                           Facade1 const& f1, Facade2 const& f2)
      {
          return f1.distance_to(f2);
      }
   private:
      iterator_core_access();
  };
  template <
      class Derived
    , class Value
    , class CategoryOrTraversal
    , class Reference = Value&
    , class Difference = std::ptrdiff_t
  >
  class iterator_facade
  {
   private:
      typedef Derived derived_t;
      Derived& derived()
      {
          return static_cast<Derived&>(*this);
      }
      Derived const& derived() const
      {
          return static_cast<Derived const&>(*this);
      }
      typedef detail::iterator_facade_types<
         Value, CategoryOrTraversal, Reference, Difference
      > associated_types;
   public:
      typedef typename associated_types::value_type value_type;
      typedef Reference reference;
      typedef Difference difference_type;
      typedef typename associated_types::pointer pointer;
      typedef typename associated_types::iterator_category iterator_category;
      reference operator*() const
      {
          return iterator_core_access::dereference(this->derived());
      }
      typename detail::operator_arrow_result<
          value_type
        , reference
        , pointer
      >::type
      operator->() const
      {
          return detail::operator_arrow_result<
              value_type
            , reference
            , pointer
          >::make(*this->derived());
      }
      typename detail::operator_brackets_result<Derived,Value,Reference>::type
      operator[](difference_type n) const
      {
          typedef detail::use_operator_brackets_proxy<Value,Reference> use_proxy;
          return detail::make_operator_brackets_result<Derived>(
              this->derived() + n
            , use_proxy()
          );
      }
      Derived& operator++()
      {
          iterator_core_access::increment(this->derived());
          return this->derived();
      }
      Derived operator++(int)
      {
          Derived tmp(this->derived());
          ++*this;
          return tmp;
      }
      Derived& operator--()
      {
          iterator_core_access::decrement(this->derived());
          return this->derived();
      }
      Derived operator--(int)
      {
          Derived tmp(this->derived());
          --*this;
          return tmp;
      }
      Derived& operator+=(difference_type n)
      {
          iterator_core_access::advance(this->derived(), n);
          return this->derived();
      }
      Derived& operator-=(difference_type n)
      {
          iterator_core_access::advance(this->derived(), -n);
          return this->derived();
      }
      Derived operator-(difference_type x) const
      {
          Derived result(this->derived());
          return result -= x;
      }
  };
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator ==( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && true ) ) >)> boost_static_assert_typedef_555; return iterator_core_access::equal( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator !=( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && true ) ) >)> boost_static_assert_typedef_556; return ! iterator_core_access::equal( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator <( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && true ) ) >)> boost_static_assert_typedef_558; return 0 > iterator_core_access::distance_to( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator >( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && true ) ) >)> boost_static_assert_typedef_559; return 0 < iterator_core_access::distance_to( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator <=( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && true ) ) >)> boost_static_assert_typedef_560; return 0 >= iterator_core_access::distance_to( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, bool >::type operator >=( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && true ) ) >)> boost_static_assert_typedef_561; return 0 <= iterator_core_access::distance_to( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
  template < class Derived1, class V1, class TC1, class R1, class D1 , class Derived2, class V2, class TC2, class R2, class D2 > inline typename detail::enable_if_interoperable< Derived1, Derived2, typename Derived1::difference_type >::type operator -( iterator_facade<Derived1, V1, TC1, R1, D1> const& lhs , iterator_facade<Derived2, V2, TC2, R2, D2> const& rhs) { typedef ::boost::static_assert_test< sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool)( ( is_interoperable< Derived1, Derived2 >::value && (is_same< typename Derived1::difference_type , typename Derived2::difference_type >::value) ) ) >)> boost_static_assert_typedef_573; return iterator_core_access::distance_to( static_cast<Derived2 const&>(rhs), static_cast<Derived1 const&>(lhs)); }
template <class Derived, class V, class TC, class R, class D> inline Derived operator+ ( iterator_facade<Derived, V, TC, R, D> const& i , typename Derived::difference_type n ) { Derived tmp(static_cast<Derived const&>(i)); return tmp += n; }
template <class Derived, class V, class TC, class R, class D> inline Derived operator+ ( typename Derived::difference_type n , iterator_facade<Derived, V, TC, R, D> const& i ) { Derived tmp(static_cast<Derived const&>(i)); return tmp += n; }
}
namespace boost {
template <class Iterator>
struct iterator_value
{
    typedef typename detail::iterator_traits<Iterator>::value_type type;
};
template <class Iterator>
struct iterator_reference
{
    typedef typename detail::iterator_traits<Iterator>::reference type;
};
template <class Iterator>
struct iterator_pointer
{
    typedef typename detail::iterator_traits<Iterator>::pointer type;
};
template <class Iterator>
struct iterator_difference
{
    typedef typename detail::iterator_traits<Iterator>::difference_type type;
};
template <class Iterator>
struct iterator_category
{
    typedef typename detail::iterator_traits<Iterator>::iterator_category type;
};
}
namespace boost
{
  struct use_default;
  template<class To>
  struct is_convertible<use_default,To>
    : mpl::false_ {};
  namespace detail
  {
    struct enable_type;
  }
  template<typename From, typename To>
  struct enable_if_convertible
    : iterators::enable_if<
          is_convertible<From, To>
        , detail::enable_type
      >
  {};
  namespace detail
  {
    template <class T, class DefaultNullaryFn>
    struct ia_dflt_help
      : mpl::apply_if<
            is_same<T, use_default>
          , DefaultNullaryFn
          , mpl::identity<T>
        >
    {
    };
    template <
        class Derived
      , class Base
      , class Value
      , class Traversal
      , class Reference
      , class Difference
    >
    struct iterator_adaptor_base
    {
        typedef iterator_facade<
            Derived
          , typename detail::ia_dflt_help<
                Value, iterator_value<Base>
            >::type
          , typename detail::ia_dflt_help<
                Traversal
              , iterator_traversal<Base>
            >::type
          , typename detail::ia_dflt_help<
                Reference
              , mpl::apply_if<
                    is_same<Value,use_default>
                  , iterator_reference<Base>
                  , add_reference<Value>
                >
            >::type
          , typename detail::ia_dflt_help<
                Difference, iterator_difference<Base>
            >::type
        >
        type;
    };
    template <class T> int static_assert_convertible_to(T);
  }
  template <
      class Derived
    , class Base
    , class Value = use_default
    , class Traversal = use_default
    , class Reference = use_default
    , class Difference = use_default
  >
  class iterator_adaptor
    : public detail::iterator_adaptor_base<
        Derived, Base, Value, Traversal, Reference, Difference
      >::type
  {
      friend class iterator_core_access;
      typedef typename detail::iterator_adaptor_base<
          Derived, Base, Value, Traversal, Reference, Difference
      >::type super_t;
   public:
      iterator_adaptor() {}
      explicit iterator_adaptor(Base const &iter)
          : m_iterator(iter)
      {
      }
      Base base() const
        { return m_iterator; }
   protected:
      Base const& base_reference() const
        { return m_iterator; }
      Base& base_reference()
        { return m_iterator; }
   private:
      typename super_t::reference dereference() const
        { return *m_iterator; }
      template <
      class OtherDerived, class OtherIterator, class V, class C, class R, class D
      >
      bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const
      {
          return m_iterator == x.base();
      }
      typedef typename iterator_category_to_traversal<
          typename super_t::iterator_category
      >::type my_traversal;
      void advance(typename super_t::difference_type n)
      {
          typedef int assertion[sizeof(detail::static_assert_convertible_to<random_access_traversal_tag>(my_traversal()))];
          m_iterator += n;
      }
      void increment() { ++m_iterator; }
      void decrement()
      {
          typedef int assertion[sizeof(detail::static_assert_convertible_to<bidirectional_traversal_tag>(my_traversal()))];
           --m_iterator;
      }
      template <
          class OtherDerived, class OtherIterator, class V, class C, class R, class D
      >
      typename super_t::difference_type distance_to(
          iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const
      {
          typedef int assertion[sizeof(detail::static_assert_convertible_to<random_access_traversal_tag>(my_traversal()))];
          return y.base() - m_iterator;
      }
   private:
      Base m_iterator;
  };
}
namespace boost { namespace spirit {
namespace impl {
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;
        ;
        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)
    {
        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;
};
}
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) {}
        position(const fixed_size_queue* s, std::size_t p)
            : self(const_cast<fixed_size_queue*>(s)), pos(p)
        {}
    };
public:
    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:
    static const 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)
{
    ;
    ;
    ;
    ;
}
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());
    ;
    ;
    ;
    ;
}
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());
    }
    ;
    ;
    ;
    ;
    return *this;
}
template <typename T, std::size_t N>
inline
fixed_size_queue<T, N>::~fixed_size_queue()
{
    ;
    ;
    ;
    ;
}
template <typename T, std::size_t N>
inline void
fixed_size_queue<T, N>::push_back(const T& e)
{
    ;
    ;
    ;
    ;
    ;
    m_queue[m_tail] = e;
    ++m_size;
    ++m_tail;
    if (m_tail == N+1)
        m_tail = 0;
    ;
    ;
    ;
    ;
}
template <typename T, std::size_t N>
inline void
fixed_size_queue<T, N>::push_front(const T& e)
{
    ;
    ;
    ;
    ;
    ;
    if (m_head == 0)
        m_head = N;
    else
        --m_head;
    m_queue[m_head] = e;
    ++m_size;
    ;
    ;
    ;
    ;
}
template <typename T, std::size_t N>
inline void
fixed_size_queue<T, N>::serve(T& e)
{
    ;
    ;
    ;
    ;
    e = m_queue[m_head];
    pop_front();
}
template <typename T, std::size_t N>
inline void
fixed_size_queue<T, N>::pop_front()
{
    ;
    ;
    ;
    ;
    ++m_head;
    if (m_head == N+1)
        m_head = 0;
    --m_size;
    ;
    ;
    ;
    ;
}
}}
namespace boost { namespace spirit {
namespace impl {
    template <typename T>
    inline void mp_swap(T& t1, T& t2);
}
namespace multi_pass_policies
{
class ref_counted
{
    protected:
        ref_counted()
            : count(new std::size_t(1))
        {}
        ref_counted(ref_counted const& x)
            : count(x.count)
        {}
        void clone()
        {
            ++*count;
        }
        bool release()
        {
            if (!--*count)
            {
                delete count;
                count = 0;
                return true;
            }
            return false;
        }
        void swap(ref_counted& x)
        {
            impl::mp_swap(count, x.count);
        }
    public:
        bool unique() const
        {
            return *count == 1;
        }
    private:
        std::size_t* count;
};
class first_owner
{
    protected:
        first_owner()
            : first(true)
        {}
        first_owner(first_owner const&)
            : first(false)
        {}
        void clone()
        {
        }
        bool release()
        {
            return first;
        }
        void swap(first_owner&)
        {
        }
    public:
        bool unique() const
        {
            return false;
        }
    private:
        bool first;
};
class illegal_backtracking : public std::exception
{
public:
    illegal_backtracking() throw() {}
    ~illegal_backtracking() throw() {}
    virtual const char*
    what() const throw()
    { return "boost::spirit::illegal_backtracking"; }
};
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)
        {}
        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);
        }
        void check() const
        {
            if (buf_id != *shared_buf_id)
            {
                boost::throw_exception(illegal_backtracking());
            }
        }
        void clear_queue()
        {
            ++*shared_buf_id;
            ++buf_id;
        }
    private:
        unsigned long* shared_buf_id;
        unsigned long buf_id;
};
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
{
    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)
        {}
        void destroy()
        {
            ;
            delete queuedElements;
            queuedElements = 0;
        }
        void swap(inner& x)
        {
            impl::mp_swap(queuedElements, x.queuedElements);
            impl::mp_swap(queuePosition, x.queuePosition);
        }
        template <typename MultiPassT>
        static typename MultiPassT::reference dereference(MultiPassT const& mp)
        {
            if (mp.queuePosition == mp.queuedElements->size())
            {
                if (mp.unique())
                {
                    if (mp.queuedElements->size() > 0)
                    {
                        mp.queuedElements->clear();
                        mp.queuePosition = 0;
                    }
                }
                return mp.get_input();
            }
            else
            {
                return (*mp.queuedElements)[mp.queuePosition];
            }
        }
        template <typename MultiPassT>
        static void increment(MultiPassT& mp)
        {
            if (mp.queuePosition == mp.queuedElements->size())
            {
                if (mp.unique())
                {
                    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;
            }
        }
        void clear_queue()
        {
            queuedElements->clear();
            queuePosition = 0;
        }
        template <typename MultiPassT>
        static bool is_eof(MultiPassT const& mp)
        {
            return mp.queuePosition == mp.queuedElements->size() &&
                mp.input_at_eof();
        }
        bool equal_to(inner const& x) const
        {
            return queuePosition == x.queuePosition;
        }
        bool less_than(inner const& x) const
        {
            return queuePosition < x.queuePosition;
        }
};
};
template < std::size_t N>
class fixed_size_queue
{
    public:
template <typename ValueT>
class inner
{
    private:
        typedef boost::spirit::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)
        {}
        void destroy()
        {
            ;
            delete queuedElements;
            queuedElements = 0;
        }
        void swap(inner& x)
        {
            impl::mp_swap(queuedElements, x.queuedElements);
            impl::mp_swap(queuePosition, x.queuePosition);
        }
        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;
            }
        }
        template <typename MultiPassT>
        static void increment(MultiPassT& mp)
        {
            if (mp.queuePosition == mp.queuedElements->end())
            {
                if (mp.queuedElements->size() >= N)
                    mp.queuedElements->pop_front();
                mp.queuedElements->push_back(mp.get_input());
                mp.advance_input();
            }
            ++mp.queuePosition;
        }
        void clear_queue()
        {}
        template <typename MultiPassT>
        static bool is_eof(MultiPassT const& mp)
        {
            return mp.queuePosition == mp.queuedElements->end() &&
                mp.input_at_eof();
        }
        bool equal_to(inner const& x) const
        {
            return queuePosition == x.queuePosition;
        }
        bool less_than(inner const& x) const
        {
            return queuePosition < x.queuePosition;
        }
};
};
class input_iterator
{
    public:
template <typename InputT>
class inner
{
    public:
        typedef
            typename boost::detail::iterator_traits<InputT>::value_type
            value_type;
        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()
            : input(new InputT())
            , val(new value_type)
        {}
        inner(InputT x)
            : input(new InputT(x))
            , val(new value_type(**input))
        {}
        inner(inner const& x)
            : input(x.input)
            , val(x.val)
        {}
        void destroy()
        {
            delete input;
            input = 0;
            delete val;
            val = 0;
        }
        bool same_input(inner const& x) const
        {
            return input == x.input;
        }
        typedef
            typename boost::detail::iterator_traits<InputT>::value_type
            value_t;
        void swap(inner& x)
        {
            impl::mp_swap(input, x.input);
            impl::mp_swap(val, x.val);
        }
    public:
        reference get_input() const
        {
            return *val;
        }
        void advance_input()
        {
            ++*input;
            *val = **input;
        }
        bool input_at_eof() const
        {
            return *input == InputT();
        }
    private:
        InputT* input;
        value_type* val;
};
};
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
{
    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 iterator_ { namespace impl {
template <typename InputPolicyT, typename InputT>
struct iterator_base_creator
{
    typedef typename InputPolicyT::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;
};
}}
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;
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);
        ~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:
        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)
{
}
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);
}
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
{
    if (is_eof() && y.is_eof())
    {
        return true;
    }
    else if (is_eof() ^ y.is_eof())
    {
        return false;
    }
    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);
}
template <typename InputT>
inline multi_pass<InputT>
make_multi_pass(InputT i)
{
    return multi_pass<InputT>(i);
}
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) {}
};
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::swap;
        swap(t1, t2);
    }
}
}}
namespace boost { namespace spirit {
    namespace impl {
        template <typename T>
        void flush_iterator(T &) {}
        template <typename T1, typename T2, typename T3, typename T4>
        void flush_iterator(boost::spirit::multi_pass<
            T1, T2, T3, T4, boost::spirit::multi_pass_policies::std_deque> &i)
        {
            i.clear_queue();
        }
    }
    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();
        }
    };
    flush_multi_pass_parser const
        flush_multi_pass_p = flush_multi_pass_parser();
}}
namespace boost { namespace spirit {
    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;
    };
    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::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;
    };
    template <typename MutexT>
    scoped_lock_parser_gen<MutexT>
    scoped_lock_d(MutexT &mutex)
    {
        return scoped_lock_parser_gen<MutexT>(mutex);
    }
}}
namespace boost { namespace spirit {
namespace impl
{
    template <typename CharT, typename T>
    class tst;
}
template <typename T, typename SetT>
class symbol_inserter;
template
<
    typename T = int,
    typename CharT = char,
    typename SetT = impl::tst<T, CharT>
>
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;
};
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);
template <typename T, typename SetT>
class symbol_inserter
{
public:
    symbol_inserter(SetT& set_)
    : set(set_) {}
    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;
};
}}
namespace boost { namespace spirit {
    namespace impl
    {
    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;
            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
                            {
                                return 0;
                            }
                       }
                        ++first;
                        ch = (first == last) ? 0 : *first;
                        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)
                {
                    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)
                    {
                        if (scan.at_end())
                        {
                            result.data = np->middle.data;
                            if (result.data)
                            {
                                latest = scan.first;
                                latest_len = result.length;
                            }
                            break;
                        }
                        ++scan;
                        ch = scan.at_end() ? 0 : *scan;
                        np = np->middle.link;
                        ++result.length;
                    }
                    else
                    {
                        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 boost { namespace spirit {
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)
, parser<symbols<T, CharT, SetT> >()
, 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;
}
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* last = sym;
    while (*last)
        last++;
    scanner<CharT const *> scan(sym, last);
    if (table.find(scan))
        return 0;
    table.add(sym, last, data);
    return table.find(scan);
}
}}
using namespace boost::spirit;
using namespace std;
struct skip_grammar : public grammar<skip_grammar>
{
    template <typename ScannerT>
    struct definition
    {
        definition(skip_grammar const& )
        {
            skip
                = space_p
                | "//" >> *(anychar_p - '\n') >> '\n'
                | "/*" >> *(anychar_p - "*/") >> "*/"
                | "#line" >> *(anychar_p - '\n') >> '\n'
                | "#pragma" >> *(anychar_p - '\n') >> '\n'
                ;
        }
        rule<ScannerT> skip;
        rule<ScannerT> const&
        start() const { return skip; }
    };
};
template<typename GrammarT>
bool
parse(GrammarT const& g, char const* text, unsigned int len)
{
    skip_grammar skip;
    parse_info<const char *> result =
        parse(text, text+len, g, skip);
    return !!result.full;
}
struct c_grammar : public grammar<c_grammar>
{
    template <typename ScannerT>
    struct definition
    {
        definition(c_grammar const& ) :
            ELLIPSIS("..."), RIGHT_ASSIGN(">>="), LEFT_ASSIGN("<<="),
            ADD_ASSIGN("+="), SUB_ASSIGN("-="), MUL_ASSIGN("*="),
            DIV_ASSIGN("/="), MOD_ASSIGN("%="), AND_ASSIGN("&="),
            XOR_ASSIGN("^="), OR_ASSIGN("|="), RIGHT_OP(">>"), LEFT_OP("<<"),
            INC_OP("++"), DEC_OP("--"), PTR_OP("->"), AND_OP("&&"),
            OR_OP("||"), LE_OP("<="), GE_OP(">="), EQ_OP("=="), NE_OP("!="),
            SEMICOLON(';'),
            COMMA(','), COLON(':'), ASSIGN('='), LEFT_PAREN('('),
            RIGHT_PAREN(')'), DOT('.'), ADDROF('&'), BANG('!'), TILDE('~'),
            MINUS('-'), PLUS('+'), STAR('*'), SLASH('/'), PERCENT('%'),
            LT_OP('<'), GT_OP('>'), XOR('^'), OR('|'), QUEST('?')
        {
            keywords =
                "auto", "break", "case", "char", "const", "continue", "default",
                "do", "double", "else", "enum", "extern", "float", "for",
                "goto", "if", "int", "long", "register", "return", "short",
                "signed", "sizeof", "static", "struct", "switch", "typedef",
                "union", "unsigned", "void", "volatile", "while";
            LEFT_BRACE = chlit<>('{') | strlit<>("<%");
            RIGHT_BRACE = chlit<>('}') | strlit<>("%>");
            LEFT_BRACKET = chlit<>('[') | strlit<>("<:");
            RIGHT_BRACKET = chlit<>(']') | strlit<>(":>");
            AUTO = strlit<>("auto");
            BREAK = strlit<>("break");
            CASE = strlit<>("case");
            CHAR = strlit<>("char");
            CONST = strlit<>("const");
            CONTINUE = strlit<>("continue");
            DEFAULT = strlit<>("default");
            DO = strlit<>("do");
            DOUBLE = strlit<>("double");
            ELSE = strlit<>("else");
            ENUM = strlit<>("enum");
            EXTERN = strlit<>("extern");
            FOR = strlit<>("for");
            FLOAT = strlit<>("float");
            GOTO = strlit<>("goto");
            IF = strlit<>("if");
            INT = strlit<>("int");
            LONG = strlit<>("long");
            REGISTER = strlit<>("register");
            RETURN = strlit<>("return");
            SHORT = strlit<>("short");
            SIGNED = strlit<>("signed");
            SIZEOF = strlit<>("sizeof");
            STATIC = strlit<>("static");
            STRUCT = strlit<>("struct");
            SWITCH = strlit<>("switch");
            TYPEDEF = strlit<>("typedef");
            UNION = strlit<>("union");
            UNSIGNED = strlit<>("unsigned");
            VOID = strlit<>("void");
            VOLATILE = strlit<>("volatile");
            WHILE = strlit<>("while");
            IDENTIFIER =
                lexeme_d[
                    ((alpha_p | '_' | '$') >> *(alnum_p | '_' | '$'))
                    - (keywords >> anychar_p - (alnum_p | '_' | '$'))
                ]
                ;
            STRING_LITERAL_PART =
                lexeme_d[
                    !chlit<>('L') >> chlit<>('\"') >>
                    *( strlit<>("\\\"") | anychar_p - chlit<>('\"') ) >>
                    chlit<>('\"')
                ]
                ;
            STRING_LITERAL = +STRING_LITERAL_PART;
            INT_CONSTANT_HEX
                = lexeme_d[
                    chlit<>('0')
                    >> as_lower_d[chlit<>('x')]
                    >> +xdigit_p
                    >> !as_lower_d[chlit<>('l') | chlit<>('u')]
                ]
                ;
            INT_CONSTANT_OCT
                = lexeme_d[
                    chlit<>('0')
                    >> +range<>('0', '7')
                    >> !as_lower_d[chlit<>('l') | chlit<>('u')]
                ]
                ;
            INT_CONSTANT_DEC
                = lexeme_d[
                    +digit_p
                    >> !as_lower_d[chlit<>('l') | chlit<>('u')]
                ]
                ;
            INT_CONSTANT_CHAR
                = lexeme_d[
                    !chlit<>('L') >> chlit<>('\'') >>
                    longest_d[
                            anychar_p
                        | ( chlit<>('\\')
                                >> chlit<>('0')
                                >> repeat_p(0, 2)[range<>('0', '7')]
                            )
                        | (chlit<>('\\') >> anychar_p)
                    ] >>
                    chlit<>('\'')
                ]
                ;
            INT_CONSTANT =
                    INT_CONSTANT_HEX
                | INT_CONSTANT_OCT
                | INT_CONSTANT_DEC
                | INT_CONSTANT_CHAR
                ;
            FLOAT_CONSTANT_1
                = lexeme_d[
                    +digit_p
                    >> (chlit<>('e') | chlit<>('E'))
                    >> !(chlit<>('+') | chlit<>('-'))
                    >> +digit_p
                    >> !as_lower_d[chlit<>('l') | chlit<>('f')]
                ]
                ;
            FLOAT_CONSTANT_2
                = lexeme_d[
                    *digit_p
                    >> chlit<>('.')
                    >> +digit_p
                    >> !( (chlit<>('e') | chlit<>('E'))
                            >> !(chlit<>('+') | chlit<>('-'))
                            >> +digit_p
                        )
                    >> !as_lower_d[chlit<>('l') | chlit<>('f')]
                ]
                ;
            FLOAT_CONSTANT_3
                = lexeme_d[
                    +digit_p
                    >> chlit<>('.')
                    >> *digit_p
                    >> !( (chlit<>('e') | chlit<>('E'))
                            >> !(chlit<>('+') | chlit<>('-'))
                            >> +digit_p
                        )
                    >> !as_lower_d[chlit<>('l') | chlit<>('f')]
                ]
                ;
            FLOAT_CONSTANT =
                    FLOAT_CONSTANT_1
                | FLOAT_CONSTANT_2
                | FLOAT_CONSTANT_3
                ;
            CONSTANT = longest_d[FLOAT_CONSTANT | INT_CONSTANT];
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            ;
            primary_expression
                = IDENTIFIER
                | CONSTANT
                | STRING_LITERAL
                | LEFT_PAREN >> expression >> RIGHT_PAREN
                ;
            postfix_expression
                = primary_expression >> postfix_expression_helper
                ;
            postfix_expression_helper
                = (
                        LEFT_BRACKET >> expression >> RIGHT_BRACKET
                    | LEFT_PAREN >> !argument_expression_list >> RIGHT_PAREN
                    | DOT >> IDENTIFIER
                    | PTR_OP >> IDENTIFIER
                    | INC_OP
                    | DEC_OP
                    ) >>
                    postfix_expression_helper
                | epsilon_p
                ;
            argument_expression_list
                = assignment_expression >> *(COMMA >> assignment_expression)
                ;
            unary_expression
                = postfix_expression
                | INC_OP >> unary_expression
                | DEC_OP >> unary_expression
                | unary_operator >> cast_expression
                | SIZEOF >>
                    (
                        unary_expression
                    | LEFT_PAREN >> type_name >> RIGHT_PAREN
                    )
                ;
            unary_operator
                = ADDROF
                | STAR
                | PLUS
                | MINUS
                | TILDE
                | BANG
                ;
            cast_expression
                = LEFT_PAREN >> type_name >> RIGHT_PAREN >> cast_expression
                | unary_expression
                ;
            multiplicative_expression
                = cast_expression >> multiplicative_expression_helper
                ;
            multiplicative_expression_helper
                = (
                        STAR >> cast_expression
                    | SLASH >> cast_expression
                    | PERCENT >> cast_expression
                    ) >>
                    multiplicative_expression_helper
                | epsilon_p
                ;
            additive_expression
                = multiplicative_expression >> additive_expression_helper
                ;
            additive_expression_helper
                = (
                        PLUS >> multiplicative_expression
                    | MINUS >> multiplicative_expression
                    ) >>
                    additive_expression_helper
                | epsilon_p
                ;
            shift_expression
                = additive_expression >> shift_expression_helper
                ;
            shift_expression_helper
                = (
                        LEFT_OP >> additive_expression
                    | RIGHT_OP >> additive_expression
                    ) >>
                    shift_expression_helper
                | epsilon_p
                ;
            relational_expression
                = shift_expression >> relational_expression_helper
                ;
            relational_expression_helper
                = (
                        LT_OP >> shift_expression
                    | GT_OP >> shift_expression
                    | LE_OP >> shift_expression
                    | GE_OP >> shift_expression
                    ) >>
                    relational_expression_helper
                | epsilon_p
                ;
            equality_expression
                = relational_expression >> equality_expression_helper
                ;
            equality_expression_helper
                = (
                        EQ_OP >> relational_expression
                    | NE_OP >> relational_expression
                    ) >>
                    equality_expression_helper
                | epsilon_p
                ;
            and_expression
                = equality_expression >> and_expression_helper
                ;
            and_expression_helper
                = ADDROF >> equality_expression >> and_expression_helper
                | epsilon_p
                ;
            exclusive_or_expression
                = and_expression >> exclusive_or_expression_helper
                ;
            exclusive_or_expression_helper
                = XOR >> and_expression >> exclusive_or_expression_helper
                | epsilon_p
                ;
            inclusive_or_expression
                = exclusive_or_expression >> inclusive_or_expression_helper
                ;
            inclusive_or_expression_helper
                = OR >> exclusive_or_expression >> inclusive_or_expression_helper
                | epsilon_p
                ;
            logical_and_expression
                = inclusive_or_expression >> logical_and_expression_helper
                ;
            logical_and_expression_helper
                = AND_OP >> inclusive_or_expression >> logical_and_expression_helper
                | epsilon_p
                ;
            logical_or_expression
                = logical_and_expression >> logical_or_expression_helper
                ;
            logical_or_expression_helper
                = OR_OP >> logical_and_expression >> logical_or_expression_helper
                | epsilon_p
                ;
            conditional_expression
                = logical_or_expression >> conditional_expression_helper
                ;
            conditional_expression_helper
                = QUEST >> expression >> COLON
                    >> conditional_expression >> conditional_expression_helper
                | epsilon_p
                ;
            assignment_expression
                = unary_expression >> assignment_operator >> assignment_expression
                | conditional_expression
                ;
            assignment_operator
                = ASSIGN
                | MUL_ASSIGN
                | DIV_ASSIGN
                | MOD_ASSIGN
                | ADD_ASSIGN
                | SUB_ASSIGN
                | LEFT_ASSIGN
                | RIGHT_ASSIGN
                | AND_ASSIGN
                | XOR_ASSIGN
                | OR_ASSIGN
                ;
            expression
                = assignment_expression >> expression_helper
                ;
            expression_helper
                = COMMA >> assignment_expression >> expression_helper
                | epsilon_p
                ;
            constant_expression
                = conditional_expression
                ;
            declaration
                = declaration_specifiers >> !init_declarator_list >> SEMICOLON
                ;
            declaration_specifiers
                = (
                        storage_class_specifier
                    | type_specifier
                    | type_qualifier
                    ) >>
                    !declaration_specifiers
                ;
            init_declarator_list
                = init_declarator >> *(COMMA >> init_declarator)
                ;
            init_declarator
                = declarator >> !(ASSIGN >> initializer)
                ;
            storage_class_specifier
                = TYPEDEF
                | EXTERN
                | STATIC
                | AUTO
                | REGISTER
                ;
            type_specifier
                = VOID
                | CHAR
                | SHORT
                | INT
                | LONG
                | FLOAT
                | DOUBLE
                | SIGNED
                | UNSIGNED
                | struct_or_union_specifier
                | enum_specifier
                ;
            struct_or_union_specifier
                = struct_or_union >>
                    (
                        IDENTIFIER >> !(LEFT_BRACE >> struct_declaration_list
                            >> RIGHT_BRACE)
                    | LEFT_BRACE >> struct_declaration_list >> RIGHT_BRACE
                    )
                ;
            struct_or_union
                = STRUCT
                | UNION
                ;
            struct_declaration_list
                = +struct_declaration
                ;
            struct_declaration
                = specifier_qualifier_list >> struct_declarator_list >> SEMICOLON
                ;
            specifier_qualifier_list
                = (
                        type_specifier
                    | type_qualifier
                    ) >>
                    !specifier_qualifier_list
                ;
            struct_declarator_list
                = struct_declarator >> *(COMMA >> struct_declarator)
                ;
            struct_declarator
                = declarator || (COLON >> constant_expression)
                ;
            enum_specifier
                = ENUM >> !IDENTIFIER >> LEFT_BRACE >> enumerator_list >> RIGHT_BRACE
                ;
            enumerator_list
                = enumerator >> *(COMMA >> enumerator)
                ;
            enumerator
                = IDENTIFIER >> !(ASSIGN >> constant_expression)
                ;
            type_qualifier
                = CONST
                | VOLATILE
                ;
            declarator
                = !pointer >> direct_declarator
                ;
            direct_declarator
                = (
                        IDENTIFIER
                    | LEFT_PAREN >> declarator >> RIGHT_PAREN
                    ) >>
                    direct_declarator_helper
                ;
            direct_declarator_helper
                = (
                        LEFT_BRACKET >> !constant_expression >> RIGHT_BRACKET
                    | LEFT_PAREN >>
                    ! (
                            parameter_type_list
                        | identifier_list
                        ) >> RIGHT_PAREN
                    ) >> direct_declarator_helper
                | epsilon_p
                ;
            pointer
                = STAR >> !(type_qualifier_list || pointer)
                ;
            type_qualifier_list
                = +type_qualifier
                ;
            parameter_type_list
                = parameter_list >> !(COMMA >> ELLIPSIS)
                ;
            parameter_list
                = parameter_declaration >> *(COMMA >> parameter_declaration)
                ;
            parameter_declaration
                = declaration_specifiers >>
                   !(
                        declarator
                    | abstract_declarator
                    )
                ;
            identifier_list
                = IDENTIFIER >> *(COMMA >> IDENTIFIER)
                ;
            type_name
                = specifier_qualifier_list >> !abstract_declarator
                ;
            abstract_declarator
                = pointer || direct_abstract_declarator
                ;
            direct_abstract_declarator
                = (
                        LEFT_PAREN >>
                        (
                            abstract_declarator >> RIGHT_PAREN
                        | !parameter_type_list >> RIGHT_PAREN
                        )
                    | LEFT_BRACKET >> !constant_expression >> RIGHT_BRACKET
                    ) >>
                    direct_abstract_declarator_helper
                ;
            direct_abstract_declarator_helper
                = (
                        LEFT_BRACKET >> !constant_expression >> RIGHT_BRACKET
                    | LEFT_PAREN >> !parameter_type_list >> RIGHT_PAREN
                    ) >>
                    direct_abstract_declarator_helper
                | epsilon_p
                ;
            initializer
                = assignment_expression
                | LEFT_BRACE >> initializer_list >> !COMMA >> RIGHT_BRACE
                ;
            initializer_list
                = initializer >> *(COMMA >> initializer)
                ;
            statement
                = labeled_statement
                | compound_statement
                | expression_statement
                | selection_statement
                | iteration_statement
                | jump_statement
                ;
            labeled_statement
                = IDENTIFIER >> COLON >> statement
                | CASE >> constant_expression >> COLON >> statement
                | DEFAULT >> COLON >> statement
                ;
            compound_statement
                = LEFT_BRACE >> !(declaration_list || statement_list) >> RIGHT_BRACE
                ;
            declaration_list
                = +declaration
                ;
            statement_list
                = +statement
                ;
            expression_statement
                = !expression >> SEMICOLON
                ;
            selection_statement
                = IF >> LEFT_PAREN >> expression >> RIGHT_PAREN >> statement
                    >> !(ELSE >> statement)
                | SWITCH >> LEFT_PAREN >> expression >> RIGHT_PAREN >> statement
                ;
            iteration_statement
                = WHILE >> LEFT_PAREN >> expression >> RIGHT_PAREN >> statement
                | DO >> statement >> WHILE >> LEFT_PAREN >> expression
                    >> RIGHT_PAREN >> SEMICOLON
                | FOR >> LEFT_PAREN >> expression_statement >> expression_statement
                    >> !expression >> RIGHT_PAREN >> statement
                ;
            jump_statement
                = GOTO >> IDENTIFIER >> SEMICOLON
                | CONTINUE >> SEMICOLON
                | BREAK >> SEMICOLON
                | RETURN >> !expression >> SEMICOLON
                ;
            function_definition
                = !declaration_specifiers
                >> declarator
                >> !declaration_list
                >> compound_statement
                ;
            external_declaration
                = function_definition
                | declaration
                ;
            translation_unit
                = *external_declaration
                ;
        }
        symbols<> keywords;
        strlit<>
                ELLIPSIS, RIGHT_ASSIGN, LEFT_ASSIGN, ADD_ASSIGN, SUB_ASSIGN,
                MUL_ASSIGN, DIV_ASSIGN, MOD_ASSIGN, AND_ASSIGN, XOR_ASSIGN,
                OR_ASSIGN, RIGHT_OP, LEFT_OP, INC_OP, DEC_OP, PTR_OP, AND_OP,
                OR_OP, LE_OP, GE_OP, EQ_OP, NE_OP;
        chlit<>
                SEMICOLON, COMMA, COLON, ASSIGN, LEFT_PAREN, RIGHT_PAREN,
                DOT, ADDROF, BANG, TILDE, MINUS, PLUS, STAR, SLASH, PERCENT,
                LT_OP, GT_OP, XOR, OR, QUEST;
        rule<ScannerT>
                LEFT_BRACE, RIGHT_BRACE, LEFT_BRACKET, RIGHT_BRACKET;
        rule<ScannerT>
                AUTO, BREAK, CASE, CHAR, CONST, CONTINUE, DEFAULT, DO, DOUBLE,
                ELSE, ENUM, EXTERN, FOR, FLOAT, GOTO, IF, INT, LONG, REGISTER,
                RETURN, SHORT, SIGNED, SIZEOF, STATIC, STRUCT, SWITCH, TYPEDEF,
                UNION, UNSIGNED, VOID, VOLATILE, WHILE, IDENTIFIER,
                STRING_LITERAL_PART, STRING_LITERAL, INT_CONSTANT_HEX, INT_CONSTANT,
                INT_CONSTANT_OCT, INT_CONSTANT_DEC, INT_CONSTANT_CHAR,
                FLOAT_CONSTANT,FLOAT_CONSTANT_1, FLOAT_CONSTANT_2, FLOAT_CONSTANT_3,
                CONSTANT;
        rule<ScannerT>
                primary_expression, postfix_expression, postfix_expression_helper,
                argument_expression_list, unary_expression, unary_operator,
                cast_expression,
                multiplicative_expression, multiplicative_expression_helper,
                additive_expression, additive_expression_helper,
                shift_expression, shift_expression_helper,
                relational_expression, relational_expression_helper,
                equality_expression, equality_expression_helper,
                and_expression, and_expression_helper,
                exclusive_or_expression, exclusive_or_expression_helper,
                inclusive_or_expression, inclusive_or_expression_helper,
                logical_and_expression, logical_and_expression_helper,
                logical_or_expression, logical_or_expression_helper,
                conditional_expression, conditional_expression_helper,
                assignment_expression, assignment_operator,
                expression, expression_helper, constant_expression, declaration,
                declaration_specifiers, init_declarator_list, init_declarator,
                storage_class_specifier, type_specifier, struct_or_union_specifier,
                struct_or_union, struct_declaration_list, struct_declaration,
                specifier_qualifier_list, struct_declarator_list,
                struct_declarator, enum_specifier, enumerator_list, enumerator,
                type_qualifier, declarator,
                direct_declarator, direct_declarator_helper, pointer,
                type_qualifier_list, parameter_type_list, parameter_list,
                parameter_declaration, identifier_list, type_name,
                abstract_declarator,
                direct_abstract_declarator, direct_abstract_declarator_helper,
                initializer, initializer_list, statement, labeled_statement,
                compound_statement, declaration_list, statement_list,
                expression_statement, selection_statement, iteration_statement,
                jump_statement, translation_unit, external_declaration,
                function_definition;
        rule<ScannerT> const&
        start() const { return translation_unit; }
    };
};
extern const char *g_code;
int
main(int argc, char* argv[])
{
  c_grammar g;
  unsigned long n = 40;
  if (argc > 1)
    n = atol(argv[1]);
  for (unsigned long i=0;i<n;i++)
  {
    if (parse(g, g_code, strlen(g_code))) {
      std::cerr << "parse OK!\n";
    } else {
      std::cerr << "parse bad.\n";
    }
  }
  return 0;
}
const char *g_code =
" extern int debug_key_pressed; \n"
" void (*dsp32ops[])(void); \n"
"  \n"
"  \n"
"  \n"
"  \n"
"  \n"
"  \n"
"  \n"
" union int_double \n"
" { \n"
"         double d; \n"
"         unsigned long i[2]; \n"
" }; \n"
"  \n"
" static void illegal(void) \n"
" { \n"
" } \n"
"  \n"
"  \n"
" static void unimplemented(void) \n"
" { \n"
"         exit(1); \n"
" } \n"
"  \n"
"  \n"
"  void execute_one(void) \n"
" { \n"
"         if (dsp32.mbufaddr[++dsp32.mbuf_index & 3] != 1) { int bufidx = dsp32.mbuf_index & 3; if (dsp32.mbufaddr[bufidx] >= 0) WLONG(dsp32.mbufaddr[bufidx], dsp32.mbufdata[bufidx]); else WWORD(-dsp32.mbufaddr[bufidx], dsp32.mbufdata[bufidx]); dsp32.mbufaddr[bufidx] = 1; }; \n"
"         CALL_MAME_DEBUG; \n"
"         OP = ROPCODE(dsp32.PC); \n"
"         dsp32_icount -= 4; \n"
"         dsp32.PC += 4; \n"
"         if (OP) \n"
"                 (*dsp32ops[OP >> 21])(); \n"
" } \n"
"  \n"
" static unsigned long cau_read_pi_special(unsigned char i) \n"
" { \n"
"         switch (i) \n"
"         { \n"
"                 case 4: return dsp32.ibuf; \n"
"                 case 5: return dsp32.obuf; \n"
"                 case 6: update_pcr(dsp32.pcr & ~PCR_PDFs); return dsp32.pdr; \n"
"                 case 14: return dsp32.piop; \n"
"                 case 20: return dsp32.pdr2; \n"
"                 case 22: update_pcr(dsp32.pcr & ~PCR_PIFs); return dsp32.pir; \n"
"                 case 30: return dsp32.pcw; \n"
"         } \n"
"         return 0; \n"
" } \n"
"  \n"
"  \n"
" static void cau_write_pi_special(unsigned char i, unsigned long val) \n"
" { \n"
"         switch (i) \n"
"         { \n"
"                 case 4: dsp32.ibuf = val; break; \n"
"                 case 5: dsp32.obuf = val; break; \n"
"                 case 6: dsp32.pdr = val; update_pcr(dsp32.pcr | PCR_PDFs); break; \n"
"                 case 14: dsp32.piop = val; break; \n"
"                 case 20: dsp32.pdr2 = val; break; \n"
"                 case 22: dsp32.pir = val; update_pcr(dsp32.pcr | PCR_PIFs); break; \n"
"                 case 30: dsp32.pcw = val; break; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
"  unsigned char cau_read_pi_1byte(int pi) \n"
" { \n"
"         int p = (pi >> 5) & 0x1f; \n"
"         int i = (pi >> 0) & 0x1f; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result = RBYTE(dsp32.r[p]); \n"
"                 dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i]) & 0xffffff); \n"
"                 return result; \n"
"         } \n"
"         else \n"
"                 return cau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  unsigned short cau_read_pi_2byte(int pi) \n"
" { \n"
"         int p = (pi >> 5) & 0x1f; \n"
"         int i = (pi >> 0) & 0x1f; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result = RWORD(dsp32.r[p]); \n"
"                 if (i < 22 || i > 23) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i] * 2) & 0xffffff); \n"
"                 return result; \n"
"         } \n"
"         else \n"
"                 return cau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  unsigned long cau_read_pi_4byte(int pi) \n"
" { \n"
"         int p = (pi >> 5) & 0x1f; \n"
"         int i = (pi >> 0) & 0x1f; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result = RLONG(dsp32.r[p]); \n"
"                 if (i < 22 || i > 23) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i] * 4) & 0xffffff); \n"
"                 return result; \n"
"         } \n"
"         else \n"
"                 return cau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  void cau_write_pi_1byte(int pi, unsigned char val) \n"
" { \n"
"         int p = (pi >> 5) & 0x1f; \n"
"         int i = (pi >> 0) & 0x1f; \n"
"         if (p) \n"
"         { \n"
"                 WBYTE(dsp32.r[p], val); \n"
"                 dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i]) & 0xffffff); \n"
"         } \n"
"         else \n"
"                 cau_write_pi_special(i, val); \n"
" } \n"
"  \n"
"  \n"
"  void cau_write_pi_2byte(int pi, unsigned short val) \n"
" { \n"
"         int p = (pi >> 5) & 0x1f; \n"
"         int i = (pi >> 0) & 0x1f; \n"
"         if (p) \n"
"         { \n"
"                 WWORD(dsp32.r[p], val); \n"
"                 if (i < 22 || i > 23) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i] * 2) & 0xffffff); \n"
"         } \n"
"         else \n"
"                 cau_write_pi_special(i, val); \n"
" } \n"
"  \n"
"  \n"
"  void cau_write_pi_4byte(int pi, unsigned long val) \n"
" { \n"
"         int p = (pi >> 5) & 0x1f; \n"
"         int i = (pi >> 0) & 0x1f; \n"
"         if (p) \n"
"         { \n"
"                 WLONG(dsp32.r[p], (long)(val << 8) >> 8); \n"
"                 if (i < 22 || i > 23) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i] * 4) & 0xffffff); \n"
"         } \n"
"         else \n"
"                 cau_write_pi_special(i, val); \n"
" } \n"
"  double dau_get_amult(int aidx) \n"
" { \n"
"         int bufidx = (dsp32.abuf_index - 1) & 3; \n"
"         double val = dsp32.a[aidx]; \n"
"         while (dsp32_icount >= dsp32.abufcycle[bufidx] - 2 * 4) \n"
"         { \n"
"                 if (dsp32.abufreg[bufidx] == aidx) \n"
"                         val = dsp32.abuf[bufidx]; \n"
"                 bufidx = (bufidx - 1) & 3; \n"
"         } \n"
"         return val; \n"
" } \n"
"  \n"
"  \n"
"  double dau_get_anzflags(void) \n"
" { \n"
"         int bufidx = (dsp32.abuf_index - 1) & 3; \n"
"         double nzflags = dsp32.NZflags; \n"
"         while (dsp32_icount >= dsp32.abufcycle[bufidx] - 3 * 4) \n"
"         { \n"
"                 nzflags = dsp32.abufNZflags[bufidx]; \n"
"                 bufidx = (bufidx - 1) & 3; \n"
"         } \n"
"         return nzflags; \n"
" } \n"
"  \n"
"  \n"
"  unsigned char dau_get_avuflags(void) \n"
" { \n"
"  \n"
"         int bufidx = (dsp32.abuf_index - 1) & 3; \n"
"         unsigned char vuflags = dsp32.VUflags; \n"
"         while (dsp32_icount >= dsp32.abufcycle[bufidx] - 3 * 4) \n"
"         { \n"
"                 vuflags = dsp32.abufVUflags[bufidx]; \n"
"                 bufidx = (bufidx - 1) & 3; \n"
"         } \n"
"         return vuflags; \n"
"  \n"
"  \n"
"  \n"
" } \n"
"  \n"
"  \n"
"  void remember_last_dau(int aidx) \n"
" { \n"
"  \n"
"         int bufidx = dsp32.abuf_index++ & 3; \n"
"         dsp32.abuf[bufidx] = dsp32.a[aidx]; \n"
"         dsp32.abufreg[bufidx] = aidx; \n"
"         dsp32.abufNZflags[bufidx] = dsp32.NZflags; \n"
"  \n"
"         dsp32.abufVUflags[bufidx] = dsp32.VUflags; \n"
"  \n"
"         dsp32.abufcycle[bufidx] = dsp32_icount; \n"
"  \n"
" } \n"
"  \n"
"  \n"
"  void dau_set_val_noflags(int aidx, double res) \n"
" { \n"
"         remember_last_dau(aidx); \n"
"         dsp32.a[aidx] = res; \n"
" } \n"
"  \n"
"  \n"
"  void dau_set_val_flags(int aidx, double res) \n"
" { \n"
"         remember_last_dau(aidx); \n"
"  \n"
" { \n"
"         double absres = (res < 0) ? -res : res; \n"
"         dsp32.VUflags = 0; \n"
"         if (absres < 5.87747e-39) \n"
"         { \n"
"                 if (absres != 0) \n"
"                         dsp32.VUflags = UFLAGBIT; \n"
"                 res = 0.0; \n"
"         } \n"
"         else if (absres > 3.40282e38) \n"
"         { \n"
"                 dsp32.VUflags = VFLAGBIT; \n"
"  \n"
"  \n"
"                 res = (res < 0) ? -3.40282e38 : 3.40282e38; \n"
"         } \n"
" } \n"
"  \n"
"         dsp32.NZflags = res; \n"
"         dsp32.a[aidx] = res; \n"
" } \n"
"  \n"
"  \n"
" double dsp_to_double(unsigned long val) \n"
" { \n"
"         union int_double id; \n"
"  \n"
"         if (val == 0) \n"
"                 return 0; \n"
"         else if ((int)val > 0) \n"
"         { \n"
"                 int exponent = ((val & 0xff) - 128 + 1023) << 20; \n"
"                 id.i[BYTE_XOR_BE(0)] = exponent + (val >> 11); \n"
"                 id.i[BYTE_XOR_BE(1)] = (val << 21) & 0xe0000000; \n"
"         } \n"
"         else \n"
"         { \n"
"                 int exponent = ((val & 0xff) - 128 + 1023) << 20; \n"
"                 val = -(val & 0xffffff00); \n"
"                 id.i[BYTE_XOR_BE(0)] = 0x80000000 + exponent + ((val >> 11) & 0x001fffff); \n"
"                 id.i[BYTE_XOR_BE(1)] = (val << 21) & 0xe0000000; \n"
"         } \n"
"         return id.d; \n"
" } \n"
"  \n"
"  \n"
" unsigned long ddd(double val) \n"
" { \n"
"         int mantissa, exponent; \n"
"         union int_double id; \n"
"         id.d = val; \n"
"         mantissa = ((id.i[BYTE_XOR_BE(0)] & 0x000fffff) << 11) | ((id.i[BYTE_XOR_BE(1)] & 0xe0000000) >> 21); \n"
"         exponent = ((id.i[BYTE_XOR_BE(0)] & 0x7ff00000) >> 20) - 1023 + 128; \n"
"         if (exponent < 0) \n"
"                 return 0x00000000; \n"
"         else if (exponent > 255) \n"
"         { \n"
"  \n"
"  \n"
"                 return ((long)id.i[BYTE_XOR_BE(0)] >= 0) ? 0x7fffffff : 0x800000ff; \n"
"         } \n"
"         else if ((long)id.i[BYTE_XOR_BE(0)] >= 0) \n"
"                 return exponent | mantissa; \n"
"         else \n"
"         { \n"
"                 mantissa = -mantissa; \n"
"                 if (mantissa == 0) { mantissa = 0x80000000; exponent--; } \n"
"                 return 0x80000000 | exponent | (mantissa & 0xffffff00); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static double dau_read_pi_special(int i) \n"
" { \n"
"         exit(1); \n"
"         return 0; \n"
" } \n"
"  \n"
"  \n"
" static void dau_write_pi_special(int i, double val) \n"
" { \n"
"         exit(1); \n"
" } \n"
"  \n"
"  \n"
" static int lastp; \n"
"  \n"
"  double dau_read_pi_double_1st(int pi, int multiplier) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         lastp = p; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result = RLONG(dsp32.r[p]); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 4) & 0xffffff); \n"
"                 return dsp_to_double(result); \n"
"         } \n"
"         else if (i < 4) \n"
"                 return multiplier ? dau_get_amult(i) : dsp32.a[i]; \n"
"         else \n"
"                 return dau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  double dau_read_pi_double_2nd(int pi, int multiplier, double xval) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         if (p == 15) p = lastp; \n"
"         lastp = p; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result; \n"
"                 result = RLONG(dsp32.r[p]); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 4) & 0xffffff); \n"
"                 return dsp_to_double(result); \n"
"         } \n"
"         else if (i < 4) \n"
"                 return multiplier ? dau_get_amult(i) : dsp32.a[i]; \n"
"         else \n"
"                 return dau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  unsigned long dau_read_pi_4bytes(int pi) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         lastp = p; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result = RLONG(dsp32.r[p]); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 4) & 0xffffff); \n"
"                 return result; \n"
"         } \n"
"         else if (i < 4) \n"
"                 return double_to_dsp(dsp32.a[i]); \n"
"         else \n"
"                 return dau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  unsigned short dau_read_pi_2bytes(int pi) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         lastp = p; \n"
"         if (p) \n"
"         { \n"
"                 unsigned long result = RWORD(dsp32.r[p]); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 2) & 0xffffff); \n"
"                 return result; \n"
"         } \n"
"         else if (i < 4) \n"
"                 return double_to_dsp(dsp32.a[i]); \n"
"         else \n"
"                 return dau_read_pi_special(i); \n"
" } \n"
"  \n"
"  \n"
"  void dau_write_pi_double(int pi, double val) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         if (p == 15) p = lastp; \n"
"         if (p) \n"
"         { \n"
"                 do { int bufidx = dsp32.mbuf_index & 3; dsp32.mbufaddr[bufidx] = (dsp32.r[p]); dsp32.mbufdata[bufidx] = (double_to_dsp(val)); } while (0); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 4) & 0xffffff); \n"
"         } \n"
"         else if (i < 4) \n"
"                 dau_set_val_noflags(i, val); \n"
"         else \n"
"                 dau_write_pi_special(i, val); \n"
" } \n"
"  \n"
"  \n"
"  void dau_write_pi_4bytes(int pi, unsigned long val) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         if (p == 15) p = lastp; \n"
"         if (p) \n"
"         { \n"
"                 lastp = p; \n"
"                 do { int bufidx = dsp32.mbuf_index & 3; dsp32.mbufaddr[bufidx] = (dsp32.r[p]); dsp32.mbufdata[bufidx] = (val); } while (0); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 4) & 0xffffff); \n"
"         } \n"
"         else if (i < 4) \n"
"                 dau_set_val_noflags(i, dsp_to_double(val)); \n"
"         else \n"
"                 dau_write_pi_special(i, val); \n"
" } \n"
"  \n"
"  \n"
"  void dau_write_pi_2bytes(int pi, unsigned short val) \n"
" { \n"
"         int p = (pi >> 3) & 15; \n"
"         int i = (pi >> 0) & 7; \n"
"  \n"
"         if (p == 15) p = lastp; \n"
"         if (p) \n"
"         { \n"
"                 lastp = p; \n"
"                 do { int bufidx = dsp32.mbuf_index & 3; dsp32.mbufaddr[bufidx] = -(dsp32.r[p]); dsp32.mbufdata[bufidx] = (val); } while (0); \n"
"                 if (i < 6) \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16]) & 0xffffff); \n"
"                 else \n"
"                         dsp32.r[p] = ((dsp32.r[p] + dsp32.r[i+16] * 2) & 0xffffff); \n"
"         } \n"
"         else if (i < 4) \n"
"                 dau_set_val_noflags(i, dsp_to_double(val << 16)); \n"
"         else \n"
"                 dau_write_pi_special(i, val); \n"
" } \n"
" static int condition(int cond) \n"
" { \n"
"         switch (cond) \n"
"         { \n"
"                 case 0: \n"
"                         return 0; \n"
"                 case 1: \n"
"                         return 1; \n"
"                 case 2: \n"
"                         return !nFLAG; \n"
"                 case 3: \n"
"                         return nFLAG; \n"
"                 case 4: \n"
"                         return !zFLAG; \n"
"                 case 5: \n"
"                         return zFLAG; \n"
"                 case 6: \n"
"                         return !vFLAG; \n"
"                 case 7: \n"
"                         return vFLAG; \n"
"                 case 8: \n"
"                         return !cFLAG; \n"
"                 case 9: \n"
"                         return cFLAG; \n"
"                 case 10: \n"
"                         return !(nFLAG ^ cFLAG); \n"
"                 case 11: \n"
"                         return (nFLAG ^ cFLAG); \n"
"                 case 12: \n"
"                         return !(zFLAG | (nFLAG ^ vFLAG)); \n"
"                 case 13: \n"
"                         return (zFLAG | (nFLAG ^ vFLAG)); \n"
"                 case 14: \n"
"                         return !(cFLAG | zFLAG); \n"
"                 case 15: \n"
"                         return (cFLAG | zFLAG); \n"
"  \n"
"                 case 16: \n"
"                         return !(dau_get_avuflags() & UFLAGBIT); \n"
"                 case 17: \n"
"                         return (dau_get_avuflags() & UFLAGBIT); \n"
"                 case 18: \n"
"                         return !(dau_get_anzflags() < 0); \n"
"                 case 19: \n"
"                         return (dau_get_anzflags() < 0); \n"
"                 case 20: \n"
"                         return !(dau_get_anzflags() == 0); \n"
"                 case 21: \n"
"                         return (dau_get_anzflags() == 0); \n"
"                 case 22: \n"
"                         return !(dau_get_avuflags() & VFLAGBIT); \n"
"                 case 23: \n"
"                         return (dau_get_avuflags() & VFLAGBIT); \n"
"                 case 24: \n"
"                         return !(dau_get_anzflags() <= 0); \n"
"                 case 25: \n"
"                         return (dau_get_anzflags() <= 0); \n"
"  \n"
"                 case 32: \n"
"                 case 33: \n"
"                 case 34: \n"
"                 case 35: \n"
"                 case 36: \n"
"                 case 37: \n"
"                 case 38: \n"
"                 case 39: \n"
"                 case 40: \n"
"                 case 41: \n"
"                 case 42: \n"
"                 case 43: \n"
"                 case 44: \n"
"                 case 45: \n"
"                 case 46: \n"
"                 case 47: \n"
"                 default: \n"
"                         exit(1); \n"
"         } \n"
" } \n"
"  \n"
" static void nop(void) \n"
" { \n"
"         unsigned long op = 123; \n"
"         if (op == 0) \n"
"                 return; \n"
"         execute_one(); \n"
"         dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"         cpu_setopbase24ledw(dsp32.PC); \n"
"  \n"
" } \n"
"  \n"
" static void goto_t(void) \n"
" { \n"
"         unsigned long op = OP; \n"
"         execute_one(); \n"
"         dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"         cpu_setopbase24ledw(dsp32.PC); \n"
" } \n"
"  \n"
"  \n"
" static void goto_pl(void) \n"
" { \n"
"         if (!nFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_mi(void) \n"
" { \n"
"         if (nFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_ne(void) \n"
" { \n"
"         if (!zFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_eq(void) \n"
" { \n"
"         if (zFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_vc(void) \n"
" { \n"
"         if (!vFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_vs(void) \n"
" { \n"
"         if (vFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_cc(void) \n"
" { \n"
"         if (!cFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_cs(void) \n"
" { \n"
"         if (cFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_ge(void) \n"
" { \n"
"         if (!(nFLAG ^ vFLAG)) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_lt(void) \n"
" { \n"
"         if (nFLAG ^ vFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_gt(void) \n"
" { \n"
"         if (!(zFLAG | (nFLAG ^ vFLAG))) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_le(void) \n"
" { \n"
"         if (zFLAG | (nFLAG ^ vFLAG)) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_hi(void) \n"
" { \n"
"         if (!cFLAG && !zFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_ls(void) \n"
" { \n"
"         if (cFLAG || zFLAG) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_auc(void) \n"
" { \n"
"         if (!(dau_get_avuflags() & UFLAGBIT)) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_aus(void) \n"
" { \n"
"         if (dau_get_avuflags() & UFLAGBIT) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_age(void) \n"
" { \n"
"         if (dau_get_anzflags() >= 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_alt(void) \n"
" { \n"
"         if (dau_get_anzflags() < 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_ane(void) \n"
" { \n"
"         if (dau_get_anzflags() != 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_aeq(void) \n"
" { \n"
"         if (dau_get_anzflags() == 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_avc(void) \n"
" { \n"
"         if (!(dau_get_avuflags() & VFLAGBIT)) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_avs(void) \n"
" { \n"
"         if (dau_get_avuflags() & VFLAGBIT) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_agt(void) \n"
" { \n"
"         if (dau_get_anzflags() > 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_ale(void) \n"
" { \n"
"         if (dau_get_anzflags() <= 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void goto_ibe(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_ibf(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_obf(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_obe(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_pde(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_pdf(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_pie(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_pif(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_syc(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_sys(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_fbc(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_fbs(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_irq1lo(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_irq1hi(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_irq2lo(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void goto_irq2hi(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void dec_goto(void) \n"
" { \n"
"         int hr = (OP >> 21) & 0x1f; \n"
"         int old = (short)dsp32.r[hr]; \n"
"         dsp32.r[hr] = (((long)(short)(dsp32.r[hr] - 1)) & 0xffffff); \n"
"         if (old >= 0) \n"
"         { \n"
"                 unsigned long op = OP; \n"
"                 execute_one(); \n"
"                 dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"                 cpu_setopbase24ledw(dsp32.PC); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void call(void) \n"
" { \n"
"         unsigned long op = OP; \n"
"         int mr = (op >> 21) & 0x1f; \n"
"         if (((0x6f3efffe) & (1 << (mr)))) \n"
"                 dsp32.r[mr] = dsp32.PC + 4; \n"
"         execute_one(); \n"
"         dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (short)op) & 0xffffff); \n"
"         cpu_setopbase24ledw(dsp32.PC); \n"
" } \n"
"  \n"
"  \n"
" static void goto24(void) \n"
" { \n"
"         unsigned long op = OP; \n"
"         execute_one(); \n"
"         dsp32.PC = (((dsp32.r[(op >> 16) & 0x1f]) + (op & 0xffff) + ((op >> 5) & 0xff0000)) & 0xffffff); \n"
"         cpu_setopbase24ledw(dsp32.PC); \n"
" } \n"
"  \n"
"  \n"
" static void call24(void) \n"
" { \n"
"         unsigned long op = OP; \n"
"         int mr = (op >> 16) & 0x1f; \n"
"         if (((0x6f3efffe) & (1 << (mr)))) \n"
"                 dsp32.r[mr] = dsp32.PC + 4; \n"
"         execute_one(); \n"
"         dsp32.PC = (op & 0xffff) + ((op >> 5) & 0xff0000); \n"
"         cpu_setopbase24ledw(dsp32.PC); \n"
" } \n"
"  \n"
"  \n"
" static void do_i(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void do_r(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
" static void add_si(void) \n"
" { \n"
"         int dr = (OP >> 21) & 0x1f; \n"
"         int hrval = ((unsigned short)dsp32.r[(OP >> 16) & 0x1f]); \n"
"         int res = hrval + (unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((hrval) ^ (OP) ^ (res) ^ ((res) >> 1)) << 8); \n"
" } \n"
"  \n"
"  \n"
" static void add_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s2rval + s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((s1rval) ^ (s2rval) ^ (res) ^ ((res) >> 1)) << 8); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void mul2_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = s1rval * 2; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((s1rval) ^ (0) ^ (res) ^ ((res) >> 1)) << 8); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void subr_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s1rval - s2rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((s1rval) ^ (s2rval) ^ (res) ^ ((res) >> 1)) << 8); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void addr_ss(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void sub_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s2rval - s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((s1rval) ^ (s2rval) ^ (res) ^ ((res) >> 1)) << 8); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void neg_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = -s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((s1rval) ^ (0) ^ (res) ^ ((res) >> 1)) << 8); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void andc_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s2rval & ~s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void cmp_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int drval = ((unsigned short)dsp32.r[(OP >> 16) & 0x1f]); \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = drval - s1rval; \n"
"                 dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((drval) ^ (s1rval) ^ (res) ^ ((res) >> 1)) << 8); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void xor_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s2rval ^ s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void rcr_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = ((dsp32.nzcflags >> 9) & 0x8000) | (s1rval >> 1); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 1) << 24); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void or_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s2rval | s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void rcl_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = ((dsp32.nzcflags >> 24) & 0x0001) | (s1rval << 1); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 0x8000) << 9); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void shr_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = s1rval >> 1; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 1) << 24); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void div2_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = (s1rval & 0x8000) | (s1rval >> 1); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = ((res & 0xffff) << 8) | ((s1rval & 1) << 24); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void and_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? ((unsigned short)dsp32.r[(OP >> 0) & 0x1f]) : ((unsigned short)dsp32.r[dr]); \n"
"                 int res = s2rval & s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void test_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int drval = ((unsigned short)dsp32.r[(OP >> 16) & 0x1f]); \n"
"                 int s1rval = ((unsigned short)dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = drval & s1rval; \n"
"                 dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void add_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = drval + (unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((drval) ^ (OP) ^ (res) ^ ((res) >> 1)) << 8); \n"
" } \n"
"  \n"
"  \n"
" static void subr_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = (unsigned short)OP - drval; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((drval) ^ (OP) ^ (res) ^ ((res) >> 1)) << 8); \n"
" } \n"
"  \n"
"  \n"
" static void addr_di(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void sub_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = drval - (unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((drval) ^ (OP) ^ (res) ^ ((res) >> 1)) << 8); \n"
" } \n"
"  \n"
"  \n"
" static void andc_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = drval & ~(unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void cmp_di(void) \n"
" { \n"
"         int drval = ((unsigned short)dsp32.r[(OP >> 16) & 0x1f]); \n"
"         int res = drval - (unsigned short)OP; \n"
"         dsp32.nzcflags = ((res) << 8); dsp32.vflags = (((drval) ^ (OP) ^ (res) ^ ((res) >> 1)) << 8); \n"
" } \n"
"  \n"
"  \n"
" static void xor_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = drval ^ (unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void or_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = drval | (unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void and_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = ((unsigned short)dsp32.r[dr]); \n"
"         int res = drval & (unsigned short)OP; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void test_di(void) \n"
" { \n"
"         int drval = ((unsigned short)dsp32.r[(OP >> 16) & 0x1f]); \n"
"         int res = drval & (unsigned short)OP; \n"
"         dsp32.nzcflags = (((res) << 8) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
" static void adde_si(void) \n"
" { \n"
"         int dr = (OP >> 21) & 0x1f; \n"
"         int hrval = (dsp32.r[(OP >> 16) & 0x1f]); \n"
"         int res = hrval + (((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = ((res) & 0xffffff); \n"
"         dsp32.nzcflags = (res); dsp32.vflags = ((hrval) ^ (OP << 8) ^ (res) ^ ((res) >> 1)); \n"
" } \n"
"  \n"
"  \n"
" static void adde_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s2rval + s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = (res); dsp32.vflags = ((s1rval) ^ (s2rval) ^ (res) ^ ((res) >> 1)); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void mul2e_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = s1rval * 2; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = (res); dsp32.vflags = ((s1rval) ^ (0) ^ (res) ^ ((res) >> 1)); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void subre_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s1rval - s2rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = (res); dsp32.vflags = ((s1rval) ^ (s2rval) ^ (res) ^ ((res) >> 1)); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void addre_ss(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void sube_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s2rval - s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = (res); dsp32.vflags = ((s1rval) ^ (s2rval) ^ (res) ^ ((res) >> 1)); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void nege_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = -s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = (res); dsp32.vflags = ((s1rval) ^ (0) ^ (res) ^ ((res) >> 1)); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void andce_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s2rval & ~s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void cmpe_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int drval = (dsp32.r[(OP >> 16) & 0x1f]); \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = drval - s1rval; \n"
"                 dsp32.nzcflags = (res); dsp32.vflags = ((drval) ^ (s1rval) ^ (res) ^ ((res) >> 1)); \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void xore_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s2rval ^ s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void rcre_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = ((dsp32.nzcflags >> 1) & 0x800000) | (s1rval >> 1); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = res | ((s1rval & 1) << 24); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void ore_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s2rval | s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void rcle_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = ((dsp32.nzcflags >> 24) & 0x000001) | (s1rval << 1); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = res | ((s1rval & 0x800000) << 1); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void shre_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = s1rval >> 1; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = res | ((s1rval & 1) << 24); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void div2e_s(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = (s1rval & 0x800000) | (s1rval >> 1); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = ((res) & 0xffffff); \n"
"                 dsp32.nzcflags = res | ((s1rval & 1) << 24); \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void ande_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int s2rval = (OP & 0x800) ? (dsp32.r[(OP >> 0) & 0x1f]) : (dsp32.r[dr]); \n"
"                 int res = s2rval & s1rval; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void teste_ss(void) \n"
" { \n"
"         if ((!(OP & 0x400) || (condition((OP >> 12) & 15)))) \n"
"         { \n"
"                 int drval = (dsp32.r[(OP >> 16) & 0x1f]); \n"
"                 int s1rval = (dsp32.r[(OP >> 5) & 0x1f]); \n"
"                 int res = drval & s1rval; \n"
"                 dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
"         } \n"
" } \n"
"  \n"
"  \n"
" static void adde_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = drval + (((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = ((res) & 0xffffff); \n"
"         dsp32.nzcflags = (res); dsp32.vflags = ((drval) ^ (OP << 8) ^ (res) ^ ((res) >> 1)); \n"
" } \n"
"  \n"
"  \n"
" static void subre_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = (((long)(short)(OP)) & 0xffffff) - drval; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = ((res) & 0xffffff); \n"
"         dsp32.nzcflags = (res); dsp32.vflags = ((drval) ^ (OP << 8) ^ (res) ^ ((res) >> 1)); \n"
" } \n"
"  \n"
"  \n"
" static void addre_di(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void sube_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = drval - (((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = ((res) & 0xffffff); \n"
"         dsp32.nzcflags = (res); dsp32.vflags = ((drval) ^ (OP << 8) ^ (res) ^ ((res) >> 1)); \n"
" } \n"
"  \n"
"  \n"
" static void andce_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = drval & ~(((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
"         dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void cmpe_di(void) \n"
" { \n"
"         int drval = (dsp32.r[(OP >> 16) & 0x1f]); \n"
"         int res = drval - (((long)(short)(OP)) & 0xffffff); \n"
"         dsp32.nzcflags = (res); dsp32.vflags = ((drval) ^ (OP << 8) ^ (res) ^ ((res) >> 1)); \n"
" } \n"
"  \n"
"  \n"
" static void xore_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = drval ^ (((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
"         dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void ore_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = drval | (((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
"         dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void ande_di(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         int drval = (dsp32.r[dr]); \n"
"         int res = drval & (((long)(short)(OP)) & 0xffffff); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
"         dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void teste_di(void) \n"
" { \n"
"         int drval = (dsp32.r[(OP >> 16) & 0x1f]); \n"
"         int res = drval & (((long)(short)(OP)) & 0xffffff); \n"
"         dsp32.nzcflags = ((res) & 0xffffff); dsp32.vflags = 0; \n"
" } \n"
" static void load_hi(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         unsigned long res = RBYTE((((long)(short)(OP)) & 0xffffff)); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = res << 8; \n"
"         dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void load_li(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         unsigned long res = RBYTE((((long)(short)(OP)) & 0xffffff)); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
"         dsp32.nzcflags = res << 8; \n"
"         dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void load_i(void) \n"
" { \n"
"         unsigned long res = RWORD((((long)(short)(OP)) & 0xffffff)); \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"         dsp32.nzcflags = res << 8; \n"
"         dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void load_ei(void) \n"
" { \n"
"         unsigned long res = ((RLONG((((long)(short)(OP)) & 0xffffff))) & 0xffffff); \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
"         dsp32.nzcflags = res; \n"
"         dsp32.vflags = 0; \n"
" } \n"
"  \n"
"  \n"
" static void store_hi(void) \n"
" { \n"
"         WBYTE((((long)(short)(OP)) & 0xffffff), dsp32.r[(OP >> 16) & 0x1f] >> 8); \n"
" } \n"
"  \n"
"  \n"
" static void store_li(void) \n"
" { \n"
"         WBYTE((((long)(short)(OP)) & 0xffffff), dsp32.r[(OP >> 16) & 0x1f]); \n"
" } \n"
"  \n"
"  \n"
" static void store_i(void) \n"
" { \n"
"         WWORD((((long)(short)(OP)) & 0xffffff), ((unsigned short)dsp32.r[(OP >> 16) & 0x1f])); \n"
" } \n"
"  \n"
"  \n"
" static void store_ei(void) \n"
" { \n"
"         WLONG((((long)(short)(OP)) & 0xffffff), (long)((dsp32.r[(OP >> 16) & 0x1f]) << 8) >> 8); \n"
" } \n"
"  \n"
"  \n"
" static void load_hr(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 unsigned long res = cau_read_pi_1byte(OP) << 8; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = res << 8; \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void load_lr(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"         { \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 unsigned long res = cau_read_pi_1byte(OP); \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = res << 8; \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void load_r(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"         { \n"
"                 unsigned long res = cau_read_pi_2byte(OP); \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = (((long)(short)(res)) & 0xffffff); \n"
"                 dsp32.nzcflags = res << 8; \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void load_er(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"         { \n"
"                 unsigned long res = ((cau_read_pi_4byte(OP)) & 0xffffff); \n"
"                 int dr = (OP >> 16) & 0x1f; \n"
"                 if (((0x6f3efffe) & (1 << (dr)))) \n"
"                         dsp32.r[dr] = res; \n"
"                 dsp32.nzcflags = res; \n"
"                 dsp32.vflags = 0; \n"
"         } \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void store_hr(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"                 cau_write_pi_1byte(OP, dsp32.r[(OP >> 16) & 0x1f] >> 8); \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void store_lr(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"                 cau_write_pi_1byte(OP, dsp32.r[(OP >> 16) & 0x1f]); \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void store_r(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"                 cau_write_pi_2byte(OP, ((unsigned short)dsp32.r[(OP >> 16) & 0x1f])); \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void store_er(void) \n"
" { \n"
"         if (!(OP & 0x400)) \n"
"                 cau_write_pi_4byte(OP, (dsp32.r[(OP >> 16) & 0x1f])); \n"
"         else \n"
"                 unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void load24(void) \n"
" { \n"
"         int dr = (OP >> 16) & 0x1f; \n"
"         unsigned long res = (OP & 0xffff) + ((OP >> 5) & 0xff0000); \n"
"         if (((0x6f3efffe) & (1 << (dr)))) \n"
"                 dsp32.r[dr] = res; \n"
" } \n"
" static void d1_aMpp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval + dau_get_amult((OP >> 26) & 7) * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMpm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval - dau_get_amult((OP >> 26) & 7) * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMmp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval + dau_get_amult((OP >> 26) & 7) * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMmm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval - dau_get_amult((OP >> 26) & 7) * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_0px(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
"         (void)xval; \n"
" } \n"
"  \n"
"  \n"
" static void d1_0mx(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
"         (void)xval; \n"
" } \n"
"  \n"
"  \n"
" static void d1_1pp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval + xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_1pm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval - xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_1mp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval + xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_1mm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval - xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMppr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMpmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMmpr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d1_aMmmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
" static void d2_aMpp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = dsp32.a[(OP >> 26) & 7] + yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMpm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = dsp32.a[(OP >> 26) & 7] - yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMmp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = -dsp32.a[(OP >> 26) & 7] + yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMmm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = -dsp32.a[(OP >> 26) & 7] - yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMppr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMpmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMmpr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d2_aMmmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
" static void d3_aMpp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = dsp32.a[(OP >> 26) & 7] + yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMpm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = dsp32.a[(OP >> 26) & 7] - yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMmp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = -dsp32.a[(OP >> 26) & 7] + yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMmm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 1, xval); \n"
"         double res = -dsp32.a[(OP >> 26) & 7] - yval * xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMppr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMpmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMmpr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d3_aMmmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
" static void d4_pp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval + xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d4_pm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = yval - xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d4_mp(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval + xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d4_mm(void) \n"
" { \n"
"         double xval = dau_read_pi_double_1st(OP >> 14, 1); \n"
"         double yval = dau_read_pi_double_2nd(OP >> 7, 0, xval); \n"
"         double res = -yval - xval; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, yval); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d4_ppr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d4_pmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d4_mpr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d4_mmr(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
" static void d5_ic(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d5_oc(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d5_float(void) \n"
" { \n"
"         double res = (double)(short)dau_read_pi_2bytes(OP >> 7); \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d5_int(void) \n"
" { \n"
"         double val = dau_read_pi_double_1st(OP >> 7, 0); \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         short res; \n"
"         if (!(dsp32.DAUC & 0x10)) val = floor(val + 0.5); \n"
"         else val = ceil(val - 0.5); \n"
"         res = (short)val; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_2bytes(zpi, res); \n"
"         dau_set_val_noflags((OP >> 21) & 3, dsp_to_double(res << 16)); \n"
" } \n"
"  \n"
"  \n"
" static void d5_round(void) \n"
" { \n"
"         double res = (double)(float)dau_read_pi_double_1st(OP >> 7, 0); \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d5_ifalt(void) \n"
" { \n"
"         int ar = (OP >> 21) & 3; \n"
"         double res = dsp32.a[ar]; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (NFLAG) \n"
"                 res = dau_read_pi_double_1st(OP >> 7, 0); \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_noflags(ar, res); \n"
" } \n"
"  \n"
"  \n"
" static void d5_ifaeq(void) \n"
" { \n"
"         int ar = (OP >> 21) & 3; \n"
"         double res = dsp32.a[ar]; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (ZFLAG) \n"
"                 res = dau_read_pi_double_1st(OP >> 7, 0); \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_noflags(ar, res); \n"
" } \n"
"  \n"
"  \n"
" static void d5_ifagt(void) \n"
" { \n"
"         int ar = (OP >> 21) & 3; \n"
"         double res = dsp32.a[ar]; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (!NFLAG && !ZFLAG) \n"
"                 res = dau_read_pi_double_1st(OP >> 7, 0); \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_noflags(ar, res); \n"
" } \n"
"  \n"
"  \n"
" static void d5_float24(void) \n"
" { \n"
"         double res = (double)((long)(dau_read_pi_4bytes(OP >> 7) << 8) >> 8); \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_double(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, res); \n"
" } \n"
"  \n"
"  \n"
" static void d5_int24(void) \n"
" { \n"
"         double val = dau_read_pi_double_1st(OP >> 7, 0); \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         long res; \n"
"         if (!(dsp32.DAUC & 0x10)) val = floor(val + 0.5); \n"
"         else val = ceil(val - 0.5); \n"
"         res = (long)val; \n"
"         if (res > 0x7fffff) res = 0x7fffff; \n"
"         else if (res < -0x800000) res = -0x800000; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_4bytes(zpi, (long)(res << 8) >> 8); \n"
"         dau_set_val_noflags((OP >> 21) & 3, dsp_to_double(res << 8)); \n"
" } \n"
"  \n"
"  \n"
" static void d5_ieee(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d5_dsp(void) \n"
" { \n"
"         unimplemented(); \n"
" } \n"
"  \n"
"  \n"
" static void d5_seed(void) \n"
" { \n"
"         unsigned long val = dau_read_pi_4bytes(OP >> 7); \n"
"         long res = val ^ 0x7fffffff; \n"
"         int zpi = (OP >> 0) & 0x7f; \n"
"         if (zpi != 7) \n"
"                 dau_write_pi_4bytes(zpi, res); \n"
"         dau_set_val_flags((OP >> 21) & 3, dsp_to_double((long)res)); \n"
" } \n"
" void (*dsp32ops[])(void) = \n"
" { \n"
"         nop, goto_t, goto_pl, goto_mi, goto_ne, goto_eq, goto_vc, goto_vs, \n"
"         goto_cc, goto_cs, goto_ge, goto_lt, goto_gt, goto_le, goto_hi, goto_ls, \n"
"         goto_auc, goto_aus, goto_age, goto_alt, goto_ane, goto_aeq, goto_avc, goto_avs, \n"
"         goto_agt, goto_ale, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         goto_ibe, goto_ibf, goto_obf, goto_obe, goto_pde, goto_pdf, goto_pie, goto_pif, \n"
"         goto_syc, goto_sys, goto_fbc, goto_fbs, goto_irq1lo,goto_irq1hi,goto_irq2lo,goto_irq2hi, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"  \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, \n"
"         dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, \n"
"         dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, \n"
"         dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, dec_goto, \n"
"  \n"
"         call, call, call, call, call, call, call, call, \n"
"         call, call, call, call, call, call, call, call, \n"
"         call, call, call, call, call, call, call, call, \n"
"         call, call, call, call, call, call, call, call, \n"
"         add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si, \n"
"         add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si, \n"
"         add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si, \n"
"         add_si, add_si, add_si, add_si, add_si, add_si, add_si, add_si, \n"
"  \n"
"         add_ss, mul2_s, subr_ss, addr_ss, sub_ss, neg_s, andc_ss, cmp_ss, \n"
"         xor_ss, rcr_s, or_ss, rcl_s, shr_s, div2_s, and_ss, test_ss, \n"
"         add_di, illegal, subr_di, addr_di, sub_di, illegal, andc_di, cmp_di, \n"
"         xor_di, illegal, or_di, illegal, illegal, illegal, and_di, test_di, \n"
"         load_hi, load_hi, load_li, load_li, load_i, load_i, load_ei, load_ei, \n"
"         store_hi, store_hi, store_li, store_li, store_i, store_i, store_ei, store_ei, \n"
"         load_hr, load_hr, load_lr, load_lr, load_r, load_r, load_er, load_er, \n"
"         store_hr, store_hr, store_lr, store_lr, store_r, store_r, store_er, store_er, \n"
"  \n"
"         d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, \n"
"         d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm, \n"
"         d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, \n"
"         d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr, \n"
"         d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, \n"
"         d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm, \n"
"         d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, \n"
"         d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr, \n"
"  \n"
"         d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, \n"
"         d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm, \n"
"         d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, \n"
"         d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr, \n"
"         d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpp, d1_aMpm, d1_aMpm, d1_aMpm, d1_aMpm, \n"
"         d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmp, d1_aMmm, d1_aMmm, d1_aMmm, d1_aMmm, \n"
"         d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, \n"
"         d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr, \n"
"  \n"
"         d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, d1_0px, \n"
"         d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, d1_0mx, \n"
"         d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, \n"
"         d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr, \n"
"         d1_1pp, d1_1pp, d1_1pp, d1_1pp, d1_1pm, d1_1pm, d1_1pm, d1_1pm, \n"
"         d1_1mp, d1_1mp, d1_1mp, d1_1mp, d1_1mm, d1_1mm, d1_1mm, d1_1mm, \n"
"         d1_aMppr, d1_aMppr, d1_aMppr, d1_aMppr, d1_aMpmr, d1_aMpmr, d1_aMpmr, d1_aMpmr, \n"
"         d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmpr, d1_aMmmr, d1_aMmmr, d1_aMmmr, d1_aMmmr, \n"
"  \n"
"         d4_pp, d4_pp, d4_pp, d4_pp, d4_pm, d4_pm, d4_pm, d4_pm, \n"
"         d4_mp, d4_mp, d4_mp, d4_mp, d4_mm, d4_mm, d4_mm, d4_mm, \n"
"         d4_ppr, d4_ppr, d4_ppr, d4_ppr, d4_pmr, d4_pmr, d4_pmr, d4_pmr, \n"
"         d4_mpr, d4_mpr, d4_mpr, d4_mpr, d4_mmr, d4_mmr, d4_mmr, d4_mmr, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"  \n"
"         d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, \n"
"         d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm, \n"
"         d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, \n"
"         d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr, \n"
"         d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, \n"
"         d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm, \n"
"         d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, \n"
"         d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr, \n"
"  \n"
"         d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, \n"
"         d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm, \n"
"         d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, \n"
"         d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr, \n"
"         d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, \n"
"         d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm, \n"
"         d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, \n"
"         d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr, \n"
"  \n"
"         d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, \n"
"         d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm, \n"
"         d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, \n"
"         d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr, \n"
"         d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpp, d2_aMpm, d2_aMpm, d2_aMpm, d2_aMpm, \n"
"         d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmp, d2_aMmm, d2_aMmm, d2_aMmm, d2_aMmm, \n"
"         d2_aMppr, d2_aMppr, d2_aMppr, d2_aMppr, d2_aMpmr, d2_aMpmr, d2_aMpmr, d2_aMpmr, \n"
"         d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmpr, d2_aMmmr, d2_aMmmr, d2_aMmmr, d2_aMmmr, \n"
"  \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"  \n"
"         d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, \n"
"         d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm, \n"
"         d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, \n"
"         d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr, \n"
"         d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, \n"
"         d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm, \n"
"         d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, \n"
"         d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr, \n"
"  \n"
"         d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, \n"
"         d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm, \n"
"         d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, \n"
"         d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr, \n"
"         d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, \n"
"         d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm, \n"
"         d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, \n"
"         d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr, \n"
"  \n"
"         d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, \n"
"         d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm, \n"
"         d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, \n"
"         d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr, \n"
"         d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpp, d3_aMpm, d3_aMpm, d3_aMpm, d3_aMpm, \n"
"         d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmp, d3_aMmm, d3_aMmm, d3_aMmm, d3_aMmm, \n"
"         d3_aMppr, d3_aMppr, d3_aMppr, d3_aMppr, d3_aMpmr, d3_aMpmr, d3_aMpmr, d3_aMpmr, \n"
"         d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmpr, d3_aMmmr, d3_aMmmr, d3_aMmmr, d3_aMmmr, \n"
"  \n"
"         d5_ic, d5_ic, d5_ic, d5_ic, d5_oc, d5_oc, d5_oc, d5_oc, \n"
"         d5_float, d5_float, d5_float, d5_float, d5_int, d5_int, d5_int, d5_int, \n"
"         d5_round, d5_round, d5_round, d5_round, d5_ifalt, d5_ifalt, d5_ifalt, d5_ifalt, \n"
"         d5_ifaeq, d5_ifaeq, d5_ifaeq, d5_ifaeq, d5_ifagt, d5_ifagt, d5_ifagt, d5_ifagt, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         d5_float24, d5_float24, d5_float24, d5_float24, d5_int24, d5_int24, d5_int24, d5_int24, \n"
"         d5_ieee, d5_ieee, d5_ieee, d5_ieee, d5_dsp, d5_dsp, d5_dsp, d5_dsp, \n"
"         d5_seed, d5_seed, d5_seed, d5_seed, illegal, illegal, illegal, illegal, \n"
"  \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"  \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         do_i, do_r, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"  \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, \n"
"         adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, \n"
"         adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, \n"
"         adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, adde_si, \n"
"  \n"
"         adde_ss, mul2e_s, subre_ss, addre_ss, sube_ss, nege_s, andce_ss, cmpe_ss, \n"
"         xore_ss, rcre_s, ore_ss, rcle_s, shre_s, div2e_s, ande_ss, teste_ss, \n"
"         adde_di, illegal, subre_di, addre_di, sube_di, illegal, andce_di, cmpe_di, \n"
"         xore_di, illegal, ore_di, illegal, illegal, illegal, ande_di, teste_di, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"         illegal, illegal, illegal, illegal, illegal, illegal, illegal, illegal, \n"
"  \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"  \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"  \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"  \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"         goto24, goto24, goto24, goto24, goto24, goto24, goto24, goto24, \n"
"  \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"  \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"  \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"  \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"         load24, load24, load24, load24, load24, load24, load24, load24, \n"
"  \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"  \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"  \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"  \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24, \n"
"         call24, call24, call24, call24, call24, call24, call24, call24 \n"
" }; \n";
