[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n"
  },
  {
    "path": ".gitignore",
    "content": "# Prerequisites\n*.d\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n\n# Fortran module files\n*.mod\n*.smod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n\n# Executables\n*.out\n*.app\n\n# Visual studio stuff\n.vs\nbuild/\npackages/\ngraveyard/\n*.vcxproj.user\n.vscode\n\n# Other caches\n__pycache__\n.ipynb_checkpoints\n\n# External libraries\n/external/python/\n/external/sqlite\n/external/pybind11-stubgen\n/external/CTPL\n/external/tomlplusplus\n/external/spdlog\n/external/pybind11\n/external/rdcfswatcher\n/external/asmjit\n/external/winreg\n/docs/source/_build\n\n~$*"
  },
  {
    "path": ".readthedocs.yml",
    "content": "# .readthedocs.yml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\n# Required\nversion: 2\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n  configuration: docs/source/conf.py\n\nbuild:\n  os: \"ubuntu-22.04\"\n  tools:\n    python: \"3.11\"\n    \npython:\n  install:\n    - requirements: docs/requirements.txt"
  },
  {
    "path": ".runsettings",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RunSettings>\n    <RunConfiguration>\n        <EnvironmentVariables>\n            <XLOIL_TEST_BIN_DIR>build/x64/Debug</XLOIL_TEST_BIN_DIR>\n        </EnvironmentVariables>\n    </RunConfiguration>\n</RunSettings>\n"
  },
  {
    "path": "FUNDING.yml",
    "content": "github: [cunnane]"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\n\n   Copyright 2020 Steven Cunnane\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "\nxlOil\n=====\n\nxlOil provides framework for interacting with Excel in different programming\nlanguages. It gives a way to write functions in a language and have them \nappear in Excel as worksheet functions or macros or have them control GUI elements. \nFor example, the Python bindings can replace VBA in almost all use cases \nand even provide functionality not available from VBA.\n\nxlOil is designed to have very low overheads when calling your worksheet \nfunctions.\n\nxlOil supports different languages via plugins. The languages currently \nsupported are:\n\n- C++\n- Python\n- SQL\n\nIn addition there is *xlOil_Utils* which contains some handy tools which Microsoft\nnever quite got around to adding.\n\nThe latest stable documentation is here: https://xloil.readthedocs.io/en/stable.\n\nxlOil features\n--------------\n\n* Python\n  - Concise syntax to declare an Excel function\n  - Optional type checking of function parameters\n  - Supports keyword arguments\n  - Choice of globally declared functions or code modules limited to a single workbook\n    like VBA workbook-level functions\n  - Tight integration with *numpy* - very low overheads for array functions\n  - Understands python tuples, lists, dictionarys and *pandas* dataframes\n  - Async functions\n  - RTD functions and on-the-fly RTD server creation\n  - Macro type functions which write to ranges on the sheet\n  - Access to the Excel Application object and the full Excel object model\n  - Drive Excel through COM automation\n  - Hook Excel events\n  - Pass any python object back to Excel and back into another function\n  - Simple add-in deployment\n  - Two-way connection to *Jupyter* notebooks: run worksheet functions in *Jupyter* and query variables\n    in the *jupyter* kernel\n  - Create Ribbon toolbars and Custom Task Panes\n  - Return *matplotlib* plots and images from worksheet functions\n* C++\n  - Safe and convenient wrappers around most things in the C-API\n  - Concise syntax to declare Excel functions: registration is automatic\n  - Deal with Excel variants, Ranges, Arrays and strings in a natural C++ fashion\n  - Object cache allows returning opaque objects to Excel and passing them back to other functions\n  - Simplified RTD server creation\n  - RTD-based background calculation\n  - Create Ribbon toolbars and Custom Task Panes  \n* SQL\n  - Create tables from Excel ranges and arrays\n  - Query and join them with the full sqlite3 SQL syntax\n* Utils: very fast functions to:\n  - Sort on multiple columns\n  - Split and join strings\n  - Make arrays from blocks\n\n\nSupporting other languages\n--------------------------\n\nYou can use xlOil as an end-user of these plugins or you can use it to write\nyou own language bindings (and ideally add them to the repo)."
  },
  {
    "path": "Version.txt",
    "content": "0.22.1\n"
  },
  {
    "path": "config/xloil.ini",
    "content": "#\n######## xlOil Settings #########\n#\n# This is a TOML file.\n#\n#################################\n#\n[Addin]\n\n##### Plugins to load\n#\n# Load these plugins. The directory containing xloil.dll is searched\n# first, then the normal DLL search path order.\n#\nPlugins=[\"xlOil_Python\", \"xlOil_SQL\", \"xlOil_Utils\"]\n\n#\n# Load any plugins in the same directory as the core dll which \n# match this pattern.\n#\n#PluginSearchPattern=\"xloil_*.dll\"\n\n\n##### Log file settings \n#\n# Intensity of logging, choose from:\n# \"trace\", \"debug\", \"info\", \"warning\", \"error\", \"critical\", \"off\"\n#\nLogLevel=\"warning\"\n\n#\n# Level at which xlOil will pop up a log window to display recent \n# log entries\n#\nLogPopupLevel=\"error\"\n\n#\n# Level at which xlOil will flush the log file to disk, lower levels\n# decrease performance but can be useful for debugging crashes\n#\n#LogFlushLevel=\"warning\"\n\n#\n# The log file is created at <name-of-ini-file>.log and in the same \n# directory unless specified below\n#\n#LogFile=\"my.log\"\n\n#\n# Log file rotation is controlled by these two parameters. A single\n# log file can grow to the *LogMaxSize* in Kb. Once this limit is\n# reached, a new blank log file is started, existing old log files\n# are renamed and the oldest is deleted to ensure maximum of \n# *LogNumberOfFiles* files.\n# \n#LogMaxSize=512\n#LogNumberOfFiles=2\n\n# If you have an ini file at %APPDATA%\\xlOil\\xlOil.ini, the core xlOil.dll\n# is loaded using those settings before any other xlOil-based XLL. Since only one \n# instance of xlOil can be hosted in Excel, one settings file must take precedence. \n# The assumption is that if you have xlOil installed, you want those settings to \n# be the primary ones.  The below option, when used in a XLL-specific ini file,\n# allows it to be loaded before the core.\n# LoadBeforeCore=False\n\n##### Date\n#\n# The date formats xlOil will attempt to parse for a string to date\n# conversion. Syntax follows C++ get_time here: \n# https://en.cppreference.com/w/cpp/io/manip/get_time\n# Note the date parsing is case sensitive because get_time is case \n# sensitive on Windows.\n#\nDateFormats=[\"%Y-%m-%d\", \"%Y%b%d\"]\n\n# \n# The key XLOIL_PATH is edited by the xlOil_Install powershell script\n# Note: Use [[]] syntax because the order of Environment variables matters\n#\n[[Addin.Environment]]\nXLOIL_PATH=\"\"\n[[Addin.Environment]]\nPATH='''%PATH%;%XLOIL_PATH%'''\n\n\n##### Python Plugin Settings\n#\n[xlOil_Python]\n#\n# Python modules to load on start up. Must be on python's sys.path.\n# xlOil provides the following optional modules:\n#   * xloil.xloil_ribbon: adds a ribbon toolbar with some useful functions\n#   * xloil.jupyter: adds jupyter interaction\n#\nLoadModules=[\"xloil.xloil_ribbon\"]\n\n#\n# On workbook open, look for a python file matching this template \n# where * is replaced by the Excel workbook name\n#\nWorkbookModule=\"*.py\"\n\n#\n# Look for a module matching this pattern in the directory of the \n# XLL when it is loaded where '*' is replaced with the addin name.\n# The default is \"*.py\" which means an ini file is optional for a \n# simple addin\n#\n#AddinModule=\"*.py\"\n\n#\n# Calls Py_SetPath before initialising python. This allows explict\n# specification of python's sys.path rather than using the usual\n# search routine, which overrides any setting of PYTHONPATH.\n# Generally this option is not required.\n#\n#SetSysPath='''.'''\n\n#\n# Sets the library for COM support. This is used by the `xloil.app` \n# and `to_com` functions although can be override on a per-call basis.\n# The default is 'win32com', 'comtypes' is also available. \n#\n#ComLib=\"comtypes\"\n\n#\n# Selects the debugger to use. The choices are:\n#   * Visual Studio 2019+ : no need to pre-select this, just attach to \n#     a running Excel process\n#   * VS Code: choose `vscode` or `debugpy`. The `DebugPyPort` attribute\n#     then determines the port on which the server listens.\n#   * Pdb: choose 'pdb'\n#\nDebugger = \"\"\n\n#\n# Determines the port on which the server listens.\n# \nDebugPyPort = \"5678\"\n\n#\n# By default xlOil loads python modules in a background thread when the addin\n# starts up or a local worksheet module is loaded. This avoids blocking the \n# UI but can lead to #NAME! errors if the a workbook is calculated before\n# the relevant functions are registered. Set UseLoaderThread to false to \n# disable background loading\n# \n#UseLoaderThread=false\n\n\n#\n# When error propagation is enabled, if any function argument is an error code \n# (#N/A!, #NUM!, etc.) that error code is given as the function's return value,\n# otherwise all argument values are handled by the function. Error propagation \n# is consistent with how Excel built-in functions handle errors, it improves \n# performance in the presence of error codes and it allow's Excel's error tracing\n# to function.\n#\n# Currently this setting is respected only by the xlOil_Python plugin.\n#\n#ErrorPropagation=false\n\n\n#\n# List of path prefixes which will be ignored for autoreloading on file \n# modification detection.\n#\n#AutoReloadExcludePaths = []\n\n\n##### Python Environment\n#\n# We need to set the python environment paths. Usually this is done automatically \n# by `xloil install` or `xloil create` or the ribbon.\n#\n# Usually just set PYTHONEXECUTABLE - python should be able to figure out the rest.\n# xlOil also uses this variable to help detect the presence of a virtual Environment. \n# Alternatively set the PYTHONPATH, PYTHONHOME and PATH directly as required by your\n# distribution.\n#\n# Note environment vars can be set by dynamically expanding a registry key.\n#\n[[xlOil_Python.Environment]]\n\t#\n\t# Tells python to do case-insensitve module name lookup and so minimises \n\t# surprises on windows when creating workbook and addin modules. Recommended!\n\t#\n    PYTHONCASEOK=\"1\"\n\n\t#\n\t# If this environment variable is set, xlOil tries to load the corresponding\n\t# pythonXY.dll as the interpreter. If unset or blank, xlOil uses the first python \n\t# version discovered using the paths set below.\n\t# \n\tXLOIL_PYTHON_VERSION=\"\"\n\n\t#\n\t# Additional paths to add to python's sys.path. Prefer to add user search\n\t# paths here and reserve the PYTHONPATH setting below for system paths. \n\t# (We make the empty value a semi-colon so that the variable exists \n\t# for the environment variable expansion below)\n\tXLOIL_PYTHON_PATH=\";\"\n\n[[xlOil_Python.Environment]]\n\t\n\t#\n\t# PYTHONEXECUTABLE should point to the python.exe of the current environment.\n\t# Note it is possible to dynamically expand registry keys contained in angle \n\t# brackets <>.\n\t#\n\tPYTHONEXECUTABLE='''<HKLM\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda39-64\\InstallPath\\ExecutablePath>'''\n\t\n\tPYTHONPATH='''%PYTHONPATH%;%XLOIL_PYTHON_PATH%'''"
  },
  {
    "path": "config/xloil_local.ini",
    "content": "#\n######## xlOil Dev Settings ###########################################\n#\n# This is a version of xlOil.ini which is copied to the build directory\n# when xloil.xll is built. Its purpose is to configure dev settings \n# without accidentally overwriting the distriuted xloil.ini file\n#\n#######################################################################\n#\n[Addin]\n\n##### Plugins to load\n#\n# Load these plugins. The directory containing xloil.dll is searched\n# first, then the normal DLL search path order.\n#\nPlugins=[\"xlOil_Python\", \"xlOil_SQL\", \"xlOil_Utils\"]\n\n##### Log file settings \n#\n# Intensity of logging, choose from:\n# \"trace\", \"debug\", \"info\", \"warning\", \"error\", \"critical\", \"off\"\n#\nLogLevel=\"trace\"\n\n#\n# Level at which xlOil will pop up a log window to display recent \n# log entries\n#\nLogPopupLevel=\"error\"\n\n#\n# Level at which xlOil will flush the log file to disk, lower levels\n# decrease performance but can be useful for debugging crashes\n#\n#LogFlushLevel=\"warning\"\n\n\n#\n# The log file is created at <name-of-ini-file>.log and in the same \n# directory unless specified below\n#\n#LogFile=\"my.log\"\n\n#\n# Log file rotation is controlled by these two parameters. A single\n# log file can grow to the *LogMaxSize* in Kb. Once this limit is\n# reached, a new blank log file is started, existing old log files\n# are renamed and the oldest is deleted to ensure maximum of \n# *LogNumberOfFiles* files.\n# \n#LogMaxSize=512\n#LogNumberOfFiles=2\n\n\n# If you have an ini file at %APPDATA%\\xlOil\\xlOil.ini, the core xlOil.dll\n# is loaded using those settings before any other xlOil-based XLL. The assumption\n# is that you have xlOil installed, but since only one instance of xlOil \n# can be hosted in Excel, one settings file must take precedence. The below option\n# allows an XLL to be loaded before the core.\n# LoadBeforeCore=false\n\n##### Date\n#\n# The date formats xlOil will attempt to parse for a string to date\n# conversion. Syntax follows C++ get_time here: \n# https://en.cppreference.com/w/cpp/io/manip/get_time\n# Note the date parsing is case sensitive because get_time is case \n# sensitive on Windows.\n#\nDateFormats=[\"%Y-%m-%d\", \"%Y%b%d\"]\n\n# \n# The key XLOIL_PATH is edited by the xlOil_Install powershell script\n# Note: Use [[]] syntax because the order of Environment variables matters\n#\n#[[Addin.Environment]]\n#XLOIL_PATH=\"\"\n#[[Addin.Environment]]\n#PATH='''%PATH%;%XLOIL_PATH%'''\n\n\n##### Python Plugin Settings\n#\n[xlOil_Python]\n#\n# Python modules to load on start up. Must be on python's sys.path\n#\nLoadModules=[\"xloil.xloil_ribbon\"]\n\n#\n# On workbook open, look for a python file matching this template \n# where * is replaced by the Excel workbook name\n#\nWorkbookModule=\"*.py\"\n\n#\n# Look for a module matching this pattern in the directory of the \n# XLL when it is loaded where '*' is replaced with the addin name.\n# The default is \"*.py\" which means an ini file is optional for a \n# simple addin\n#\n#AddinModule=\"*.py\"\n\n#\n# Calls Py_SetPath before initialising python. This allows explict\n# specification of python's sys.path rather than using the usual\n# search routine, which overrides any setting of PYTHONPATH.\n# Generally this option is not required.\n#\n#SetSysPath='''.'''\n\n#\n# Sets the library for COM support. This is used by the `xloil.app` \n# and `to_com` functions although can be override on a per-call basis.\n# The default is 'win32com', 'comtypes' is also available. \n#\n#ComLib=\"comtypes\"\n\n#\n# Selects the debugger to use. The choices are:\n#   * Visual Studio 2019+ : no need to pre-select this, just attach to \n#     a running Excel process\n#   * VS Code: choose `vscode` or `debugpy`. The `DebugPyPort` attribute\n#     then determines the port on which the server listens.\n#   * Pdb: choose 'pdb'\n#\nDebugger = \"\"\n\n#\n# Determines the port on which the server listens.\n# \nDebugPyPort = \"5678\"\n\n#UseLoaderThread=false\n\nErrorPropagation=false\n\n\n##### Python Environment\n#\n# We need to set the python environment paths. Usually this is done automatically \n# by `xloil install` or `xloil create` or the ribbon.\n#\n# Usually just set PYTHONEXECUTABLE - python should be able to figure out the rest.\n# xlOil also uses this variable to help detect the presence of a virtual Environment. \n# Alternatively set the PYTHONPATH, PYTHONHOME and PATH directly as required by your\n# distribution.\n#\n# Note environment vars can be set by dynamically expanding a registry key.\n#\n[xlOil_Python.Environment]\n    \n\tPYTHONCASEOK=\"1\"\n\n\t#\n\t# If this environment variable is set, xlOil tries to load the corresponding\n\t# pythonXY.dll as the interpreter. If unset or blank, xlOil uses the reported\n\t# python version of the interpreter in the first python dist found.\n\t# \n\tXLOIL_PYTHON_VERSION=\"\"\n\n    #\n\t# PYTHONEXECUTABLE should point to the python.exe of the current environment.\n\t# Note it is possible to dynamically expand registry keys contained in angle \n\t# brackets <>.\n\t#\n\tPYTHONEXECUTABLE='''D:\\lib\\conda311\\python.exe'''\n\t#PYTHONEXECUTABLE='''<HKLM\\SOFTWARE\\Python\\PythonCore\\3.6\\InstallPath\\ExecutablePath>'''\n\t\n\tXLOIL_PYTHON_PATH='''D:\\lib'''\n\n\tPYTHONPATH='''%PYTHONPATH%;D:\\lib'''\n"
  },
  {
    "path": "config/xloil_local_32.ini",
    "content": "#\n######## xlOil Dev Settings ###########################################\n#\n# This is a version of xlOil.ini which is copied to the build directory\n# when xloil.xll is built. Its purpose is to configure dev settings \n# without accidentally overwriting the distriuted xloil.ini file\n#\n#######################################################################\n#\n[Addin]\n\n##### Plugins to load\n#\n# Load these plugins. The directory containing xloil.dll is searched\n# first, then the normal DLL search path order.\n#\nPlugins=[\"xlOil_Python\", \"xlOil_SQL\", \"xlOil_Utils\"]\n\n##### Log file settings \n#\n# Intensity of logging, choose from:\n# \"trace\", \"debug\", \"info\", \"warning\", \"error\", \"critical\", \"off\"\n#\nLogLevel=\"trace\"\n\n#\n# Level at which xlOil will pop up a log window to display recent \n# log entries\n#\nLogPopupLevel=\"error\"\n\n#\n# The log file is created at <name-of-ini-file>.log and in the same \n# directory unless specified below\n#\n#LogFile=\"my.log\"\n\n#\n# Log file rotation is controlled by these two parameters. A single\n# log file can grow to the *LogMaxSize* in Kb. Once this limit is\n# reached, a new blank log file is started, existing old log files\n# are renamed and the oldest is deleted to ensure maximum of \n# *LogNumberOfFiles* files.\n# \n#LogMaxSize=512\n#LogNumberOfFiles=2\n\n\n# If you have an ini file at %APPDATA%\\xlOil\\xlOil.ini, the core xlOil.dll\n# is loaded using those settings before any other xlOil-based XLL. The assumption\n# is that you have xlOil installed, but since only one instance of xlOil \n# can be hosted in Excel, one settings file must take precedence. The below option\n# allows an XLL to be loaded before the core.\n# LoadBeforeCore=false\n\n##### Date\n#\n# The date formats xlOil will attempt to parse for a string to date\n# conversion. Syntax follows C++ get_time here: \n# https://en.cppreference.com/w/cpp/io/manip/get_time\n# Note the date parsing is case sensitive because get_time is case \n# sensitive on Windows.\n#\nDateFormats=[\"%Y-%m-%d\", \"%Y%b%d\"]\n\n# \n# The key XLOIL_PATH is edited by the xlOil_Install powershell script\n# Note: Use [[]] syntax because the order of Environment variables matters\n#\n#[[Addin.Environment]]\n#XLOIL_PATH=\"\"\n#[[Addin.Environment]]\n#PATH='''%PATH%;%XLOIL_PATH%'''\n\n\n##### Python Plugin Settings\n#\n[xlOil_Python]\n#\n# Python modules to load on start up. Must be on python's sys.path\n#\nLoadModules=[\"xloil.xloil_ribbon\", \"excelfunc\"]\n\n#\n# On workbook open, look for a python file matching this template \n# where * is replaced by the Excel workbook name\n#\nWorkbookModule=\"*.py\"\n\n#\n# Look for a module matching this pattern in the directory of the \n# XLL when it is loaded where '*' is replaced with the addin name.\n# The default is \"*.py\" which means an ini file is optional for a \n# simple addin\n#\n#AddinModule=\"*.py\"\n\n#\n# Calls Py_SetPath before initialising python. This allows explict\n# specification of python's sys.path rather than using the usual\n# search routine, which overrides any setting of PYTHONPATH.\n# Generally this option is not required.\n#\n#SetSysPath='''.'''\n\n#\n# Sets the library for COM support. This is used by the `xloil.app` \n# and `to_com` functions although can be override on a per-call basis.\n# The default is 'win32com', 'comtypes' is also available. \n#\n#ComLib=\"comtypes\"\n\n#\n# Selects the debugger to use. The choices are:\n#   * Visual Studio 2019+ : no need to pre-select this, just attach to \n#     a running Excel process\n#   * VS Code: choose `vscode` or `debugpy`. The `DebugPyPort` attribute\n#     then determines the port on which the server listens.\n#   * Pdb: choose 'pdb'\n#\nDebugger = \"\"\n\n#\n# Determines the port on which the server listens.\n# \nDebugPyPort = \"5678\"\n\n#UseLoaderThread=false\n\n##### Python Environment\n#\n# We need to set the python environment paths. Usually this is done automatically \n# by `xloil install` or `xloil create` or the ribbon.\n#\n# Usually just set PYTHONEXECUTABLE - python should be able to figure out the rest.\n# xlOil also uses this variable to help detect the presence of a virtual Environment. \n# Alternatively set the PYTHONPATH, PYTHONHOME and PATH directly as required by your\n# distribution.\n#\n# Note environment vars can be set by dynamically expanding a registry key.\n#\n[xlOil_Python.Environment]\n    \n\tPYTHONCASEOK=\"1\"\n\n\t#\n\t# If this environment variable is set, xlOil tries to load the corresponding\n\t# pythonXY.dll as the interpreter. If unset or blank, xlOil uses the reported\n\t# python version of the interpreter in the first python dist found.\n\t# \n\tXLOIL_PYTHON_VERSION=\"\"\n\n    #\n\t# PYTHONEXECUTABLE should point to the python.exe of the current environment.\n\t# Note it is possible to dynamically expand registry keys contained in angle \n\t# brackets <>.\n\t#\n\tPYTHONEXECUTABLE='''D:\\lib\\Python311-32\\python.exe'''\n\t#PYTHONEXECUTABLE='''<HKLM\\SOFTWARE\\Python\\PythonCore\\3.6\\InstallPath\\ExecutablePath>'''\n\n\tXLOIL_PYTHON_PATH='''D:\\lib'''\n\n\tPYTHONPATH='''%PYTHONPATH%;D:\\lib'''\n"
  },
  {
    "path": "docs/make.cmd",
    "content": "@ECHO OFF\n\npushd %~dp0\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\n\nif \"%1\" == \"\" goto help\n\nset XLOIL_SOLN_DIR=%~dp0..\nset DOC_BUILD_DIR=%XLOIL_SOLN_DIR%\\build\\docs\nset PY_PACKAGE_DIR=%XLOIL_SOLN_DIR%\\libs\\xlOil_Python\\Package\nset SOURCEDIR=%~dp0\\source\nset PATH=%PATH%;C:\\Program Files\\doxygen\\bin\n\n%SPHINXBUILD% >NUL 2>NUL\nif errorlevel 9009 (\n\techo.\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\n\techo.installed, then set the SPHINXBUILD environment variable to point\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\n\techo.may add the Sphinx directory to PATH.\n\techo.\n\techo.If you don't have Sphinx installed, grab it from\n\techo.http://sphinx-doc.org/\n\texit /b 1\n)\n\nmkdir \"%DOC_BUILD_DIR%\"\n\nif \"%1\" == \"doxygen\" goto doxygen\n\nif \"%1\" == \"-bin\" (\n  set XLOIL_BIN_DIR=%XLOIL_SOLN_DIR%\\build\\%2\n  shift\n  shift\n)\n\nREM Generate the doc stubs: since we can import the core pyd locally, this is\nREM really just for ReadTheDocs\nif exist \"%PY_PACKAGE_DIR%\\generate_stubs.py\" (\n\techo.Generating doc stubs for xloil_core\n\tpython \"%PY_PACKAGE_DIR%\\generate_stubs.py\"\n)\n\nREM It's very important to pass the -E argument to sphinx, otherwise it does\nREM not notice changes to docstrings in python modules and generates the \nREM wrong documentation\n\nREM Set READTHEDOCS so we get consistency with the RTD online version\nset READTHEDOCS=1\n%SPHINXBUILD% -M %1 \"%SOURCEDIR%\" \"%DOC_BUILD_DIR%\" %SPHINXOPTS% -E -W --keep-going %O%\nset READTHEDOCS=\ngoto end\n\n\n:doxygen\n\npushd source\n\nREM For some reason doxygen can't create directories itself\nmkdir \"%DOC_BUILD_DIR%\\doxygen\\html\\doxygen\"\nmkdir \"%DOC_BUILD_DIR%\\doxygen\\xml\\doxygen\"\n\nREM Need to reverse slashes for doxygen because life is tough\nset \"XLO_SOLN_DIR=%XLOIL_SOLN_DIR:\\=/%\"\ndoxygen xloil.doxyfile\npopd\ngoto end\n\n\n:help\n%SPHINXBUILD% -M help %SOURCEDIR% %DOC_BUILD_DIR% %SPHINXOPTS% %O%\n\n:end\npopd\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "numpy\nnumpydoc\nautodocsumm\nsphinx-rtd-theme \ndocutils>=0.16 \nsphinx_rtd_theme\nautodocsumm"
  },
  {
    "path": "docs/source/Concepts.rst",
    "content": "==============\nxlOil Concepts\n==============\n\nThis document explains some of the key xlOil concepts shared accross different languages\n\n.. contents::\n    :local:\n\n\nExcel Functions (UDFs)\n----------------------\n\nExcel supports several classes of user-defined functions:\n\n- Macros: run at user request, have write access to workbook\n- Worksheet functions: run by Excel's calculation cycle. Several sub-types:\n  - Vanilla\n  - Thread-safe: can be run concurrently\n  - Macro-type: can read from sheet addresses and invoke a wider variety of Excel interface functions\n  - Async: can run asynchronously during the calc cycle, but not in the background\n  - RTD: (real time data) background threads which push data onto the sheet when it becomes available\n  - Cluster: can be packaged to run on a remote Excel compute cluster\n\nxlOil currently supports all but Cluster functions.\n\nExcel can pass functions / macros data in one of these types:\n\n- Integer\n- Boolean\n- Floating point\n- String\n- Error, e.g. #NUM!, #VALUE!\n- Empty\n- Array of any of the above\n- Range refering to a worksheet address\n\nThere is no date type. Excel's builtin date functions interpret numbers as days since 1900. \nExcel does not support timezones.\n\n\n.. _core-cached-objects:\n\nCached Excel Objects\n--------------------\n\nxlOil has an internal lookup for Excel values, which is a convenient way of \npassing arrays around a sheet and as arguments to other xlOil functions.\n\nThe function ``=xloRef(A1:B2)`` returns a cache string of the form:\n``<UniqueChar>[WorkbookName]SheetName!CellRef,#``\n\nThe data can be recovered using ``=xloVal(<CacheString>)``. Alternatively,\nthis string can be passed instead of the source range to xlOil functions which\nsupport cache lookups - and for large arrays this is much faster.\n\nExample use cases are:\n\n    * Where you might use a named range - to avoid updating references \n      in multiple functions when data is appended.  Because `xloRef` automatically \n      trims the range back to the last non-blank row, it can be pointed to a range\n      far larger than the data.\n    * To speed up passing the same large array into several functions \n      (e.g. multiple lookups from a data table, although consider xlOil_SQL if\n      you want to do this).\n\nHowever, there is a disadvantage to using `xloRef`: the cache is cleared when\na workbook is closed, but Excel does not know to recalculate the `xloRef` \nfunctions when the workbook is reopened. Hence you need to force a sheet\nrecalculation using *Ctrl-Alt-F9*.\n\nIn addition to caching arrays, xlOil plugins use the cache to opaquely return\nreferencs to in-memory structures.  Although the strings look similar, they \npoint to very different objects and cannot be written to the sheet using `xloVal`.\n\n\n.. _concepts-rtd-async:\n\nRtd / Async\n-----------\n\nIn Excel, RTD (real time data) functions are able to return values independently of Excel's \ncalculation cycle.  Excel has supported RTD functions since at least Excel 2002.  In Excel \n2010, Excel introduced native async functions.\n\nRTD:\n\n    * Pro: operates independently of the calc cycle - true background execution\n    * Pro: provides notification when an RTD function call is changed or removed\n    * Con: increased overhead compared to native async\n    * Con: requires automatic calculation enabled (or repeated presses of F9 until calc is done)\n\nNative async:\n\n    * Pro: Less overhead compared to RTD\n    * Pro: works with manual calc mode\n    * Con: tied to calc cycle, so any interruption cancels all asyncs functions\n\nThe last con is particularly problematic for native async: *any* user interaction with Excel will\ninterrupt the calc, so whilst native async functions can run asynchronously with each other, they\ncannot be used to perform background calculations.\n\n.. _concepts-ribbon:\n\nCustom UI: The Fluent Ribbon\n----------------------------\n\nxlOil allows dynamic creation of Excel Ribbon components. The ribbon is defined by XML\n(surrounded with <customUI> tags) which should be created with a specialised editor, see the \n*Resources* below. Controls in the ribbon interact with user code via callback handlers.  \nThese callbacks pass a variety of arguments and may expect a return value; it is important \nto check that the any callback behaves as per the callback specifications in the *Resources*.\n\nTo pass ribbon XML into Excel, xlOil creates a COM-based add-in in addition to the XLL-based \nadd-in which loads the xlOil core - you can see this appearing in Excel's add-in list in the \nExcel's Options windows.\n\nResources:\n\n   * `Microsoft: Overview of the Office Fluent Ribbon <https://docs.microsoft.com/en-us/office/vba/library-reference/concepts/overview-of-the-office-fluent-ribbon>`_\n   * `Microsoft: Customizing the Office Fluent Ribbon for Developers <https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/aa338202(v=office.12)>`_\n   * `Microsoft: Custom UI XML Markup Specification <https://docs.microsoft.com/en-us/openspecs/office_standards/ms-customui/31f152d6-2a5d-4b50-a867-9dbc6d01aa43>`_\n   * `Microsoft: Ribbon Callback Specifications <https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2010/ee691833(v=office.14)>`_\n   * `Office RibbonX Editor <https://github.com/fernandreu/office-ribbonx-editor>`_\n   * `Ron de Bruin: Ribbon Examples files and Tips <https://www.rondebruin.nl/win/s2/win003.htm>`_\n\n\n.. _concepts-intellisense:\n\nIntellisense / Function Context Help\n------------------------------------\n\nTo get pop-up function help, install `Excel-DNA Intellisense <https://github.com/Excel-DNA/IntelliSense/releases>`_\n\nIn addition to the function wizard, Excel has a function context help which pops up as you type.\nThis is only directly available for built-in functions.  Fortunately, Govert of *Excel-DNA* has created\nan add-in which mimics this behaviour for user-defined functions.  Download the XLL (with the right bitness)\nfrom the link above and activate it by one of:\n\n   1) Dragging the XLL into Excel (must be done once per session)\n   2) Install it via *Excel* => *Options* => *Addins* => *Manage*. \n   3) Copy it to your `%APPDATA%\\\\Microsoft\\\\Excel\\\\XLSTART` directory.\n\nYou will now get pop-up help for all xlOil plugins functions, including any dynamically registered ones, \nfor example, created with python plugin."
  },
  {
    "path": "docs/source/Core.rst",
    "content": "===========\nxlOil Core\n===========\n\nHere we tell you how to get started using xlOil and how to distribute addins\n\n.. _core-getting-started:\n\nGetting Started\n---------------\n\nYou need **Excel 2010** or later on a desktop PC. xlOil will not work with online \nor Mac versions of Office.\n\n.. important::\n\n    If you want to use xlOil with python you should install it via `pip`. Stop reading\n    this page and go to :doc:`xlOil_Python/GettingStarted`\n\nDownload the binary package (e.g. from gitlab) and unzip to a directory of \nyour choice. \n\nYou can run the `xlOil_Install.ps1` script to install the addin for every\nExcel session, or just drop `xlOil.xll` into any running Excel session\nto load xlOil temporarily.\n\nxlOil should now load when you open Excel, try following \n:any:`sql-getting-started`\n\nTo configure the plugins being loaded, see :any:`core-edit-settings-files`.\nSome plugings, such as the python one, have several paths which must be set \ncorrectly - it will generally be easier to use these plugins by following their\nspecific installation instructions.\n\n.. _core-example-sheets:\n\nExample sheets\n--------------\n\nTo check your setup and see some of the capabilities of xlOil, try:\n:download:`Tests and Examples </_build/xlOilExamples.zip>`.\n\n.. _core-edit-settings-files:\n\nEditing the settings file\n-------------------------\n\nThere is an `xlOil.ini` file linked to the main `xlOil.xll` addin. (This ini file \nis actually parsed as TOML, an extension of the ini format). xlOil searches for\nthis file first in `%APPDATA%/xlOil` then in the directory containing the `xlOil.xll` \naddin. \n\nThe two most important setting in `xlOil.ini` are:\n\n::\n\n    ...\n    XLOIL_PATH='''C:\\lib\\xloil```\n    ...\n    Plugins=[\"xloil_Python.dll\", \"xlOil_SQL.dll\"]\n\n``XLOIL_PATH`` allows the `xlOil.xll` addin to locate the main xlOil DLL if the \naddin is being run from a different directory.  When the main DLL has loaded, \nxlOil loads the specified plugins. It searches for these plugins first in the \ndirectory containing `xlOil.dll`, then the directory containing the XLL, then \nthe usual DLL search paths. \n\n\nSetting enviroment variables in settings files\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nEach plugin can have an *Environment* section in the settings file. Within this block\ntokens are interpreted as enviroment variables to set. A plugin's environment settings \nare processed before the plugin is loaded. \n\nKeys are interpreted as environement variables to set. Values can reference other enviroment \nvariables by surrounding the name with `%` characters.\n\nIn addition you can pull values from the registry by surrounding the registry\npath with angle brackets `<>`. Leaving a trailing backslash `\\\\` in the \nregistry path fetches the default value for that key.\n\nThe TOML syntax of three single quotes indicates a string literal, this avoids escaping \nall the backslashes.\n\nThe default enviroment block for Python looks like this:\n\n::\n\n    [[xlOil_Python.Environment]]\n    xlOilPythonVersion=\"3.7\"\n\n    [[xlOil_Python.Environment]]\n    PYTHONPATH='''<HKLM\\SOFTWARE\\Python\\PythonCore\\%xlOilPythonVersion%\\PythonPath\\>'''\n    PYTHON_LIB='''<HKLM\\SOFTWARE\\Python\\PythonCore\\%xlOilPythonVersion%\\InstallPath\\>'''\n\n    [[xlOil_Python.Environment]]\n    PATH='''%PATH%;%PYTHON_LIB%;%PYTHON_LIB%\\Library\\bin'''\n\nThe double brackets tell TOML that the order of these declarations is important,\nthis means we can refer to previously set enviroment variables.\n\nIn addition you can pull values from the registry by surrounding the registry\npath with angle brackets `<>`, for example, \n`<HKLM\\SOFTWARE\\Python\\PythonCore\\3.6\\InstallPath\\ExecutablePath>`. \nLeaving a trailing backslash `\\\\` in the registry path fetches the default \nvalue for that key.\n\nTroubleshooting\n---------------\n\nYou may need to tweak your settings file: :any:`core-edit-settings-files`\n\nA common problem is that the COM interface misbehaves by either failing on start-up or failing\nbecause of an open dialog box in Excel.  For a start-up fail, unload and reload the addin. \nFor other errors try to close dialog boxes or panes and if that fails, restart Excel.\n\nThe log file\n~~~~~~~~~~~~~\n\nIf xlOil detects a serious load error, it pops up a log window to alert you (this can\nbe turned off). If it succesfully loaded the core DLL a log file will also be created\nnext to `xlOil.ini`, which by default is in ``%APPDATA%\\xlOil``.  If xlOil loaded, the \nworksheet function `xloLog` can tell you where this file is.  A setting in `xlOil.ini` \ncontrols the log level.\n\nManual installation\n~~~~~~~~~~~~~~~~~~~\n\nThe `xlOil_Install.ps1` script does the following:\n\n   1. Check xlOil is not in Excel's disabled add-ins\n   2. Copy xlOil.xll to the ``%APPDATA%\\Microsoft\\Excel\\XLSTART`` directory\n   3. Copy xlOil.ini in the ``%APPDATA%\\xlOil``` directory\n   4. Check VBA Object Model access is allowed in \n      `Excel > File > Options > Trust Center > Trust Center Settings > Macro Settings``\n\n\nManual removal\n~~~~~~~~~~~~~~\n\nShould you need to force remove xlOil, do the following:\n\n   1. Remove *xlOil.xll* from ``%APPDATA%\\Microsoft\\Excel\\XLSTART``\n   2. Remove the directory ``%APPDATA%\\xlOil```\n\nIf you have added *xlOil.xll* or another xll add-in (xlOil does not do this by default)\nand you want to remove it go to:\n\n   1. `Excel > File > Options > Add-ins > Manage Excel Addins`\n   2. If the previous step fails to remove the addin, start Excel with elevated/admin \n      priviledges and retry\n   3. If that fails, try to remove the add-in from the registry key\n      ``HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Office\\<Version>\\Excel\\Options``.\n      You should see values *OPEN*, *OPEN1*, etc with add-in names to be loaded. After removing\n      a value, you need to rename the others to preserve the numeric sequence.\n   4. If that does not work, also look at this registry key:\n      ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Office\\<Version>\\Excel\\Options``.\n\nNote you may need to run the registry editor with elevated priviledges.\n\nTo really scrub the registry, you may find references to the addin under:\n   * `HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\<Version>\\\\Excel\\\\Add-in Manager`\n   * `HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\<Version>\\\\Excel\\\\AddInLoadTimes`\n   * `HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\<Version>\\\\Excel\\\\Resiliency\\DisabledItems`\n   * `HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\Excel\\\\Addins`\n   * `HKEY_CURRENT_USER\\\\SOFTWARE\\\\Microsoft\\\\Office\\\\Excel\\\\AddinsData`\n"
  },
  {
    "path": "docs/source/Developer.rst",
    "content": "=======================\nxlOil Development Guide\n=======================\n\nGetting started as developer\n----------------------------\n\n- You need Visual Studio 2022 or newer\n- All xlOil_Core dependencies are already in the `external` folder. Some of them are compressed, \n  so unpack them.\n- To build the `xlOil-COM` library you need the ATL headers which can be installed with the Visual\n  Studio installer (under C++ development). \n- For debugging, set xlOil_Loader as the target project, with \n  command=`<Path-to-Excel.exe>` args=`$(OutDir)\\xloil.xll`\n\n\nRelease Instructions\n--------------------\n\n::\n\n    cd <xloil_root>\\tools\n    python stage.py\n\n(Optional) test python wheels with \n\n::\n\n    cd <xloil_root>\\build\\staging\\pypackage\n    pip install dist/xlOil-0.3-cp37-cp37m-win_amd64.whl\n    pip uninstall dist/xlOil-0.3-cp37-cp37m-win_amd64.whl\n\nUse twine to upload to PyPI (note you need to ensure twine has the right login\nkeys/secrets):\n\n::\n\n    cd <xloil_root>\\build\\staging\\pypackage\n\n    # (Optional test)\n    twine upload --repository-url https://test.pypi.org/legacy/ dist/*\n\n    # The real thing\n    twine upload dist/*\n"
  },
  {
    "path": "docs/source/Events.rst",
    "content": "==================\nxlOil Excel Events\n==================\n\n.. contents::\n    :local:\n\nIntroduction\n------------\n\nxlOil allows code to hook into Excel events.  The Excel API documentation \n`Excel.Application <https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#events>`_\ncontains more complete descriptions of most of these events, with the exception of the\n`CalcCancelled`, `WorkbookAfterClose`, `XllAdd` and `XllRemove` events which are not part of the\n*Application* object and are provided by xlOil.\n\nFor the syntax used to hook these events, see the individual language documentation.\n\nParameter types\n===============\nMost events use some of the parameter types described below:\n\n* *Workbook name*: passed as a string (not a ``Workbook`` object)\n* *Worksheet name*: passed as a string \n* *Range*: passed as a ``Range`` object\n* *Cancel*: a bool which starts as False If the event handler sets this argument to True,\n  further processing of the event will stop\n  \nAfterCalculate\n--------------\n\nThis event occurs after all Worksheet.Calculate, Chart.Calculate, QueryTable.AfterRefresh, \nand SheetChange events. It's the last event to occur after all refresh processing and all \ncalc processing have completed, and it occurs after CalculationState is set to xlDone.\nThis event is called if the calculation was interrupted (for example by the user pressing \na key or mouse button).\n\nWorkbookOpen\n------------\nOccurs when a workbook is opened. Takes a single parameter containing the workbook name.\n\nNewWorkbook\n-----------\nOccurs when a new workbook is created. Takes a single parameter containing the workbook name.\n\nSheetSelectionChange\n--------------------\nOccurs when the selection changes on any worksheet (doesn't occur if the selection is on a \nchart sheet). Takes two paramters:\n\n* Worksheet name\n* Target / selected Range\n\nSheetBeforeDoubleClick\n----------------------\nOccurs when any worksheet is double-clicked, before the default double-click action. \nTakes three parameters\n\n * Worksheet name\n * Target - A Range giving cell nearest to the mouse pointer when the double-click occurred.\n * Cancel - False when the event occurs. If the event procedure sets this argument to True, the default \n   double-click action isn't performed when the procedure is finished.\n\nSheetBeforeRightClick\n---------------------\nOccurs when any worksheet is right-clicked, before the default right-click action. \nTakes three parameters\n\n * Worksheet name\n * Target - A Range giving the cell nearest to the mouse pointer when the right-click occurred.\n * Cancel - False when the event occurs. If the event procedure sets this argument to True, the default \n   right-click action isn't performed when the procedure is finished.\n\nSheetActivate\n-------------\nOccurs when any sheet is activated. Takes a single parameter containing the sheet name.\n\nSheetDeactivate\n---------------\nOccurs when any sheet is deactivated. Takes a single parameter containing the sheet name.\n\nSheetCalculate\n--------------\nOccurs after any worksheet is recalculated or after any changed data is plotted on a chart.\nTakes a single parameter containing the sheet name.\n\nSheetChange\n-----------\nOccurs when cells in any worksheet are changed by the user or by an external link. Takes \ntwo paramters:\n\n* Worksheet name\n* Changed Range\n\nWorkbookActivate\n----------------\nOccurs when any workbook is activated.  Takes a single parameter containing the workbook name.\n\nWorkbookDeactivate\n------------------\nOccurs when any workbook is deactivated.  Takes a single parameter containing the workbook name.\n\nWorkbookBeforeClose\n-------------------\nOccurs immediately before any open workbook closes. Takes two parameters\n\n * Workbook name\n * Cancel - False when the event occurs. If the event procedure sets this argument to True, the \n   workbook doesn't close when the procedure is finished.\n\nThe event is not called for each workbook when Excel exits.\n\nWorkbookBeforeSave\n------------------\nOccurs before any open workbook is saved. Takes three parameters:\n\n * Workbook name\n * SaveAsUI - True if the Save As dialog box will be displayed due to changes made that need to \n   be saved in the workbook.\n * Cancel - False when the event occurs. If the event procedure sets this argument to True, the \n   workbook isn't save when the procedure is finished.\n\nWorkbookBeforePrint\n-------------------\nOccurs immediately before any open workbook is printed. Takes two parameters\n\n * Workbook name\n * Cancel - False when the event occurs. If the event procedure sets this argument to True, the \n   workbook doesn't print when the procedure is finished.\n\nWorkbookAfterClose\n------------------\nExcel's *WorkbookBeforeClose* event is cancellable by the user so it is not possible to know if \nthe workbook actually closed.  When xlOil calls `WorkbookAfterClose`, the workbook is certainly \nclosed, but it may be some time since that closure happened. Takes a single parameter containing the \nworkbook name.\n\nThe event is not called for each workbook when xlOil exits. This event is not part of the \n*Excel.Application* API.\n\nWorkbookNewSheet\n----------------\nOccurs when a new sheet is created in any open workbook. The first parameter is the workbook name, \nthe second is the new sheet name.\n\nWorkbookAddinInstall\n--------------------\nOccurs when a workbook is installed as an add-in. Takes a single parameter containing the workbook name.\n\nWorkbookAddinUninstall\n----------------------\nOccurs when any add-in workbook is uninstalled. Takes a single parameter containing the workbook name.\n\nCalcCancelled\n-------------\nCalled when the calculation cycle is cancelled (for example by the user pressing a key or mouse button).\nNative async functions should stop any background calculation when this event is received.\n\nThis event is not part of the *Excel.Application* API.\n\nXllAdd\n------\nTriggered when an XLL related to this instance of xlOil is added by the user using the Addin settings\nwindow. The parameter is the XLL filename.\n\nThis event is not part of the *Excel.Application* API.\n\nXllRemove\n---------\nTriggered when an XLL related to this instance of xlOil is removed by the user using the Addin settings\nwindow. The parameter is the XLL filename.\n\nThis event is not part of the *Excel.Application* API.\n"
  },
  {
    "path": "docs/source/Introduction.rst",
    "content": "=====\nxlOil\n=====\n\nxlOil is a framework for linking programming languages with Excel language. \nThat is, a way to write functions in a language of your choice and have them\nappear in Excel as worksheet functions and macros, as well as manipulating\nthe application and GUI similar to VBA.\n\nxlOil is designed to have very low overheads when calling your own worksheet \nfunctions.\n\nxlOil supports different languages via plugins. The languages currently \nsupported are:\n\n- C++\n- Python\n- SQL\n\nIn addition there is :any:`xlOil_Utils` which contains some handy tools which Microsoft\nnever quite got around to adding.\n\nYou can use xlOil as an end-user of these plugins or you can use it to write\nyou own language bindings and contribute.\n\n.. important::\n\n    **Start Here:**  :any:`core-getting-started`\n\nxlOil features\n--------------\n\n* Python\n    - Very concise syntax to declare an Excel function\n    - Optional type checking of function parameters\n    - Supports keyword arguments\n    - Choice of globally declared functions or code modules limited to a single workbook (just\n      like VBA workbook-level functions)\n    - Tight integration with numpy - very low overheads for array functions\n    - Understands python tuples, lists, dictionarys and pandas dataframes\n    - Async functions\n    - RTD functions and on-the-fly RTD server creation\n    - Macro type functions which write to ranges on the sheet\n    - Access to the Excel Application object \n    - Hook Excel events\n    - Pass any python object back to Excel and then back into any python function\n    - Simple and quick add-in deployment\n    - Two-way connection to Jupyter notebooks: run worksheet functions in Jupyter and query variables\n      in the jupyter kernel\n    - On-the-fly creation/destruction of COM addin objects and Ribbon UI\n\n* C++\n    - Safe and convenient wrappers around most things in the C-API\n    - Concise syntax to declare Excel functions: registration is automatic\n    - Deal with Excel variants, Ranges, Arrays and strings in a natural C++ fashion\n    - Object cache allows returning opaque objects to Excel and passing them back to other functions\n    - Async functions\n    - RTD functions and on-the-fly RTD server creation\n    - On-the-fly creation/destruction of COM addin objects and Ribbon UI\n\n* SQL\n    - Create tables from Excel ranges and arrays\n    - Query and join them with the full sqlite3 SQL syntax\n\n* Utils: very fast functions to\n    - Sort on multiple columns\n    - Split and join strings\n    - Make arrays from blocks\n\nWhy xlOil was created\n---------------------\n\nProgramming with Excel has no ideal solution. You have a choice of APIs:\n\n- VBA - great integration with Excel, but clunky syntax compared with\n  other languages, few common libraries, limited IDE, testing and source \n  control very difficult, single-threaded, use not encouraged by MS.\n- C-API - It's C and hence unsafe. The API is also old, has some quirks \n  and is missing many features of the other APIs. But it's the fastest\n  interface.\n- COM - More fully-featured but slower and strangely missing some features\n  of the C-API.  It's C++ so still pretty unsafe. Has some unexpected behaviour\n  and may fail to respond.  Requires COM binding support in your language \n  or the syntax is essentially unusuable.\n- .Net API - actually sits on top of COM, the best modern interface\n  but only for .Net languages and speed-limited by COM overheads, still missing \n  some C-API features.\n- Javascript API - supports Office on multiple devices and operating system, but \n  very slow with limited functionality compared to other APIs.\n\nxlOil tries to give you the C and COM APIs blended in a more friendly \nfashion and adds:\n\n- Solution to the \"how to register a worksheet function without a static DLL entry point\" problem\n- Object caching\n- A framework for converting excel variant types to another language and back\n- A convenient way of creating worksheet-scope functions\n- A loader stub\n- Goodwill to all men\n\n\nComparison between xlOil and other Excel Addin solutions\n--------------------------------------------------------\n\nGiven the age of Excel, there are many other solutions for Excel add-in\ndevelopment.\n\nMost available packages are commercial (and quite expensive) so I \ncannot test relative performance with xlOil. They are generally\nfocussed on a single language rather than providing a framework\nfor language bindings as xlOil does.\n\nThe following, likely incomplete, list includes some of the most  \nprominent Excel addin software. \n\n- Addin express: (commercial) fully-featured with nice GUI and the support\n  seems good as well. Limited to .Net languages, but covers the entire Office\n  suite (not just Excel)\n- ExcelDNA: (free) mature, well-regarded and widely used, covers \n  almost all Excel API features, but only for .Net languages.  I strongly\n  recommend this software if you are using .Net languages.\n- XLL Plus: (commercial) seems to be fully-featured with GUI wizards\n  to help developers, but only for C++ and the most expensive sofware \n  here.\n- PyXLL: (commercial) Python-only.  Supports the full range of Excel\n  API features and some functionality to run on remote servers.\n- XlWings: (mostly free) Python-only. More mature sofware, but considerably\n  slower (2000x in my test case) than xlOil due to use of slower APIs.\n  Can only create 'local' functions backed by VBA, so every Excel sheet needs\n  to be be a macro sheet with special VBA redirects. This means it is not viable\n  for addin deployment.  Supports Mac and Python 2.7 (but licence fee required \n  for this).\n"
  },
  {
    "path": "docs/source/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#     sys.path.insert(0, os.path.abspath('.'))\n\nimport os\nimport sys\nfrom pathlib import Path\n\n#\n# The default soln_dir and bin_dir paths here are to allow VS code to auto\n# preview the docs. I'm currently not sure how to add environment variables\n# to processes run by VS code.\n#\n\nfile_dir = Path(__file__).parent\nxloil_dir = file_dir.parent.parent\nsoln_dir = Path(os.environ.get(\"XLOIL_SOLN_DIR\", xloil_dir)).resolve()\nbin_dir = Path(os.environ.get(\"XLOIL_BIN_DIR\", xloil_dir / \"build/x64/Debug\")).resolve()\n\nif bin_dir.exists():\n    sys.path.append(str(bin_dir))\nsys.path.append(str(soln_dir / \"libs/xlOil_Python/Package\"))\n\n# May as well fail here if we can't find xloil\ntry:\n    import xloil\nexcept Exception as e:\n    raise Exception(f'{e}. SysPath={sys.path}', e)\n\n# -- Project information -----------------------------------------------------\n\nproject = 'xlOil'\ncopyright = '2022, Steven Cunnane'\nauthor = 'Steven Cunnane'\n\n# The full version, including alpha/beta/rc tags\nrelease = (soln_dir / \"Version.txt\").read_text()\n\n# -- General configuration ---------------------------------------------------\n\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\", \n    \"sphinx.ext.autosummary\", \n    \"sphinx.ext.autosectionlabel\", \n    \"numpydoc\",\n    'autodocsumm'\n    ]\n\n# Avoid duplicate label warnings from autosectionlabel\nsuppress_warnings = ['autosectionlabel.*']\n\n# True to prefix each section label with the name of the document it is in, \n# followed by a colon. For example, index:Introduction for a section called \n# Introduction that appears in document index.rst.\nautosectionlabel_prefix_document = True\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = []\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n\nUSE_READTHEDOCS_THEME = True\nif USE_READTHEDOCS_THEME:\n    import sphinx_rtd_theme\n    extensions.append('sphinx_rtd_theme')\n    html_theme = \"sphinx_rtd_theme\"\nelse:\n    html_theme = 'bizstyle'\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = []# ['_static']\n\n# A list of paths that contain extra files not directly related to the documentation, \n# such as robots.txt or .htaccess. Relative paths are taken as relative to the \n# configuration directory. They are copied to the output directory.\n#html_extra_path = ['../build/doxygen']\n\nautodoc_default_flags = ['members']\n\n#\n# If autosummary_generate is True, stub .rst files for for items in the autosummary\n# toctree are automatically generated. We prefer to keep a flatter structure.\n#\nautosummary_generate = False\n\n# See https://stackoverflow.com/questions/34216659/\nnumpydoc_show_class_members=False\n\n#\n# Required for readthedocs build as the master_doc seems to default to 'contents' in\n# their environment. Locally sphinx builds fine without this\n#\nmaster_doc = 'index'\n\n# -- Generate examples file ---------------------------------------------------\n#\n# Only do this when XLOIL_BIN_DIR is explicitly set so not on ad-hoc run\n#\nif \"XLOIL_BIN_DIR\" in os.environ:\n    import zipfile\n    from zipfile import ZipFile\n\n    try: os.makedirs('_build')\n    except FileExistsError: pass\n\n    zipObj = ZipFile('_build/xlOilExamples.zip', 'w', compression=zipfile.ZIP_BZIP2)\n    try:\n        zipObj.write(soln_dir / \"tests\" / \"AutoSheets\" / \"PythonTest.xlsm\", \"PythonTest.xlsx\")\n        zipObj.write(soln_dir / \"tests\" / \"ManualSheets\" / \"python\" / \"PythonTestAsync.xlsm\", \"PythonTestAsync.xlsm\")\n        zipObj.write(soln_dir / \"tests\" / \"AutoSheets\" / \"PythonTest.py\", \"PythonTest.py\")\n        zipObj.write(soln_dir / \"tests\" / \"AutoSheets\" / \"TestModule.py\", \"TestModule.py\")\n        zipObj.write(soln_dir / \"tests\" / \"AutoSheets\" / \"TestSQL.xlsx\", \"TestSQL.xlsx\")\n        zipObj.write(soln_dir / \"tests\" / \"AutoSheets\" / \"TestUtils.xlsx\", \"TestUtils.xlsx\")\n    \n    except FileNotFoundError as err: \n        print(\"WARNING: Could not create xlOilExamples.zip due to: \", str(err))\n\n    zipObj.close()\n"
  },
  {
    "path": "docs/source/index.rst",
    "content": ".. raw:: html\n\n\t<iframe src=\"https://github.com/sponsors/cunnane/card\" title=\"Sponsor xlOil\" height=\"200\" width=\"500\" style=\"border: 0;\"></iframe>\n\nxlOil documentation\n===================\n\n.. toctree::\n\t:maxdepth: 4\n\t:caption: Contents:\n\t:glob:\n\n\tIntroduction\n\tCore\n\tConcepts\n\tEvents\n\txlOil_Core_Functions\n\txlOil_Cpp/index\n\txlOil_Python/index\n\txlOil_SQL/index\n\txlOil_Utils\n\tDeveloper\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/source/xlOil_Core_Functions.rst",
    "content": "=========================\nxlOil Core Functions\n=========================\n\nThis page describes the worksheet functions registered by the xlOil core, which should always \nbe available when xlOil is running.\n\nxloRef: adds a value or array to the cache\n------------------------------------------\n\n.. function:: xloRef(arrayOrRange)\n\n    Adds the specified value or range or array to the object cache and returns a string \n    reference.\n\n    See :any:`core-cached-objects`\n\nxloVal: Retrives a value from the Excel data cache\n--------------------------------------------------\n\n.. function:: xloVal(cacheRefString)\n\n    Given a reference string, returns a stored array or value. Cached values \n    are not saved with the workbook so will need to be recreated by forcing \n    a full recalc (press Ctrl-Alt-F9) when the workbook is opened\n\n    See :any:`core-cached-objects`\n\n\nxloHelp: returns help on an xlOil registered function\n------------------------------------------------------\n\n.. function:: xloHelp(functionName)\n\n    Returns a two column array containing the help information passed to Excel's \n    function wizard when the function was registered.  The first row contains \n    the function name and the main help string. Subsequent rows contain argument\n    names and their associated help.\n\n    In the function wizard all help strings are limited to 256 characters. xloHelp\n    does not have this limitation. \n\nxloLog: flushes the log file and returns its location\n-----------------------------------------------------\n\n.. function:: xloLog(ShowWindow=FALSE)\n\n    The xlOil log is only flushed (written to file) occasionally or when an error \n    or warning occurs. Executing this function flushes the log and returns the \n    location of the log file (by default this is the same directory as the settings\n    file).\n\n    Setting the *ShowWindow* parameter causes xlOil's log window to appear. This \n    doesn't display the contents of the entire log file but only the most recent log \n    messages.\n\n\nxloVersion: returns information on the xlOil version\n----------------------------------------------------\n\n.. function:: xloVersion()\n\n    Returns a two-column array of version information."
  },
  {
    "path": "docs/source/xlOil_Cpp/COM.rst",
    "content": "=======================\nxlOil C++ Using COM\n=======================\n\nThe root of Excel's COM interface is `Excel.Application <https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)>`_\nwhich VBA programmers will be familiar with.\n\nThe easiest way to work with it in C++ is by importing the type library into your source file - \nthis allows compile time checks and auto-completion and results in faster code.  COM objects\ncan be accessed using 'late-binding' where methods and properties are queried from the object\nat runtime, but this clearly limits performance.\n\nIn xlOil, the appropriate type library can be imported with the *ExcelTypeLib.h* header:\n\n::\n\n    #include <xlOil\\ExcelTypeLib.h>\n    #include <xlOil\\xlOil.h>\n    using namespace xloil;\n\n    XLO_FUNC_START(testToday())\n    {\n        excelApp().Range[L\"A1\"]->NumberFormat = L\"dd-mm-yyyy\";\n    }\n    XLO_FUNC_END(testToday).macro();\n\nIf *ExcelTypeLib.h* is included before `xlOil.h` it adds COM error handling to any worksheet \nfunctions declared with `XLO_FUNC_START`.  This is useful because COM throws its own `_com_error`\nclasses which do not derive from `std::exception`.\n\nI cannot find a specific Excel/COM/C++ tutorial at this time, but the *Excel.Application* API \ndocumentation is comprehensive. \n"
  },
  {
    "path": "docs/source/xlOil_Cpp/CppRtd.rst",
    "content": "=======================\nxlOil C++ RTD functions\n=======================\n\nIn Excel, RTD (real time data) functions are able to return values independently of Excel's \ncalculation cycle. The classic example of this is a stock ticker with live prices. This is contrasted \nwith  Excel's native async support in :any:`concepts-rtd-async`.\n\n\nExample: Subscription\n---------------------\n\nxlOil wraps the RTD server implementation to make subscription and publication straightfoward as in the \nfollowing example:\n\n.. highlight:: c++\n\n::\n\n    #include <xloil/xlOil.h>\n    using namespace xloil;\n\n    IRtdServer& myRtdServer()\n    {\n      static shared_ptr<IRtdServer> ptr = newRtdServer();\n      static auto backgroundTask = std::async([]()\n        {\n          // Somehow fetch live prices here\n          ptr->publish(\"SP500\", ExcelObj(123));\n          ptr->publish(\"FTSE100\", ExcelObj(456));\n        });\n      return *ptr;\n    }\n\n    XLO_FUNC_START(\n      getStock(const ExcelObj& ticker)\n    )\n    {\n      auto value = myRtdServer().subscribe(tag.toString().c_str());\n      return returnValue(value\n        ? *value\n        : Const::Error(CellError::NA));\n    }\n    XLO_FUNC_END(getStock);\n\n\nExample: Background task\n------------------------\n\nThe RTD mechanism can be used to run slow tasks like data fetches or calculations in the background whilst\nthe user continues to interact with Excel.  The following demonstrates a simple counter which increments\nstepwise.\n\n.. highlight:: c++\n\n::\n\n    #include <xloil/xlOil.h>\n    using namespace xloil;\n    \n    struct Counter : public RtdAsyncTask\n    {\n      Counter(int iStep) : _iStep(iStep) {}\n\n      int _iStep;\n\n      // This function arranges for the work to be done in the background, but must\n      // exit when the `RtdNotifier` requests it\n      std::future<void> operator()(RtdNotifier notify) override\n      {\n        return std::async([=, step = _iStep]()\n        {\n          int _count = 0;\n          while (!notify.cancelled())\n          {\n            notify.publish(ExcelObj(_count));\n            std::this_thread::sleep_for(std::chrono::seconds(2));\n            _count += step;\n          }\n        });\n      }\n\n      // When the cell which generated the task is recalculated, xlOil cannot tell\n      // whether Excel is calling it with new inputs or RTD triggered the call to get\n      // a result. It uses this equality operator to determine if it already has a \n      // running task for the given set of inputs\n      bool operator==(const IRtdAsyncTask& that_) const override\n      {\n        const auto* that = dynamic_cast<const Counter*>(&that_);\n        if (!that)\n          return false;\n        return _iStep == that->_iStep;\n      }\n    };\n\n    XLO_FUNC_START(\n      rtdCounter(const ExcelObj& step)\n    )\n    {\n      auto value = rtdAsync(\n        std::make_shared<Counter>(step.toInt(1)));\n      return returnValue(value ? *value : CellError::NA);\n    }\n    XLO_FUNC_END(rtdCounter);"
  },
  {
    "path": "docs/source/xlOil_Cpp/CustomGUI.rst",
    "content": "==============================\nxlOil C++ GUI Customisation\n==============================\n\n.. contents::\n    :local:\n\nxlOil allows dynamic creation of Excel Ribbon components and custom task panes. See \n:any:`concepts-ribbon` for background. The code differs slightly depending on whether \nyou are writing a static XLL or an xlOil plugin.\n\nCreating a ribbon in a static XLL\n---------------------------------\n\n.. highlight:: c++\n\n::\n    \n    void ribbonHandler(const RibbonControl& ctrl) {}\n    \n\n    struct MyAddin\n    {\n        std::shared_ptr<IComAddin> theComAddin;\n        MyAddin()\n        {\n            // We need this call so that xlOil defers execution of the ribbon creation\n            // until Excel's COM interface is ready\n            xllOpenComCall([this]()\n            {\n                auto mapper = [=](const wchar_t* name) mutable { return ribbonHandler; };\n                theComAddin = makeAddinWithRibbon(\n                    L\"TestXlOil\",\n                    LR\"(\n                        <customUI xmlns=\"http://schemas.microsoft.com/office/2009/07/customui\">\n                        ...\n                        </customUI>\n                    )\", \n                    mapper);\n            });\n        }\n    };\n    XLO_DECLARE_ADDIN(MyAddin);\n\n\nCreating a ribbon in an xlOil plugin\n------------------------------------\n\n.. highlight:: c++\n\n:: \n\n    #incude <xloil/xloil.h>\n\n    void ribbonHandler(const RibbonControl& ctrl) {}\n    std::shared_ptr<IComAddin> theComAddin;\n\n    XLO_PLUGIN_INIT(xloil::AddinContext* ctx, const xloil::PluginContext& plugin)\n    {\n        xloil::linkLogger(ctx, plugin);\n\n        auto mapper = [=](const wchar_t* name) mutable { return ribbonHandler; };\n        theComAddin = makeAddinWithRibbon(\n            L\"TestXlOil\",\n            LR\"(\n                <customUI xmlns=\"http://schemas.microsoft.com/office/2009/07/customui\">\n                ...\n                </customUI>\n            )\", \n            mapper);\n\n        return 0;\n    }\n\n    \nCreating a Custom Task Pane\n---------------------------\n\nAfter a COM addin has been created using the ribbon examples above, a custom task pane\ncan be added in the following way.\n\n.. highlight:: c++\n\n:: \n    \n    std::shared_ptr<ICustomTaskPane> taskPane(theComAddin->createTaskPane(L\"xloil\"));\n    taskPane->setVisible(true);\n\nAn option progid can be passed to `createTaskPane` to create a specific COM object \nas the root of the task pane, if omitted, xlOil uses a simple default object."
  },
  {
    "path": "docs/source/xlOil_Cpp/DynamicRegistration.rst",
    "content": "==============================\nxlOil C++ Dynamic Registration\n==============================\n\nTo support registration of functions in other languages, xlOil has the ability to register worksheet\nfunctions generated at runtime.  In C++, you usually can create a static entry point for each function\nyou want to register using xlOil macros.  These macros end up calling `Excel12(xlfRegister, ...)` and \npass the name of your function.  Dynamic registration is a little trickier since `xlfRegister` requires\nthe name of an entry point into your XLL rather than a function pointer.  xlOil arranges for such a \nsuitable entry point to exist by generating a small trampoline function in assembler which redirects\nto your function.  However, this creates a tiny performance overhead (typically around 8-16 instructions\nincreasing with the number of arguments).\n\n.. highlight:: c++\n\n::\n\n    auto regId = RegisterLambda<>(\n        [](const ExcelObj& arg1, const ExcelObj& arg2)\n        {\n            ...\n            return returnValue(...);\n        })\n        .name(\"Foobar\")\n        .help(\"Does nothing\")\n        .arg(\"Arg1\")\n        .registerFunc();\n\nThe lambda's can take as many `const ExcelObj&` args as required. It must return `ExcelObj*`,\nbut it may throw: xlOil will return the error string.  By specifying `const FuncInfo&` as the \ntype of the first argument, the callable will be given a reference to the function registration info\nin addition the arguments passed by Excel.\n\nYou can dynamically register any function you could register statically, so :any:`SpecialArgs` \narguments are valid, as well as a void return, for example:\n\n.. highlight:: c++\n\n::\n\n    auto regId = RegisterLambda<void>(\n        [](const FuncInfo&, const ExcelObj& arg1, const AsyncHandle& handle)\n        {\n            handle.returnValue(...);\n        })\n        .name(\"AsyncFoobar\").registerFunc();\n\nThe returned register Id is a `shared_ptr` whose destructor unregisters the function, so this must be\nkept in scope.\n\n"
  },
  {
    "path": "docs/source/xlOil_Cpp/Events.rst",
    "content": "================\nxlOil C++ Events\n================\n\nSee :ref:`Events:Introduction`.\n\nExamples\n--------\n\n.. highlight:: c++\n\n::\n\n    // When the returned shared_ptr is destroyed, the handler is unhooked.\n    auto ptr = xloil::Event::CalcCancelled().bind(\n          [this]() { this->cancel(); }));\n\n    // The returned id can be used to unhook the handler\n    static auto id = Event::AfterCalculate() += [logger]() { logger->flush(); };\n\n"
  },
  {
    "path": "docs/source/xlOil_Cpp/GettingStarted.rst",
    "content": "=========================\nxlOil C++ Getting Started\n=========================\n\n\nThere are a few ways to build a C++ project with xlOil:\n\n   1. xlOil plugin: writing a DLL which can be loaded by xlOil after the loader XLL \n      starts up the application. This allows co-operation with other xlOil features such as\n      the the object cache and settings file.  It means that cache references created by \n      `xloRef` can be used in your addin.\n   2. XLL dynamically linking xlOil. This allows co-operation with the Excel object cache.\n      Your XLL will need to be able to find xlOil when it loads - this may be easier if delay\n      loading is employed.\n   3. XLL statically linking xlOil. This gives a standalone XLL. It does not include\n      the xlOil cache functions `xloRef` and `xloVal`, although it is easy to define a private\n      object cache with your own function names.\n\nThe header files and `xlOil.lib` file required for dynamic linking are included in the \n`binary releases <https://gitlab.com/stevecu/xloil/-/releases>`_.\n\nYou need: \n    * `xlOil.lib`: linking library\n    * `xlOil.dll`: main binary \n    * `xlOil.xll`: XLL loader stub\n    * `xlOil.ini`: Main settings file\n    * `include/xloil`: header files\n\nThe static libs are a lot larger, so you'll need to build them from source.\n\nIf you want to read settings from the add-in's *.ini* file using *tomlplusplus* you can find \nthis in `xlOil/external` - it's header-only.\n\nCreating an xlOil Plugin\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis method assumes you already have a running install of xlOil.\n\nCreate a project & solution for your DLL.\n\nBuilding an xlOil plugin requires a number of build settings and the easiest way to get these right\nit is use a property sheet.  First, include an edited copy of `./libs/SetRoot.props` where *xlOilRoot* \npoints to the xlOil directory. Then include `./libs/xlOilPlugin.props`.\n\nNow add the following source file:\n\n.. highlight:: c++\n\n:: \n\n    #include <xloil/xloil.h>\n\n    XLO_PLUGIN_INIT(xloil::AddinContext* ctx, const xloil::PluginContext& plugin)\n    {\n      xloil::linkLogger(ctx, plugin);\n      return 0;\n    }\n\n    using namespace xloil;\n\n    XLO_FUNC_START( \n        MyFunc(const ExcelObj* arg1, const ExcelObj* arg2)\n    )\n    {\n        auto result = arg1->toString() + \": \" + arg2->toString(L\"default value\");\n        return ExcelObj::returnValue(result);\n    }\n    XLO_FUNC_END(MyFunc).threadsafe()\n        .help(L\"Joins two strings\")\n        .arg(L\"Val1\", L\"First String\")\n        .arg(L\"Val2\", L\"Second String\");\n\n\nDeclaring an `XLO_PLUGIN_INIT` entry point lets xlOil know the DLL is a plugin. Calling `linkLogger`\nlinks the *spdlog* to the main xlOil log output.  This is optional if you don't plan on using any logging\nfunctionality.\n\nThe ``ExcelObj`` class wraps the xloper12 variant type used in the XLL interface. It provides\na number of accessors with a focus on efficiency and avoidance of copying (see below).\n\nTo load your plugin in Excel you need to ensure that the main xlOil add-in can locate your DLL. \nYou can do this by changing the Addin enviroment in the `xlOil.ini` file or changing the\ncurrent working directory or system PATH, or by simply ensuring your DLL is in the same directory\nas *xlOil.dll*.\n\nYou should also add your plugin to the `Plugins=` key in `xlOil.ini`.\n\n\nCreating an XLL which statically links xlOil\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBuild xlOil with the *DebugStatic* or *ReleaseStatic* configuration.\n\nCreate a project & solution for your XLL. It should output a DLL, but change the *Target Extension* to XLL.\n\nBuilding an xlOil-linked XLL requires a number of build settings and the easiest way to get these right\nit is use a property sheet.  First, include an edited copy of `./libs/SetRoot.props` where *xlOilRoot* \npoints to the xlOil directory. Then include `./libs/xlOilStaticLib.props`.\n\nAlternatively, you can copy and modify the `TestAddin` project, though you will still need to ensure\n*xlOilRoot* is set correctly.\n\nCreate a `Main.cpp` file with the following contents:\n\n.. highlight:: c++\n\n::\n\n    #include <xloil/xlOil.h>\n    #include <xloil/XllEntryPoint.h>\n    using namespace xloil;\n    \n    struct MyAddin\n    {};\n    XLO_DECLARE_ADDIN(MyAddin);\n\n    XLO_FUNC_START( \n        MyFunc(const ExcelObj* arg1, const ExcelObj* arg2)\n    )\n    {\n        auto result = arg1->toString() + \": \" + arg2->toString(L\"default value\");\n        return ExcelObj::returnValue(result);\n    }\n    XLO_FUNC_END(MyFunc).threadsafe()\n        .help(L\"Joins two strings\")\n        .arg(L\"Val1\", L\"First String\")\n        .arg(L\"Val2\", L\"Second String\");\n\n\nDebugging your addin\n~~~~~~~~~~~~~~~~~~~~\n\nStart a debugging session with the following settings where the XLL may be `xlOil.xll`\nor one you built yourself depending on which path you are following.\n\n   * Command: <path to Excel.exe>\n   * Arguments: <path to the XLL>\n\nSetting the working directory is optional, but it may help locate any externals DLLs your\nadd-in uses.\n\nThere are many examples to follow in the ``xloil_Utils`` and ``xloil_SQL`` projects."
  },
  {
    "path": "docs/source/xlOil_Cpp/ObjectHandles.rst",
    "content": "========================\nxlOil C++ Object Handles\n========================\n\nIt is often convenient to pass a pointer to an in-memory object from one function to another in a way\nwhich generalises :any:`core-cached-objects`.  xlOil makes this very straightforward:\n\n.. highlight:: c++\n\n::\n\n    XLO_FUNC_START(\n        cacheOut(const ExcelObj& val)\n    )\n    {\n        auto key = makeCached<int>(val.toInt());\n        return returnValue(key);\n    }\n    XLO_FUNC_END(cacheOut);\n\n    XLO_FUNC_START(\n        cacheIn(const ExcelObj& cacheKey)\n    )\n    {\n        auto* val = getCached<int>(cacheKey.asPString());\n        return returnValue(val ? *val : 0);\n    }\n    XLO_FUNC_END(cacheIn);\n\nThe cache key or handle returned looks `<UnusualChar>[Book1]Sheet1!R1C1,A`. The leading character \nallows rapid rejection of invalid cache strings; it is unique per cached object type.\n\nCached objects do not persist when a spreadsheet is closed, but Excel does not know to recalculate\nthe cells which generate the cache handles when a spreadsheet is opened, so a full recalc must\nbe manually performed with Ctrl-Alt-F9.  To avoid this requirement, you can make the functions which\ngenerate the handles RTD, but this carries some overhead.\n"
  },
  {
    "path": "docs/source/xlOil_Cpp/SpecialArgs.rst",
    "content": "======================\nXLL Special Arguments\n======================\n\nUser-defined Excel functions in XLLs usually take a number of `const ExcelObj&` arguments\nand return a `ExcelObj*`.  xlOil supports a number of other possibilities, the most useful\nof which are `RangeArg` and `AsyncHandle`.\n\nRangeArg\n--------\n\nDeclaring a class as `const RangeArg&` instead of an `ExcelObj` in registered function tells \nxlOil to allow range references to be passed.  These are sheet addresses which avoid copying\nthe underlying data.  Normally, references to areas on the sheet are converted to arrays\nbefore being passed to the function.  A `RangeArg` only allows the possibility that a range\nreference be specified, `RangeArg` inherits from `ExcelObj` and so may actually be any Excel \ntype.\n\nAsyncHandle\n-----------\n\nDeclaring an argument as `const AsyncHandle&` causes the function to be declared as native\nasync type to Excel. Such a function does not return a value directly but invokes the \n`returnValue` method on its handle to pass a value to Excel (which should only be done once).\n\nExcelObj pointer\n----------------\n\nYou may opt to receive a `const ExcelObj*` instead of a reference. This is purely preference\nand has no other impact.\n\nFPArray\n-------\n\nAn `FPArray` argument is a two-dimensional array of double. This is naturally very fast to \naccess, particulary when combined with inplace returns but has a significant drawback: if\nif any value in the array passed to the function is not a number, Excel will return *#VALUE!*\nwithout actually invoking the function.\n\nInplace returns\n----------------\n\nExcel supports returning values by modifying arguments in place.  This is most useful for the \nFPArray type.  To declare inplace return, simply make the argument a non-const ref or pointer.\n\nIt is also possible to return an `ExcelObj` in-place but this is disabled by default. \nIn the words of the XLL SDK:\n\n\n    \"Excel permits the registration of functions that return an XLOPER by modifying \n    an argument in place. However, if an XLOPER argument points to memory, and the \n    pointer is then overwritten by the return value of the DLL function, Excel can \n    leak memory. If the DLL allocated memory for the return value, Excel might try \n    to free that memory, which could cause an immediate crash.  Therefore, you should \n    not modify XLOPER/XLOPER12 arguments in place.\"\n\n\nIn practice, it can be safe to modify an ExcelObj in place, for instance *xloSort*\nmodifies its input by changing the row order in the array, but without changing memory \nallocation.  However it does not use an inplace return because the drawback of this  \ntechnique is that you cannot return a different type to the one passed, in particular\nyou cannot return an error message or error type. \n\nTo enable inplace `ExcelObj` returns, define the macro \n`XLOIL_UNSAFE_INPLACE_RETURN` before including any xlOil headers."
  },
  {
    "path": "docs/source/xlOil_Cpp/StaticXLLs.rst",
    "content": "======================\nxlOil C++ Static XLLs\n======================\n\nAs explained in :any:`GettingStarted`, it is possible to create an XLL which statically links xlOil.\nThis allows an all-in-one XLL without worrying about DLL search paths.  We expand on the example \nin :any:`GettingStarted` to illustrate some of the other static XLL features:\n\n.. highlight:: c++\n\n::\n\n    #include <xloil/xlOil.h>\n    #include <xloil/XllEntryPoint.h>\n    using namespace xloil;\n\n    struct MyAddin\n    {\n        MyAddin()\n        {\n            // This constructor is called by Excel's AutoOpen\n\n            xllOpenComCall([this]()\n            {\n            // If we need to do some COM stuff on startup, like register a Ribbon,\n            // it needs to go in this delayed COM callback.\n            });\n        }\n\n        ~MyAddin()\n        {\n            // This destructor is called by Excel's AutoClose\n        }\n\n        \n        static wstring addInManagerInfo()\n        {\n            // The string returned here is displayed in Excel's addin options window\n            // Note the function is static: it can be called before AutoOpen.\n            return wstring(L\"My Addin Name\");\n        }\n    };\n    XLO_DECLARE_ADDIN(MyAddin);\n\n"
  },
  {
    "path": "docs/source/xlOil_Cpp/index.rst",
    "content": "======================\nxlOil C++\n======================\n\nxlOil C++ provides a layer above the `XLL API <https://docs.microsoft.com/en-us/office/client-developer/excel/excel-xll-sdk-api-function-reference>`_\nand includes features not available via the XLL API, such as RTD Servers, Ribbon customisation\nand event handling.\n\nThe xlOil C++ interface has a `doxygen API description <../../doxygen/html/doxygen/index.html>`_.\n\n.. toctree::\n    :maxdepth: 4\n    :caption: Contents\n\n    GettingStarted\n    SpecialArgs\n    Events\n    ObjectHandles\n    CustomGUI\n    CppRtd\n    DynamicRegistration\n    StaticXLLs\n    COM\n\n\nQuick Tour of the Key Classes\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nExcelObj - An XLOPER wrapper\n----------------------------\n\nAn *ExcelObj* is a friendly wrapper around Excel's *xloper12* struct which is the variant type\nused to pass arguments in the XLL interface.  An *ExcelObj* it has the same size and *xloper12* so\nyou can freely cast between the two (although be aware that *ExcelObj* has a destructor).\n*ExcelObj* supports a number of variant-like operations: it can be compared to strings or numbers,\nconverted to a string, and created from values or initialiser lists. However, it's not recommended\nto use *ExcelObj* as a generic variant type - reserve it for interaction with the XLL API.\n\nExcelArray / ArrayBuilder\n-------------------------\n\nTo **view** a suitable `ExcelObj` as an array, pass it to the `ExcelArray` constructor.  \nBy default, the array is 'trimmed' to last row and column containing data (i.e. not empty or \nN/A).  `ExcelArray` is a view - it is lightweight but does not own the underlying\ndata.\n\nThe `ArrayBuilder` class constructs arrays to return to Excel. For efficiency (of the CPU not\nthe programmer!) it requires you to know up-front how many array elements you require and the\ntotal length of all strings in the array.  This may mean you need to make two passes of your \ndata, but it saves iterating through the array on destruction. \n\nPString\n-------\n\nStrings in the XLL API are Pascal wide char strings: the first character is the length and \nthey are not null terminated.  `PString` wraps such a string and provides a similar interface to \n`std::wstring`.  There's also a `PStringView` type like `std::wstring_view`.\n\nRange / RangeArg / ExcelRef\n---------------------------\n\nThere are few types of range class with slightly different internals and usages. All behave \nin a \"range-like\" way, supporting:\n\n    * `(i, j)` - accessor to pick out individual elements\n    * `range(fromRow, fromCol, toRow, toCol)` - create a sub-range\n    * `value()` - convert to an `ExcelObj` single value or array\n    * `address()` - fetch the sheet address as a string \n    * `set(val)` - sets the range values to the given `ExcelObj` (which may be an array)\n\n\nThe `RangeArg` type should only be used to declare an argument to a user-defined worksheet\nfunction.  Specifing this type means that xlOil is allowed to pass range references to your\nfunction.  See :any:`SpecialArgs`.  A `RangeArg` is not directly constructable - you should\nconvert it to an `ExcelRef` to copy and pass it around.\n\nThe `ExcelRef` type is equivalent to an *xltypeRef* `ExcelObj`, that is it points to a \nrectangular space on a specific sheet.  It can be created from an `ExcelObj` which is a \nrange reference (typically via `RangeArg.toExcelRef()`) or a sheet address string.\n\nThe `Range` type is a virtual base: it may point either to an `ExcelRef` range or a COM \nrange object.  Prefer `ExcelRef` when you are sure the range information has been passed via\nan XLL worksheet function.\n\n\ncallExcel - calling XLL API functions\n-------------------------------------\n\nThe XLL SDK docs describe a number of API calls beginning with `xl` such as `xlCoerce` and\n`xlSheetNm`. There are also many more poorly documented API calls beginning with `xlc` and \n`xlf`. They can all be found in `xlcall.h`.  Invoking these functions is straightforward:\n\n.. highlight:: c++\n\n::\n    \n    ExcelObj result = callExcel(msxll::xlSheetId, \"Sheet1\");\n\n\nAll arguments are automatically converted to `ExcelObj` type where a conversion is possible\nbefore being passed to Excel.  The type of the return value is given in the documentation.\n\nrunExcelThread - calling blocked API functions \n----------------------------------------------\n\nExcel's COM API must be called on the main thread, since it's single-threaded apartment.\nBreaking this rule may lead to undefined behaviour. In addition, the COM interface must be 'ready'\nwhich means no dialog boxes are open or other tasks which busy the COM interface.\n\nCalls to the XLL API generally also require the main thread (with a few exceptions) and being in \nthe correct 'context', that is being in a function invoked by Excel.\n\nThe `runExcelThread` function queues a message to a hidden window or an asynchronous procedure call \n(APC) callback which will be executed on the main thread when Excel passes control to windows \nor pumps its message loop respectively (a window message is the default, most responsive choice).\n\nThe `runExcelThread` function can retry calls, trying to wait until the COM interface is ready (sadly \nthere is no mechanism to allow Excel to inform applications when it is ready to work, you just \nhave to keep trying).\n \nIn addition, setting the `XLL_API` flag runs the callback in the XLL context.\n\n "
  },
  {
    "path": "docs/source/xlOil_Python/BuiltInUDFs.rst",
    "content": "==================================\nxlOil Built-in Worksheet Functions\n==================================\n\nThe the important ``xloRef`` and ``xloVal`` functions are described at\n:ref:`core-cached-objects`\n\nxloPyLoad: import and scan a python module (worksheet function)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. function:: xloImport(ModuleName:str, From=None, As=None)\n\n    Loads functions from a module and registers them in Excel. The functions do not have to be decorated.\n    Provides an analogue of `from X import Y as Z`\n\n    ModuleName:\n        A module name or a full path name to a target py file. If empty, the workbook module\n        with the same name as the calling workbook is (re)loaded.\n    From: \n        If omitted, imports the specified module as normal, i.e. :any:`xloil.scan_module` If a \n        value or array, registers only the specified object names.  If \"*\", all objects are registered.\n    To: \n        Optionally specifies the Excel function names to register in the same order as `From`.\n        Should have the same length as `From`.\n\n    See :any:`xloil.import_functions`\n\n.. function:: xloAttr(Object, Name:str, *Args, **Kwargs)\n    Returns the named attribute value, or the result of calling it if possible. ie, ``object.attr`` \n    or ``object.attr(*args, *kwargs)`` if it is a callable.\n\n    Object: \n        The target object\n    Name: \n        The name of the attribute to be returned.  The attribute can be a bound method,\n        member, property, method, function or class\n    Args\n        If the attribute is callable, it will be called using these positional arguments\n    Kwargs\n        If the attribute is callable, it will be called using these keyword arguments\n   \n.. function:: xloAttrObj(Object, Name:str, *Args, **Kwargs)\n    Returns the value of named attribute or the result of calling the attribute.  Behaves like\n    `xloAttr` except always returns a cache object (see :ref:`xlOil_Python/TypeConversion:Cached Objects`).\n\n    This function is useful to stop the default conversion to Excel, for example when returning\n    an iterable. A typical use is when chaining `=xloAttrObj` calls.\n\n.. function:: xloPyDebug(Debugger)\n\n    See :ref:`xlOil_Python/Debugging:Selecting the debugger programmatically`"
  },
  {
    "path": "docs/source/xlOil_Python/Concepts.rst",
    "content": "=========================\nxlOil Python Concepts\n=========================\n\n.. contents::\n    :local:\n\n\nWorkbook Modules\n----------------\n\nWhen an Excel workbook is opened, xlOil tries to load the module `<workbook_name>.py` \n(this is configurable).  When registering functions from workbook modules, xlOil defaults \nto making any declared functions :ref:`xlOil_Python/Functions:Local Functions`\n\nThe function :any:`xloil.linked_workbook` when called from a workbook module retrieves \nthe associated workbook path.\n\n\nArray Functions\n---------------\n\nBy default, xlOil-Python converts Excel array arguments to numpy arrays. The conversion\nhappens entirely in C++ and is very fast.  Where possible you should write functions\nwhich support array processing (vectorising) to take advantage of this, for example\nthe following works when it's arguments are arrays or numbers:\n\n::\n\n    @xlo.func\n    def cubic(x, a, b, c, d)\n        return a * x ** 3 + b * x ** 2 + c * x  + d\n\nYou can take this further to evaluate polynominals of n-th degree:\n\n::\n\n    @xlo.func\n    def poly(x, coeffs: xlo.Array(float)):\n        return np.sum(coeffs * x[:,None] ** range(coeffs.T.shape[0]), axis=1)\n\nSpecifing that we expect an array argument and the data type of that array avoids the\noverhead of xlOil determining the type.  There is a problem with this function:\nwhat happens if ``x`` is two-dimensional?  To avoid this possibility we can specify:\n\n::\n\n    @xlo.func\n    def poly(x: xlo.Array(dims=1), coeffs: xlo.Array(float)):\n        return np.sum(coeffs * X[:,None] ** range(coeffs.T.shape[0]), axis=1)\n\n\nEvents\n------\n\nEvents allow for a callback on user interaction. If you are familiar with VBA, you may have used \nExcel's event model already.  Most of the workbook events described in \n`Excel.Appliction <https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#events>`_\nare available in xlOil. \n\nSee :ref:`xlOil_Python/ModuleReference:Events` for more details on python events and :doc:`Events`\nfor a description of the available Excel events.\n\nExcel events do not use return values.  However, some events take reference parameters. \nFor example, `WorkbookBeforeSave` has a boolean `cancel` parameter. Setting this to True cancels the \nsave.  As references to primitive types aren't supported in python, in xlOil you need to set this \nvalue using `cancel.value=True`.\n\nEvent handlers are (currently) global to the Excel instance, so you may need to filter by workbook name \nwhen handling events even if you have hooked the event in a local workbook module.\n\nExamples\n~~~~~~~~\n\n::\n\n    def greet(workbook, worksheet):\n        xlo.Range(f\"[{workbook}]{worksheet}!A1\") = \"Hello!\"\n\n    xlo.event.WorkbookNewSheet += greet\n\n\nRegistering functions in other modules\n--------------------------------------\n\nxlOil automatically scans modules when they are imported or reloaded via a\nhook in python's import mechanism.  This ensures any :any:`xloil.func` \ndecorated functions are registered. \n\nIf you load a module outside the normal ``import`` mechanism, you can tell \nxlOil to look for functions to register with :any:`xloil.scan_module`. \n\nAlso see :any:`xlOil_Python/Functions:Dynamic Registration`, which explains\nhow any python callable can be registered as an Excel function.\n\n\nMultiple addins and event loops\n-------------------------------\n\n*xlOil_Python* can be used by multiple add-ins, that is, more than one XLL\nloader with its own settings and python codebase can exist in the same Excel\nsession.  \n\n   * Each add-in / XLL is loaded in a background thread equipped with an `asyncio`  \n     event loop.  Get the loop using :any:`xloil.get_event_loop`.\n   * You can find the addin associated with the currently running code with \n     :any:`xloil.source_addin` .\n   * All add-ins share the same python interpreter\n   * All add-ins share the python object cache\n   * Worksheet functions are executed in Excel's main thread or one of its \n     worker threads for thread safe functions\n   * Async / RTD worksheet functions are executed in a dedicated xlOil Core\n     event loop which you can access with ``xloil.get_async_loop()``\n   * You can ask xlOil to create a separate thread & event loop for an addin.     \n\nAlthough CPython supports subinterpreters, most C-based extensions, particularly\n*numpy* do not, so there are no plans to add subinterpreter support at this stage.\n"
  },
  {
    "path": "docs/source/xlOil_Python/CustomGUI.rst",
    "content": "==============================\nxlOil Python GUI Customisation\n==============================\n\n.. contents::\n    :local:\n\n\nStatus Bar\n----------\n\nPossibly the simplest Excel GUI interaction: writing messages to Excel's status bar:\n\n::\n\n    from xloil import StatusBar\n\n    with StatusBar(1000) as status:\n        status.msg('Doing slow thing')\n        ...\n        status.msg('Done slow thing')\n\nThe :any:`xloil.StatusBar` object clears the status bar after the specified number of milliseconds\nonce the `with` context ends\n\n\nRibbon\n------\n\nxlOil allows dynamic creation of Excel Fluent Ribbon components. See :any:`concepts-ribbon` for \nbackground.\n\n::\n\n    gui = xlo.ExcelGUI(r'''<customUI xmlns=...>....</<customUI>''', \n        funcmap={\n            'onClick1': run_click,\n            'onClick2': run_click,\n            'onUpdate': update_text,\n        })\n\nThe ``gui`` object :any:`xloil.ExcelGUI` holds a handle to a COM addin created to support\nthe ribbon customisation.  If the object goes out of scope and is deleted by python or if you call \n``gui.disconnect()``, the add-in is unloaded along with the ribbon customisation and any custom task \npanes.\n\nThe ``funcmap`` dictionary (or function) links callbacks named in the ribbon XML to python functions. \nEach handler should have a signature like the following:\n\n::\n\n    def ribbon_button_press(ctrl: RibbonControl)\n        ...\n    def ribbon_callback2(ctrl: RibbonControl, arg1, arg2)\n        ...\n    def ribbon_get_text_label(ctrl: RibbonControl, *args)\n        return \"something\"\n    async def ribbon_callback4(ctrl: RibbonControl, *args)\n        ...    \n\nThe ``ctrl`` argument points to the control which raised the callback. The number of additional\narguments is callback dependent.  Some callbacks are expected to return a value. \nSee `Customizing the Office Fluent Ribbon <https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/aa338199(v=office.12)>`_\nfor a description of the appropriate callback signature.\n\n.. note::\n\n    Callbacks are executed in Excel's main thread unless declared *async*, in which case they will be \n    executed in the addin's event loop.  Async callbacks cannot return values.\n\n\nInstead of a dictionary, the `funcmap` object can be a function which takes any string and returns a \ncallback handler.\n\nSee :doc:`ExampleGUI` for an example of ribbon customisation, or look at xlOil's own ribbon in the \n`xloil/xloil_ribbon.py` module.\n\nSetting button images\n=====================\n\nAny `getImage` callbacks must return a `PIL Image <https://pillow.readthedocs.io/en/stable/reference/Image.html>`_.\nThis is converted to an appropriate COM object by xlOil. Instead of using a separate `getImage` callback \nper control, a single `loadImage` attribute can be added:\n\n::\n\n    <customUI loadImage=\"MyImageLoader\" xmlns=...>\n        ...\n        <button id=\"AButton\" image=\"icon.jpg\" />\n\nThe `MyImageLoader` function will be called with the argument `icon.jpg` and be expected to return\na *PIL Image*.\n\n\nCustom Task Panes\n-----------------\n\n`Custom task panes <https://docs.microsoft.com/en-us/visualstudio/vsto/custom-task-panes>`_ are user \ninterface panels that are usually docked to one side of a window in the Excel application. They can \ncontain a *Qt*, *Tk* or *wx* interface, or any suitable custom COM control. \n\nCustom task panes are created using the :any:`xloil.ExcelGUI` object. There is no need to create a ribbon \nas well, but task panes are normally opened using a ribbon button, because Excel does not provide a \ndefault way for users to show or hide custom task panes.\n\nCustom task panes are associated with a document frame window, which presents a view of a workbook \nto the user.  If you want to display a custom task pane with multiple workbooks, create a new instance \nof the custom task pane when the user creates or opens a workbook. To do this, either handle the \n`WorkbookOpen` event, or require the user to press a ribbon button to open a task pane for the active\nworkbook.\n\nThread-safety\n=============\n\nThe :any:`xloil.ExcelGUI` object and custom task panes can be created in any thread (internally they \nre-direct calls to Excel's main thread). Typically GUI creation will be done on xlOil's python loader \nthread, which also contains an *asyncio* event loop. The individual GUI toolkits are generally not \nthread-safe and should only be accessed from dedicated threads which xlOil creates.  This is described \nbelow per toolkit in more detail.\n\n.. caution:\n\n    If another non-xlOil Excel addin uses the same GUI toolkit, it is very likely that Excel will crash.\n\nQt Custom Task Panes\n====================\n\nQt support uses *qtpy* which auto-detects the Qt bindings (PySide/PyQt) and standardises the \nsmall syntactic differences between the libraries.\n\n.. caution::\n    You *must* import :any:`xloil.gui.qtpy` before any other use of Qt.  This allows xlOil \n    to create and the *QApplication* on its own thread.\n\nIt's common in Qt GUIs to inherit from `QWidget`, so xlOil allows you to create a pane\nfrom a `QWidget`:\n\n::\n\n    import xloil.gui.qtpy\n    from qtpy.QtWidgets import QWidget     \n\n    class QtTaskPane(QWidget):\n        def __init__(self):\n            super().__init__() # Don't forget this!\n            ... # some code to draw the widget\n        def send_signal(self, int):\n            ... # some code to emit a Qt signal\n\n    excelui = xlo.create_gui(...)\n    pane = excelui.attach_pane('MyPane', pane=QtTaskPane)\n\n    # The widget is in the pane's `widget` attribute\n    pane.widget.send_signal(3) \n\nThe :any:`xloil.ExcelGUI.attach_pane` call creates a task pane with the specified name.  If ``pane`` \nis a *type* which inherits from `QWidget`, it is constructed (on the Qt thread, see below)\nand placed in a :any:`xloil.gui.qtpy.QtThreadTaskPane` then attached to the Excel window.\n\nTo talk to your widget, it's best to set up a system of Qt \n`signals <https://wiki.qt.io/Qt_for_Python_Signals_and_Slots>`_ as these are thread-safe. \n(Note the `syntax differs slightly in PyQt5 <https://www.pythonguis.com/faq/pyqt5-vs-pyside2/>`_\nbut it is standardised by *qtpy*) \n\n\nQt Thread-safety\n________________\n\nAll *Qt* interactions other than signals must take place in the same thread, or Qt\nwill abort.  xlOil creates a special Qt thread which runs the Qt event loop, and \nconstructs any task panes on that thread.\n\nTo run commands on xlOil's *Qt* thread, use the :any:`xloil.gui.qtpy.Qt_thread` object\n\n::\n\n    from xloil.gui.qtpy import Qt_thread\n    future = Qt_thread().submit(func, *args)        # returns a concurrent.futures.Future\n    future2 = Qt_thread().submit_async(func, *args) # returns an asyncio.Future\n    future.result()                                 # Blocks if result is required now\n\nYou can also use `Qt_thread` as a decorator to wrap the function in a `submit` call, for example:\n\n::\n\n    @Qt_thread\n    def some_func():\n        ...\n\nTkinter Custom Task Panes\n=========================\n\nWe create a class which derives from :any:`xloil.gui.tkinter.TkThreadTaskPane` (which in turn \nderives from :any:`xloil.gui.CustomTaskPane`).  Unlike Qt, it's not (I think) as common to derive\nfrom a *tkinter.Frame* object.\n\nWe draw the window into the *tkinter.Toplevel* contained in `self.top_level`.\n\n::\n    \n    from xloil.gui.tkinter import TkThreadTaskPane, Tk_thread\n\n    class TkTaskPane(TkThreadTaskPane):\n    \n        @Tk_thread\n        def set_x(self, x):\n            ...\n        \n        def __init__(self):\n            super().__init__() # Don't forget this!\n            \n            # This name is picked up by ExcelGUI.attach_pane\n            self.name = \"MyPane\"\n\n            import tkinter as tk\n            \n            top_level = self.top_level\n            # Draw into window\n            ...\n            \n\n    excelui = xlo.ExcelGUI(xml=..., funcmap=...)\n    pane = excelui.attach_pane(TkTaskPane())\n\n    pane.set_x(3)\n\nAs *tkinter* does not have thread-safe signals, although it does have events which could be used here, \nbut for illustration, we ensure `set_x` is run on the *Tk* thread, by decorating it with \n:any:`xloil.gui.tkinter.Tk_thread`.  The `__init__` method is always called on the *tkinter* thread \nso we don't need to decorate it.\n\nTkinter Thread-safety\n_____________________\n\nThe :any:`xloil.gui.tkinter.Tk_thread` function behaves the same as `Qt_thread` described\nin :ref:`xlOil_Python/CustomGUI:Qt Thread-safety`. \n\n\nwxPython Custom Task Panes\n==========================\n\nIt's common in wx GUIs to inherit from `wx.Frame`, so xlOil allows you to create a pane\nfrom a `wx.Frame`:\n\n::\n\n    from xloil.gui.wx import wx_thread\n    import wx\n\n    class OurWxPane(wx.Frame):\n        def __init__(self):\n            super().__init__(None, title='Hello')\n            ...\n\n        @wx_thread\n        def set_progress(self, x: int):\n            ...\n\n    excelui = xlo.create_gui(...)\n    pane = excelui.attach_pane('MyPane', pane=OurWxPane)\n\n    # The frame is in the pane's `frame` attribute\n    pane.frame.set_progress(3)\n\nWe ensure `set_progress` is run on the *wx* thread, by decorating it with :any:`xloil.gui.wx.wx_thread`.\n\nwxPython Thread-safety\n______________________\n\nThe :any:`xloil.gui.wx.wx_thread` function behaves the same as `Qt_thread` described\nin :ref:`xlOil_Python/CustomGUI:Qt Thread-safety`. \n\n\nTask Pane Events\n================\n\nCustom task panes have three events which can be handled by defining methods in the subclass of \n:any:`xloil.gui.CustomTaskPane` used to create the pane. The callbacks occur on Excel's main thread.\nThe events are:\n\n::\n\n    def on_docked(self):\n        # Called when the user docks or undocks the pane. The dock position is in 'self.position'\n        ...\n\n    def on_visible(self, state: bool):\n        # Called when the user closes/shows the pane with the new visibility in 'state'\n        ...\n\n    def on_destroy(self):\n        # Called just before the pane is destroyed when the parent window is closed\n        super().on_destroy() # Important!\n        ...\n\nTask Pane registry\n==================\n\nThe created task panes are automatically stored in a registry so there is no need to hold a\nreference to them.  Task panes are attached by default to the active window and it is possible to \nhave multiple windows per open workbook.  xlOil will free the panes when the parent workbook ora\naddin closes.\n\nWe can search the registry by name for a task pane without having the :obj:`xloil.ExcelGUI` object:\n\n::\n\n    pane = xloil.gui.find_task_pane(\"MyPane\")\n\nBy default, xlOil looks for a pane attached to the active window, but this can be changed with\narguments.  It is possible to create multiple panes with the same name, in which case this search\ncould return either one.\n\n\nAsync GUI Calls\n---------------\n\nThe above examples create the GUI calls in a synchronous fashion but many of the GUI functions\nare or can be async.  Because xlOil loads modules in a background thread, it's not necessary\nto do this to keep Excel responsive but it could be useful in some circumstances.\n\n::\n\n    async def make_gui():\n    \n        # With connect=False the ctor does nothing\n        excelui = xlo.ExcelGUI(xml=..., funcmap=..., connect=False)\n\n        # The action happens when we call connect, which returns a awaitable future\n        await excelui.connect()\n\n        # We can also create the pane async by passing an awaitable but we have \n        # to then pass the name explictly\n        await excelui.attach_pane_async(\n            name='TkPane',\n            pane=Tk_thread().submit_async(TkTaskPane))\n\n        # We need to keep a reference to 'excelui' as deleting it disconnects the UI\n        return excelui, pane\n"
  },
  {
    "path": "docs/source/xlOil_Python/Debugging.rst",
    "content": "==============================\nxlOil Python Debugging\n==============================\n\nOnly python debuggers capable of handling *embedded* python interpreters can be used to debug xlOil\npython code.\n\nVisual Studio\n-------------\n\n*Visual Studio 2019* and *Visual Studio 2022* with Python Tools installed can break into xlOil python code. \nAttach to the relevant Excel process selecting *only Python Code* debugging.  \n\nVisual Studio will occasionally hang when first hitting a python breakpoint. In the case, restart VS and\nExcel and re-try\n\n.. note::\n    As of Aug 2022, mixed mode debugging with both Python and Native C code does not work: Python \n    breakpoints are not hit.\n\n\nVS Code\n-------\n\n*VS Code* can break into xlOil python code. You need to tell xlOil to start a `debugpy` server by\nselecting it as the debugger in the xlOil ribbon or the ini file. Then use VS Code's python \nremote debugger to connect.  The default port is *5678* but this can be changed in the ini file.\n\n*VS Code* cannot hit breakpoints in async and RTD functions even though tracing is enabled in the\nrelevant threads.  The reason for this is unknown.\n\n.. note::\n    Running the *debugpy* server has some peformance implications, so avoid leaving debugging \n    enabled when not required.\n\nPdb\n---\n\nPdb can be used for post-mortem debugging, i.e. after an exception occurs. Select *pdb* in as \nthe debugger in the xlOil ribbon or the ini file.  Use the command `breakpoint()` in your \ncode to trigger the debugger, or wait for an exception.\n\n\nSelecting the debugger programmatically\n---------------------------------------\n\nA debugger can be selected at runtime in the xlOil ribbon but this choice will persist when Excel\nis restarted.  Alternatively, the debugger can be choosen in code, which is not persistent. Use\nthe following python code:\n\n::\n\n    import xloil.debug\n    xloil.debug.use_debugger('pdb')\n\nOr the Excel formula:\n\n::\n\n    =xloPyDebug(...)\n\n"
  },
  {
    "path": "docs/source/xlOil_Python/DistributingAddins.rst",
    "content": "=======================================\nxlOil Python Distribution and Packaging\n=======================================\n\nxlOil supports two possiblilities for distribution:\n   * Creating an XLL addin to distribute code to existing xlOil users\n   * Packaging Python and xlOil to install code for new users\n\n\nCreating an Addin\n=================\n\nThe idea of this approach is to create an XLL addin so users don't have to edit\ntheir `xlOil.ini` to load some packaged code.  \n\nUsers of XLL will need access to a python distribution which contains\nthe *xlOil* package, however they do not need the xlOil addin installed.\n\nAt a command prompt, run:\n\n::\n\n    xloil create myaddin.xll\n\nThis will create a `myaddin.xll` and `myaddin.ini` in the current directory.\nBy default, the XLL will try to load `myaddin.py` in the same directory, so \ncreate this file:\n\n::\n\n    import xloil as xlo\n\n    @xlo.func\n    def MySum(x, y, z):\n        '''Adds up numbers'''\n        return x + y + z\n\nDropping `myaddin.xll` into an Excel session will create the function ``MySum``.\n\nIf the python distribution will be in a standard directory on users' machines,\nthe `PYTHONEXECUTABLE` and `PATH` environment variables in `myaddin.ini` can\nbe used to point to it, otherwise these variables can read the python location\nfrom the registry.\n\nIf you copy `myaddin.xll`, `myaddin.ini` and `myaddin.py` to your `%APPDATA%\\\\Microsoft\\\\Excel\\\\XLSTART` \ndirectory, Excel attempts to opens the ini file and py files which is not ideal! xlOil will\nlook for `myaddin.ini` in `%APPDATA%\\\\xlOil`, so install the ini to there instead. You'll also need \nto choose a directory to hold `myaddin.py` (or other python modules) and ensure `myaddin.ini` points to \nit; `%APPDATA%\\\\xlOil\\\\myaddin` could be a sensible choice.\n\n.. important:: \n    If a user of `myaddin.xll` has an ini file at `%APPDATA%\\\\xlOil\\\\xlOil.ini``\n    the core xlOil.dll is loaded using those settings before `myaddin.xll`.\n    The assumption is that the user has the xlOil addin installed in Excel, but \n    since only one instance of xlOil (and one python interpreter) can be hosted in \n    Excel, one settings file must take precedence. You can make your addin take\n    precedence with the `LoadBeforeCore` flag in `myaddin.ini`.\n\n\nPackaging Python\n================\n\nxlOil can use `PyInstaller <https://pyinstaller.org/>`_ to package a python distribution and\ncreate an installer executable.  Support for this is fairly rudimentary at present.\n\nYou shouuld start with a minimum python distribution (ideally based on the standard distribution)\nfor the code you want to distribute, otherwise *PyInstaller* may create a very large output.  The\ndistribution should include xlOil and be able to load your code in Excel.\n\nTo package the settings in the file *myaddin.ini* which loads the python module *excel_funcs.py*, \nrun the following command:\n\n::\n\n    xloil package myaddin.ini --hidden-import excel_funcs\n\nNote that *--hidden-import* is actually an `argument to PyInstaller <https://pyinstaller.org/en/stable/usage.html#options>`_\nand can be specified multiple times.  Any other trailing arguments will be passed directly to *PyInstaller*.\n\nThe resulting *dist* directory will contain:\n\n  * install_main.exe (installs xlOil)\n  * _internal (contains the python distribution)\n\nThe installer does not copy the python distribution, it is used in-situ\n\n\nCustomising the packaging\n-------------------------\n\nCalling \n\n:: \n\n    xloil package -makespec myaddin.ini\n    \nstops the packaging process before after creation of the \n`PyInstaller spec files <https://pyinstaller.org/en/stable/spec-files.html>`_.  You can edit this\nspec file directly as described in the *PyInstaller* docs, then invoke *PyInstaller* on the spec file\nyourself to finish the process.\n"
  },
  {
    "path": "docs/source/xlOil_Python/Dynamic.rst",
    "content": "========================================\nxlOil Python Dynamic Runtime Interaction\n========================================\n\nxlOil function registration can be controlled dynamically at runtime.  Also,\nthe Excel can be controlled from macros or the console.\n\n\n.. contents::\n    :local:\n\nDynamic Import\n--------------\n\nFunctions for registration can be specified at runtime without the need to \nadd an :any:`xloil.func` decorator.\n\n.. note::\n    Although Excel will let you, avoid doing this from (non-async) worksheet functions\n    since creating new functions *during* Excel's calculation cycle is likely to cause\n    instability.\n\nThe :any:`xloil.import_functions` call provides an analogue of ``from X import Y as Z`` \nwith Excel UDFs.  A simple usage is:\n\n::\n\n    xloil.import_functions(\"c:/lib/AnotherFile.py\", names=[\"greet\"], as_names=[\"PyGreet\"])\n\n\nwhere AnotherFile.py contains:\n\n::\n\n    def greet(x:str):\n        return f\"Hello {x}!\"\n\nWe specify the Excel name of the function explicitly, if we omitted this, the function \nwould be registered with its python name.  In Excel you can then use the formula \n``=greet(\"World\")``.\n\nTyping annotations are respected, as are doc-strings - the import behaves as if we had \ndecorated the function with :any:`xloil.func`.\n\nIn a worksheet, :any:`xloil.import_functions` is exposed as ``xloImport`` with the same \narguments.\n\nSince the import machinery can register *any* callable, including class constructors,\nyou cane be a little creative.  For example, the following cell formulae will\ncreate a *pandas* *DataFrame* from the range `C1:F5`, sum over rows and take the average\nof the result.\n\n::\n\n    [A1] : =xloImport(\"pandas\",\"DataFrame\")\n\n    [A2] : =DataFrame(C1:F5)\n\n    [A3] : =xloAttr(xloAttrObj(A2,\"sum\",{\"axis\",1}), \"mean\")\n\n\nNotice we used ``xloAttrObj`` - the output of this is always a cache reference.  This stops \nxlOil from trying to convert the result to an Excel value.  Since a *DataFrame* is iterable\nit would otherwise output *DataFrame.index* as an array.  Also note the convenient use of\n`array constants <https://support.microsoft.com/en-us/office/use-array-constants-in-array-formulas-477443ea-5e71-4242-877d-fcae47454eb8>`_\nto specify keyword arguments.\n\n\nDynamic Registration\n--------------------\n\nFunctions can be registed using :any:`xloil.register_functions` and deregistered\nwith :any:`xloil.deregister_functions`.\n\nFor example:\n\n::\n\n    def Greet(x):\n        return f\"Hello {x}\"\n    \n    xlo.register_functions([Greet])\n\nAny callable can be registered, for example:\n\n::\n\n    class Closure:\n        self._total = 0\n        def __call__(self, x):\n            self._total += x\n            return x\n    \n    xlo.register_functions(Closure())\n\nThe name and help of the function can be controlled using :any:`xloil.func`\nand the function can be linked to a specific python module, which means\nit will be removed if the module is unloaded or reloaded.\n\n::\n\n    xlo.register_functions(\n        [xlo.func(fn=Closure(), name=f\"Dynamic1\", register=False)], \n        module=sys.modules[__name__])\n\nFunctions are deregistered by name:\n\n::\n\n    xlo.deregister_functions(\"Greet\")\n"
  },
  {
    "path": "docs/source/xlOil_Python/Example.rst",
    "content": "======================\nxlOil Python Examples\n======================\n\nThis is code for the xlOil python test spreadsheet. You can find the associated sheet at \n:ref:`core-example-sheets`.\n\n.. literalinclude:: /../../tests/AutoSheets/PythonTest.py\n\n"
  },
  {
    "path": "docs/source/xlOil_Python/ExampleGUI.rst",
    "content": "=========================\nxlOil Python GUI Examples\n=========================\n\nThis is code for the xlOil python test spreadsheet. You can find the associated sheet at \n:ref:`core-example-sheets`.\n\n.. literalinclude:: /../../tests/ManualSheets/python/PythonTestUI.py\n\n"
  },
  {
    "path": "docs/source/xlOil_Python/ExampleRTD.rst",
    "content": "=========================\nxlOil Python RTD Examples\n=========================\n\nThis is code for the xlOil python test spreadsheet. You can find the associated sheet at \n:ref:`core-example-sheets`.\n\n.. literalinclude:: /../../tests/ManualSheets/python/PythonTestAsync.py\n\n"
  },
  {
    "path": "docs/source/xlOil_Python/ExcelApplication.rst",
    "content": "==========================================\nxlOil Python: The Excel.Application object\n==========================================\n\n.. contents::\n    :local:\n\nIntroduction\n------------\n\nThe `Excel.Application` object is the root of Excel's COM interface.  If you have used VBA you \nwill likely have come across it.  If xlOil is running embedded in Excel, you can get a reference \nto the parent application with :any:`xloil.app`.  If xlOil has been imported as package, you can \ncreate an Application with :any:`xloil.Application`.\n\nxlOil mirrors a small part of the `Excel.Application` object model as discussed below. For other calls,\nthe COM interface can be accessed directly which provides syntax similar to the `Application`` object in \nVBA.\n\n.. important:: \n    All COM calls must be invoked on the main thread!  A function runs in the main thread if is \n    not declared multi-threaded or if it is called from VBA or the GUI. However during Excel's calc\n    cycle, much of the Application object model is locked, in particular, writing to the sheet is blocked.\n    To schedule a callback to be run on main thread use :any:`xloil.excel_callback`.\n\nThe object model is documented extensively at `Excel object model overview <https://docs.microsoft.com/en-us/visualstudio/vsto/excel-object-model-overview>`_\nand `Application Object <https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)>`_\n\n\nCalling Worksheet Functions and Application.Run\n-----------------------------------------------\n\nIn VBA, ``Application.Run`` takes a function name and a variable argument list and attempts\nto call the specified user-defined function.  In xlOil, use :obj:`xloil.run` to make the same \ncall or go via the COM library with ``xloil.app().Run(...)``. All COM calls must be invoked\non the main thread, however :obj:`xloil.run` and :obj:`xloil.call` have async flavours \n:obj:`xloil.run_async` and :obj:`xloil.call_async` which return a Future and can be called \nfrom any thread.\n\nTo call a worksheet function, use :obj:`xloil.call`. This can also invoke old-style \n`macro sheet commands <https://docs.excel-dna.net/assets/excel-c-api-excel-4-macro-reference.pdf>`_.\nIt must be called from **a non-local worksheet function**.  Worksheet functions can be\ncalled from COM, for example, ``xloil.app().WorksheetFunction.Sum(...)``.\n\n+-------------------------------+---------------------------------------------------------+------------------------------+\n| Function                      |  Use                                                    | Call from                    |\n+===============================+=========================================================+==============================+\n| :obj:`xloil.run`              | Calls user-defined functions as per `Application.Run`   | Main thread                  |\n+-------------------------------+---------------------------------------------------------+------------------------------+\n| :obj:`xloil.run_async`        | (as above but async)                                    | Anywhere                     |\n+-------------------------------+---------------------------------------------------------+------------------------------+\n| :obj:`xloil.call`             | Calls worksheet functions, UDFs or macro sheet commands | Non-local worksheet function |\n+-------------------------------+---------------------------------------------------------+------------------------------+\n| :obj:`xloil.run_async`        | (as above but async)                                    | Anywhere                     |\n+-------------------------------+---------------------------------------------------------+------------------------------+\n| xloil.app().WorksheetFunction | Calls worksheet functions                               | Main thread                  |\n+-------------------------------+---------------------------------------------------------+------------------------------+\n\nxlOil's Excel Object Model\n--------------------------\n\nxlOil mirrors a small part of the `Excel.Application` object model to faciliate easier access to the commonly \nused :obj:`xloil.Application`, :obj:`xloil.Workbook`, :obj:`xloil.Worksheet`, :obj:`xloil.ExcelWindow`, and \n:obj:`xloil.Range` objects.\n\nEach of xlOil's application objects provides a `to_com` method which accepts an optional *lib* argument. \nCalling this returns a marshalled COM object which supports any method or property in the full Application object \nmodel. COM support is be provided by `comtypes <https://pythonhosted.org/comtypes/>`_ , a newer pure \npython package or `win32com <http://timgolden.me.uk/pywin32-docs/html/com/win32com/HTML/docindex.html>`_ \na well-established C++ based library.  If omitted, the default is 'win32com'. The default can be changed \nin the XLL's ini file.\n\nCOM methods can be called directly on xlOil's application objects, so the following are equivalent:\n\n::\n\n    xlo.Application().RegisterXLL(...)\n    xlo.Application().to_com().RegisterXLL(...)\n\nThere is no ambiguity with other methods on the *Application* object as COM methods and properties \nall start with a capital letter.\n\nCOM methods can be called with keyword arguments - note COM arguments start with a capital letter.\n\n::\n\n    xloil.app().Selection.PasteSpecial(Paste=xloil.constants.xlPasteFormulas)\n\n\nExcel Automation\n----------------\n\nExcel's COM interface allows the application to be driven externally by a script. This is best explored\nby looking at (a simplified version of) xlOil's test runner.  The test runner is started at the command line,\nrather than inside an Excel instance like an xlOil-based addin.  You may want to look at the documentation\nfor Excel's `Name <https://docs.microsoft.com/en-us/office/vba/api/excel.name>`_ object.\n\n::\n\n    import xloil as xlo\n\n    # Create a new Excel instance and make it visible\n    app = xlo.Application()\n    app.visible = True\n\n    # Load addin\n    if not app.RegisterXLL(\"xloil.xll\"):\n        raise Exception(\"xloil load failed\")\n\n    test_results = {}\n    for filename in ['TestUtils.xlsx, PythonTest.xlsm']:\n\n        # Open the workbook in readonly mode: don't change the test source!\n        wb = app.open(filename, read_only=True)\n    \n        app.calculate(full=True)\n\n        # Loop through all named ranges in the workbook, looking for ones \n        # prefixed with 'Test_'.  We expect those ranges to contain True\n        # for a successful test outcome.\n        names = wb.to_com().Names\n        for named_range in names:\n            if named_range.Name.lower().startswith(\"Test_\"):\n                # skip one char as RefersTo always starts with '='\n                address = named_range.RefersTo[1:]\n                test_results[(filename, named_range.Name)] = wb[address].value\n        \n        wb.close(save=False)\n\n    app.quit()\n\n    if not all(test_results.values()):\n        print(\"-->FAILED<--\")\n\n\nCreating an Application\n=======================\n\nThe :any:`xloil.Application` object can be created in several ways:\n\n    1) When xloil is embedded, the parent applicaton object is in :any:`xloil.app()`\n    2) `xlo.Application()` with no arguments opens an new instance of Excel (but does not make it visible)\n    3) `xlo.Application(\"MyWorkbook.xlsx\")` returns an instance of Excel which has *MyWorkbook.xlsx* open (or throws)\n    4) `xlo.Application(ComObject)` points an Application at a COM object managed by *win32com* or *comtypes*\n    5) `xlo.Application(HWND)` creates a Application given the window handle of Excel's main window as an int\n\nThe application object can be :any:`xloil.Application.quit()` manually or since it is a context manager, \nyou can write:\n\n::\n\n    with xloil.Application() as app:\n        # do stuff\n        ...\n\n    # app has been quit without saving any open Workbooks\n\n\nAccessing Sheets and Ranges\n---------------------------\n\nWhen xlOil is embedded in Excel as an addin, there is a natural default :obj:`xloil.Application` \nobject: the parent application, which can be accessed by :any:`xloil.app()`.  Additionally,\nwhen embedded you can unambigiously create :any:`xloil.Range` and :any:`xloil.Worksheet` objects\nwithout needing to specify the application.\n\nReading from a Range\n====================\n\n::\n\n    import xloil as xlo\n\n    # if xlOil is embedded: no need to specify Application.\n    # Returns a numpy array\n    xlo.Range(\"A1:C1\").value\n\n    # Above is equivalent to\n    xlo.app().range(\"A1:C1\").value\n\n    # Using COM (win32com) to access a range with empty index\n    # Returns a tuple rather than a numpy array\n    xlo.app().Range(\"A1\", \"C1\").Value\n\nIf the range referred to is empty, its `value` array will be populated with `None`. This \nis different to array/range arguments to :any:`xloil.func` worksheet functions where the\narray is trimmed to the last non-blank. This behaviour can be replicated with \n:any:`xloil.Range.trim` :\n\n::\n\n    r = xlo.app().range(\"A1:C1\")\n\n    r.clear()\n    r.trim().value  # returns the array [None]\n\n    r.set(1)\n    r.trim().value # returns the array [1, 1, 1]\n\nThe square bracket (getitem) operator for a Range behaves like a numpy array,\nin that if the tuple specifies a single cell, it returns the value in that cell, otherwise \nit returns a :any:`xloil.Range` object.  To create a range consisting of a single cell\nuse the `cells` method.\n\nWriting to a range\n==================\n\n::\n\n    # Using the COM object\n    xlo.app().Range(\"A1\", \"B2\").Value = ((1, 2), (3, 4))\n\n    rng = xlo.Range(\"A1:B2\")\n    # Using xlOil syntax (can use numpy array)\n    rng.value = np.array([[1, 2], [3, 4]])\n\n    # Set the entire range to a single value\n    rng.set(\"hello\")\n\n    # Add something\n    rng += \" world!\"\n\n\nWriting a cell formula\n======================\n\nUse the  :any:`xloil.Range.formula` property to set or retrieve the formula in a cell\n\n::\n\n    xlo.app().Range(\"A1\").formula = '=SUM(B1:B10)'\n    xlo.log(xlo.app().Range(\"A1\").has_formula)  # Will write True\n\nWhen write addresses used in formula strings, :any:`xloil.Address` can be useful e.g.:\n\n::\n    \n    sum_start_row=0\n    sum_end_row=9\n    address = xlo.Address((sum_start_row, 1, sum_end_row, 1), sheet=\"Sheet1\")\n    xlo.app().Range(\"A1\").formula = f'=SUM({address})'  # Will be '=SUM(Sheet1!B1:B10)'\n\n\nSince the introduction of dynamic arrays, array formulae have become largely obselete, but it\nis possible to set them with :any:`xloil.Range.set_formula`.\n\n\nUsing Worksheets and Workbooks\n==============================\n\nThere are several ways to address or refer to part of a worksheet:\n\n::\n\n    wb = xloil.active_workbook()  # Only available when embedded\n\n    # Specify external Excel range address\n    r1 = xlo.app().range[f'{wb.name}Sheet1!B2:D3']\n\n    # Specify workbook Excel range address\n    r1 = wb['Sheet1!B2:D3']\n\n    # Specify worksheet, then local Excel range address\n    ws = wb['Sheet1']\n    r1 = ws['B2:D3']\n    \n    # The range function, like in Excel includes right and left hand ends\n    r2 = ws.range(from_row=1, from_col=1, to_row=2, to_col=3)\n\n    # The slice syntax follows python conventions so only the left\n    # hand end is included\n    r3 = ws[1:3, 1:4]\n\n\nThe square bracket (getitem) operator for :any:`xloil.Worksheet` always returns\na :any:`xloil.Range`. For :any:`xloil.Workbook` it may return a :any:`xloil.Range`\nor a :any:`xloil.Worksheet`.\n\nWriting to a worksheet\n~~~~~~~~~~~~~~~~~~~~~~\n\n::\n\n    data = np.array([[1, 2], [3, 4]])\n\n    ws = xloil.worksheets['Sheet1']\n\n    # ws[...] gives a Range, so  \n    ws[\"A1:B2\"].value = data\n\n    # However, value is optional when writing to a sheet\n    ws[\"A1:B2\"] = data  \n\n    # You can copy another part of the sheet, it's faster to\n    # drop the value property here\n    ws[\"A1:B2\"] = ws[\"D1:E2\"] \n\n    # Also works for Workbooks\n    wb = xloil.active_workbook()\n    wb['Sheet1!B2:D3'] = ws[\"D1:E2\"] \n\n\n\nPausing Excel Calculations\n--------------------------\n\nWhen writing to worksheets, performance can often be improved by disabling Excel's auto calculation \nand Event model, otherwise calculation cycles and events will be triggered on each write.\n\nThis is straightforward using :any:`xloil.PauseExcel`:\n\n::\n\n    with xloil.PauseExcel() as paused:\n        for i in range(100):\n            worksheet[i, 1].value = i\n\n\nThe context manager can be replicated manually with\n\n::\n\n    try:\n\n        xloil.app().ScreenUpdating = False\n        xloil.app().EnableEvents = False\n        xloil.app().Calculation = xloil.constants.xlCalculationManual\n\n        ...\n\n    finally:\n    \n        xloil.app().ScreenUpdating = True\n        xloil.app().EnableEvents = True\n        xloil.app().Calculation = xloil.constants.xlCalculationAutomatic\n\n\nTroubleshooting\n---------------\n\nBoth *comtypes* and *win32com* have caches for the python code backing the Excel object model. If \nthese caches somehow become corrupted, it can result in strange COM errors.  It is safe to delete \nthese caches and let the library regenerate them. The caches are located at:\n\n   * *comtypes*: `<your python install>/site-packages/comtypes/gen`\n   * *win32com*: run ``import win32com; print(win32com.__gen_path__)``\n\nSee `for example <https://stackoverflow.com/questions/52889704/>`_\n\nNote: as of 25-Jan-2022, *comtypes* has been observed to give the wrong answer for a call to\n`xloil.app().Workbooks(...)` so it is no longer used as the default whilst this is investigated.\n"
  },
  {
    "path": "docs/source/xlOil_Python/ExternalPackages.rst",
    "content": "=============================\nxlOil Python Package Support\n=============================\n\nxlOil has built-in converters for several external libraries\n\n.. contents::\n    :local:\n\n\nPandas\n------\n\nPandas support can be enabled in *xlOil* with:\n\n::\n\n    import xloil.pandas\n\nThis registers a return converter which allows pandas dataframes to be returned\nfrom Excel functions in a natural table format.  Not if a function always returns \na dataframe it is more performant to specify  ``pandas.DataFrame`` as the return type\nannotation.\n\nThe annotation ``pandas.DataFrame`` can also be used for arguments. The converter by \ndefault expects a two dimensional array with headings in the first row.\n\nTo gain more control over the *DataFrame* conversion, use the annotion \n`xloil.pandas.PDFrame`.  Examples:\n\n::\n\n    @xlo.func\n    def getDataField(data: PDFrame(headings=True), columns) -> PDFrame(headings=False):\n        return data[columnName]\n\n    @xlo.func\n    def readDatedData(df: PDFrame(headings=True, index=['Date', 'Type'], dates=['Date'])):\n        # df will have a pandas.MultiIndex index\n        return df\n\n\nThe parameters have slightly different interpretations when reading or outputting arguments.\n\nThe `headings`` parameter when reading, if True, interprets the first row as column heading or \nif it is an int inperets the first *N* rows as a *pandas.MultiIndex* heading.  When outputting, \nif it is True/False outputs column headings or not.\n\nThe `index`` parameter when reading specifies column(s) which should be set as the index: xloil \ncalls `DataFrame.set_index(<index>)`, so a column name or list-like of columns names can be \ngiven.  When writing: if *index* is set to False, the index is not output, otherwise it is.\n\nThe `dates` parameters specifies which columns to convert from from Excel serial date numbers \nto *numpy.datetime64*. Since Excel stores dates as floating points it is not possible for\nxlOil to identify date columns automatically.  This parameter has no effect when outputting as \n*datetime* arrays are converted automatically.\n\nWe can call the *PDFrame* converter in the function itself if we want to control the arguments\npassed to it based on the function's inputs (this isn't possible if it is used as a decorator).\n\n::\n\n    @xlo.func\n    def dFrameMultiHeadings(\n            df: PDFrame(headings=2),\n            outputHeadings=False):\n        return PDFrame(headings=outputHeadings)(df)\n\n\nSee :doc:`Example` for more examples.\n\nMatplotlib\n----------\n\nImporting ``xloil.matplotlib`` defines a return converter so matplotlib figures\ncan be returned from worksheet functions.  By default they are resized to the cell.\nSubseqent figures returned from the same cell overwrite previous ones.\nReturning a figure requires setting ``macro=True`` in the :obj:`xloil.func` declaration.\n\n::\n\n    import xloil.matplotlib\n    from matplotlib import pyplot\n    \n    @xlo.func(macro=True)\n    def pyTestPlot(x, y, **kwargs):\n        fig = pyplot.figure()\n        ax.plot(x, y, **kwargs)\n        return fig\n\n    @xlo.func(macro=True)\n    def pyTestPlot(x, y, width, height, **kwargs):\n        fig = pyplot.figure()\n        ax.plot(x, y, **kwargs)\n        return xloil.matplotlib.ReturnFigure(size=(width, height), pos='top')(fig)\n\nPIL / pillow\n------------\n\nImporting ``xloil.pillow`` defines a return converter so PIL images\ncan be returned from worksheet functions.  By default they are resized to the cell.\nSubseqent images returned from the same cell overwrite previous ones.\nReturning an image requires setting ``macro=True`` in the :obj:`xloil.func` declaration.\n\n::\n\n    import xloil.pillow\n    from PIL import Image\n\n    @xlo.func(macro=True)\n    def pyTestPic():\n        im = Image.open(\"MyPic.jpg\")\n        return im\n"
  },
  {
    "path": "docs/source/xlOil_Python/FAQ.rst",
    "content": "======================\nxlOil Python Questions\n======================\n\n.. contents::\n    :local:\n\n\nImportError: Typelib different than module\n------------------------------------------\n\nWhen using `comtypes` for COM support, then auto-generated modules can go out of sync, for example, if\nyou upgrade `comtypes`.  Fix this at a command prompt with \n\n.. highlight:: dosbatch\n\n:: \n\n    C:\\ > where clear_comtypes_cache.py\n    C:\\MyPythonDist\\Scripts\\clear_comtypes_cache.py\n    C:\\ > python C:\\MyPythonDist\\Scripts\\clear_comtypes_cache.py -y\n\nYou'll probably need to restart Excel.\n\n\nIntellisense / Function Context Help\n------------------------------------\n\nTo activate pop-up function help, follow the instructions here: :any:`concepts-intellisense`.\n\n\nAuto-reload doesn't reload a module\n-----------------------------------\n\nxlOil only watches for changes in modules which contain :any:`xloil.func` regisrations: it does\nnot do a deep scan / reload of all dependent modules as this could include large portions of your\npython distribution!\n\nDynamically Resized Arrays\n--------------------------\n\nThis is available in Office 365.  It would be possible to replicate this behaviour in older Excel \nversions however it is somewhat tricky, as the output ranges are not 'protected' as they are with \narray formulae or with the Office 365 support.  The code would need to:\n \n    1. Hook the *AfterCalculate* event.\n    2. Remember which functions output arrays in the current calc cycle and their calling cell.\n    3. Remember which functions output arrays in the previous calc cycle and their calling cell.\n    4. On *AfterCalculate*, loop through the functions in (2) writing their array to the worksheet.\n    5. When writing the array, take care to clear any previous result from (3) but not to overwrite\n       any other non-empty cells.\n    6. Clear the ranges for functions in (3) but not in (2).\n    7. Carefully handle the case where the output range for a function in (3) has been edited, for example\n       it may now contain a function in (2)!\n\nUnlike the built-in support in Office 365, the written arrays would be static data so, for example,\nfunction dependency tracing would not work on them (except the top left entry).\n\n\nThis application failed to start because it could not find or load the Qt platform plugin \"windows\"\n---------------------------------------------------------------------------------------------------\n\nUnder Anaconda (and possibly other distributions), Qt is installed outside the usual site-packages \nlocation.  A *qt.conf* file in the root dir directs Qt to the correct place. However under Windows, \nQt will only look for this file in the directory returned by GetModuleFileName or in :/qt/etc/ which \nis unlikely to exist or be easily creatable on Windows.  (See https://doc.qt.io/qt-6/qt-conf.html)\nIn our case GetModuleFileName always returns Excel.exe.\n\nxlOil attempts to work around this by passing the correct location to Qt on start up, however for \nnon-standard locations like virtual environments it may be necessary to set the \n`QT_QPA_PLATFORM_PLUGIN_PATH` environment variable explicitly in xlOil.ini.  If `QT_QPA_PLATFORM_PLUGIN_PATH`\nis set, xlOil will not try to workaround this issue, so verify the value of this variable in the\nlauching environment.\n\n\nwin32com / pythoncom: <some CLSID> has no attribute 'CLSIDToClassMap' \n----------------------------------------------------------------------\n\nThe cache used by *win32com* has somehow gone wrong. Deleting the cache dir will cause a rebuild\nwhich usually resolves the issue.  The location of this directory can be discovered with\n\n::\n\n    python -c \"import win32com; print(win32com.__gen_path__)\"\n\nEither delete the entire *gen_py* directory or just the subdirectory corresponding to the CLSID\nwhich is indicated in the error.\n\n\nCould not connect COM: trying again in 1 second\n-----------------------------------------------\n\nIf this appears frequently in your log file, it may be because Excel is not opening a blank \nworkbook on load.  It is a long-standing Excel bug that the COM server is not properly \nstarted until a workbook is opened: xlOil needs this COM server to register ribbon components,\nso waits in a loop until is is available.  To make Excel open a blank workbook on load (the\npre-Office 2016 behaviour), go to the *File* menu, then *Options*, under *General*, find\n*Start up options*, uncheck the \"Show the Start screen when this application starts\" box.\n"
  },
  {
    "path": "docs/source/xlOil_Python/Functions.rst",
    "content": "==================================\nxlOil Python Registering Functions\n==================================\n\n.. contents::\n    :local:\n\nThere are several ways a python function can be registered with Excel via arguments to \n:any:`xloil.func` decorator.\n\n::\n\n    @xloil.func\n    def Greeting(who):\n        return \"Hello  \" + who\n\n\nLocal Functions\n---------------\n\nWhen registering functions from :ref:`xlOil_Python/Concepts:Workbook Modules`, xlOil defaults to making\nany declared functions \"local\": this means their scope is limited to the workbook.\nIt also means the function is automatically macro-type (xlOil achieves this by creating \na VBA stub to invoke them).\n\nThis behaviour can be overriden by `local` argument:\n\n::\n\n    @xloil.func(local=False)\n    def Greeting(who):\n        return \"Hello  \" + who\n\n\nLocal functions have some limitations compared to global scope ones:\n- No native async or threadsafe, but RTD async is OK\n- Slower due to the VBA redirect\n- Associated workbook must be saved as macro-enabled (xlsm extension)\n- No function wizard help, but CTRL+SHIFT+A to show argument names is available\n\n(Technical note: It is possible to use the Application.MacroOptions call to add help to the \nfunction wizard for VBA, but identically named functions will conflict which rather defeats \nthe purpose of local functions).\n\n\nAsync and RTD Functions\n-----------------------\n\nRTD (real time data) functions are able to return values independently of Excel's \ncalculation cycle and correspond to `async generators <https://www.python.org/dev/peps/pep-0525/>`_\nin python.  For example, the function below returns the time every two seconds:\n\n::\n\n    import xloil, datetime, asyncio\n\n    @xloil.func\n    async def pyClock():\n        while True:\n            await asyncio.sleep(2)\n            yield datetime.datetime.now()\n\nThis is discussed in detail in :ref:`xlOil_Python/Rtd:Introduction`.\n\n\nCommands, Macros & Subroutines\n------------------------------\n\n'Macros' in VBA are declared as subroutines (``Sub``/``End Sub``) and do not return a value. \nThese functions run outside the calculation cycle, triggered by some user interaction such\nas a button.  They run on Excel's main thread and have full permissions on the Excel object \nmodel.  In the XLL interface, these are called 'commands' in the XLL interface and xlOil uses \nthis terminology.\n\nPrograms which heavily use the :ref:`xlOil_Python/ExcelApplication:Introduction` object model are usually written as \ncommands.\n\n::\n\n    @xloil.func(command=True)\n    def pressRunTests():\n\n        r = xloil.Range(\"TestArea\")\n        r.clear()\n        r.set(\"Foo\")\n\n        ...\n\nIf not :ref:`xlOil_Python/Functions:Local Functions`, XLL commands are hidden and not displayed in \ndialog boxes for running macros, such as Excel's macro viewer (Alt+F8). However their \nnames can be entered anywhere a valid command name is required, including in the macro\nviewer.\n\n\nMulti-threaded functions\n------------------------\n\nDeclaring a function re-entrant tells Excel it can be called on all of its calculation\nthreads simultaneously - any other function is invoked on the main thread.  \n\n:ref:`xlOil_Python/Functions:Local Functions` cannot be declared re-entrant.\n\nSince python (at least CPython) is single-threaded there is no direct performance\nbenefit from enabling this. However, if you make frequent calls to C-based libraries \nspeed gains may be possible.\n\n::\n\n    import xloil, ctypes\n\n    @xloil.func(local=False, threaded=True)\n    def threadsafe(x: float) -> int:\n        # Do lots of calculations\n        ...\n        # Return the thread ID to prove the functions were executed on different threads\n        return ctypes.windll.kernel32.GetCurrentThreadId(None)\n\n\nDynamic Registration\n--------------------\n\nFunctions for registration can be specified at runtime without the need to decorate them\nwith :any:`xloil.func`. \n\n.. note::\n    Although Excel will let you, avoid doing this from (non-async) worksheet functions\n    since creating new functions *during* Excel's calculation cycle is likely to cause\n    instability.\n\nThe :any:`xloil.import_functions` call provides an analogue of ``from X import Y as Z`` \nwith Excel UDFs.  A simple usage is:\n\n::\n\n    xloil.import_functions(\"c:/lib/AnotherFile.py\", names=[\"greet\"], as_names=[\"PyGreet\"])\n\n\nwhere AnotherFile.py contains:\n\n::\n\n    def greet(x:str):\n        return f\"Hello {x}!\"\n\nWe specify the Excel name of the function explicitly, if we omitted this, the function \nwould be registered with its python name.  In Excel you can then use the formula \n``=greet(\"World\")``.\n\nTyping annotations are respected, as are doc-strings - the import behaves as if we had \ndecorated the function with :any:`xloil.func`.\n\nIn a worksheet, :any:`xloil.import_functions` is exposed as ``xloImport`` with the same \narguments.\n\nSince the import machinery can register *any* callable, including class constructors,\nyou cane be a little creative.  For example, the following cell formulae will\ncreate a *pandas* *DataFrame* from the range `C1:F5`, sum over rows and take the average\nof the result.\n\n::\n\n    [A1] : =xloImport(\"pandas\",\"DataFrame\")\n\n    [A2] : =DataFrame(C1:F5)\n\n    [A3] : =xloAttr(xloAttrObj(A2,\"sum\",{\"axis\",1}), \"mean\")\n\n\nNotice we used ``xloAttrObj`` - the output of this is always a cache reference.  This stops \nxlOil from trying to convert the result to an Excel value.  Since a *DataFrame* is iterable\nit would otherwise output *DataFrame.index* as an array.  Also note the convenient use of\n`array constants <https://support.microsoft.com/en-us/office/use-array-constants-in-array-formulas-477443ea-5e71-4242-877d-fcae47454eb8>`_\nto specify keyword arguments.\n\nMore controlled registration\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n:any:`xloil.register_functions`\n\n::\n\n    class Closure:\n        self._total = 0\n        def __call__(self, x):\n            self._total += x\n            return x\n    \n    funcs.append(\n        xlo.func(fn=Closure(), name=f\"dynamic1\", register=False)\n        )\n\n    xlo.register_functions(funcs, sys.modules[__name__])\n\n  Loads functions from the specified source and registers them in Excel. The functions\n        do not have to be decorated, but are imported as if they were decorated with ``xloil.func``.\n        So if the functions have typing annotations, they are respected where possible.\n\n        This function is intended \n\n    Imports the specifed python module and registers any it for xloil \n    functions it contains.  Leaving the argument blank loads or reloads the\n    workbook module for the calling sheet, i.e. the file `WorkbookName.py`."
  },
  {
    "path": "docs/source/xlOil_Python/GettingStarted.rst",
    "content": "=========================\nxlOil Python Introduction\n=========================\n\n.. contents::\n    :local:\n\nIntroduction\n------------\n\nThe Python plugin for xlOil primarily allows creation of Excel functions and macros \nbacked by Python code. In addition it offers full control over GUI objects and an \ninterface for Excel automation: driving the application in code.\n\nWhen loaded by xlOil, *xlOil_Python* loads specified python modules, looking for functions \nto add to Excel's global name scope, like an Excel addin.  The plugin can also look for modules \nof the form <workbook_name>.py and load these too, this is like creating a VBA code module for \na workbook. Any python module which contains Excel functions is watched for file modifications so \ncode changes are reflected immediately in Excel.\n\n*xlOil_Python* is tightly integrated with numpy, allowing creation of fast Excel array \nfunctions.\n\n*xlOil_Python* can be imported in python code to allow remote control of an Excel application.\nSee :doc:`ExcelApplication`\n\nFor examples of worksheet functions and GUI controls have a look at :doc:`Example` and\n:ref:`core-example-sheets`.\n\nGetting Started\n---------------\n\n**You must use the same bit-ness of python and Excel**.  So if your Excel is 32-bit, you must\ninstall xloil using a 32-bit python distibution.\n\nRun the following at a command prompt with python environment settings:\n\n::\n\n    pip install xlOil\n   \nxlOil can now be imported to allow remote control of an Excel application.  See :doc:`ExcelApplication`\n\nTo install the addin which allows you to create python-based Excel functions, type:\n\n::\n\n     xloil install\n\nThis call registers the xlOil addin with Excel and places a settings file at\n`%APPDATA%/xlOil/xlOil.ini`.  The settings file describes the python modules \nwhich will be loaded and sets the paths to the python distribution. xlOil should \nset the python paths automatically, but they can be overriden if required.\n\nTo test the setup, you can try the python example sheet: :ref:`core-example-sheets`.\n\n.. note:: \n    It's not necessary for ``xlOil.xll`` to be registered in this way: you can just\n    drop it into your Excel session when required. \n\nYou now have three ways to get xlOil to load your python code.\n\n\nMy first xlOil module\n~~~~~~~~~~~~~~~~~~~~~\n\nCreate a `MyTest.py` file with the following lines:\n\n::\n\n    import xloil as xlo\n\n    @xlo.func\n    def Greeting(who):\n        return \"Hello  \" + who\n\nOpen Excel and use the *xlOil* ribbon toolbar to ensure the search paths include\nthe directory containing `MyTest.py`.  Then add 'MyTest' to the *Load Modules* \nfield, separating entries with a comma. The order of these steps matters because \nediting the *Load Modules* field triggers a load of all newly added modules.\n\nCall the `=Greeting(\"world\")` function in a cell.\n\n\nMy first workbook module\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nCreate an Excel workbook called `MyBook`. In the same directory, create a\nfile `MyBook.py` containing the following:\n\n::\n\n    import xloil as xlo\n\n    @xlo.func\n    def Adder(x, y):\n        return x + y\n\nYou need to open and close `MyBook` in Excel for xlOil to find the python file.\nNow try invoking the `=Adder()` function - it can also add arrays!\n\nIf this isn't working, ensure that \"Trust access to the VBA object model\" is\nchecked in *Excel Options -> Trust Centre -> Macro Settings* - this setting\nis off by default.\n\nUsing the Ribbon\n----------------\n\nxlOil's Ribbon toolbar can:\n\n    * Change the python environment (reqires restart)\n    * Select modules to load at startup and *sys.path* to set\n    * Open the log file\n    * Open a console to interact with the embedded python environment\n    * Choose a debugger, see :ref:'xlOil_Python/Debugging'\n    * Select date formats to use when parsing strings\n\nThe toolbar edits the settings file so that changes persist.  The ribbon is enabled by\nbut can be disabled by removing it from the specified *Load Modules*.\n\n.. note::\n\n    If you have an old ini file (prior to v0.15), you will need to upgrade it to use the  \n    ribbon toolbar. Remove the old ini file and remove/install xlOil.\n\nTroubleshooting\n---------------\n\nIf xlOil detects a serious load error, it pops up a log window to alert you (this can\nbe turned off). If it succesfully loaded the core DLL a log file will also be created\nin `%APPDATA%/xlOil` next to `xlOil.ini`.  The worksheet function `=xloLog()` will tell \nyou where this file is.\n\nNormally a python distribution or environment can be loaded with only the location of \n*python.exe* passed via the `PYTHONEXECUTABLE` environment varaible.  For more complex\nsetups, you may need to set the python paths, i.e. `PATH` and `PYTHONPATH` and maybe even \n`PYTHONHOME`, in the `xlOil.ini` file for xlOil to load your python distribution.\n\nIf the xlOil ribbon does not appear, check that `xloil.xloil_ribbon` appears in the\n*LoadModules* key in the ini file.\n\nIntellisense / Function Context Help\n------------------------------------\n\nTo activate pop-up function help, follow the instructions here: :any:`concepts-intellisense`.\n"
  },
  {
    "path": "docs/source/xlOil_Python/Jupyter.rst",
    "content": "=========================\nxlOil Jupyter Interaction\n=========================\n\n.. contents::\n    :local:\n    \nIntroduction\n------------\n\nxlOil can connect to a Jupyter python kernel, allowing interaction between a Jupyter notebook \nand Excel.  To use this functionality, either run `=xloPyLoad(\"xloil.jupyter\")` in a cell or\nload the `xloil.jupyter` module by specifying it in the `xlOil.ini` file:\n\n::\n\n    ...\n\n    [xlOil_Python]\n    LoadModules=[\"xloil.jupyter\"]\n\nTo establish the connection, call the `xloJpyConnect` function. You pass it one of the following:\n\n   1. The name of a notebook e.g. `MyBook.ipynb`. In this case all local jupyter instances\n      will be searched to find which one has this notebook open.\n   2. The full URL to the notebook, e.g. \n      `http://localhost:8888/notebooks/MyBook.ipynb?token=ac3894ab667fa1f3e4f7fe473fa89566a1580cdb49a2649b`\n   3. The `kernel-xxxx-xxx-xxx.json` file which is specified in the output of running \n      the magic `%connect_info` in a Jupyter cell (no file path is required).\n\nThe `xloJpyConnect` function will return a cache reference.\n\n.. note:: \n\n    The targeted jupyter kernel can be running any version of Python 3 and does not need to\n    to have the `xloil` package installed.\n\n\nRegistering an Excel function from Jupyter\n------------------------------------------\n\nAfter the connection is estabilished, any function created in the kernel and decorated with\n`@xloil.func` will be registed in Excel just as if it had been loaded by xlOil in the normal way.\nThe function will be run in the context of the kernel and the result returned asynchronously \nto Excel.\n\n.. note:: \n\n    Any `@xloil.func` declarations prior to connection will be ignored, so part of the \n    jupyter notebook may need to be re-calculated to ensure functions are registed\n\n\nWatching a variable in a Jupyter notebook\n-----------------------------------------\n\nThe function `=xloJpyWatch(Connection, VarName)` can dynamically capture the value of any \nglobal variable in the kernel.  It is an RTD function so automatically updates when the variable\nis changed.\n\nRunning code in the kernel\n--------------------------\n\nCalling `xloJpyRun` executes the provided string as python code in the kernel, captures the \nresult and returns it to Excel.  xloJpyRun processes the code string as a `format` string using  \npassing the *repr* of any additional arguments, that is, it executes \n`code_string.format(repr(arg1), repr(arg2), ...)`\n\nExamples\n--------\n\nIn an Excel cell enter:\n\n::\n\n    =xloJpyRun(<connection>, \"{} + {}\", 3, 4)\n\n\nExecute the following in a jupyter cell in a connected notebook:\n\n::\n\n    @xloil.func\n    def jptest(x):\n        return f\"Jupyter says {x}\"\n\nWhen xlOil connects to the kernel it will automatically import xlOil, although it does \nnot cause a problem if re-imported.\n\nNow try entering `=jptest(\"hi\")` in Excel!\n\n\nUsing COM Automation\n--------------------\n\nIf the *jupyter* kernel has the *xloil* package installed, we can turn the tables on the \nconnected Excel application and control it using COM automtion. Executing the following\nin the jupyter kernel will add a new workbook to the connected Excel:\n\n::\n\n    app = xloil.app()\n    app.workbooks.add()\n\nSee :ref:`xlOil_Python/ExcelApplication:Introduction` for full details on the :any:`xloil.Application` \nobject and COM automation support.\n\n\nLimitations\n-----------\n\nFunctions declared in the kernel cannot specify the `async` or `rtd` arguments: they are \nautomatically of RTD async type to stop the kernel blocking Excel's calculation cycle!  \nThey cannot be multi-threaded, although xlOil can connect to more than one kernel \nsimultaneously and exection in each kernel will be concurrent.\n\nRegistered kernel-based functions have addin/global scope in Excel.  Any `@xloil.func` \ndeclarations prior to connection will be ignored, even if `xloil` was imported. \n\nThere is reasonable overhead in the machinery required to pass the function arguments to \njupyter and process the result: all transport is via strings, so peformance degredation \nmay be noticable for a large number of calls or for large arrays.\n\n"
  },
  {
    "path": "docs/source/xlOil_Python/ModuleReference.rst",
    "content": "=================================\nxlOil Python Module Reference\n=================================\n\n.. contents::\n    :local:\n\nDeclaring Worksheet Functions\n-----------------------------\n\n.. currentmodule:: xloil\n\n.. autosummary::\n\tAllowRange\n\tArg\n\tArray\n\tCache\n\tCannotConvert\n\tCellError\n\tExcelArray\n\tFastArray\t\n\tSingleValue\n\tfunc\n\tconverter\n\treturner\n\timport_functions\n\tregister_functions\n\tderegister_functions\n\tscan_module\n\n.. automodule:: xloil\n\t:members: Arg,Array,Cache,CannotConvert,CellError,ExcelArray,FastArray,SingleValue,func,converter,returner,import_functions,register_functions,deregister_functions,scan_module\n\t:imported-members:\n\t:undoc-members:\n\n.. autodata:: AllowRange\n\nExcel Object Model\n------------------\n\n.. currentmodule:: xloil\n\n.. autosummary::\n\tworkbooks\n\tworksheets\n\tapp\n\tactive_worksheet\n\tactive_workbook\n\tApplication\n\tCaller\n\tRange\n\tWorkbook\n\tWorksheet\n\tExcelWindow\n\tExcelWindows\n\tWorkbooks\n\tWorksheets\n\n.. autodata:: workbooks\n\t\n.. autodata:: worksheets\n\t\n.. autofunction:: app\n\n.. autofunction:: active_worksheet\n\n.. autofunction:: active_workbook\n\n.. autoclass:: Application\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\t:special-members: __enter__, __exit__\n\n.. autoclass:: Caller\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\n.. autoclass:: Range\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\t:special-members: __getitem__\n\n.. autoclass:: Workbook\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\t:special-members: __getitem__\n\n.. autoclass:: Worksheet\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\t:special-members: __getitem__, __setitem__\n\n.. autoclass:: ExcelWindow\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\n.. autoclass:: ExcelWindows\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\n.. autoclass:: Workbooks\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\n.. autoclass:: Worksheets\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\n.. autoclass:: PauseExcel\n\t:members: \n\n.. automodule:: xloil\n\t:members: SpecialCells\n\t:imported-members:\n\t:undoc-members:\n\n\nRTD Functions\n-------------\n\n.. currentmodule:: xloil\n\n.. autosummary::\n\tRtdPublisher\n\tRtdServer\n\txloil.rtd.subscribe\n\txloil.rtd.RtdSimplePublisher\n\n.. autoclass:: RtdPublisher\n\t:members:\n\t\n.. autoclass:: RtdServer\n\t:members:\n\n.. automodule:: xloil.rtd\n\t:members:\n\n\nGUI Interaction\n---------------\n\n.. currentmodule:: xloil\n\n.. autosummary::\n\tStatusBar\n\tExcelGUI\n\tTaskPaneFrame\n\tRibbonControl\n\txloil.gui.CustomTaskPane\n\txloil.gui.find_task_pane\n\txloil.gui.qtpy.Qt_thread\n\txloil.gui.qtpy.QtThreadTaskPane\n\txloil.gui.tkinter.Tk_thread\n\txloil.gui.tkinter.TkThreadTaskPane\n\txloil.gui.wx.wx_thread\n\txloil.gui.wx.WxThreadTaskPane\n\n.. autoclass:: StatusBar\n\t:members:\n\n.. autoclass:: ExcelGUI\n\t:members:\n.. autoclass:: TaskPaneFrame\n\t:members:\n.. autoclass:: RibbonControl\n\t:members:\n\n.. automodule:: xloil.gui\n\t:members: CustomTaskPane \n\n.. autofunction:: find_task_pane\n\n.. automodule:: xloil.gui.qtpy\n\t:members: Qt_thread, QtThreadTaskPane\n\t:inherited-members:\n\n.. automodule:: xloil.gui.tkinter\n\t:members: Tk_thread, TkThreadTaskPane\t\n\t:inherited-members:\n\n.. automodule:: xloil.gui.wx\n\t:members: wx_thread, WxThreadTaskPane\t\n\t:inherited-members:\n\nEvents\n------\n\n.. currentmodule:: xloil.event\n\n.. automodule:: xloil.event\n\n.. autoclass:: Event\n\t:members:\n\t:special-members: __iadd__, __isub__\n\n.. autofunction:: pause\n.. autofunction:: allow\n\n.. autodata:: AfterCalculate\n.. autodata:: WorkbookOpen\n.. autodata:: NewWorkbook\n.. autodata:: SheetSelectionChange\n.. autodata:: SheetBeforeDoubleClick\n.. autodata:: SheetBeforeRightClick\n.. autodata:: SheetActivate\n.. autodata:: SheetDeactivate\n.. autodata:: SheetCalculate\n.. autodata:: SheetChange\n.. autodata:: WorkbookAfterClose\n.. autodata:: WorkbookRename\n.. autodata:: WorkbookActivate\n.. autodata:: WorkbookDeactivate\n.. autodata:: WorkbookBeforeClose\n.. autodata:: WorkbookBeforeSave\n.. autodata:: WorkbookAfterSave\n.. autodata:: WorkbookBeforePrint\n.. autodata:: WorkbookNewSheet\n.. autodata:: WorkbookAddinInstall\n.. autodata:: WorkbookAddinUninstall\n.. autodata:: XllAdd\n.. autodata:: XllRemove\n.. autodata:: ComAddinsUpdate\n.. autodata:: PyBye\n.. autodata:: UserException\n\n\nEverything else\n---------------\n\n.. currentmodule:: xloil\n\n.. autosummary::\n\tin_wizard\n\tget_async_loop\n\tget_event_loop\n\tfrom_excel_date\n\tdate_formats\n\tlinked_workbook\n\texcel_state\n\tcheck_abort\n\tAddress\n\trun\n\trun_async\n\tcall\n\tcall_async\n\texcel_callback\n\tcache\n\tAddin\n\tsource_addin\n\txloil_addins\n\tcore_addin\n\txloil._core._AddinsDict\n\txloil._core._DateFormatList\n\txloil._core._LogWriter\n\txloil.logging.log\n\txloil.debug.use_debugger\n\n.. autoclass:: ObjectCache\n\t:members: \n\n.. autodata:: cache\n\t:annotation: = ObjectCache\n\t:no-value:\n\n.. automodule:: xloil\n\t:members: in_wizard,get_async_loop,get_event_loop,from_excel_date,linked_workbook,source_addin,excel_state,run,run_async,call,call_async,excel_callback,source_addin,xloil_addins,core_addin,check_abort\n\t:imported-members:\n\t:undoc-members:\n\n.. autoclass:: Address\n\t:members:\n\n.. autodata:: date_formats\n\t:annotation: = _DateFormatList\n\t:no-value:\n\n.. autoclass:: ExcelState\n\t:members: \n\t:inherited-members:\n\t:undoc-members:\n\n.. autoclass:: Addin\n\t:members:\n\n.. autodata:: xloil_addins\n\t:annotation: = _AddinsDict\n\t:no-value:\n\n.. automodule:: xloil._core\n\t:members: _AddinsDict, _DateFormatList, _LogWriter\n\n.. automodule:: xloil.logging\n\t:members: \n\n.. automodule:: xloil.debug\n\t:members:\n\n\n\nExternal libraries\n------------------\n\n.. currentmodule:: xloil\n\n.. autosummary::\n\tinsert_cell_image\n\txloil.pandas.PDFrame\n\txloil.pillow.ReturnImage\n\txloil.matplotlib.ReturnFigure\n\n.. autofunction:: insert_cell_image\n\n.. automodule:: xloil.pandas\n\t:members: PDFrame\n.. automodule:: xloil.pillow\n\t:members: ReturnImage\n.. automodule:: xloil.matplotlib\n\t:members: ReturnFigure\n\n"
  },
  {
    "path": "docs/source/xlOil_Python/Rtd.rst",
    "content": "======================\nxlOil Python Async/Rtd\n======================\n\nIntroduction\n------------\n\nRTD (real time data) functions are able to return values independently of Excel's calculation\ncycle. The classic example of this is a stock ticker with live prices.  It is easy to create\nan RTD function in *xlOil_Python* -- the following gives a ticking clock:\n\n::\n\n    import xloil, datetime, asyncio\n\n    @xloil.func\n    async def pyClock():\n        while True:\n            yield datetime.datetime.now()\n            await asyncio.sleep(2)\n            \n\nNote that calculation must be on automatic mode or you will not see the updates. \nWhatever parameter is passed to `sleep` the clock will not tick faster than 2 seconds - this due \nto the `RTD throttle interval <https://docs.microsoft.com/en-us/previous-versions/office/developer/office-xp/aa140060(v=office.10)>`_\nWhich can bed changed via `xlo.app().RTD.ThrottleInterval = <milliseconds>`, however \nreducing it below the default of 2000 may impair performance.  The change is global and\npersists when Excel is restarted, so give some consideration to altering the value.\n\nAny `async def` function is handled in xlOil as using RTD by default.  It is possible to \nuse Excel's native async support, but this has some drawbacks, discussed in :any:`concepts-rtd-async`\n\nThere is another advantage of RTD: RTD functions can be 'local', i.e. called through a \nVBA stub associated with the workbook, which avoids cluttering the global function namespace.\n\nImproving RTD performance (specifying topics)\n---------------------------------------------\n\nRegistering an `async def` function as described above has a certain overhead: excel will \ncall the function multiple times to fetch the result, so xlOil must store and compare all \nthe function arguments to figure out if Excel wants the result of a previous calculation \nor to starta new calculation with new arguments.\n\nIf an RTD `topic`, i.e. a unique string identifier, is easy to determine we can take over\nresponsibility for generating it manually.\n\n::\n\n    # First create a new RTD COM server so the `topic` strings don't collide\n    _rtdServer = xlo.RtdServer()\n    \n    @xloil.func\n    def pyClock2(secs):\n\n        async def fetch() -> dt.datetime:\n            while True:\n                await asyncio.sleep(secs)\n                yield dt.datetime.now()\n            \n        return xloil.rtd.subscribe(_rtdServer, \"Time:\" + str(secs), fetch)\n\nThe `subscribe` call will look for an existing publisher, i.e. a clock with `secs` interval,\nand return the value if one is found.  Otherwise it will run the coroutine and publish\nthe value.  Note the coroute specifies a return type: this is handled with a return converter\njust like functions decorated with :any:`xloil.func`.\n\nThe instance of the :obj:`xloil.RtdServer` object creates and registers a COM class. When xlOil is\nunloaded, the server will be unregistered and destroyed.  Since we created our own server the \nserver, we can choose the convention for these topic strings (i.e. the unique publisher ID).\n\nNote that we do not need to declare the outer function async, the `subscribe()` call notifies \nExcel that this function should be treated as RTD.\n\nxlOil's RTD Interface\n---------------------\n\nIf even finer-grained control of the RTD mechanism is required (such as in the `xloil_jupyter`\nmodule, :doc:`Jupyter`), we can specify the publisher as described below.\n\nWe will follow the *UrlGetter* example in :doc:`ExampleRTD`.  In this case we make the topics URLs. \nThe RTD workflow is to first check if a given topic has a publisher using `peek()`. If not, \nwe spin one up with :any:`xloil.RtdServer.start`. Then we :any:`xloil.RtdServer.subscribe` to \nthe topic which tells xlOil to call Excel's RTD function.\n\n:: \n\n    _rtdServer = xlo.RtdServer()\n\n    @xlo.func\n    def pyGetUrlLive(url):\n        if _rtdServer.peek(url) is None:\n            publisher = UrlGetter(url)\n            _rtdServer.start(publisher)\n        return _rtdServer.subscribe(url)\n\n\nThe publisher is the class which does the work. Its `connect()` method is called when a \nworksheet function calls `subscribe()` for its topic.  The publisher should then start\nan async task to publish values.\n\nIf the worksheet function is subsequently changed or deleted, then `disconnect()` is called. \nWhen a publisher has no subscribers it should save CPU cycles by stopping its task.  A \npublisher should also stop when requested by the `stop()` method.\n\nApart from `connect()` the remaining methods are boilerplate at least for a simple publisher.\nThe boilerplate can be avoided by use of the `RtdSimplePublisher` class, then only the\n`run()` method in the below requires definition. \n\n::\n\n    class UrlGetter(xlo.RtdPublisher):\n\n        def __init__(self, url):\n            # You *must* call this ctor explicitly or the python binding library will crash\n            super().__init__()  \n            self._url = url\n            self._task = None\n           \n        def connect(self, num_subscribers):\n            if self.done():\n                async def run():\n                    try:\n                        while True:\n                            data = await getUrlAsync(self._url);\n                            _rtdServer.publish(self._url, data)\n                            await asyncio.sleep(4)                     \n                    except Exception as e:\n                        _rtdServer.publish(self._url, e)\n                        \n                self._task = xlo.get_event_loop().create_task(run())\n                \n        def disconnect(self, num_subscribers):\n            if num_subscribers == 0:\n                self.stop()\n                # Returning True schedules the publisher for destruction\n                return True \n                \n        def stop(self):\n            if self._task is not None: \n                self._task.cancel()\n        \n        def done(self):\n            return self._task is None or self._task.done()\n            \n        def topic(self):\n            return self._url\n\nThe final task, left as an exercise, is to write `getUrlAsync()`: an async function which \nfetches a URL.  It is straightforward with the `aiohttp` library.\n"
  },
  {
    "path": "docs/source/xlOil_Python/TypeConversion.rst",
    "content": "============================\nxlOil Python Type Conversion\n============================\n\n.. contents::\n    :local:\n\n\nArgument Types\n--------------\n\nxlOil function declarations in python look like:\n\n::\n\n    @xlo.func\n    def DoSomething(x, y:float):\n      return x\n\nIf no type is specified for an argument, xlOil will dynamically choose a type based\non the argument provied by Excel, this can be one of:\n\n    * *bool*\n    * *int*\n    * *str*\n    * *float*\n    * *numpy.ndarray* (if an array or range is passed)\n    * :py:class:`xloil.CellError`\n\nUsing ``typing`` annotations improves performance at the expense of static\ntyping.  Annonations also allow for user-defined conversion to any python type. \nxlOil has built-in support for the following annotations:\n\n.. list-table:: Supported argument annotations\n    :widths: 20 50\n    :header-rows: 1\n\n    * - Type\n      - Comment\n    * - *bool*\n      - \n    * - *int*\n      -\n    * - *str*\n      -\n    * - *float*\n      -\n    * - *numpy.ndarray*\n      - Use the :py:class:`xloil.Array` annotation rather than ndarray directly\n    * - *dict*\n      - Requires a 2-column input array. The first column is interpreted as keys\n    * - *tuple*\n      - Gives a tuple of tuple-of-tuples depending on number of input dimensions\n    * - *datetime.date*\n      - See :ref:`xlOil_Python/TypeConversion:Dates`\n    * - *datetime.datetime*\n      - See :ref:`xlOil_Python/TypeConversion:Dates`\n    * - *pandas.DataFrame*\n      - Can use the :py:class:`xloil.pandas.PDFrame` annotation for more conversion options. \n        Need to `import xloil.pandas` before use.\n    * - *pandas.Timestamp*\n      - Need to `import xloil.pandas` before use.\n    * - :py:class:`xloil.Range`\n      - See :ref:`xlOil_Python/TypeConversion:Range Arguments`\n    * - :py:class:`xloil.AllowRange`\n      - See :ref:`xlOil_Python/TypeConversion:Range Arguments` \n    * - <AnyType>\n      - See :ref:`xlOil_Python/TypeConversion:Custom Type Conversion`\n\nAnnotations which xlOil does not understand are ignored.\n\nExample:\n\n::\n\n    @xlo.func\n    def pySumNums(x: float, y: float, a: int = 2, b: int = 3) -> float:\n        return x * a + y * b\n\n\nReturn Types\n------------\n\nLike argument types, xlOil can read return type annotations. If no annotation\nis specified xlOil tries the following conversions:\n   \n   * *None*\n   * *int*\n   * *float*\n   * *numpy.ndarray*\n   * *datetime*\n   * :py:class:`xloil.CellError`\n   * *str*\n   * Registered custom return converters, see :ref:`xlOil_Python/TypeConversion:Custom Return Conversion`\n   * iterable\n\nIf none of these succeeds, the object is placed in the cache, see :ref:`xlOil_Python/TypeConversion:Cached Objects`\n\n.. list-table:: Supported return type annotations\n    :widths: 20 50\n    :header-rows: 1\n\n    * - Type\n      - Comment\n    * - *bool*\n      - \n    * - *int*\n      -\n    * - *str*\n      -\n    * - *float*\n      -\n    * - *numpy.ndarray*\n      - Use the :py:class:`xloil.Array` annotation rather than ndarray directly\n    * - *dict*\n      - Outputs a 2-column array of key, value pairs\n    * - *tuple*\n      - A tuple of tuple-of-tuples produces a 1 or 2 dim array\n    * - *datetime.date*\n      - See :ref:`xlOil_Python/TypeConversion:Dates`\n    * - *datetime.datetime*\n      - See :ref:`xlOil_Python/TypeConversion:Dates`\n    * - *pandas.DataFrame*\n      - Can use the :py:class:`xloil.pandas.PDFrame` annotation for more conversion options. \n        Need to `import xloil.pandas` before use.\n    * - *pandas.Timestamp*\n      - Need to `import xloil.pandas` before use.\n    * - *PIL.Image*\n      - See :ref:`xlOil_Python/TypeConversion:Returning Images and Plots`\n    * - *matplotlib.pyplot.Figure*\n      - See :ref:`xlOil_Python/TypeConversion:Returning Images and Plots`\n    * - :py:class:`xloil.Cache`\n      - Placed the return value in the python object cache, see :ref:`xlOil_Python/TypeConversion:Cached Objects`.\n    * - :py:class:`xloil.SingleValue`\n      - Ensures the output will be a single cell value, not an array.\n    * - <AnyType>\n      - See :ref:`xlOil_Python/TypeConversion:Custom Return Conversion`\n\nCached Objects\n--------------\n\nIf xlOil cannot convert a returned python object to Excel, it will place it in \nan object dictionary and return a reference string of the form\n\n``<UniqueChar>[SheetID]!CellNumber,#``\n\nxlOil automatically resolves cache string passed function arguments to their\nobjects.  With this mechanism you can pass python objects opaquely between \nfunctions.  You should not attempt to construct a cache string directly.\n\nFor example:\n\n::\n\n    @xlo.func\n    def make_lambda(pow):\n        return lambda x: x ** pow\n\n    @xlo.func\n    def apply_lambda(f, x):\n        return f(x)\n\nSince xlOil cannot convert a lambda function to an Excel object, it outputs a \ncache reference string.  That string is automatically turned back into a lambda \nif passed as an argument to the second function.\n\nThe python cache is separate to the Core object cache accessed using `xloRef`\nand `xloVal`.  The Core cache stores native Excel objects such as arrays.\nWhen reading functions arguments xlOil tries to lookup strings in both of these\ncaches. \n\nThe leading *<UniqueChar>* means xlOil can very quickly determine that a string\nisn't a cache reference, so the overhead of checking if every string argument\nis a cache object is very low in practice. \n\nUsing :any:`xloil.cache` it is possible to place objects into the cache. This \ncan be used an alternative to the :py:class:`xloil.Cache` decorator to allow\nthe function to choose whether or not to return a cache object.  It could \nalso be used to return cached objects from commands or subroutines, but \nunderstand the object lifecycle before doing this\n\nCache Object Lifecycle\n~~~~~~~~~~~~~~~~~~~~~~\n\nxlOil uses the caller infomation provided by Excel to construct the cache \nstring. When invoked from a worksheet function, the caller info contains \nthe sheet and cell reference and so on each calculation cycle the same\ncache reference appears and the new cache object automatically overwrites \nthe previous one.\n\nWhen invoked from a source other than a worksheet function (there are several\npossibilies for this, see the help for `xlfCaller`), xlOil again generates a \nreference string based on the caller info. However, this may not be unique. \nIn addition, objects with the same caller info will replace those created \nduring a previous calculation cycle. For example, creating cache objects \nfrom a button clicked repeatedly will behave differently if Excel recalculates \nin between the clicks. To override this behaviour, the exact cache `key` can \nbe specified.  For example, use Python's `id` function or the cell address \nbeing written to.  When `key` is specified the user is responsible for managing\nthe lifecycle of their cache objects using `remove` in :any:`xloil.cache`.\n\n\nDates\n-----\n\nApplying the argument annotation ``datetime.datetime`` requests a date conversion. Returning \na ``datetime`` is allowed without a return annotation: the datetime will be converted to\nan Excel date number:\n\n::\n\n    from datetime import datetime, timedelta\n    @func\n    def AddDay(date: datetime):\n        return date + timedelta(days = 1)\n\n\nxlOil can interpret strings as dates. In the settings file, the key ``DateFormats`` \nspecifies an array of date formats to try when parsing strings. Naturally, adding more \nformats decreases performance. The formats use the C++ ``std::get_time`` syntax,\nsee https://en.cppreference.com/w/cpp/io/manip/get_time.\n\nSince ``std::get_time`` is **case-sensitive** on Windows, so is xlOil's date parsing\n(this may be fixed in a future release as it is quite annoying for month names).\n\nExcel has limited internal support for dates. There is no primitive date object \nbut cells containing numbers can be formatted as dates. This means that worksheet \nfunctions cannot tell whether numerical values are intended as dates - this applies\nto Excel built-in date functions as well. (It is possible to check for date formatting\nvia the COM interface but this would give behaviour inconsistent with the built-ins)\n\nExcel does not understand timezones and neither does ``std::get_time``, so these\nare currently unsupported.\n\n\nDicts\n-----\n\nWhen the ``dict`` *argument type* annotation is specified, xlOil expects a two-column \narray of(*string*, *value*) to be passed.\n\nUsing a ``dict`` *return type* annotation allows a ``dict`` to be returned as as a \ntwo column array. Without the annotation, the default iterable converter would be invoked, \nresulting in only the keys being output.\n\nVariable and Keyword Arguments\n-------------------------------\n\nIf keyword args (`**kwargs`) are specified, xlOil expects a two-column array of \n(*string*, *value*) to be passed, the same as using a ``dict`` annotation. For variable\nargs (`*args`) xlOil adds a large number of trailing optional arguments. The variable\nargument list is ended by the first missing argument.  If both *kwargs* and *args* are \nspecified, their order is reversed in the Excel function declaration.\n\nThe following example shows dictionary and keyword aruments:\n\n::\n\n  @xlo.func\n  def pyTestKwargs(lookup: dict, **kwargs) -> dict:\n      lookup.update(kwargs)\n      return lookup\n\nThe number of trailing optional arguments is limited by the maxiumum number of arguments \nallowed by Excel, which is 255 for a worksheet function and 60 for a local function.\n\nRange Arguments\n---------------\n\nRange arguments allow a function to directly access a part of the worksheet. This \nallows macro functions to write to the worksheet or it can be used for optimisation\nif a function only requires a few values from a large input range.\n\nA function can only receive range arguments if it is declared as *macro-type*. In \naddition, attempting to write to a Range during Excel's calculation cycle will fail.\n\nAnnotating an argument with :py:class:`xlo.Range` will tell xlOil to pass the function an\n:py:class:`Range` object, or fail if this is not possible.  An :py:class:`Range` \ncan only be created when the input argument explicitly points to a part of the worksheet, not \nan array output from another function.\n\nAnnotating an argument with :py:class:`xlo.AllowRange` will tell xlOil to pass an \n:py:class:`Range` object if possible, otherwise one of the other basic data types\n(int, str, array, etc.).\n\n\nCustom Type Conversion\n----------------------\n\nA custom type converter is a function or a class which serialises between a set \nof simple types understood by Excel and general python types.\n\nA type converter class is expected to implement at least one of ``read(self, val)`` \nand ``write(self, val)`` and be decorated with :py:func:`xloil.converter`.\nIt may take parameters in its constructor and hold state. \n\nA function can be interpreted as a type reader or writer depending on the parameters\npassed to the :py:func:`xloil.converter` decorator.\n\nThe ``read(self, val)`` method or a function decorated as a reader or argument converter \nshould be able to accept a value of: \n\n    *int*, *bool*, *float*, *str*, :py:class:`xloil.ExcelArray`, :py:class:`CellError`, \n    :py:class:`xloil.Range` (optional) \n\nand return a python object or raise an exception (ideally :py:class:`xloil.CannotConvert`).\n\nAn :py:class:`xloil.ExcelArray` represents an un-processed array argument, a\nhandle to the raw Excel object not yet converted to a *numpy* array.  The converter\nmay opt to process only a part of this array for efficiency. \n\nA converter may be used by name in *typing* annotations for :py:func:`xloil.func` \nfunctions.  In addition, the converter can register as the handler for a specific type \nwhich enables that type to be used in annotations.  For registration, the converter must\nbe default-constructible (or be a function).\n\nBy decorating with ``@xloil.converter(range=True)``, the type converter can opt to\nreceive :py:class:`Range` arguments in addition to the other types.\n\n\n::\n\n    @xlo.converter()\n    def arg_doubler(x):\n      if isinstance(x, xlo.ExcelArray):\n        x = x.to_numpy()\n      return 2 * x\n\n    @xlo.func\n    def pyTestCustomConv(x: arg_doubler):\n      return x\n\n    @xlo.converter(typeof=bytes, register=True)\n    class StrToBytes:\n      def __init__(self, encoding='utf-8'):\n        self._encoding = encoding\n      def read(self, val):\n        return val.encode(self._encoding)\n      def write(self, val):\n        return val.decode(self._encoding)\n      \n    @xlo.func\n    def Pad(text: bytes, size: int) -> StrToBytes('utf-8'):\n      return text.center(size) \n\nCustom Return Conversion\n------------------------\n\nA return type converter should take a python object and return a simple type\nwhich xlOil knows how to return to Excel. It should raise :py:class:`xloil.CannotConvert` \nif it cannot handle the given object.\n\nIt can be a class implementing ``write(self, val)`` and decorated with \n:py:class:`xloil.converter` or a function decorated with :py:class:`xloil.returner`\nor :py:class:`xloil.converter`.\n\nA return converter can register as the handler for a specific type which enables that \ntype to be used in return annotations *and* allows xlOil to try to call \nthe converter for Excel functions with no return annotation, see :ref:`xlOil_Python/TypeConversion:Return Types`.\n        \n\n::\n\n    @xlo.returner(typeof=MyType, register=True)\n    def mytypename(val):\n      return val.__name__\n    \n    @xlo.func\n    def MakeMyType():\n      return MyType()\n  \n\nReturning Images and Plots\n--------------------------\n\nBy using custom return converters you can return `PIL` or `pillow` image \nobjects from worksheet functions. The returned image can be automatically \nsized to the calling range, or any offset from it, but it floats like a \nnormal picture in Excel.  Calling the worksheet function again removes\nthe previous image and replaces it with a new one.\n\n::\n\n    import xloil.pillow\n    from PIL import Image\n    \n    @xlo.func(macro=True) # macro permissions required\n    def ShowPic(filename):\n        return Image.open(filename)\n\n\nImporting ``xloil.pillow`` registers a custom return converter for ``PIL.Image``.\nTo gain control over the image size and position, use the :py:class:`xloil.pillow.ReturnImage`\nreturn annotation.\n\nSimilarly a matplotlib figure can be returned directly\n\n::\n\n    import xloil.matplotlib\n\n    @func(macro=True)\n    def Plot(x, y):\n        fig = pyplot.figure(figsize=(5,5))\n        fig.add_subplot(111).plot(x, y)\n        return fig\n\nImporting ``xloil.matplotlib`` registers a custom return converter for \n``matplotlib.pyplot.Figure``. To gain control over the plot size and position, \nuse the :py:class:`xloil.matplotlib.ReturnFigure` return annotation.\n\nBoth of these converters use :py:class:`xloil.insert_cell_image`.\n"
  },
  {
    "path": "docs/source/xlOil_Python/index.rst",
    "content": "============\nxlOil Python\n============\n\n.. toctree::\n    :maxdepth: 4\n    :caption: Contents\n\n    GettingStarted\n    Concepts\n    Functions\n    TypeConversion\n    ExcelApplication\n    CustomGUI\n    Dynamic\n    ExternalPackages\n    BuiltInUDFs\n    Jupyter\n    Rtd\n    Debugging\n    DistributingAddins\n    Example\n    ExampleGUI\n    ExampleRTD\n    FAQ\n    ModuleReference\n"
  },
  {
    "path": "docs/source/xlOil_SQL/index.rst",
    "content": "=========\nxlOil SQL\n=========\n\nThe SQL plugin uses sqlite3 to provide functions which query Excel arrays (or\nranges) as if they were tables in a database. Multiple tables can be queried \nand joined.\n\n.. contents::\n    :local:\n\n.. _sql-getting-started:\n\nSQL Getting Started\n-------------------\n\nxlOil_SQL does not require any settings and is automatically loaded in a default \nxlOil installation.  It should appear in the plugin list in\n`%APPDATA%/xlOil/xlOil.ini`:\n\n::\n\n    Plugins=[\"xlOil_SQL.dll\"]\n\nYou can open the example spreadsheet at :ref:`core-example-sheets` to see it in action.\n\nFor a quick demo, create a 3 column table of data in an new Excel workbook. \nMake the headings 'Foo', 'Bar' and 'Baz'.  The contents of the data can be \nanything you like.\n\nSuppose the table is in cells A1:C5, then in another cell type \n\n::\n\n    =xloSql(\"SELECT Bar, Baz FROM Table1\", A1:C5)\n\nMake the output an array formula with Ctrl-Shift-Enter and size it \nappropriately.\n\n.. _xloSql:\n\nxloSql\n------\n\nExecutes a query on multiples data arrays\n\n.. function:: xloSql(Query, [Meta], [Table1], [Table2], [Table3], ...)\n\n    Excecutes the SQL query on the provided tables, returning the \n    result in an array. The tables will be named Table1, Table2, etc in the \n    query but this can overrided by the `meta` parameter\n\n        Query:\n            a string or array of string (which will be concatenated) \n            describing a query in SQL (sqlite3). \n\n        Meta: \n            optional array of string. The first column contains the \n            names of the tables. Subsequent columns are interpreted\n            as column headings for the table. Providing a blank table\n            name or few names than tables results in the un-named\n            tables retaining their default name of tableN\n        \n        TableN:\n            each table argument should point to an array of data with\n            columns as fields and records as rows. Unless column\n            names are specified in the meta, the first row is interpreted as column names\n\n\n    **Examples**\n    \n    (Arguments pointing to array data are surrouned by `{}`)\n\n    ::\n\n        =xloSql(\"SELECT table1.A, B, C FROM table1 \",  { A    B  } , { A     C } )\n                \"INNER JOIN table2                 \"   { Foo  1  }   { Bar   2 } )\n                \"ON table1.A == table2.A           \"   { Baz  7  }   { Foo   3 } )\n\n        --> Foo 1 3\n\nStateful Database Functions\n---------------------------\n\nThis family of functions can be used to build up and repeatedly query an \nin-memory database for cases where building the database on the fly using \n:ref:`xlOil_SQL/index:xloSql` is not performant.\n\nxloSqlDB\n~~~~~~~~\n\n.. function:: xloSqlDB()\n\n    Returns a reference to a new database object. The functions :ref:`xlOil_SQL/index:xloSqlDB`, :ref:`xlOil_SQL/index:xloSqlTable`\n    and :ref:`xlOil_SQL/index:xloSqlQuery` can be used to build up an in-memory database for the cases where\n    building these objects on the fly using :ref:`xlOil_SQL/index:xloSql` is not performant.\n\nxloSqlTable\n~~~~~~~~~~~\n\n.. function:: xloSqlTable(Database, Data, Name, [Headings], [Query])\n\n    Creates a table in a database created with :ref:`xlOil_SQL/index:xloSqlDB`.  The function returns a reference \n    to the database: it is recommended to chain xloSqlTable calls to force execution order\n    in Excel. This ensures tables are added to the database before any queries are run\n\n        Database:\n            a reference to a database created with `xloSqlDB`. \n\n        Data: \n            an array of data with columns as fields and records as rows. Unless column\n            headings are specified, the first row is interpreted as column names\n\n        Name:\n            The name of the table in the database. This must be unique.\n        \n        Headings:\n            optional column headings for the data. If these are specified, data is read\n            from the first input row\n        \n        Query:\n            An optional query to process the data as it is copied into the database.\n            If ommitted, \"SELECT * FROM name\" is used.\n\nxloSqlQuery\n~~~~~~~~~~~\n.. function:: xloSqlQuery(Database, Query)\n\n        Database:\n            A reference to a database originally created with :ref:`xlOil_SQL/index:xloSqlDB` but which has\n            passed through calls to :ref:`xlOil_SQL/index:xloSqlTable`.\n\n        Query:\n            A SQL query to execute. Tables referenced in the query must have been added \n            to the database by :ref:`xlOil_SQL/index:xloSqlTable` before this function is called.\n\n\n   **Examples**\n\n    ::\n\n        .              A                               B       C       D   \n        1 =xloSqlDB()                                  MyTab   Foo     Bar\n        2                                                      7       2\n        3 =xloSqlTable(A1, C1:D4, B1)                          4       1\n        4                                                      8       4\n        5\n        6 =xloSqlQuery(A3, \"SELECT Bar FROM MyTab\")\n\n        Cell A6 will contain the array [2, 1, 4]\n\nxloSqlTables\n~~~~~~~~~~~~\n\n.. function:: xloSqlTables(Database)\n\n    Returns an array of all table names in the database\n"
  },
  {
    "path": "docs/source/xlOil_Utils.rst",
    "content": "===========\nxlOil Utils\n===========\n\nThe Utils plugin contains general purpose tools to manipulate data,\nparticularly arrays.\n\n.. contents:: Contents\n\t:local:\n    \nxloBlock: creates an array from blocks\n----------------------------------------\n\n.. function:: xloBlock(layout, arg1, arg2, arg3,...)\n\n    Creates a block matrix given a layout specification.\n\n    Layout has the form `1, 2, 3; 4, 5, 6` where numbers refer to\n    argument numbers provided (note indexing is 1-based). Commas\n    divide argument numbers, semi-colons indicate a new row. xlOil \n    expands the blocks row by row.\n\n    Omiting the argument number, i.e. two consecutive commas gives an\n    auto-sized padded space. You can only have one per row.\n\n    Whitespace is ignored in the layout specification.\n\n    Arguments may be an array or a single value, which is interpreted as\n    a 1x1 array.\n\n    Any holes in the result are filled with #N/A - this is preferrable \n    over Excel's 'empty' value which is transformed to a zero when \n    written to the sheet.\n\n    **Examples**\n\n    ::\n\n        =xloBlock(\"1, 2; 3, 4\", A A, B B, C C, D D)\n                                A A  B B\n\n        --> A A B B\n            A A B B\n            C C D D\n\n\n        =xloBlock(\"1, 2; 3,, 4\", A A, B B, C, D)\n                                 A A  B B\n\n        --> A A B B\n            A A B B\n            C - - D\n\nxloFill: gives an array filled with a single value\n--------------------------------------------------\n\n.. function:: xloFill(value, numRows, numColumns)\n\n    Creates an array of size numRows by numColumns filled with value.\n\n    Throws if value is not a single value.\n\nxloFillNA: replaces Empy or #N/A with a specified value\n----------------------------------------------------------\n\n.. function:: xloFillNA(value, array, [trim])\n\n    Replaces any #N/A or Empty with a specified value. #N/As in Excel \n    result from holes, e.g. from xloBlock or array which does not fill\n    the space allocated in an array formula.  Empty values are particularly\n    problematic: they correpond to Excel reading an empty cell in an array\n    but are transformed to a zero when written to the sheet.\n\n    Throws if value is not a single value.\n\n    The optional trim parameter can be used to disable xlOil's default\n    array-trimming behaviour of resizing to the last non-empty, non-NA \n    row and column.\n\n\nxloSort: sorts an array by multiple columns\n----------------------------------------------------------\n\n.. function:: xloSort(Array, Order, [colOrHeading1], [colOrHeading2], ...)\n\n    Sorts data by one or more column keys. The function behaves similarly\n    to Excel's sort command, but works as a sheet function.\n\n    The `Order` parameter should be a string with a descriptor character\n    for each column to used as a sort key.  The character described how \n    the column data will be compared. Allowed characters and their meaning \n    are:\n\n        *a*: ascending\n\n        *A*: ascending case-sensitive,\n\n        *d*: descending\n\n        *D*: descending case-sensitive\n\n        *whitespace*: ignored\n\n    Each subsequent argument should be the (1-based) number of a column\n    or string.  If any strings are specified, the first row of `Array`\n    is interpreted as column headers and the strings are matched against\n    these headers.\n\n    The order of the column specifiers indicates the prescendence in the\n    sort order.\n\n    xloSort works in-place for speed but uses Excel's variant types. This \n    means it will not be \n\n    **Examples**\n\n    ::\n\n        =xloSort( { Baz    4 } , \"a d\", 2, 1)\n                  { Bar    4 }              \n                  { Boz    2 }             \n\n        -> 2    Boz\n           4    Baz\n           4    Bar    \n\n\n\nxloPad: pads an array to have at least two rols and columns\n-----------------------------------------------------------\n\n.. function:: xloPad(array)\n\n    xloPad works around the Excel 'feature' that duplicates arrays\n    with only one row or column when they are used in an array formula with \n    a larger target size.  This can be frustrating for display of variable \n    sized array results.  xloPad simply ensures the array has at least two\n    rows and columsn, adding #N/A where required to fill the space.\n\n\nxloConcat: concatenates strings\n--------------------------------\n\n.. function:: xloConcat([separator], valOrArray1, valOrArray2, ...)\n\n    Concatenates strings or other values with an optional separator.\n    Concatenation is in argument order. The separator may be blank or any\n    value which can be converted to a string.  Non string arguments are \n    converted to string before concatenation.  Arrays are concatenated\n    along rows using the sparator if specified.\n\n\nxloSplit: splits strings at a separator\n---------------------------------------\n\n.. function:: xloSplit(stringOrArray, separators, [consecutiveAsOne])\n\n    Splits a string at one or more separator characters, returning an array.\n    A separators can only be a single character, but multiple separators\n    can be specified. If `consecutiveAsOne` is omitted or TRUE, consecutive\n    separators are treated as one, otherwise they generate empty cells.\n\n    If a array of strings is passed, splitting will occur on each array\n    element and the array orientation wil be preserved. The array must be \n    1-dimensional\n\n    Any non string values are ignored - no coercision is performed.\n\n    The `separators` input can be a string containing any number of characters;\n    each will be treated as a distinct separator - multi-character separators\n    are not supported.\n\n    **Examples**\n\n    ::\n\n        =xloSplit(\"Foo:Bar,,Baz\", \":,\")\n\n        -> Foo      Bar     Baz\n\n\nxloIndex: gets values or sub-arrays for arrays and ranges\n---------------------------------------------------------\n\n.. function:: xloIndex(ArrayOrRef, [FromRow], [FromCol], [ToRow], [ToCol])\n\n    Extends the Excel INDEX function to support xloRefs and sub-arrays. With\n    the first three arguments, `xloIndex` behaves like INDEX but can be passed\n    an xloRef. This is an efficient way to fetch data from xloRef objects as it \n    avoids copying the entire object to Excel.\n\n    If *ToRow* and *ToCol* are provided they specify the right-hand end (not \n    inclusive) of a sub-array from (*FromRow*, *FromCol*) to (*ToRow*, *ToCol*).\n\n    **The row and column indices are 1-based**.  If any of the indices is zero or \n    negative it is interpreted as an offset from the number of rows or columns \n    in the parent array.\n\n    **Examples**\n\n    ::\n\n        =xloIndex(A1:D5,1,3) -> returns C1\n        =xloIndex(A1:D5,-1,-1) -> returns D5\n        =xloIndex(A1:D5,1,3,3,4) -> returns C1:D3\n        =xloIndex(A1:D5,-2,-2,0,0) -> returns C4:D5\n"
  },
  {
    "path": "docs/source/xloil.doxyfile",
    "content": "# Doxyfile 1.8.18\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the configuration\n# file that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# https://www.gnu.org/software/libiconv/ for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME           = xlOil\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER         = 1\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          =\n\n# With the PROJECT_LOGO tag one can specify a logo or an icon that is included\n# in the documentation. The maximum height of the logo should not exceed 55\n# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy\n# the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = $(XLO_SOLN_DIR)/build/docs/doxygen\n\n# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS         = NO\n\n# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII\n# characters to appear in the names of generated files. If set to NO, non-ASCII\n# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode\n# U+3044.\n# The default value is: NO.\n\nALLOW_UNICODE_NAMES    = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE        = English\n\n# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all generated output in the proper direction.\n# Possible values are: None, LTR, RTL and Context.\n# The default value is: None.\n\nOUTPUT_TEXT_DIRECTION  = None\n\n# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES        = YES\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line\n# such as\n# /***************\n# as being the beginning of a Javadoc-style comment \"banner\". If set to NO, the\n# Javadoc-style will behave just like regular comments and it will not be\n# interpreted by doxygen.\n# The default value is: NO.\n\nJAVADOC_BANNER         = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new\n# page for each member. If set to NO, the documentation of a member will be part\n# of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE               = 4\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines (in the resulting output). You can put ^^ in the value part of an\n# alias to insert a newline as if a physical newline was in the original file.\n# When you need a literal { or } or , in the value part of an alias you have to\n# escape them by means of a backslash (\\), this can lead to conflicts with the\n# commands \\{ and \\} for these it is advised to use the version @{ and @} or use\n# a double escape (\\\\{ and \\\\})\n\nALIASES                =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C  = NO\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice\n# sources only. Doxygen will then generate output that is more tailored for that\n# language. For instance, namespaces will be presented as modules, types will be\n# separated into more groups, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_SLICE  = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,\n# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,\n# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:\n# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser\n# tries to guess whether the code is fixed or free formatted code, this is the\n# default for Fortran type files). For instance to make doxygen treat .inc files\n# as Fortran files (default is PHP), and .f files as C (default is Fortran),\n# use: inc=Fortran f=C.\n#\n# Note: For files without extension you can use no_extension as a placeholder.\n#\n# Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n# the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n# according to the Markdown format, which allows for more readable\n# documentation. See https://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you can\n# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n# case of backward compatibilities issues.\n# The default value is: YES.\n\nMARKDOWN_SUPPORT       = YES\n\n# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up\n# to that level are automatically included in the table of contents, even if\n# they do not have an id attribute.\n# Note: This feature currently applies only to Markdown headings.\n# Minimum value: 0, maximum value: 99, default value: 5.\n# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.\n\nTOC_INCLUDE_HEADINGS   = 5\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n# The default value is: YES.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should set this\n# tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string);\n# versus func(std::string) {}). This also make the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n# The default value is: NO.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n# The default value is: NO.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen\n# will parse them like normal C++ but will assume all classes use public instead\n# of private inheritance when no explicit protection keyword is present.\n# The default value is: NO.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES will make\n# doxygen to replace the get and set methods by a property in the documentation.\n# This will only work if the methods are indeed getting or setting a simple\n# type. If this is not the case, or you want to show the methods anyway, you\n# should set this option to NO.\n# The default value is: YES.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n# The default value is: NO.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# If one adds a struct or class to a group and this option is enabled, then also\n# any nested class or struct is added to the same group. By default this option\n# is disabled and one has to add nested compounds explicitly via \\ingroup.\n# The default value is: NO.\n\nGROUP_NESTED_COMPOUNDS = NO\n\n# Set the SUBGROUPING tag to YES to allow class member groups of the same type\n# (for instance a group of public functions) to be put as a subgroup of that\n# type (e.g. under the Public Functions section). Set it to NO to prevent\n# subgrouping. Alternatively, this can be done per class using the\n# \\nosubgrouping command.\n# The default value is: YES.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n# are shown inside the group in which they are included (e.g. using \\ingroup)\n# instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n# and RTF).\n#\n# Note that this feature does not work in combination with\n# SEPARATE_MEMBER_PAGES.\n# The default value is: NO.\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n# with only public data fields or simple typedef fields will be shown inline in\n# the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO, structs, classes, and unions are shown on a separate page (for HTML and\n# Man pages) or section (for LaTeX and RTF).\n# The default value is: NO.\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n# enum is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically be\n# useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n# The default value is: NO.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can be\n# an expensive process and often the same symbol appears multiple times in the\n# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n# doxygen will become slower. If the cache is too large, memory is wasted. The\n# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n# symbols. At the end of a run doxygen will report the cache usage and suggest\n# the optimal cache size from a speed point of view.\n# Minimum value: 0, maximum value: 9, default value: 0.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in\n# documentation are documented, even if no documentation was available. Private\n# class members and static file members will be hidden unless the\n# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n# Note: This will also disable the warnings about undocumented members that are\n# normally produced when WARNINGS is set to YES.\n# The default value is: NO.\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will\n# be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual\n# methods of a class will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIV_VIRTUAL   = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal\n# scope will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be\n# included in the documentation.\n# The default value is: NO.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined\n# locally in source files will be included in the documentation. If set to NO,\n# only classes defined in header files are included. Does not have any effect\n# for Java sources.\n# The default value is: YES.\n\nEXTRACT_LOCAL_CLASSES  = NO\n\n# This flag is only useful for Objective-C code. If set to YES, local methods,\n# which are defined in the implementation section but not in the interface are\n# included in the documentation. If set to NO, only methods in the interface are\n# included.\n# The default value is: NO.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base name of\n# the file that contains the anonymous namespace. By default anonymous namespace\n# are hidden.\n# The default value is: NO.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n# undocumented members inside documented classes or files. If set to NO these\n# members will be included in the various overviews, but no documentation\n# section is generated. This option has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy. If set\n# to NO, these classes will be included in the various overviews. This option\n# has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_CLASSES     = YES\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n# declarations. If set to NO, these declarations will be included in the\n# documentation.\n# The default value is: NO.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n# documentation blocks found inside the body of a function. If set to NO, these\n# blocks will be appended to the function's detailed documentation block.\n# The default value is: NO.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation that is typed after a\n# \\internal command is included. If the tag is set to NO then the documentation\n# will be excluded. Set it to YES to include the internal documentation.\n# The default value is: NO.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n# names in lower-case letters. If set to YES, upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# (including Cygwin) ands Mac users are advised to set this option to NO.\n# The default value is: system dependent.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n# their full class and namespace scopes in the documentation. If set to YES, the\n# scope will be hidden.\n# The default value is: NO.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will\n# append additional text to a page's title, such as Class Reference. If set to\n# YES the compound reference will be hidden.\n# The default value is: NO.\n\nHIDE_COMPOUND_REFERENCE= NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n# the files that are included by a file in the documentation of that file.\n# The default value is: YES.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each\n# grouped member an include statement to the documentation, telling the reader\n# which file to include in order to use the member.\n# The default value is: NO.\n\nSHOW_GROUPED_MEMB_INC  = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n# files with double quotes in the documentation rather than with sharp brackets.\n# The default value is: NO.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n# documentation for inline members.\n# The default value is: YES.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n# (detailed) documentation of file and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order.\n# The default value is: YES.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n# descriptions of file, namespace and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order. Note that\n# this will also influence the order of the classes in the class list.\n# The default value is: NO.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n# (brief and detailed) documentation of class members so that constructors and\n# destructors are listed first. If set to NO the constructors will appear in the\n# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n# member documentation.\n# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n# detailed member documentation.\n# The default value is: NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n# of group names into alphabetical order. If set to NO the group names will\n# appear in their defined order.\n# The default value is: NO.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n# fully-qualified names, including namespaces. If set to NO, the class list will\n# be sorted only by class name, not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the alphabetical\n# list.\n# The default value is: NO.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n# type resolution of all parameters of a function it will reject a match between\n# the prototype and the implementation of a member function even if there is\n# only one candidate or it is obvious which candidate to choose by doing a\n# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n# accept a match between prototype and implementation in such cases.\n# The default value is: NO.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo\n# list. This list is created by putting \\todo commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test\n# list. This list is created by putting \\test commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug\n# list. This list is created by putting \\bug commands in the documentation.\n# The default value is: YES.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)\n# the deprecated list. This list is created by putting \\deprecated commands in\n# the documentation.\n# The default value is: YES.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional documentation\n# sections, marked by \\if <section_label> ... \\endif and \\cond <section_label>\n# ... \\endcond blocks.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n# initial value of a variable or macro / define can have for it to appear in the\n# documentation. If the initializer consists of more lines than specified here\n# it will be hidden. Use a value of 0 to hide initializers completely. The\n# appearance of the value of individual variables and macros / defines can be\n# controlled using \\showinitializer or \\hideinitializer command in the\n# documentation regardless of this setting.\n# Minimum value: 0, maximum value: 10000, default value: 30.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n# the bottom of the documentation of classes and structs. If set to YES, the\n# list will mention the files that were used to generate the documentation.\n# The default value is: YES.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n# will remove the Files entry from the Quick Index and from the Folder Tree View\n# (if specified).\n# The default value is: YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n# page. This will remove the Namespaces entry from the Quick Index and from the\n# Folder Tree View (if specified).\n# The default value is: YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command command input-file, where command is the value of the\n# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n# by doxygen. Whatever the program writes to standard output is used as the file\n# version. For an example see the documentation.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option. You can\n# optionally specify a file name after the option, if omitted DoxygenLayout.xml\n# will be used as the name of the layout file.\n#\n# Note that if you run doxygen from a directory containing a file called\n# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n# tag is left empty.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n# the reference definitions. This must be a list of .bib files. The .bib\n# extension is automatically appended if omitted. This requires the bibtex tool\n# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.\n# For LaTeX the style of the bibliography can be controlled using\n# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n# search path. See also \\cite for info how to create references.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# Configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated to\n# standard output by doxygen. If QUIET is set to YES this implies that the\n# messages are off.\n# The default value is: NO.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES\n# this implies that the warnings are on.\n#\n# Tip: Turn warnings on while writing the documentation.\n# The default value is: YES.\n\nWARNINGS               = YES\n\n# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate\n# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n# will automatically be disabled.\n# The default value is: YES.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some parameters\n# in a documented function, or documenting parameters that don't exist or using\n# markup commands wrongly.\n# The default value is: YES.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n# are documented, but have no documentation for their parameters or return\n# value. If set to NO, doxygen will only warn about wrong or incomplete\n# parameter documentation, but not about the absence of documentation. If\n# EXTRACT_ALL is set to YES then this flag will automatically be disabled.\n# The default value is: NO.\n\nWARN_NO_PARAMDOC       = NO\n\n# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when\n# a warning is encountered.\n# The default value is: NO.\n\nWARN_AS_ERROR          = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that doxygen\n# can produce. The string should contain the $file, $line, and $text tags, which\n# will be replaced by the file and line number from which the warning originated\n# and the warning text. Optionally the format may contain $version, which will\n# be replaced by the version of the file (if it could be obtained via\n# FILE_VERSION_FILTER)\n# The default value is: $file:$line: $text.\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning and error\n# messages should be written. If left blank the output is written to standard\n# error (stderr).\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag is used to specify the files and/or directories that contain\n# documented source files. You may enter file names like myfile.cpp or\n# directories like /usr/src/myproject. Separate the files or directories with\n# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING\n# Note: If this tag is empty the current directory is searched.\n\nINPUT                  = $(XLO_SOLN_DIR)/include/xloil\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n# libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n# documentation (see: https://www.gnu.org/software/libiconv/) for the list of\n# possible encodings.\n# The default value is: UTF-8.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n# *.h) to filter out the source-files in the directories.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# read by doxygen.\n#\n# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,\n# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,\n# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,\n# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),\n# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen\n# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,\n# *.vhdl, *.ucf, *.qsf and *.ice.\n\nFILE_PATTERNS          = *.c \\\n                         *.cc \\\n                         *.cxx \\\n                         *.cpp \\\n                         *.c++ \\\n                         *.java \\\n                         *.ii \\\n                         *.ixx \\\n                         *.ipp \\\n                         *.i++ \\\n                         *.inl \\\n                         *.idl \\\n                         *.ddl \\\n                         *.odl \\\n                         *.h \\\n                         *.hh \\\n                         *.hxx \\\n                         *.hpp \\\n                         *.h++ \\\n                         *.cs \\\n                         *.d \\\n                         *.php \\\n                         *.php4 \\\n                         *.php5 \\\n                         *.phtml \\\n                         *.inc \\\n                         *.m \\\n                         *.markdown \\\n                         *.md \\\n                         *.mm \\\n                         *.dox \\\n                         *.doc \\\n                         *.txt \\\n                         *.py \\\n                         *.pyw \\\n                         *.f90 \\\n                         *.f95 \\\n                         *.f03 \\\n                         *.f08 \\\n                         *.f18 \\\n                         *.f \\\n                         *.for \\\n                         *.vhd \\\n                         *.vhdl \\\n                         *.ucf \\\n                         *.qsf \\\n                         *.ice\n\n# The RECURSIVE tag can be used to specify whether or not subdirectories should\n# be searched for input files as well.\n# The default value is: NO.\n\nRECURSIVE              = NO\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n#\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                =\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n# The default value is: NO.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       =\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories use the pattern */test/*\n\nEXCLUDE_SYMBOLS        = msxll \\\n                         toml \\\n                         std \\\n                         detail \\\n                         spdlog\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or directories\n# that contain example code fragments that are included (see the \\include\n# command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank all\n# files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude commands\n# irrespective of the value of the RECURSIVE tag.\n# The default value is: NO.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or directories\n# that contain images that are to be included in the documentation (see the\n# \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command:\n#\n# <filter> <input-file>\n#\n# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the\n# name of an input file. Doxygen will then use the output that the filter\n# program writes to standard output. If FILTER_PATTERNS is specified, this tag\n# will be ignored.\n#\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# properly processed by doxygen.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis. Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match. The filters are a list of the form: pattern=filter\n# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n# filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n# patterns match the file name, INPUT_FILTER is applied.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# properly processed by doxygen.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will also be used to filter the input files that are used for\n# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n# The default value is: NO.\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n# it is also possible to disable source filtering for a specific pattern using\n# *.ext= (so without naming a filter).\n# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.\n\nFILTER_SOURCE_PATTERNS =\n\n# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want to reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE =\n\n#---------------------------------------------------------------------------\n# Configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n# generated. Documented entities will be cross-referenced with these sources.\n#\n# Note: To get rid of all source code in the generated output, make sure that\n# also VERBATIM_HEADERS is set to NO.\n# The default value is: NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body of functions,\n# classes and enums directly into the documentation.\n# The default value is: NO.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n# special comment blocks from generated source code fragments. Normal C, C++ and\n# Fortran comments will always remain visible.\n# The default value is: YES.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n# entity all documented functions referencing it will be listed.\n# The default value is: NO.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES then for each documented function\n# all documented entities called/used by that function will be listed.\n# The default value is: NO.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n# to YES then the hyperlinks from functions in REFERENCES_RELATION and\n# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n# link to the documentation.\n# The default value is: YES.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n# source code will show a tooltip with additional information such as prototype,\n# brief description and links to the definition and documentation. Since this\n# will make the HTML file larger and loading of large files a bit slower, you\n# can opt to disable this feature.\n# The default value is: YES.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nSOURCE_TOOLTIPS        = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code will\n# point to the HTML generated by the htags(1) tool instead of doxygen built-in\n# source browser. The htags tool is part of GNU's global source tagging system\n# (see https://www.gnu.org/software/global/global.html). You will need version\n# 4.8.6 or higher.\n#\n# To use it do the following:\n# - Install the latest version of global\n# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file\n# - Make sure the INPUT points to the root of the source tree\n# - Run doxygen as normal\n#\n# Doxygen will invoke htags (and that will in turn invoke gtags), so these\n# tools must be available from the command line (i.e. in the search path).\n#\n# The result: instead of the source browser generated by doxygen, the links to\n# source code will now point to the output of htags.\n# The default value is: NO.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n# verbatim copy of the header file for each class for which an include is\n# specified. Set to NO to disable this.\n# See also: Section \\class.\n# The default value is: YES.\n\nVERBATIM_HEADERS       = YES\n\n# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the\n# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the\n# cost of reduced performance. This can be particularly helpful with template\n# rich C++ code for which doxygen's built-in parser lacks the necessary type\n# information.\n# Note: The availability of this option depends on whether or not doxygen was\n# generated with the -Duse_libclang=ON option for CMake.\n# The default value is: NO.\n\nCLANG_ASSISTED_PARSING = NO\n\n# If clang assisted parsing is enabled you can provide the compiler with command\n# line options that you would normally use when invoking the compiler. Note that\n# the include paths will already be set by doxygen for the files and directories\n# specified with INPUT and INCLUDE_PATH.\n# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.\n\nCLANG_OPTIONS          =\n\n# If clang assisted parsing is enabled you can provide the clang parser with the\n# path to the compilation database (see:\n# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files\n# were built. This is equivalent to specifying the \"-p\" option to a clang tool,\n# such as clang-check. These options will then be passed to the parser.\n# Note: The availability of this option depends on whether or not doxygen was\n# generated with the -Duse_libclang=ON option for CMake.\n\nCLANG_DATABASE_PATH    =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n# compounds will be generated. Enable this if the project contains a lot of\n# classes, structs, unions or interfaces.\n# The default value is: YES.\n\nALPHABETICAL_INDEX     = YES\n\n# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n# which the alphabetical index list will be split.\n# Minimum value: 1, maximum value: 20, default value: 5.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all classes will\n# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n# can be used to specify a prefix (or a list of prefixes) that should be ignored\n# while generating the index headers.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output\n# The default value is: YES.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_OUTPUT            = html/doxygen\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n# generated HTML page (for example: .htm, .php, .asp).\n# The default value is: .html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n# each generated HTML page. If the tag is left blank doxygen will generate a\n# standard header.\n#\n# To get valid HTML the header file that includes any scripts and style sheets\n# that doxygen needs, which is dependent on the configuration options used (e.g.\n# the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n# default header using\n# doxygen -w html new_header.html new_footer.html new_stylesheet.css\n# YourConfigFile\n# and then modify the file new_header.html. See also section \"Doxygen usage\"\n# for information on how to generate the default header that doxygen normally\n# uses.\n# Note: The header is subject to change so you typically have to regenerate the\n# default header when upgrading to a newer version of doxygen. For a description\n# of the possible markers and block names see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n# generated HTML page. If the tag is left blank doxygen will generate a standard\n# footer. See HTML_HEADER for more information on how to generate a default\n# footer and what special commands can be used inside the footer. See also\n# section \"Doxygen usage\" for information on how to generate the default footer\n# that doxygen normally uses.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n# sheet that is used by each HTML page. It can be used to fine-tune the look of\n# the HTML output. If left blank doxygen will generate a default style sheet.\n# See also section \"Doxygen usage\" for information on how to generate the style\n# sheet that doxygen normally uses.\n# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n# it is more robust and this tag (HTML_STYLESHEET) will in the future become\n# obsolete.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# cascading style sheets that are included after the standard style sheets\n# created by doxygen. Using this option one can overrule certain style aspects.\n# This is preferred over using HTML_STYLESHEET since it does not replace the\n# standard style sheet and is therefore more robust against future updates.\n# Doxygen will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list). For an example see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_STYLESHEET  =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n# files will be copied as-is; there are no commands or markers available.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n# will adjust the colors in the style sheet and background images according to\n# this color. Hue is specified as an angle on a colorwheel, see\n# https://en.wikipedia.org/wiki/Hue for more information. For instance the value\n# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n# purple, and 360 is red again.\n# Minimum value: 0, maximum value: 359, default value: 220.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n# in the HTML output. For a value of 0 the output will use grayscales only. A\n# value of 255 will produce the most vivid colors.\n# Minimum value: 0, maximum value: 255, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n# luminance component of the colors in the HTML output. Values below 100\n# gradually make the output lighter, whereas values above 100 make the output\n# darker. The value divided by 100 is the actual gamma applied, so 80 represents\n# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n# change the gamma.\n# Minimum value: 40, maximum value: 240, default value: 80.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting this\n# to YES can help to show when doxygen was last run and thus if the\n# documentation is up to date.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_TIMESTAMP         = NO\n\n# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML\n# documentation will contain a main index with vertical navigation menus that\n# are dynamically created via JavaScript. If disabled, the navigation index will\n# consists of multiple levels of tabs that are statically embedded in every HTML\n# page. Disable this option to support browsers that do not have JavaScript,\n# like the Qt help browser.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_MENUS     = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n# shown in the various tree structured indices initially; the user can expand\n# and collapse entries dynamically later on. Doxygen will expand the tree to\n# such a level that at most the specified number of entries are visible (unless\n# a fully collapsed tree already exceeds this amount). So setting the number of\n# entries 1 will produce a full collapsed tree by default. 0 is a special value\n# representing an infinite number of entries and will result in a full expanded\n# tree by default.\n# Minimum value: 0, maximum value: 9999, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files will be\n# generated that can be used as input for Apple's Xcode 3 integrated development\n# environment (see: https://developer.apple.com/xcode/), introduced with OSX\n# 10.5 (Leopard). To create a documentation set, doxygen will generate a\n# Makefile in the HTML output directory. Running make will produce the docset in\n# that directory and running make install will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy\n# genXcode/_index.html for more information.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_DOCSET        = NO\n\n# This tag determines the name of the docset feed. A documentation feed provides\n# an umbrella under which multiple documentation sets from a single provider\n# (such as a company or product suite) can be grouped.\n# The default value is: Doxygen generated docs.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# This tag specifies a string that should uniquely identify the documentation\n# set bundle. This should be a reverse domain-name style string, e.g.\n# com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n# The default value is: org.doxygen.Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n# The default value is: Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n# additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n# Windows.\n#\n# The HTML Help Workshop contains a compiler that can convert all HTML output\n# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n# files are now used as the Windows 98 help format, and will replace the old\n# Windows help format (.hlp) on all Windows platforms in the future. Compressed\n# HTML files also contain an index, a table of contents, and you can search for\n# words in the documentation. The HTML workshop also contains a viewer for\n# compressed HTML files.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_HTMLHELP      = NO\n\n# The CHM_FILE tag can be used to specify the file name of the resulting .chm\n# file. You can add a path in front of the file if the result should not be\n# written to the html output directory.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_FILE               =\n\n# The HHC_LOCATION tag can be used to specify the location (absolute path\n# including file name) of the HTML help compiler (hhc.exe). If non-empty,\n# doxygen will try to run the HTML help compiler on the generated index.hhp.\n# The file has to be specified with full path.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nHHC_LOCATION           =\n\n# The GENERATE_CHI flag controls if a separate .chi index file is generated\n# (YES) or that it should be included in the master .chm file (NO).\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nGENERATE_CHI           = NO\n\n# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)\n# and project file content.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_INDEX_ENCODING     =\n\n# The BINARY_TOC flag controls whether a binary table of contents is generated\n# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it\n# enables the Previous and Next buttons.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members to\n# the table of contents of the HTML help documentation and to the tree view.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n# (.qch) of the generated HTML documentation.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n# the file name of the resulting .qch file. The path specified is relative to\n# the HTML output folder.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n# Project output. For more information please see Qt Help Project / Namespace\n# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n# Help Project output. For more information please see Qt Help Project / Virtual\n# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-\n# folders).\n# The default value is: doc.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n# filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's filter section matches. Qt Help Project / Filter Attributes (see:\n# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# The QHG_LOCATION tag can be used to specify the location of Qt's\n# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n# generated .qhp file.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n# generated, together with the HTML files, they form an Eclipse help plugin. To\n# install this plugin and make it available under the help contents menu in\n# Eclipse, the contents of the directory containing the HTML and XML files needs\n# to be copied into the plugins directory of eclipse. The name of the directory\n# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n# After copying Eclipse needs to be restarted before the help appears.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the Eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have this\n# name. Each documentation set should have its own identifier.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# If you want full control over the layout of the generated HTML pages it might\n# be necessary to disable the index and replace it with your own. The\n# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n# of each HTML page. A value of NO enables the index and the value YES disables\n# it. Since the tabs in the index contain the same information as the navigation\n# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information. If the tag\n# value is set to YES, a side panel will be generated containing a tree-like\n# index structure (just like the one that is generated for HTML Help). For this\n# to work a browser that supports JavaScript, DHTML, CSS and frames is required\n# (i.e. any modern browser). Windows users are probably better off using the\n# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can\n# further fine-tune the look of the index. As an example, the default style\n# sheet generated by doxygen has an example that shows how to put an image at\n# the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n# the same information as the tab index, you could consider setting\n# DISABLE_INDEX to YES when enabling this option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_TREEVIEW      = YES\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n# doxygen will group on one line in the generated HTML documentation.\n#\n# Note that a value of 0 will completely suppress the enum values from appearing\n# in the overview section.\n# Minimum value: 0, maximum value: 20, default value: 4.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n# to set the initial width (in pixels) of the frame in which the tree is shown.\n# Minimum value: 0, maximum value: 1500, default value: 250.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nTREEVIEW_WIDTH         = 250\n\n# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to\n# external symbols imported via tag files in a separate window.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg\n# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see\n# https://inkscape.org) to generate formulas as SVG images instead of PNGs for\n# the HTML output. These images will generally look nicer at scaled resolutions.\n# Possible values are: png The default and svg Looks nicer but requires the\n# pdf2svg tool.\n# The default value is: png.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FORMULA_FORMAT    = png\n\n# Use this tag to change the font size of LaTeX formulas included as images in\n# the HTML documentation. When you change the font size after a successful\n# doxygen run you need to manually remove any form_*.png images from the HTML\n# output directory to force them to be regenerated.\n# Minimum value: 8, maximum value: 50, default value: 10.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANSPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are not\n# supported properly for IE 6.0, but are supported on all modern browsers.\n#\n# Note that when changing this option you need to delete any form_*.png files in\n# the HTML output directory before the changes have effect.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_TRANSPARENT    = YES\n\n# The FORMULA_MACROFILE can contain LaTeX \\newcommand and \\renewcommand commands\n# to create new LaTeX commands to be used in formulas as building blocks. See\n# the section \"Including formulas\" for details.\n\nFORMULA_MACROFILE      =\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n# https://www.mathjax.org) which uses client side JavaScript for the rendering\n# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX\n# installed or if you want to formulas look prettier in the HTML output. When\n# enabled you may also need to install MathJax separately and configure the path\n# to it using the MATHJAX_RELPATH option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. See the MathJax site (see:\n# http://docs.mathjax.org/en/latest/output.html) for more details.\n# Possible values are: HTML-CSS (which is slower, but has the best\n# compatibility), NativeMML (i.e. MathML) and SVG.\n# The default value is: HTML-CSS.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the HTML\n# output directory using the MATHJAX_RELPATH option. The destination directory\n# should contain the MathJax.js script. For instance, if the mathjax directory\n# is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n# Content Delivery Network so you can quickly see the result without installing\n# MathJax. However, it is strongly recommended to install a local copy of\n# MathJax from https://www.mathjax.org before deployment.\n# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_RELPATH        = https://cdn.jsdelivr.net/npm/mathjax@2\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n# extension names that should be enabled during MathJax rendering. For example\n# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_EXTENSIONS     =\n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n# of code that will be used on startup of the MathJax code. See the MathJax site\n# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n# example see the documentation.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_CODEFILE       =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n# the HTML output. The underlying search engine uses javascript and DHTML and\n# should work on any modern browser. Note that when using HTML help\n# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n# there is already a search function so this one should typically be disabled.\n# For large projects the javascript based search engine can be slow, then\n# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n# search using the keyboard; to jump to the search box use <access key> + S\n# (what the <access key> is depends on the OS and browser, but it is typically\n# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down\n# key> to jump into the search results window, the results can be navigated\n# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel\n# the search. The filter options can be selected when the cursor is inside the\n# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>\n# to select a filter and <Enter> or <escape> to activate or cancel the filter\n# option.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using JavaScript. There\n# are two flavors of web server based searching depending on the EXTERNAL_SEARCH\n# setting. When disabled, doxygen will generate a PHP script for searching and\n# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing\n# and searching needs to be provided by external tools. See the section\n# \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain the\n# search results.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: https://xapian.org/).\n#\n# See the section \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will return the search results when EXTERNAL_SEARCH is enabled.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: https://xapian.org/). See the section \"External Indexing and\n# Searching\" for details.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHENGINE_URL       =\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n# The default file is: searchdata.xml.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH_ID     =\n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of\n# to a relative location where the documentation can be found. The format is:\n# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTRA_SEARCH_MAPPINGS  =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.\n# The default value is: YES.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked.\n#\n# Note that when not enabling USE_PDFLATEX the default is latex when enabling\n# USE_PDFLATEX the default is pdflatex and when in the later case latex is\n# chosen this is overwritten by pdflatex. For specific output languages the\n# default can have been set differently, this depends on the implementation of\n# the output language.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_CMD_NAME         =\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate\n# index for LaTeX.\n# Note: This tag is used in the Makefile / make.bat.\n# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file\n# (.tex).\n# The default file is: makeindex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to\n# generate index for LaTeX. In case there is no backslash (\\) as first character\n# it will be automatically added in the LaTeX code.\n# Note: This tag is used in the generated output file (.tex).\n# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.\n# The default value is: makeindex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_MAKEINDEX_CMD    = makeindex\n\n# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used by the\n# printer.\n# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x\n# 14 inches) and executive (7.25 x 10.5 inches).\n# The default value is: a4.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPAPER_TYPE             = a4\n\n# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names\n# that should be included in the LaTeX output. The package can be specified just\n# by its name or with the correct syntax as to be used with the LaTeX\n# \\usepackage command. To get the times font for instance you can specify :\n# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}\n# To use the option intlimits with the amsmath package you can specify:\n# EXTRA_PACKAGES=[intlimits]{amsmath}\n# If left blank no extra packages will be included.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the\n# generated LaTeX document. The header should contain everything until the first\n# chapter. If it is left blank doxygen will generate a standard header. See\n# section \"Doxygen usage\" for information on how to let doxygen write the\n# default header to a separate file.\n#\n# Note: Only use a user-defined header if you know what you are doing! The\n# following commands have a special meaning inside the header: $title,\n# $datetime, $date, $doxygenversion, $projectname, $projectnumber,\n# $projectbrief, $projectlogo. Doxygen will replace $title with the empty\n# string, for the replacement values of the other commands the user is referred\n# to HTML_HEADER.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the\n# generated LaTeX document. The footer should contain everything after the last\n# chapter. If it is left blank doxygen will generate a standard footer. See\n# LATEX_HEADER for more information on how to generate a default footer and what\n# special commands can be used inside the footer.\n#\n# Note: Only use a user-defined footer if you know what you are doing!\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_FOOTER           =\n\n# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# LaTeX style sheets that are included after the standard style sheets created\n# by doxygen. Using this option one can overrule certain style aspects. Doxygen\n# will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list).\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_STYLESHEET =\n\n# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the LATEX_OUTPUT output\n# directory. Note that the files will be copied as-is; there are no commands or\n# markers available.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_FILES      =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is\n# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will\n# contain links (just like the HTML output) instead of page references. This\n# makes the output suitable for online browsing using a PDF viewer.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate\n# the PDF file directly from the LaTeX files. Set this option to YES, to get a\n# higher quality PDF documentation.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode\n# command to the generated LaTeX files. This will instruct LaTeX to keep running\n# if errors occur, instead of asking the user for help. This option is also used\n# when generating formulas in HTML.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BATCHMODE        = NO\n\n# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the\n# index chapters (such as File Index, Compound Index, etc.) in the output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HIDE_INDICES     = NO\n\n# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source\n# code with syntax highlighting in the LaTeX output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. See\n# https://en.wikipedia.org/wiki/BibTeX and \\cite for more info.\n# The default value is: plain.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BIB_STYLE        = plain\n\n# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated\n# page will contain the date and time when the page was generated. Setting this\n# to NO can help when comparing the output of multiple runs.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_TIMESTAMP        = NO\n\n# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)\n# path from which the emoji images will be read. If a relative path is entered,\n# it will be relative to the LATEX_OUTPUT directory. If left blank the\n# LATEX_OUTPUT directory will be used.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EMOJI_DIRECTORY  =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The\n# RTF output is optimized for Word 97 and may not look too pretty with other RTF\n# readers/editors.\n# The default value is: NO.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: rtf.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will\n# contain hyperlink fields. The RTF file will contain links (just like the HTML\n# output) instead of page references. This makes the output suitable for online\n# browsing using Word or some other Word compatible readers that support those\n# fields.\n#\n# Note: WordPad (write) and others do not support links.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's\n# configuration file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n#\n# See also section \"Doxygen usage\" for information on how to generate the\n# default style sheet that doxygen normally uses.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an RTF document. Syntax is\n# similar to doxygen's configuration file. A template extensions file can be\n# generated using doxygen -e rtf extensionFile.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_EXTENSIONS_FILE    =\n\n# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code\n# with syntax highlighting in the RTF output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_SOURCE_CODE        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for\n# classes and files.\n# The default value is: NO.\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it. A directory man3 will be created inside the directory specified by\n# MAN_OUTPUT.\n# The default directory is: man.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to the generated\n# man pages. In case the manual section does not start with a number, the number\n# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is\n# optional.\n# The default value is: .3.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_EXTENSION          = .3\n\n# The MAN_SUBDIR tag determines the name of the directory created within\n# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by\n# MAN_EXTENSION with the initial . removed.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_SUBDIR             =\n\n# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it\n# will generate one additional man file for each entity documented in the real\n# man page(s). These additional files only source the real man page, but without\n# them the man command would be unable to find the correct page.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that\n# captures the structure of the code including all documentation.\n# The default value is: NO.\n\nGENERATE_XML           = YES\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: xml.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_OUTPUT             = xml/doxygen\n\n# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program\n# listings (including syntax highlighting and cross-referencing information) to\n# the XML output. Note that enabling this will significantly increase the size\n# of the XML output.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_PROGRAMLISTING     = YES\n\n# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include\n# namespace members in file scope as well, matching the HTML output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_NS_MEMB_FILE_SCOPE = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the DOCBOOK output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files\n# that can be used to generate PDF.\n# The default value is: NO.\n\nGENERATE_DOCBOOK       = NO\n\n# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n# front of it.\n# The default directory is: docbook.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_OUTPUT         = docbook\n\n# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the\n# program listings (including syntax highlighting and cross-referencing\n# information) to the DOCBOOK output. Note that enabling this will significantly\n# increase the size of the DOCBOOK output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_PROGRAMLISTING = NO\n\n#---------------------------------------------------------------------------\n# Configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an\n# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures\n# the structure of the code including all documentation. Note that this feature\n# is still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module\n# file that captures the structure of the code including all documentation.\n#\n# Note that this feature is still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary\n# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI\n# output from the Perl module output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely\n# formatted so it can be parsed by a human reader. This is useful if you want to\n# understand what is going on. On the other hand, if this tag is set to NO, the\n# size of the Perl module output will be much smaller and Perl will parse it\n# just the same.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file are\n# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful\n# so different doxyrules.make files included by the same Makefile don't\n# overwrite each other's variables.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all\n# C-preprocessor directives found in the sources and include files.\n# The default value is: YES.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names\n# in the source code. If set to NO, only conditional compilation will be\n# performed. Macro expansion can be done in a controlled way by setting\n# EXPAND_ONLY_PREDEF to YES.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then\n# the macro expansion is limited to the macros specified with the PREDEFINED and\n# EXPAND_AS_DEFINED tags.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES, the include files in the\n# INCLUDE_PATH will be searched if a #include is found.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by the\n# preprocessor.\n# This tag requires that the tag SEARCH_INCLUDES is set to YES.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will be\n# used.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that are\n# defined before the preprocessor is started (similar to the -D option of e.g.\n# gcc). The argument of the tag is a list of macros of the form: name or\n# name=definition (no spaces). If the definition and the \"=\" are omitted, \"=1\"\n# is assumed. To prevent a macro definition from being undefined via #undef or\n# recursively expanded use the := operator instead of the = operator.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nPREDEFINED             =\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this\n# tag can be used to specify a list of macro names that should be expanded. The\n# macro definition that is found in the sources will be used. Use the PREDEFINED\n# tag if you want to use a different macro definition that overrules the\n# definition found in the source code.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will\n# remove all references to function-like macros that are alone on a line, have\n# an all uppercase name, and do not end with a semicolon. Such function macros\n# are typically used for boiler-plate code, and will confuse the parser if not\n# removed.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES tag can be used to specify one or more tag files. For each tag\n# file the location of the external documentation should be added. The format of\n# a tag file without this location is as follows:\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where loc1 and loc2 can be relative or absolute paths or URLs. See the\n# section \"Linking to external documentation\" for more information about the use\n# of tag files.\n# Note: Each tag file must have a unique name (where the name does NOT include\n# the path). If a tag file is not located in the directory in which doxygen is\n# run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create a\n# tag file that is based on the input files it reads. See section \"Linking to\n# external documentation\" for more information about the usage of tag files.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES, all external class will be listed in\n# the class index. If set to NO, only the inherited external classes will be\n# listed.\n# The default value is: NO.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will be\n# listed.\n# The default value is: YES.\n\nEXTERNAL_GROUPS        = YES\n\n# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in\n# the related pages index. If set to NO, only the current project's pages will\n# be listed.\n# The default value is: YES.\n\nEXTERNAL_PAGES         = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram\n# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to\n# NO turns the diagrams off. Note that this option also works with HAVE_DOT\n# disabled, but it is recommended to install and use dot, since it yields more\n# powerful graphs.\n# The default value is: YES.\n\nCLASS_DIAGRAMS         = NO\n\n# You can include diagrams made with dia in doxygen documentation. Doxygen will\n# then run dia to produce the diagram and insert it in the documentation. The\n# DIA_PATH tag allows you to specify the directory where the dia binary resides.\n# If left empty dia is assumed to be found in the default search path.\n\nDIA_PATH               =\n\n# If set to YES the inheritance and collaboration graphs will hide inheritance\n# and usage relations if the target is undocumented or is not a class.\n# The default value is: YES.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz (see:\n# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent\n# Bell Labs. The other options in this section have no effect if this option is\n# set to NO\n# The default value is: NO.\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed\n# to run in parallel. When set to 0 doxygen will base this on the number of\n# processors available in the system. You can set it explicitly to a value\n# larger than 0 to get control over the balance between CPU load and processing\n# speed.\n# Minimum value: 0, maximum value: 32, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_NUM_THREADS        = 0\n\n# When you want a differently looking font in the dot files that doxygen\n# generates you can specify the font name using DOT_FONTNAME. You need to make\n# sure dot is able to find the font, which can be done by putting it in a\n# standard location or by setting the DOTFONTPATH environment variable or by\n# setting DOT_FONTPATH to the directory containing the font.\n# The default value is: Helvetica.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of\n# dot graphs.\n# Minimum value: 4, maximum value: 24, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the default font as specified with\n# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set\n# the path where dot can find it using this tag.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for\n# each documented class showing the direct and indirect inheritance relations.\n# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a\n# graph for each documented class showing the direct and indirect implementation\n# dependencies (inheritance, containment, and class references variables) of the\n# class with other documented classes.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for\n# groups, showing the direct groups dependencies.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside the\n# class node. If there are many fields or methods and many nodes the graph may\n# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the\n# number of items for each type to make the size more manageable. Set this to 0\n# for no limit. Note that the threshold may be exceeded by 50% before the limit\n# is enforced. So when you set the threshold to 10, up to 15 fields may appear,\n# but if the number exceeds 15, the total amount of fields shown is limited to\n# 10.\n# Minimum value: 0, maximum value: 100, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and\n# collaboration graphs will show the relations between templates and their\n# instances.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to\n# YES then doxygen will generate a graph for each documented file showing the\n# direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDE_GRAPH          = YES\n\n# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are\n# set to YES then doxygen will generate a graph for each documented file showing\n# the direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH tag is set to YES then doxygen will generate a call\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable call graphs for selected\n# functions only using the \\callgraph command. Disabling a call graph can be\n# accomplished by means of the command \\hidecallgraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable caller graphs for selected\n# functions only using the \\callergraph command. Disabling a caller graph can be\n# accomplished by means of the command \\hidecallergraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical\n# hierarchy of all classes instead of a textual one.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the\n# dependencies a directory has on other directories in a graphical way. The\n# dependency relations are determined by the #include relations between the\n# files in the directories.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. For an explanation of the image formats see the section\n# output formats in the documentation of the dot tool (Graphviz (see:\n# http://www.graphviz.org/)).\n# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order\n# to make the SVG files visible in IE 9+ (other browsers do not have this\n# requirement).\n# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,\n# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and\n# png:gdiplus:gdiplus.\n# The default value is: png.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n#\n# Note that this requires a modern browser other than Internet Explorer. Tested\n# and working are Firefox, Chrome, Safari, and Opera.\n# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make\n# the SVG files visible. Older versions of IE do not have SVG support.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINTERACTIVE_SVG        = NO\n\n# The DOT_PATH tag can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the \\dotfile\n# command).\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the \\mscfile\n# command).\n\nMSCFILE_DIRS           =\n\n# The DIAFILE_DIRS tag can be used to specify one or more directories that\n# contain dia files that are included in the documentation (see the \\diafile\n# command).\n\nDIAFILE_DIRS           =\n\n# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the\n# path where java can find the plantuml.jar file. If left blank, it is assumed\n# PlantUML is not used or called during a preprocessing step. Doxygen will\n# generate a warning when it encounters a \\startuml command in this case and\n# will not generate output for the diagram.\n\nPLANTUML_JAR_PATH      =\n\n# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a\n# configuration file for plantuml.\n\nPLANTUML_CFG_FILE      =\n\n# When using plantuml, the specified paths are searched for files specified by\n# the !include statement in a plantuml block.\n\nPLANTUML_INCLUDE_PATH  =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes\n# that will be shown in the graph. If the number of nodes in a graph becomes\n# larger than this value, doxygen will truncate the graph, which is visualized\n# by representing a node as a red box. Note that doxygen if the number of direct\n# children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that\n# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n# Minimum value: 0, maximum value: 10000, default value: 50.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs\n# generated by dot. A depth value of 3 means that only nodes reachable from the\n# root by following a path via at most 3 edges will be shown. Nodes that lay\n# further from the root node will be omitted. Note that setting this option to 1\n# or 2 may greatly reduce the computation time needed for large code bases. Also\n# note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n# Minimum value: 0, maximum value: 1000, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not seem\n# to support this out of the box.\n#\n# Warning: Depending on the platform used, enabling this option may lead to\n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to\n# read).\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10) support\n# this, this feature is disabled by default.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page\n# explaining the meaning of the various boxes and arrows in the dot generated\n# graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot\n# files that are used to generate the various graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "docs/xlOil-Sphinx.code-workspace",
    "content": "{\n\t\"folders\": [\n\t\t{\n\t\t\t\"path\": \".\"\n\t\t}\n\t]\n}"
  },
  {
    "path": "external/Excel2013SDK/INCLUDE/XLCALL.H",
    "content": "/*\n**  Microsoft Excel Developer's Toolkit\n**  Version 15.0\n**\n**  File:           INCLUDE\\XLCALL.H\n**  Description:    Header file for for Excel callbacks\n**  Platform:       Microsoft Windows\n**\n**  DEPENDENCY:\n**  Include <windows.h> before you include this.\n**\n**  This file defines the constants and\n**  data types which are used in the\n**  Microsoft Excel C API.\n**\n*/\n\n#pragma once\n\n/*\n** XL 12 Basic Datatypes \n**/\n\ntypedef INT32 BOOL;\t\t\t/* Boolean */\ntypedef WCHAR XCHAR;\t\t\t/* Wide Character */\ntypedef INT32 RW;\t\t\t/* XL 12 Row */\ntypedef INT32 COL;\t \t      \t/* XL 12 Column */\ntypedef DWORD_PTR IDSHEET;\t\t/* XL12 Sheet ID */\n\n/*\n** XLREF structure \n**\n** Describes a single rectangular reference.\n*/\n\ntypedef struct xlref \n{\n\tWORD rwFirst;\n\tWORD rwLast;\n\tBYTE colFirst;\n\tBYTE colLast;\n} XLREF, *LPXLREF;\n\n\n/*\n** XLMREF structure\n**\n** Describes multiple rectangular references.\n** This is a variable size structure, default \n** size is 1 reference.\n*/\n\ntypedef struct xlmref \n{\n\tWORD count;\n\tXLREF reftbl[1];\t\t\t\t\t/* actually reftbl[count] */\n} XLMREF, *LPXLMREF;\n\n\n/*\n** XLREF12 structure \n**\n** Describes a single XL 12 rectangular reference.\n*/\n\ntypedef struct xlref12\n{\n\tRW rwFirst;\n\tRW rwLast;\n\tCOL colFirst;\n\tCOL colLast;\n} XLREF12, *LPXLREF12;\n\n\n/*\n** XLMREF12 structure\n**\n** Describes multiple rectangular XL 12 references.\n** This is a variable size structure, default \n** size is 1 reference.\n*/\n\ntypedef struct xlmref12\n{\n\tWORD count;\n\tXLREF12 reftbl[1];\t\t\t\t\t/* actually reftbl[count] */\n} XLMREF12, *LPXLMREF12;\n\n\n/*\n** FP structure\n**\n** Describes FP structure.\n*/\n\ntypedef struct _FP\n{\n    unsigned short int rows;\n    unsigned short int columns;\n    double array[1];        /* Actually, array[rows][columns] */\n} FP;\n\n/*\n** FP12 structure\n**\n** Describes FP structure capable of handling the big grid.\n*/\n\ntypedef struct _FP12\n{\n    INT32 rows;\n    INT32 columns;\n    double array[1];        /* Actually, array[rows][columns] */\n} FP12;\n\n\n/*\n** XLOPER structure \n**\n** Excel's fundamental data type: can hold data\n** of any type. Use \"R\" as the argument type in the \n** REGISTER function.\n**/\n\ntypedef struct xloper \n{\n\tunion \n\t{\n\t\tdouble num;\t\t\t\t\t/* xltypeNum */\n\t\tLPSTR str;\t\t\t\t\t/* xltypeStr */\n#ifdef __cplusplus\n\t\tWORD xbool;\t\t\t\t\t/* xltypeBool */\n#else\t\n\t\tWORD bool;\t\t\t\t\t/* xltypeBool */\n#endif\t\n\t\tWORD err;\t\t\t\t\t/* xltypeErr */\n\t\tshort int w;\t\t\t\t\t/* xltypeInt */\n\t\tstruct \n\t\t{\n\t\t\tWORD count;\t\t\t\t/* always = 1 */\n\t\t\tXLREF ref;\n\t\t} sref;\t\t\t\t\t\t/* xltypeSRef */\n\t\tstruct \n\t\t{\n\t\t\tXLMREF *lpmref;\n\t\t\tIDSHEET idSheet;\n\t\t} mref;\t\t\t\t\t\t/* xltypeRef */\n\t\tstruct \n\t\t{\n\t\t\tstruct xloper *lparray;\n\t\t\tWORD rows;\n\t\t\tWORD columns;\n\t\t} array;\t\t\t\t\t/* xltypeMulti */\n\t\tstruct \n\t\t{\n\t\t\tunion\n\t\t\t{\n\t\t\t\tshort int level;\t\t/* xlflowRestart */\n\t\t\t\tshort int tbctrl;\t\t/* xlflowPause */\n\t\t\t\tIDSHEET idSheet;\t\t/* xlflowGoto */\n\t\t\t} valflow;\n\t\t\tWORD rw;\t\t\t\t/* xlflowGoto */\n\t\t\tBYTE col;\t\t\t\t/* xlflowGoto */\n\t\t\tBYTE xlflow;\n\t\t} flow;\t\t\t\t\t\t/* xltypeFlow */\n\t\tstruct\n\t\t{\n\t\t\tunion\n\t\t\t{\n\t\t\t\tBYTE *lpbData;\t\t\t/* data passed to XL */\n\t\t\t\tHANDLE hdata;\t\t\t/* data returned from XL */\n\t\t\t} h;\n\t\t\tlong cbData;\n\t\t} bigdata;\t\t\t\t\t/* xltypeBigData */\n\t} val;\n\tWORD xltype;\n} XLOPER, *LPXLOPER;\n\n/*\n** XLOPER12 structure \n**\n** Excel 12's fundamental data type: can hold data\n** of any type. Use \"U\" as the argument type in the \n** REGISTER function.\n**/\n\ntypedef struct xloper12 \n{\n\tunion \n\t{\n\t\tdouble num;\t\t\t\t       \t/* xltypeNum */\n\t\tXCHAR *str;\t\t\t\t       \t/* xltypeStr */\n\t\tBOOL xbool;\t\t\t\t       \t/* xltypeBool */\n\t\tint err;\t\t\t\t       \t/* xltypeErr */\n\t\tint w;\n\t\tstruct \n\t\t{\n\t\t\tWORD count;\t\t\t       \t/* always = 1 */\n\t\t\tXLREF12 ref;\n\t\t} sref;\t\t\t\t\t\t/* xltypeSRef */\n\t\tstruct \n\t\t{\n\t\t\tXLMREF12 *lpmref;\n\t\t\tIDSHEET idSheet;\n\t\t} mref;\t\t\t\t\t\t/* xltypeRef */\n\t\tstruct \n\t\t{\n\t\t\tstruct xloper12 *lparray;\n\t\t\tRW rows;\n\t\t\tCOL columns;\n\t\t} array;\t\t\t\t\t/* xltypeMulti */\n\t\tstruct \n\t\t{\n\t\t\tunion\n\t\t\t{\n\t\t\t\tint level;\t\t\t/* xlflowRestart */\n\t\t\t\tint tbctrl;\t\t\t/* xlflowPause */\n\t\t\t\tIDSHEET idSheet;\t\t/* xlflowGoto */\n\t\t\t} valflow;\n\t\t\tRW rw;\t\t\t\t       \t/* xlflowGoto */\n\t\t\tCOL col;\t\t\t       \t/* xlflowGoto */\n\t\t\tBYTE xlflow;\n\t\t} flow;\t\t\t\t\t\t/* xltypeFlow */\n\t\tstruct\n\t\t{\n\t\t\tunion\n\t\t\t{\n\t\t\t\tBYTE *lpbData;\t\t\t/* data passed to XL */\n\t\t\t\tHANDLE hdata;\t\t\t/* data returned from XL */\n\t\t\t} h;\n\t\t\tlong cbData;\n\t\t} bigdata;\t\t\t\t\t/* xltypeBigData */\n\t} val;\n\tDWORD xltype;\n} XLOPER12, *LPXLOPER12;\n\n/*\n** XLOPER and XLOPER12 data types\n**\n** Used for xltype field of XLOPER and XLOPER12 structures\n*/\n\n#define xltypeNum        0x0001\n#define xltypeStr        0x0002\n#define xltypeBool       0x0004\n#define xltypeRef        0x0008\n#define xltypeErr        0x0010\n#define xltypeFlow       0x0020\n#define xltypeMulti      0x0040\n#define xltypeMissing    0x0080\n#define xltypeNil        0x0100\n#define xltypeSRef       0x0400\n#define xltypeInt        0x0800\n\n#define xlbitXLFree      0x1000\n#define xlbitDLLFree     0x4000\n\n#define xltypeBigData\t(xltypeStr | xltypeInt)\n\n\n/*\n** Error codes\n**\n** Used for val.err field of XLOPER and XLOPER12 structures\n** when constructing error XLOPERs and XLOPER12s\n*/\n\n#define xlerrNull    0\n#define xlerrDiv0    7\n#define xlerrValue   15\n#define xlerrRef     23\n#define xlerrName    29\n#define xlerrNum     36\n#define xlerrNA      42\n#define xlerrGettingData 43\n\n\n/* \n** Flow data types\n**\n** Used for val.flow.xlflow field of XLOPER and XLOPER12 structures\n** when constructing flow-control XLOPERs and XLOPER12s\n**/\n\n#define xlflowHalt       1\n#define xlflowGoto       2\n#define xlflowRestart    8\n#define xlflowPause      16\n#define xlflowResume     64\n\n\n/*\n** Return codes\n**\n** These values can be returned from Excel4(), Excel4v(), Excel12() or Excel12v().\n*/\n\n#define xlretSuccess        0    /* success */ \n#define xlretAbort          1    /* macro halted */\n#define xlretInvXlfn        2    /* invalid function number */ \n#define xlretInvCount       4    /* invalid number of arguments */ \n#define xlretInvXloper      8    /* invalid OPER structure */  \n#define xlretStackOvfl      16   /* stack overflow */  \n#define xlretFailed         32   /* command failed */  \n#define xlretUncalced       64   /* uncalced cell */\n#define xlretNotThreadSafe  128  /* not allowed during multi-threaded calc */\n#define xlretInvAsynchronousContext  256  /* invalid asynchronous function handle */\n#define xlretNotClusterSafe  512  /* not supported on cluster */\n\n\n/*\n** XLL events\n**\n** Passed in to an xlEventRegister call to register a corresponding event.\n*/\n\n#define xleventCalculationEnded      1    /* Fires at the end of calculation */ \n#define xleventCalculationCanceled   2    /* Fires when calculation is interrupted */\n\n\n/*\n** Function prototypes\n*/\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint _cdecl Excel4(int xlfn, LPXLOPER operRes, int count,... ); \n/* followed by count LPXLOPERs */\n\nint pascal Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER opers[]);\n\nint pascal XLCallVer(void);\n\nlong pascal LPenHelper(int wCode, VOID *lpv);\n\nint _cdecl Excel12(int xlfn, LPXLOPER12 operRes, int count,... );\n/* followed by count LPXLOPER12s */\n\nint pascal Excel12v(int xlfn, LPXLOPER12 operRes, int count, LPXLOPER12 opers[]);\n\n#ifdef __cplusplus\n}\n#endif\n\n\n/*\n** Cluster Connector Async Callback\n*/\n\ntypedef int (CALLBACK *PXL_HPC_ASYNC_CALLBACK)(LPXLOPER12 operAsyncHandle, LPXLOPER12 operReturn);\n\n\n/*\n** Cluster connector entry point return codes\n*/\n\n#define xlHpcRetSuccess            0\n#define xlHpcRetSessionIdInvalid  -1\n#define xlHpcRetCallFailed        -2\n\n\n/*\n** Function number bits\n*/ \n\n#define xlCommand    0x8000\n#define xlSpecial    0x4000\n#define xlIntl       0x2000\n#define xlPrompt     0x1000\n\n\n/*\n** Auxiliary function numbers\n**\n** These functions are available only from the C API,\n** not from the Excel macro language.\n*/\n\n#define xlFree          (0  | xlSpecial)\n#define xlStack         (1  | xlSpecial)\n#define xlCoerce        (2  | xlSpecial)\n#define xlSet           (3  | xlSpecial)\n#define xlSheetId       (4  | xlSpecial)\n#define xlSheetNm       (5  | xlSpecial)\n#define xlAbort         (6  | xlSpecial)\n#define xlGetInst       (7  | xlSpecial) /* Returns application's hinstance as an integer value, supported on 32-bit platform only */\n#define xlGetHwnd       (8  | xlSpecial)\n#define xlGetName       (9  | xlSpecial)\n#define xlEnableXLMsgs  (10 | xlSpecial)\n#define xlDisableXLMsgs (11 | xlSpecial)\n#define xlDefineBinaryName (12 | xlSpecial)\n#define xlGetBinaryName\t(13 | xlSpecial)\n/* GetFooInfo are valid only for calls to LPenHelper */\n#define xlGetFmlaInfo\t(14 | xlSpecial)\n#define xlGetMouseInfo\t(15 | xlSpecial)\n#define xlAsyncReturn\t(16 | xlSpecial)\t/*Set return value from an asynchronous function call*/\n#define xlEventRegister\t(17 | xlSpecial)\t/*Register an XLL event*/\n#define xlRunningOnCluster\t(18 | xlSpecial)\t/*Returns true if running on Compute Cluster*/\n#define xlGetInstPtr\t(19 | xlSpecial)\t/* Returns application's hinstance as a handle, supported on both 32-bit and 64-bit platforms */\n\n/* edit modes */\n#define xlModeReady\t0\t// not in edit mode\n#define xlModeEnter\t1\t// enter mode\n#define xlModeEdit\t2\t// edit mode\n#define xlModePoint\t4\t// point mode\n\n/* document(page) types */\n#define dtNil 0x7f\t// window is not a sheet, macro, chart or basic\n// OR window is not the selected window at idle state\n#define dtSheet 0\t// sheet\n#define dtProc  1\t// XLM macro\n#define dtChart 2\t// Chart\n#define dtBasic 6\t// VBA \n\n/* hit test codes */\n#define htNone\t\t0x00\t// none of below\n#define htClient\t0x01\t// internal for \"in the client are\", should never see\n#define htVSplit\t0x02\t// vertical split area with split panes\n#define htHSplit\t0x03\t// horizontal split area\n#define htColWidth\t0x04\t// column width adjuster area\n#define htRwHeight\t0x05\t// row height adjuster area\n#define htRwColHdr\t0x06\t// the intersection of row and column headers\n#define htObject\t0x07\t// the body of an object\n// the following are for size handles of draw objects\n#define htTopLeft\t0x08\n#define htBotLeft\t0x09\n#define htLeft\t\t0x0A\n#define htTopRight\t0x0B\n#define htBotRight\t0x0C\n#define htRight\t\t0x0D\n#define htTop\t\t0x0E\n#define htBot\t\t0x0F\n// end size handles\n#define htRwGut\t\t0x10\t// row area of outline gutter\n#define htColGut\t0x11\t// column area of outline gutter\n#define htTextBox\t0x12\t// body of a text box (where we shouw I-Beam cursor)\n#define htRwLevels\t0x13\t// row levels buttons of outline gutter\n#define htColLevels\t0x14\t// column levels buttons of outline gutter\n#define htDman\t\t0x15\t// the drag/drop handle of the selection\n#define htDmanFill\t0x16\t// the auto-fill handle of the selection\n#define htXSplit\t0x17\t// the intersection of the horz & vert pane splits\n#define htVertex\t0x18\t// a vertex of a polygon draw object\n#define htAddVtx\t0x19\t// htVertex in add a vertex mode\n#define htDelVtx\t0x1A\t// htVertex in delete a vertex mode\n#define htRwHdr\t\t0x1B\t// row header\n#define htColHdr\t0x1C\t// column header\n#define htRwShow\t0x1D\t// Like htRowHeight except means grow a hidden column\n#define htColShow\t0x1E\t// column version of htRwShow\n#define htSizing\t0x1F\t// Internal use only\n#define htSxpivot\t0x20\t// a drag/drop tile in a pivot table\n#define htTabs\t\t0x21\t// the sheet paging tabs\n#define htEdit\t\t0x22\t// Internal use only\n\ntypedef struct _fmlainfo\n{\n\tint wPointMode;\t// current edit mode.  0 => rest of struct undefined\n\tint cch;\t// count of characters in formula\n\tchar *lpch;\t// pointer to formula characters.  READ ONLY!!!\n\tint ichFirst;\t// char offset to start of selection\n\tint ichLast;\t// char offset to end of selection (may be > cch)\n\tint ichCaret;\t// char offset to blinking caret\n} FMLAINFO;\n\ntypedef struct _mouseinfo\n{\n\t/* input section */\n\tHWND hwnd;\t\t// window to get info on\n\tPOINT pt;\t\t// mouse position to get info on\n\n\t/* output section */\n\tint dt;\t\t\t// document(page) type\n\tint ht;\t\t\t// hit test code\n\tint rw;\t\t\t// row @ mouse (-1 if #n/a)\n\tint col;\t\t// col @ mouse (-1 if #n/a)\n} MOUSEINFO;\n\n\n\n/* \n** User defined function\n**\n** First argument should be a function reference.\n*/\n\n#define xlUDF      255\n\n\n/*\n** Built-in Excel functions and command equivalents\n*/\n\n\n// Excel function numbers\n\n#define xlfCount 0\n#define xlfIsna 2\n#define xlfIserror 3\n#define xlfSum 4\n#define xlfAverage 5\n#define xlfMin 6\n#define xlfMax 7\n#define xlfRow 8\n#define xlfColumn 9\n#define xlfNa 10\n#define xlfNpv 11\n#define xlfStdev 12\n#define xlfDollar 13\n#define xlfFixed 14\n#define xlfSin 15\n#define xlfCos 16\n#define xlfTan 17\n#define xlfAtan 18\n#define xlfPi 19\n#define xlfSqrt 20\n#define xlfExp 21\n#define xlfLn 22\n#define xlfLog10 23\n#define xlfAbs 24\n#define xlfInt 25\n#define xlfSign 26\n#define xlfRound 27\n#define xlfLookup 28\n#define xlfIndex 29\n#define xlfRept 30\n#define xlfMid 31\n#define xlfLen 32\n#define xlfValue 33\n#define xlfTrue 34\n#define xlfFalse 35\n#define xlfAnd 36\n#define xlfOr 37\n#define xlfNot 38\n#define xlfMod 39\n#define xlfDcount 40\n#define xlfDsum 41\n#define xlfDaverage 42\n#define xlfDmin 43\n#define xlfDmax 44\n#define xlfDstdev 45\n#define xlfVar 46\n#define xlfDvar 47\n#define xlfText 48\n#define xlfLinest 49\n#define xlfTrend 50\n#define xlfLogest 51\n#define xlfGrowth 52\n#define xlfGoto 53\n#define xlfHalt 54\n#define xlfPv 56\n#define xlfFv 57\n#define xlfNper 58\n#define xlfPmt 59\n#define xlfRate 60\n#define xlfMirr 61\n#define xlfIrr 62\n#define xlfRand 63\n#define xlfMatch 64\n#define xlfDate 65\n#define xlfTime 66\n#define xlfDay 67\n#define xlfMonth 68\n#define xlfYear 69\n#define xlfWeekday 70\n#define xlfHour 71\n#define xlfMinute 72\n#define xlfSecond 73\n#define xlfNow 74\n#define xlfAreas 75\n#define xlfRows 76\n#define xlfColumns 77\n#define xlfOffset 78\n#define xlfAbsref 79\n#define xlfRelref 80\n#define xlfArgument 81\n#define xlfSearch 82\n#define xlfTranspose 83\n#define xlfError 84\n#define xlfStep 85\n#define xlfType 86\n#define xlfEcho 87\n#define xlfSetName 88\n#define xlfCaller 89\n#define xlfDeref 90\n#define xlfWindows 91\n#define xlfSeries 92\n#define xlfDocuments 93\n#define xlfActiveCell 94\n#define xlfSelection 95\n#define xlfResult 96\n#define xlfAtan2 97\n#define xlfAsin 98\n#define xlfAcos 99\n#define xlfChoose 100\n#define xlfHlookup 101\n#define xlfVlookup 102\n#define xlfLinks 103\n#define xlfInput 104\n#define xlfIsref 105\n#define xlfGetFormula 106\n#define xlfGetName 107\n#define xlfSetValue 108\n#define xlfLog 109\n#define xlfExec 110\n#define xlfChar 111\n#define xlfLower 112\n#define xlfUpper 113\n#define xlfProper 114\n#define xlfLeft 115\n#define xlfRight 116\n#define xlfExact 117\n#define xlfTrim 118\n#define xlfReplace 119\n#define xlfSubstitute 120\n#define xlfCode 121\n#define xlfNames 122\n#define xlfDirectory 123\n#define xlfFind 124\n#define xlfCell 125\n#define xlfIserr 126\n#define xlfIstext 127\n#define xlfIsnumber 128\n#define xlfIsblank 129\n#define xlfT 130\n#define xlfN 131\n#define xlfFopen 132\n#define xlfFclose 133\n#define xlfFsize 134\n#define xlfFreadln 135\n#define xlfFread 136\n#define xlfFwriteln 137\n#define xlfFwrite 138\n#define xlfFpos 139\n#define xlfDatevalue 140\n#define xlfTimevalue 141\n#define xlfSln 142\n#define xlfSyd 143\n#define xlfDdb 144\n#define xlfGetDef 145\n#define xlfReftext 146\n#define xlfTextref 147\n#define xlfIndirect 148\n#define xlfRegister 149\n#define xlfCall 150\n#define xlfAddBar 151\n#define xlfAddMenu 152\n#define xlfAddCommand 153\n#define xlfEnableCommand 154\n#define xlfCheckCommand 155\n#define xlfRenameCommand 156\n#define xlfShowBar 157\n#define xlfDeleteMenu 158\n#define xlfDeleteCommand 159\n#define xlfGetChartItem 160\n#define xlfDialogBox 161\n#define xlfClean 162\n#define xlfMdeterm 163\n#define xlfMinverse 164\n#define xlfMmult 165\n#define xlfFiles 166\n#define xlfIpmt 167\n#define xlfPpmt 168\n#define xlfCounta 169\n#define xlfCancelKey 170\n#define xlfInitiate 175\n#define xlfRequest 176\n#define xlfPoke 177\n#define xlfExecute 178\n#define xlfTerminate 179\n#define xlfRestart 180\n#define xlfHelp 181\n#define xlfGetBar 182\n#define xlfProduct 183\n#define xlfFact 184\n#define xlfGetCell 185\n#define xlfGetWorkspace 186\n#define xlfGetWindow 187\n#define xlfGetDocument 188\n#define xlfDproduct 189\n#define xlfIsnontext 190\n#define xlfGetNote 191\n#define xlfNote 192\n#define xlfStdevp 193\n#define xlfVarp 194\n#define xlfDstdevp 195\n#define xlfDvarp 196\n#define xlfTrunc 197\n#define xlfIslogical 198\n#define xlfDcounta 199\n#define xlfDeleteBar 200\n#define xlfUnregister 201\n#define xlfUsdollar 204\n#define xlfFindb 205\n#define xlfSearchb 206\n#define xlfReplaceb 207\n#define xlfLeftb 208\n#define xlfRightb 209\n#define xlfMidb 210\n#define xlfLenb 211\n#define xlfRoundup 212\n#define xlfRounddown 213\n#define xlfAsc 214\n#define xlfDbcs 215\n#define xlfRank 216\n#define xlfAddress 219\n#define xlfDays360 220\n#define xlfToday 221\n#define xlfVdb 222\n#define xlfMedian 227\n#define xlfSumproduct 228\n#define xlfSinh 229\n#define xlfCosh 230\n#define xlfTanh 231\n#define xlfAsinh 232\n#define xlfAcosh 233\n#define xlfAtanh 234\n#define xlfDget 235\n#define xlfCreateObject 236\n#define xlfVolatile 237\n#define xlfLastError 238\n#define xlfCustomUndo 239\n#define xlfCustomRepeat 240\n#define xlfFormulaConvert 241\n#define xlfGetLinkInfo 242\n#define xlfTextBox 243\n#define xlfInfo 244\n#define xlfGroup 245\n#define xlfGetObject 246\n#define xlfDb 247\n#define xlfPause 248\n#define xlfResume 251\n#define xlfFrequency 252\n#define xlfAddToolbar 253\n#define xlfDeleteToolbar 254\n#define xlfResetToolbar 256\n#define xlfEvaluate 257\n#define xlfGetToolbar 258\n#define xlfGetTool 259\n#define xlfSpellingCheck 260\n#define xlfErrorType 261\n#define xlfAppTitle 262\n#define xlfWindowTitle 263\n#define xlfSaveToolbar 264\n#define xlfEnableTool 265\n#define xlfPressTool 266\n#define xlfRegisterId 267\n#define xlfGetWorkbook 268\n#define xlfAvedev 269\n#define xlfBetadist 270\n#define xlfGammaln 271\n#define xlfBetainv 272\n#define xlfBinomdist 273\n#define xlfChidist 274\n#define xlfChiinv 275\n#define xlfCombin 276\n#define xlfConfidence 277\n#define xlfCritbinom 278\n#define xlfEven 279\n#define xlfExpondist 280\n#define xlfFdist 281\n#define xlfFinv 282\n#define xlfFisher 283\n#define xlfFisherinv 284\n#define xlfFloor 285\n#define xlfGammadist 286\n#define xlfGammainv 287\n#define xlfCeiling 288\n#define xlfHypgeomdist 289\n#define xlfLognormdist 290\n#define xlfLoginv 291\n#define xlfNegbinomdist 292\n#define xlfNormdist 293\n#define xlfNormsdist 294\n#define xlfNorminv 295\n#define xlfNormsinv 296\n#define xlfStandardize 297\n#define xlfOdd 298\n#define xlfPermut 299\n#define xlfPoisson 300\n#define xlfTdist 301\n#define xlfWeibull 302\n#define xlfSumxmy2 303\n#define xlfSumx2my2 304\n#define xlfSumx2py2 305\n#define xlfChitest 306\n#define xlfCorrel 307\n#define xlfCovar 308\n#define xlfForecast 309\n#define xlfFtest 310\n#define xlfIntercept 311\n#define xlfPearson 312\n#define xlfRsq 313\n#define xlfSteyx 314\n#define xlfSlope 315\n#define xlfTtest 316\n#define xlfProb 317\n#define xlfDevsq 318\n#define xlfGeomean 319\n#define xlfHarmean 320\n#define xlfSumsq 321\n#define xlfKurt 322\n#define xlfSkew 323\n#define xlfZtest 324\n#define xlfLarge 325\n#define xlfSmall 326\n#define xlfQuartile 327\n#define xlfPercentile 328\n#define xlfPercentrank 329\n#define xlfMode 330\n#define xlfTrimmean 331\n#define xlfTinv 332\n#define xlfMovieCommand 334\n#define xlfGetMovie 335\n#define xlfConcatenate 336\n#define xlfPower 337\n#define xlfPivotAddData 338\n#define xlfGetPivotTable 339\n#define xlfGetPivotField 340\n#define xlfGetPivotItem 341\n#define xlfRadians 342\n#define xlfDegrees 343\n#define xlfSubtotal 344\n#define xlfSumif 345\n#define xlfCountif 346\n#define xlfCountblank 347\n#define xlfScenarioGet 348\n#define xlfOptionsListsGet 349\n#define xlfIspmt 350\n#define xlfDatedif 351\n#define xlfDatestring 352\n#define xlfNumberstring 353\n#define xlfRoman 354\n#define xlfOpenDialog 355\n#define xlfSaveDialog 356\n#define xlfViewGet 357\n#define xlfGetpivotdata 358\n#define xlfHyperlink 359\n#define xlfPhonetic 360\n#define xlfAveragea 361\n#define xlfMaxa 362\n#define xlfMina 363\n#define xlfStdevpa 364\n#define xlfVarpa 365\n#define xlfStdeva 366\n#define xlfVara 367\n#define xlfBahttext 368\n#define xlfThaidayofweek 369\n#define xlfThaidigit 370\n#define xlfThaimonthofyear 371\n#define xlfThainumsound 372\n#define xlfThainumstring 373\n#define xlfThaistringlength 374\n#define xlfIsthaidigit 375\n#define xlfRoundbahtdown 376\n#define xlfRoundbahtup 377\n#define xlfThaiyear 378\n#define xlfRtd 379\n#define xlfCubevalue 380\n#define xlfCubemember 381\n#define xlfCubememberproperty 382\n#define xlfCuberankedmember 383\n#define xlfHex2bin 384\n#define xlfHex2dec 385\n#define xlfHex2oct 386\n#define xlfDec2bin 387\n#define xlfDec2hex 388\n#define xlfDec2oct 389\n#define xlfOct2bin 390\n#define xlfOct2hex 391\n#define xlfOct2dec 392\n#define xlfBin2dec 393\n#define xlfBin2oct 394\n#define xlfBin2hex 395\n#define xlfImsub 396\n#define xlfImdiv 397\n#define xlfImpower 398\n#define xlfImabs 399\n#define xlfImsqrt 400\n#define xlfImln 401\n#define xlfImlog2 402\n#define xlfImlog10 403\n#define xlfImsin 404\n#define xlfImcos 405\n#define xlfImexp 406\n#define xlfImargument 407\n#define xlfImconjugate 408\n#define xlfImaginary 409\n#define xlfImreal 410\n#define xlfComplex 411\n#define xlfImsum 412\n#define xlfImproduct 413\n#define xlfSeriessum 414\n#define xlfFactdouble 415\n#define xlfSqrtpi 416\n#define xlfQuotient 417\n#define xlfDelta 418\n#define xlfGestep 419\n#define xlfIseven 420\n#define xlfIsodd 421\n#define xlfMround 422\n#define xlfErf 423\n#define xlfErfc 424\n#define xlfBesselj 425\n#define xlfBesselk 426\n#define xlfBessely 427\n#define xlfBesseli 428\n#define xlfXirr 429\n#define xlfXnpv 430\n#define xlfPricemat 431\n#define xlfYieldmat 432\n#define xlfIntrate 433\n#define xlfReceived 434\n#define xlfDisc 435\n#define xlfPricedisc 436\n#define xlfYielddisc 437\n#define xlfTbilleq 438\n#define xlfTbillprice 439\n#define xlfTbillyield 440\n#define xlfPrice 441\n#define xlfYield 442\n#define xlfDollarde 443\n#define xlfDollarfr 444\n#define xlfNominal 445\n#define xlfEffect 446\n#define xlfCumprinc 447\n#define xlfCumipmt 448\n#define xlfEdate 449\n#define xlfEomonth 450\n#define xlfYearfrac 451\n#define xlfCoupdaybs 452\n#define xlfCoupdays 453\n#define xlfCoupdaysnc 454\n#define xlfCoupncd 455\n#define xlfCoupnum 456\n#define xlfCouppcd 457\n#define xlfDuration 458\n#define xlfMduration 459\n#define xlfOddlprice 460\n#define xlfOddlyield 461\n#define xlfOddfprice 462\n#define xlfOddfyield 463\n#define xlfRandbetween 464\n#define xlfWeeknum 465\n#define xlfAmordegrc 466\n#define xlfAmorlinc 467\n#define xlfConvert 468\n#define xlfAccrint 469\n#define xlfAccrintm 470\n#define xlfWorkday 471\n#define xlfNetworkdays 472\n#define xlfGcd 473\n#define xlfMultinomial 474\n#define xlfLcm 475\n#define xlfFvschedule 476\n#define xlfCubekpimember 477\n#define xlfCubeset 478\n#define xlfCubesetcount 479\n#define xlfIferror 480\n#define xlfCountifs 481\n#define xlfSumifs 482\n#define xlfAverageif 483\n#define xlfAverageifs 484\n#define xlfAggregate 485\n#define xlfBinom_dist 486\n#define xlfBinom_inv 487\n#define xlfConfidence_norm 488\n#define xlfConfidence_t 489\n#define xlfChisq_test 490\n#define xlfF_test 491\n#define xlfCovariance_p 492\n#define xlfCovariance_s 493\n#define xlfExpon_dist 494\n#define xlfGamma_dist 495\n#define xlfGamma_inv 496\n#define xlfMode_mult 497\n#define xlfMode_sngl 498\n#define xlfNorm_dist 499\n#define xlfNorm_inv 500\n#define xlfPercentile_exc 501\n#define xlfPercentile_inc 502\n#define xlfPercentrank_exc 503\n#define xlfPercentrank_inc 504\n#define xlfPoisson_dist 505\n#define xlfQuartile_exc 506\n#define xlfQuartile_inc 507\n#define xlfRank_avg 508\n#define xlfRank_eq 509\n#define xlfStdev_s 510\n#define xlfStdev_p 511\n#define xlfT_dist 512\n#define xlfT_dist_2t 513\n#define xlfT_dist_rt 514\n#define xlfT_inv 515\n#define xlfT_inv_2t 516\n#define xlfVar_s 517\n#define xlfVar_p 518\n#define xlfWeibull_dist 519\n#define xlfNetworkdays_intl 520\n#define xlfWorkday_intl 521\n#define xlfEcma_ceiling 522\n#define xlfIso_ceiling 523\n#define xlfBeta_dist 525\n#define xlfBeta_inv 526\n#define xlfChisq_dist 527\n#define xlfChisq_dist_rt 528\n#define xlfChisq_inv 529\n#define xlfChisq_inv_rt 530\n#define xlfF_dist 531\n#define xlfF_dist_rt 532\n#define xlfF_inv 533\n#define xlfF_inv_rt 534\n#define xlfHypgeom_dist 535\n#define xlfLognorm_dist 536\n#define xlfLognorm_inv 537\n#define xlfNegbinom_dist 538\n#define xlfNorm_s_dist 539\n#define xlfNorm_s_inv 540\n#define xlfT_test 541\n#define xlfZ_test 542\n#define xlfErf_precise 543\n#define xlfErfc_precise 544\n#define xlfGammaln_precise 545\n#define xlfCeiling_precise 546\n#define xlfFloor_precise 547\n#define xlfAcot 548\n#define xlfAcoth 549\n#define xlfCot 550\n#define xlfCoth 551\n#define xlfCsc 552\n#define xlfCsch 553\n#define xlfSec 554\n#define xlfSech 555\n#define xlfImtan 556\n#define xlfImcot 557\n#define xlfImcsc 558\n#define xlfImcsch 559\n#define xlfImsec 560\n#define xlfImsech 561\n#define xlfBitand 562\n#define xlfBitor 563\n#define xlfBitxor 564\n#define xlfBitlshift 565\n#define xlfBitrshift 566\n#define xlfPermutationa 567\n#define xlfCombina 568\n#define xlfXor 569\n#define xlfPduration 570\n#define xlfBase 571\n#define xlfDecimal 572\n#define xlfDays 573\n#define xlfBinom_dist_range 574\n#define xlfGamma 575\n#define xlfSkew_p 576\n#define xlfGauss 577\n#define xlfPhi 578\n#define xlfRri 579\n#define xlfUnichar 580\n#define xlfUnicode 581\n#define xlfMunit 582\n#define xlfArabic 583\n#define xlfIsoweeknum 584\n#define xlfNumbervalue 585\n#define xlfSheet 586\n#define xlfSheets 587\n#define xlfFormulatext 588\n#define xlfIsformula 589\n#define xlfIfna 590\n#define xlfCeiling_math 591\n#define xlfFloor_math 592\n#define xlfImsinh 593\n#define xlfImcosh 594\n#define xlfFilterxml 595\n#define xlfWebservice 596\n#define xlfEncodeurl 597\n\n/* Excel command numbers */\n#define xlcBeep (0 | xlCommand)\n#define xlcOpen (1 | xlCommand)\n#define xlcOpenLinks (2 | xlCommand)\n#define xlcCloseAll (3 | xlCommand)\n#define xlcSave (4 | xlCommand)\n#define xlcSaveAs (5 | xlCommand)\n#define xlcFileDelete (6 | xlCommand)\n#define xlcPageSetup (7 | xlCommand)\n#define xlcPrint (8 | xlCommand)\n#define xlcPrinterSetup (9 | xlCommand)\n#define xlcQuit (10 | xlCommand)\n#define xlcNewWindow (11 | xlCommand)\n#define xlcArrangeAll (12 | xlCommand)\n#define xlcWindowSize (13 | xlCommand)\n#define xlcWindowMove (14 | xlCommand)\n#define xlcFull (15 | xlCommand)\n#define xlcClose (16 | xlCommand)\n#define xlcRun (17 | xlCommand)\n#define xlcSetPrintArea (22 | xlCommand)\n#define xlcSetPrintTitles (23 | xlCommand)\n#define xlcSetPageBreak (24 | xlCommand)\n#define xlcRemovePageBreak (25 | xlCommand)\n#define xlcFont (26 | xlCommand)\n#define xlcDisplay (27 | xlCommand)\n#define xlcProtectDocument (28 | xlCommand)\n#define xlcPrecision (29 | xlCommand)\n#define xlcA1R1c1 (30 | xlCommand)\n#define xlcCalculateNow (31 | xlCommand)\n#define xlcCalculation (32 | xlCommand)\n#define xlcDataFind (34 | xlCommand)\n#define xlcExtract (35 | xlCommand)\n#define xlcDataDelete (36 | xlCommand)\n#define xlcSetDatabase (37 | xlCommand)\n#define xlcSetCriteria (38 | xlCommand)\n#define xlcSort (39 | xlCommand)\n#define xlcDataSeries (40 | xlCommand)\n#define xlcTable (41 | xlCommand)\n#define xlcFormatNumber (42 | xlCommand)\n#define xlcAlignment (43 | xlCommand)\n#define xlcStyle (44 | xlCommand)\n#define xlcBorder (45 | xlCommand)\n#define xlcCellProtection (46 | xlCommand)\n#define xlcColumnWidth (47 | xlCommand)\n#define xlcUndo (48 | xlCommand)\n#define xlcCut (49 | xlCommand)\n#define xlcCopy (50 | xlCommand)\n#define xlcPaste (51 | xlCommand)\n#define xlcClear (52 | xlCommand)\n#define xlcPasteSpecial (53 | xlCommand)\n#define xlcEditDelete (54 | xlCommand)\n#define xlcInsert (55 | xlCommand)\n#define xlcFillRight (56 | xlCommand)\n#define xlcFillDown (57 | xlCommand)\n#define xlcDefineName (61 | xlCommand)\n#define xlcCreateNames (62 | xlCommand)\n#define xlcFormulaGoto (63 | xlCommand)\n#define xlcFormulaFind (64 | xlCommand)\n#define xlcSelectLastCell (65 | xlCommand)\n#define xlcShowActiveCell (66 | xlCommand)\n#define xlcGalleryArea (67 | xlCommand)\n#define xlcGalleryBar (68 | xlCommand)\n#define xlcGalleryColumn (69 | xlCommand)\n#define xlcGalleryLine (70 | xlCommand)\n#define xlcGalleryPie (71 | xlCommand)\n#define xlcGalleryScatter (72 | xlCommand)\n#define xlcCombination (73 | xlCommand)\n#define xlcPreferred (74 | xlCommand)\n#define xlcAddOverlay (75 | xlCommand)\n#define xlcGridlines (76 | xlCommand)\n#define xlcSetPreferred (77 | xlCommand)\n#define xlcAxes (78 | xlCommand)\n#define xlcLegend (79 | xlCommand)\n#define xlcAttachText (80 | xlCommand)\n#define xlcAddArrow (81 | xlCommand)\n#define xlcSelectChart (82 | xlCommand)\n#define xlcSelectPlotArea (83 | xlCommand)\n#define xlcPatterns (84 | xlCommand)\n#define xlcMainChart (85 | xlCommand)\n#define xlcOverlay (86 | xlCommand)\n#define xlcScale (87 | xlCommand)\n#define xlcFormatLegend (88 | xlCommand)\n#define xlcFormatText (89 | xlCommand)\n#define xlcEditRepeat (90 | xlCommand)\n#define xlcParse (91 | xlCommand)\n#define xlcJustify (92 | xlCommand)\n#define xlcHide (93 | xlCommand)\n#define xlcUnhide (94 | xlCommand)\n#define xlcWorkspace (95 | xlCommand)\n#define xlcFormula (96 | xlCommand)\n#define xlcFormulaFill (97 | xlCommand)\n#define xlcFormulaArray (98 | xlCommand)\n#define xlcDataFindNext (99 | xlCommand)\n#define xlcDataFindPrev (100 | xlCommand)\n#define xlcFormulaFindNext (101 | xlCommand)\n#define xlcFormulaFindPrev (102 | xlCommand)\n#define xlcActivate (103 | xlCommand)\n#define xlcActivateNext (104 | xlCommand)\n#define xlcActivatePrev (105 | xlCommand)\n#define xlcUnlockedNext (106 | xlCommand)\n#define xlcUnlockedPrev (107 | xlCommand)\n#define xlcCopyPicture (108 | xlCommand)\n#define xlcSelect (109 | xlCommand)\n#define xlcDeleteName (110 | xlCommand)\n#define xlcDeleteFormat (111 | xlCommand)\n#define xlcVline (112 | xlCommand)\n#define xlcHline (113 | xlCommand)\n#define xlcVpage (114 | xlCommand)\n#define xlcHpage (115 | xlCommand)\n#define xlcVscroll (116 | xlCommand)\n#define xlcHscroll (117 | xlCommand)\n#define xlcAlert (118 | xlCommand)\n#define xlcNew (119 | xlCommand)\n#define xlcCancelCopy (120 | xlCommand)\n#define xlcShowClipboard (121 | xlCommand)\n#define xlcMessage (122 | xlCommand)\n#define xlcPasteLink (124 | xlCommand)\n#define xlcAppActivate (125 | xlCommand)\n#define xlcDeleteArrow (126 | xlCommand)\n#define xlcRowHeight (127 | xlCommand)\n#define xlcFormatMove (128 | xlCommand)\n#define xlcFormatSize (129 | xlCommand)\n#define xlcFormulaReplace (130 | xlCommand)\n#define xlcSendKeys (131 | xlCommand)\n#define xlcSelectSpecial (132 | xlCommand)\n#define xlcApplyNames (133 | xlCommand)\n#define xlcReplaceFont (134 | xlCommand)\n#define xlcFreezePanes (135 | xlCommand)\n#define xlcShowInfo (136 | xlCommand)\n#define xlcSplit (137 | xlCommand)\n#define xlcOnWindow (138 | xlCommand)\n#define xlcOnData (139 | xlCommand)\n#define xlcDisableInput (140 | xlCommand)\n#define xlcEcho (141 | xlCommand)\n#define xlcOutline (142 | xlCommand)\n#define xlcListNames (143 | xlCommand)\n#define xlcFileClose (144 | xlCommand)\n#define xlcSaveWorkbook (145 | xlCommand)\n#define xlcDataForm (146 | xlCommand)\n#define xlcCopyChart (147 | xlCommand)\n#define xlcOnTime (148 | xlCommand)\n#define xlcWait (149 | xlCommand)\n#define xlcFormatFont (150 | xlCommand)\n#define xlcFillUp (151 | xlCommand)\n#define xlcFillLeft (152 | xlCommand)\n#define xlcDeleteOverlay (153 | xlCommand)\n#define xlcNote (154 | xlCommand)\n#define xlcShortMenus (155 | xlCommand)\n#define xlcSetUpdateStatus (159 | xlCommand)\n#define xlcColorPalette (161 | xlCommand)\n#define xlcDeleteStyle (162 | xlCommand)\n#define xlcWindowRestore (163 | xlCommand)\n#define xlcWindowMaximize (164 | xlCommand)\n#define xlcError (165 | xlCommand)\n#define xlcChangeLink (166 | xlCommand)\n#define xlcCalculateDocument (167 | xlCommand)\n#define xlcOnKey (168 | xlCommand)\n#define xlcAppRestore (169 | xlCommand)\n#define xlcAppMove (170 | xlCommand)\n#define xlcAppSize (171 | xlCommand)\n#define xlcAppMinimize (172 | xlCommand)\n#define xlcAppMaximize (173 | xlCommand)\n#define xlcBringToFront (174 | xlCommand)\n#define xlcSendToBack (175 | xlCommand)\n#define xlcMainChartType (185 | xlCommand)\n#define xlcOverlayChartType (186 | xlCommand)\n#define xlcSelectEnd (187 | xlCommand)\n#define xlcOpenMail (188 | xlCommand)\n#define xlcSendMail (189 | xlCommand)\n#define xlcStandardFont (190 | xlCommand)\n#define xlcConsolidate (191 | xlCommand)\n#define xlcSortSpecial (192 | xlCommand)\n#define xlcGallery3dArea (193 | xlCommand)\n#define xlcGallery3dColumn (194 | xlCommand)\n#define xlcGallery3dLine (195 | xlCommand)\n#define xlcGallery3dPie (196 | xlCommand)\n#define xlcView3d (197 | xlCommand)\n#define xlcGoalSeek (198 | xlCommand)\n#define xlcWorkgroup (199 | xlCommand)\n#define xlcFillGroup (200 | xlCommand)\n#define xlcUpdateLink (201 | xlCommand)\n#define xlcPromote (202 | xlCommand)\n#define xlcDemote (203 | xlCommand)\n#define xlcShowDetail (204 | xlCommand)\n#define xlcUngroup (206 | xlCommand)\n#define xlcObjectProperties (207 | xlCommand)\n#define xlcSaveNewObject (208 | xlCommand)\n#define xlcShare (209 | xlCommand)\n#define xlcShareName (210 | xlCommand)\n#define xlcDuplicate (211 | xlCommand)\n#define xlcApplyStyle (212 | xlCommand)\n#define xlcAssignToObject (213 | xlCommand)\n#define xlcObjectProtection (214 | xlCommand)\n#define xlcHideObject (215 | xlCommand)\n#define xlcSetExtract (216 | xlCommand)\n#define xlcCreatePublisher (217 | xlCommand)\n#define xlcSubscribeTo (218 | xlCommand)\n#define xlcAttributes (219 | xlCommand)\n#define xlcShowToolbar (220 | xlCommand)\n#define xlcPrintPreview (222 | xlCommand)\n#define xlcEditColor (223 | xlCommand)\n#define xlcShowLevels (224 | xlCommand)\n#define xlcFormatMain (225 | xlCommand)\n#define xlcFormatOverlay (226 | xlCommand)\n#define xlcOnRecalc (227 | xlCommand)\n#define xlcEditSeries (228 | xlCommand)\n#define xlcDefineStyle (229 | xlCommand)\n#define xlcLinePrint (240 | xlCommand)\n#define xlcEnterData (243 | xlCommand)\n#define xlcGalleryRadar (249 | xlCommand)\n#define xlcMergeStyles (250 | xlCommand)\n#define xlcEditionOptions (251 | xlCommand)\n#define xlcPastePicture (252 | xlCommand)\n#define xlcPastePictureLink (253 | xlCommand)\n#define xlcSpelling (254 | xlCommand)\n#define xlcZoom (256 | xlCommand)\n#define xlcResume (258 | xlCommand)\n#define xlcInsertObject (259 | xlCommand)\n#define xlcWindowMinimize (260 | xlCommand)\n#define xlcSize (261 | xlCommand)\n#define xlcMove (262 | xlCommand)\n#define xlcSoundNote (265 | xlCommand)\n#define xlcSoundPlay (266 | xlCommand)\n#define xlcFormatShape (267 | xlCommand)\n#define xlcExtendPolygon (268 | xlCommand)\n#define xlcFormatAuto (269 | xlCommand)\n#define xlcGallery3dBar (272 | xlCommand)\n#define xlcGallery3dSurface (273 | xlCommand)\n#define xlcFillAuto (274 | xlCommand)\n#define xlcCustomizeToolbar (276 | xlCommand)\n#define xlcAddTool (277 | xlCommand)\n#define xlcEditObject (278 | xlCommand)\n#define xlcOnDoubleclick (279 | xlCommand)\n#define xlcOnEntry (280 | xlCommand)\n#define xlcWorkbookAdd (281 | xlCommand)\n#define xlcWorkbookMove (282 | xlCommand)\n#define xlcWorkbookCopy (283 | xlCommand)\n#define xlcWorkbookOptions (284 | xlCommand)\n#define xlcSaveWorkspace (285 | xlCommand)\n#define xlcChartWizard (288 | xlCommand)\n#define xlcDeleteTool (289 | xlCommand)\n#define xlcMoveTool (290 | xlCommand)\n#define xlcWorkbookSelect (291 | xlCommand)\n#define xlcWorkbookActivate (292 | xlCommand)\n#define xlcAssignToTool (293 | xlCommand)\n#define xlcCopyTool (295 | xlCommand)\n#define xlcResetTool (296 | xlCommand)\n#define xlcConstrainNumeric (297 | xlCommand)\n#define xlcPasteTool (298 | xlCommand)\n#define xlcPlacement (300 | xlCommand)\n#define xlcFillWorkgroup (301 | xlCommand)\n#define xlcWorkbookNew (302 | xlCommand)\n#define xlcScenarioCells (305 | xlCommand)\n#define xlcScenarioDelete (306 | xlCommand)\n#define xlcScenarioAdd (307 | xlCommand)\n#define xlcScenarioEdit (308 | xlCommand)\n#define xlcScenarioShow (309 | xlCommand)\n#define xlcScenarioShowNext (310 | xlCommand)\n#define xlcScenarioSummary (311 | xlCommand)\n#define xlcPivotTableWizard (312 | xlCommand)\n#define xlcPivotFieldProperties (313 | xlCommand)\n#define xlcPivotField (314 | xlCommand)\n#define xlcPivotItem (315 | xlCommand)\n#define xlcPivotAddFields (316 | xlCommand)\n#define xlcOptionsCalculation (318 | xlCommand)\n#define xlcOptionsEdit (319 | xlCommand)\n#define xlcOptionsView (320 | xlCommand)\n#define xlcAddinManager (321 | xlCommand)\n#define xlcMenuEditor (322 | xlCommand)\n#define xlcAttachToolbars (323 | xlCommand)\n#define xlcVbaactivate (324 | xlCommand)\n#define xlcOptionsChart (325 | xlCommand)\n#define xlcVbaInsertFile (328 | xlCommand)\n#define xlcVbaProcedureDefinition (330 | xlCommand)\n#define xlcRoutingSlip (336 | xlCommand)\n#define xlcRouteDocument (338 | xlCommand)\n#define xlcMailLogon (339 | xlCommand)\n#define xlcInsertPicture (342 | xlCommand)\n#define xlcEditTool (343 | xlCommand)\n#define xlcGalleryDoughnut (344 | xlCommand)\n#define xlcChartTrend (350 | xlCommand)\n#define xlcPivotItemProperties (352 | xlCommand)\n#define xlcWorkbookInsert (354 | xlCommand)\n#define xlcOptionsTransition (355 | xlCommand)\n#define xlcOptionsGeneral (356 | xlCommand)\n#define xlcFilterAdvanced (370 | xlCommand)\n#define xlcMailAddMailer (373 | xlCommand)\n#define xlcMailDeleteMailer (374 | xlCommand)\n#define xlcMailReply (375 | xlCommand)\n#define xlcMailReplyAll (376 | xlCommand)\n#define xlcMailForward (377 | xlCommand)\n#define xlcMailNextLetter (378 | xlCommand)\n#define xlcDataLabel (379 | xlCommand)\n#define xlcInsertTitle (380 | xlCommand)\n#define xlcFontProperties (381 | xlCommand)\n#define xlcMacroOptions (382 | xlCommand)\n#define xlcWorkbookHide (383 | xlCommand)\n#define xlcWorkbookUnhide (384 | xlCommand)\n#define xlcWorkbookDelete (385 | xlCommand)\n#define xlcWorkbookName (386 | xlCommand)\n#define xlcGalleryCustom (388 | xlCommand)\n#define xlcAddChartAutoformat (390 | xlCommand)\n#define xlcDeleteChartAutoformat (391 | xlCommand)\n#define xlcChartAddData (392 | xlCommand)\n#define xlcAutoOutline (393 | xlCommand)\n#define xlcTabOrder (394 | xlCommand)\n#define xlcShowDialog (395 | xlCommand)\n#define xlcSelectAll (396 | xlCommand)\n#define xlcUngroupSheets (397 | xlCommand)\n#define xlcSubtotalCreate (398 | xlCommand)\n#define xlcSubtotalRemove (399 | xlCommand)\n#define xlcRenameObject (400 | xlCommand)\n#define xlcWorkbookScroll (412 | xlCommand)\n#define xlcWorkbookNext (413 | xlCommand)\n#define xlcWorkbookPrev (414 | xlCommand)\n#define xlcWorkbookTabSplit (415 | xlCommand)\n#define xlcFullScreen (416 | xlCommand)\n#define xlcWorkbookProtect (417 | xlCommand)\n#define xlcScrollbarProperties (420 | xlCommand)\n#define xlcPivotShowPages (421 | xlCommand)\n#define xlcTextToColumns (422 | xlCommand)\n#define xlcFormatCharttype (423 | xlCommand)\n#define xlcLinkFormat (424 | xlCommand)\n#define xlcTracerDisplay (425 | xlCommand)\n#define xlcTracerNavigate (430 | xlCommand)\n#define xlcTracerClear (431 | xlCommand)\n#define xlcTracerError (432 | xlCommand)\n#define xlcPivotFieldGroup (433 | xlCommand)\n#define xlcPivotFieldUngroup (434 | xlCommand)\n#define xlcCheckboxProperties (435 | xlCommand)\n#define xlcLabelProperties (436 | xlCommand)\n#define xlcListboxProperties (437 | xlCommand)\n#define xlcEditboxProperties (438 | xlCommand)\n#define xlcPivotRefresh (439 | xlCommand)\n#define xlcLinkCombo (440 | xlCommand)\n#define xlcOpenText (441 | xlCommand)\n#define xlcHideDialog (442 | xlCommand)\n#define xlcSetDialogFocus (443 | xlCommand)\n#define xlcEnableObject (444 | xlCommand)\n#define xlcPushbuttonProperties (445 | xlCommand)\n#define xlcSetDialogDefault (446 | xlCommand)\n#define xlcFilter (447 | xlCommand)\n#define xlcFilterShowAll (448 | xlCommand)\n#define xlcClearOutline (449 | xlCommand)\n#define xlcFunctionWizard (450 | xlCommand)\n#define xlcAddListItem (451 | xlCommand)\n#define xlcSetListItem (452 | xlCommand)\n#define xlcRemoveListItem (453 | xlCommand)\n#define xlcSelectListItem (454 | xlCommand)\n#define xlcSetControlValue (455 | xlCommand)\n#define xlcSaveCopyAs (456 | xlCommand)\n#define xlcOptionsListsAdd (458 | xlCommand)\n#define xlcOptionsListsDelete (459 | xlCommand)\n#define xlcSeriesAxes (460 | xlCommand)\n#define xlcSeriesX (461 | xlCommand)\n#define xlcSeriesY (462 | xlCommand)\n#define xlcErrorbarX (463 | xlCommand)\n#define xlcErrorbarY (464 | xlCommand)\n#define xlcFormatChart (465 | xlCommand)\n#define xlcSeriesOrder (466 | xlCommand)\n#define xlcMailLogoff (467 | xlCommand)\n#define xlcClearRoutingSlip (468 | xlCommand)\n#define xlcAppActivateMicrosoft (469 | xlCommand)\n#define xlcMailEditMailer (470 | xlCommand)\n#define xlcOnSheet (471 | xlCommand)\n#define xlcStandardWidth (472 | xlCommand)\n#define xlcScenarioMerge (473 | xlCommand)\n#define xlcSummaryInfo (474 | xlCommand)\n#define xlcFindFile (475 | xlCommand)\n#define xlcActiveCellFont (476 | xlCommand)\n#define xlcEnableTipwizard (477 | xlCommand)\n#define xlcVbaMakeAddin (478 | xlCommand)\n#define xlcInsertdatatable (480 | xlCommand)\n#define xlcWorkgroupOptions (481 | xlCommand)\n#define xlcMailSendMailer (482 | xlCommand)\n#define xlcAutocorrect (485 | xlCommand)\n#define xlcPostDocument (489 | xlCommand)\n#define xlcPicklist (491 | xlCommand)\n#define xlcViewShow (493 | xlCommand)\n#define xlcViewDefine (494 | xlCommand)\n#define xlcViewDelete (495 | xlCommand)\n#define xlcSheetBackground (509 | xlCommand)\n#define xlcInsertMapObject (510 | xlCommand)\n#define xlcOptionsMenono (511 | xlCommand)\n#define xlcNormal (518 | xlCommand)\n#define xlcLayout (519 | xlCommand)\n#define xlcRmPrintArea (520 | xlCommand)\n#define xlcClearPrintArea (521 | xlCommand)\n#define xlcAddPrintArea (522 | xlCommand)\n#define xlcMoveBrk (523 | xlCommand)\n#define xlcHidecurrNote (545 | xlCommand)\n#define xlcHideallNotes (546 | xlCommand)\n#define xlcDeleteNote (547 | xlCommand)\n#define xlcTraverseNotes (548 | xlCommand)\n#define xlcActivateNotes (549 | xlCommand)\n#define xlcProtectRevisions (620 | xlCommand)\n#define xlcUnprotectRevisions (621 | xlCommand)\n#define xlcOptionsMe (647 | xlCommand)\n#define xlcWebPublish (653 | xlCommand)\n#define xlcNewwebquery (667 | xlCommand)\n#define xlcPivotTableChart (673 | xlCommand)\n#define xlcOptionsSave (753 | xlCommand)\n#define xlcOptionsSpell (755 | xlCommand)\n#define xlcHideallInkannots (808 | xlCommand)\n"
  },
  {
    "path": "external/Excel2013SDK/SRC/ReadMe.txt",
    "content": "Changes to XLCALL.CPP in the Microsoft Excel 2013 XLL Software Development Kit (SDK)\n====================================================================================\n\nThere are no changes to XLCALL.CPP.\n\nWhat is XLCALL.CPP?\n===================\n\nXLCALL.CPP was introduced in the Excel 2007 XLL SDK.\nXLCALL.CPP contains the definitions of two Excel entry points -\nExcel12 and Excel12v.\n\nAny XLL built starting with the Excel 2007 XLL SDK that uses the Excel12 or Excel12v\nentry points must include the code from XLCALL.CPP for successful compilation.\n\nThe code from XLCALL.CPP can be included in the following three ways:\n\n1. If you are using Microsoft Visual Studio for development, add XLCALL.CPP to the project.\n\n2. If you are using makefiles to build the XLL, add XLCALL.CPP to the list of .CPP files\nto compile.\n\n3. Include XLCALL.CPP in a C or C++ file that contains code for your XLL.\nXLCALL.CPP can be included using the following statement:\n\n#include \"XLCALL.CPP\"\n\nMake sure that XLCALL.CPP is present in your include path.\n\nThe first two methods are the preferred way of including the code from XLCALL.CPP.\nThe third method is illustrated by the framework sample included in the Excel 2010 XLL SDK.\n\nNOTE - It is not necessary to explicitly include the code from XLCALL.CPP if\nthe XLL links to frmwrk32.lib. frmwrk32.lib already contains this code."
  },
  {
    "path": "external/Excel2013SDK/SRC/XLCALL.CPP",
    "content": "/*\n**  Microsoft Excel Developer's Toolkit\n**  Version 14.0\n**\n**  File:           SRC\\XLCALL.CPP\n**  Description:    Code file for Excel callbacks\n**  Platform:       Microsoft Windows\n**\n**  This file defines the entry points \n**  which are used in the Microsoft Excel C API.\n**\n*/\n\n#ifndef _WINDOWS_\n#include <windows.h>\n#endif\n\n#include \"xlcall.h\"\n\n/*\n** Excel 12 entry points backwards compatible with Excel 11\n**\n** Excel12 and Excel12v ensure backwards compatibility with Excel 11\n** and earlier versions. These functions will return xlretFailed when\n** used to callback into Excel 11 and earlier versions\n*/\n\n#define cxloper12Max 255\n#define EXCEL12ENTRYPT \"MdCallBack12\"\n\ntypedef int (PASCAL *EXCEL12PROC) (int xlfn, int coper, LPXLOPER12 *rgpxloper12, LPXLOPER12 xloper12Res);\n\nHMODULE hmodule;\nEXCEL12PROC pexcel12;\n\n__forceinline void FetchExcel12EntryPt(void)\n{\n\tif (pexcel12 == NULL)\n\t{\n\t\thmodule = GetModuleHandle(NULL);\n\t\tif (hmodule != NULL)\n\t\t{\n\t\t\tpexcel12 = (EXCEL12PROC) GetProcAddress(hmodule, EXCEL12ENTRYPT);\n\t\t}\n\t}\n}\n\n/*\n** This function explicitly sets EXCEL12ENTRYPT.\n**\n** If the XLL is loaded not by Excel.exe, but by a HPC cluster container DLL,\n** then GetModuleHandle(NULL) would return the process EXE module handle.\n** In that case GetProcAddress would fail, since the process EXE doesn't\n** export EXCEL12ENTRYPT ( since it's not Excel.exe).\n**\n** First try to fetch the known good entry point,\n** then set the passed in address.\n*/\n#ifdef __cplusplus\nextern \"C\"\n#endif\t\n__declspec(dllexport)\nvoid pascal SetExcel12EntryPt(EXCEL12PROC pexcel12New)\n{\n\tFetchExcel12EntryPt();\n\tif (pexcel12 == NULL)\n\t{\n\t\tpexcel12 = pexcel12New;\n\t}\n}\n\nint _cdecl Excel12(int xlfn, LPXLOPER12 operRes, int count, ...)\n{\n\n\tLPXLOPER12 rgxloper12[cxloper12Max];\n\tva_list ap;\n\tint ioper;\n\tint mdRet;\n\n\tFetchExcel12EntryPt();\n\tif (pexcel12 == NULL)\n\t{\n\t\tmdRet = xlretFailed;\n\t}\n\telse\n\t{\n\t\tmdRet = xlretInvCount;\n\t\tif ((count >= 0)  && (count <= cxloper12Max))\n\t\t{\n\t\t\tva_start(ap, count);\n\t\t\tfor (ioper = 0; ioper < count ; ioper++)\n\t\t\t{\n\t\t\t\trgxloper12[ioper] = va_arg(ap, LPXLOPER12);\n\t\t\t}\n\t\t\tva_end(ap);\n\t\t\tmdRet = (pexcel12)(xlfn, count, &rgxloper12[0], operRes);\n\t\t}\n\t}\n\treturn(mdRet);\n\t\n}\n\nint pascal Excel12v(int xlfn, LPXLOPER12 operRes, int count, LPXLOPER12 opers[])\n{\n\n\tint mdRet;\n\n\tFetchExcel12EntryPt();\n\tif (pexcel12 == NULL)\n\t{\n\t\tmdRet = xlretFailed;\n\t}\n\telse\n\t{\n\t\tmdRet = (pexcel12)(xlfn, count, &opers[0], operRes);\n\t}\n\treturn(mdRet);\n\n}\n"
  },
  {
    "path": "external/Sources.txt",
    "content": "Asmjit\n------\n\nBranch: master (25 Oct 2019)\nSource: https://github.com/asmjit/asmjit/commit/ac77dfcd75f043e2fe317133a971040e5b999916\n\nBoost\n-----\n\nBranch: 1.67\nSource: https://sourceforge.net/projects/boost/files/boost/\n\nExcel2013SDK\n------------\n\nBranch: release\nSource: microsoft\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/add.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_ADD_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_ADD_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ADD */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ADD(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# else\n#    define BOOST_PP_ADD(x, y) BOOST_PP_ADD_I(x, y)\n#    define BOOST_PP_ADD_I(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# endif\n#\n# define BOOST_PP_ADD_P(d, xy) BOOST_PP_TUPLE_ELEM(2, 1, xy)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_ADD_O(d, xy) BOOST_PP_ADD_O_I xy\n# else\n#    define BOOST_PP_ADD_O(d, xy) BOOST_PP_ADD_O_I(BOOST_PP_TUPLE_ELEM(2, 0, xy), BOOST_PP_TUPLE_ELEM(2, 1, xy))\n# endif\n#\n# define BOOST_PP_ADD_O_I(x, y) (BOOST_PP_INC(x), BOOST_PP_DEC(y))\n#\n# /* BOOST_PP_ADD_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ADD_D(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# else\n#    define BOOST_PP_ADD_D(d, x, y) BOOST_PP_ADD_D_I(d, x, y)\n#    define BOOST_PP_ADD_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_ADD_P, BOOST_PP_ADD_O, (x, y)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/dec.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DEC_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_DEC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_DEC */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_DEC(x) BOOST_PP_DEC_I(x)\n# else\n#    define BOOST_PP_DEC(x) BOOST_PP_DEC_OO((x))\n#    define BOOST_PP_DEC_OO(par) BOOST_PP_DEC_I ## par\n# endif\n#\n# define BOOST_PP_DEC_I(x) BOOST_PP_DEC_ ## x\n#\n# define BOOST_PP_DEC_0 0\n# define BOOST_PP_DEC_1 0\n# define BOOST_PP_DEC_2 1\n# define BOOST_PP_DEC_3 2\n# define BOOST_PP_DEC_4 3\n# define BOOST_PP_DEC_5 4\n# define BOOST_PP_DEC_6 5\n# define BOOST_PP_DEC_7 6\n# define BOOST_PP_DEC_8 7\n# define BOOST_PP_DEC_9 8\n# define BOOST_PP_DEC_10 9\n# define BOOST_PP_DEC_11 10\n# define BOOST_PP_DEC_12 11\n# define BOOST_PP_DEC_13 12\n# define BOOST_PP_DEC_14 13\n# define BOOST_PP_DEC_15 14\n# define BOOST_PP_DEC_16 15\n# define BOOST_PP_DEC_17 16\n# define BOOST_PP_DEC_18 17\n# define BOOST_PP_DEC_19 18\n# define BOOST_PP_DEC_20 19\n# define BOOST_PP_DEC_21 20\n# define BOOST_PP_DEC_22 21\n# define BOOST_PP_DEC_23 22\n# define BOOST_PP_DEC_24 23\n# define BOOST_PP_DEC_25 24\n# define BOOST_PP_DEC_26 25\n# define BOOST_PP_DEC_27 26\n# define BOOST_PP_DEC_28 27\n# define BOOST_PP_DEC_29 28\n# define BOOST_PP_DEC_30 29\n# define BOOST_PP_DEC_31 30\n# define BOOST_PP_DEC_32 31\n# define BOOST_PP_DEC_33 32\n# define BOOST_PP_DEC_34 33\n# define BOOST_PP_DEC_35 34\n# define BOOST_PP_DEC_36 35\n# define BOOST_PP_DEC_37 36\n# define BOOST_PP_DEC_38 37\n# define BOOST_PP_DEC_39 38\n# define BOOST_PP_DEC_40 39\n# define BOOST_PP_DEC_41 40\n# define BOOST_PP_DEC_42 41\n# define BOOST_PP_DEC_43 42\n# define BOOST_PP_DEC_44 43\n# define BOOST_PP_DEC_45 44\n# define BOOST_PP_DEC_46 45\n# define BOOST_PP_DEC_47 46\n# define BOOST_PP_DEC_48 47\n# define BOOST_PP_DEC_49 48\n# define BOOST_PP_DEC_50 49\n# define BOOST_PP_DEC_51 50\n# define BOOST_PP_DEC_52 51\n# define BOOST_PP_DEC_53 52\n# define BOOST_PP_DEC_54 53\n# define BOOST_PP_DEC_55 54\n# define BOOST_PP_DEC_56 55\n# define BOOST_PP_DEC_57 56\n# define BOOST_PP_DEC_58 57\n# define BOOST_PP_DEC_59 58\n# define BOOST_PP_DEC_60 59\n# define BOOST_PP_DEC_61 60\n# define BOOST_PP_DEC_62 61\n# define BOOST_PP_DEC_63 62\n# define BOOST_PP_DEC_64 63\n# define BOOST_PP_DEC_65 64\n# define BOOST_PP_DEC_66 65\n# define BOOST_PP_DEC_67 66\n# define BOOST_PP_DEC_68 67\n# define BOOST_PP_DEC_69 68\n# define BOOST_PP_DEC_70 69\n# define BOOST_PP_DEC_71 70\n# define BOOST_PP_DEC_72 71\n# define BOOST_PP_DEC_73 72\n# define BOOST_PP_DEC_74 73\n# define BOOST_PP_DEC_75 74\n# define BOOST_PP_DEC_76 75\n# define BOOST_PP_DEC_77 76\n# define BOOST_PP_DEC_78 77\n# define BOOST_PP_DEC_79 78\n# define BOOST_PP_DEC_80 79\n# define BOOST_PP_DEC_81 80\n# define BOOST_PP_DEC_82 81\n# define BOOST_PP_DEC_83 82\n# define BOOST_PP_DEC_84 83\n# define BOOST_PP_DEC_85 84\n# define BOOST_PP_DEC_86 85\n# define BOOST_PP_DEC_87 86\n# define BOOST_PP_DEC_88 87\n# define BOOST_PP_DEC_89 88\n# define BOOST_PP_DEC_90 89\n# define BOOST_PP_DEC_91 90\n# define BOOST_PP_DEC_92 91\n# define BOOST_PP_DEC_93 92\n# define BOOST_PP_DEC_94 93\n# define BOOST_PP_DEC_95 94\n# define BOOST_PP_DEC_96 95\n# define BOOST_PP_DEC_97 96\n# define BOOST_PP_DEC_98 97\n# define BOOST_PP_DEC_99 98\n# define BOOST_PP_DEC_100 99\n# define BOOST_PP_DEC_101 100\n# define BOOST_PP_DEC_102 101\n# define BOOST_PP_DEC_103 102\n# define BOOST_PP_DEC_104 103\n# define BOOST_PP_DEC_105 104\n# define BOOST_PP_DEC_106 105\n# define BOOST_PP_DEC_107 106\n# define BOOST_PP_DEC_108 107\n# define BOOST_PP_DEC_109 108\n# define BOOST_PP_DEC_110 109\n# define BOOST_PP_DEC_111 110\n# define BOOST_PP_DEC_112 111\n# define BOOST_PP_DEC_113 112\n# define BOOST_PP_DEC_114 113\n# define BOOST_PP_DEC_115 114\n# define BOOST_PP_DEC_116 115\n# define BOOST_PP_DEC_117 116\n# define BOOST_PP_DEC_118 117\n# define BOOST_PP_DEC_119 118\n# define BOOST_PP_DEC_120 119\n# define BOOST_PP_DEC_121 120\n# define BOOST_PP_DEC_122 121\n# define BOOST_PP_DEC_123 122\n# define BOOST_PP_DEC_124 123\n# define BOOST_PP_DEC_125 124\n# define BOOST_PP_DEC_126 125\n# define BOOST_PP_DEC_127 126\n# define BOOST_PP_DEC_128 127\n# define BOOST_PP_DEC_129 128\n# define BOOST_PP_DEC_130 129\n# define BOOST_PP_DEC_131 130\n# define BOOST_PP_DEC_132 131\n# define BOOST_PP_DEC_133 132\n# define BOOST_PP_DEC_134 133\n# define BOOST_PP_DEC_135 134\n# define BOOST_PP_DEC_136 135\n# define BOOST_PP_DEC_137 136\n# define BOOST_PP_DEC_138 137\n# define BOOST_PP_DEC_139 138\n# define BOOST_PP_DEC_140 139\n# define BOOST_PP_DEC_141 140\n# define BOOST_PP_DEC_142 141\n# define BOOST_PP_DEC_143 142\n# define BOOST_PP_DEC_144 143\n# define BOOST_PP_DEC_145 144\n# define BOOST_PP_DEC_146 145\n# define BOOST_PP_DEC_147 146\n# define BOOST_PP_DEC_148 147\n# define BOOST_PP_DEC_149 148\n# define BOOST_PP_DEC_150 149\n# define BOOST_PP_DEC_151 150\n# define BOOST_PP_DEC_152 151\n# define BOOST_PP_DEC_153 152\n# define BOOST_PP_DEC_154 153\n# define BOOST_PP_DEC_155 154\n# define BOOST_PP_DEC_156 155\n# define BOOST_PP_DEC_157 156\n# define BOOST_PP_DEC_158 157\n# define BOOST_PP_DEC_159 158\n# define BOOST_PP_DEC_160 159\n# define BOOST_PP_DEC_161 160\n# define BOOST_PP_DEC_162 161\n# define BOOST_PP_DEC_163 162\n# define BOOST_PP_DEC_164 163\n# define BOOST_PP_DEC_165 164\n# define BOOST_PP_DEC_166 165\n# define BOOST_PP_DEC_167 166\n# define BOOST_PP_DEC_168 167\n# define BOOST_PP_DEC_169 168\n# define BOOST_PP_DEC_170 169\n# define BOOST_PP_DEC_171 170\n# define BOOST_PP_DEC_172 171\n# define BOOST_PP_DEC_173 172\n# define BOOST_PP_DEC_174 173\n# define BOOST_PP_DEC_175 174\n# define BOOST_PP_DEC_176 175\n# define BOOST_PP_DEC_177 176\n# define BOOST_PP_DEC_178 177\n# define BOOST_PP_DEC_179 178\n# define BOOST_PP_DEC_180 179\n# define BOOST_PP_DEC_181 180\n# define BOOST_PP_DEC_182 181\n# define BOOST_PP_DEC_183 182\n# define BOOST_PP_DEC_184 183\n# define BOOST_PP_DEC_185 184\n# define BOOST_PP_DEC_186 185\n# define BOOST_PP_DEC_187 186\n# define BOOST_PP_DEC_188 187\n# define BOOST_PP_DEC_189 188\n# define BOOST_PP_DEC_190 189\n# define BOOST_PP_DEC_191 190\n# define BOOST_PP_DEC_192 191\n# define BOOST_PP_DEC_193 192\n# define BOOST_PP_DEC_194 193\n# define BOOST_PP_DEC_195 194\n# define BOOST_PP_DEC_196 195\n# define BOOST_PP_DEC_197 196\n# define BOOST_PP_DEC_198 197\n# define BOOST_PP_DEC_199 198\n# define BOOST_PP_DEC_200 199\n# define BOOST_PP_DEC_201 200\n# define BOOST_PP_DEC_202 201\n# define BOOST_PP_DEC_203 202\n# define BOOST_PP_DEC_204 203\n# define BOOST_PP_DEC_205 204\n# define BOOST_PP_DEC_206 205\n# define BOOST_PP_DEC_207 206\n# define BOOST_PP_DEC_208 207\n# define BOOST_PP_DEC_209 208\n# define BOOST_PP_DEC_210 209\n# define BOOST_PP_DEC_211 210\n# define BOOST_PP_DEC_212 211\n# define BOOST_PP_DEC_213 212\n# define BOOST_PP_DEC_214 213\n# define BOOST_PP_DEC_215 214\n# define BOOST_PP_DEC_216 215\n# define BOOST_PP_DEC_217 216\n# define BOOST_PP_DEC_218 217\n# define BOOST_PP_DEC_219 218\n# define BOOST_PP_DEC_220 219\n# define BOOST_PP_DEC_221 220\n# define BOOST_PP_DEC_222 221\n# define BOOST_PP_DEC_223 222\n# define BOOST_PP_DEC_224 223\n# define BOOST_PP_DEC_225 224\n# define BOOST_PP_DEC_226 225\n# define BOOST_PP_DEC_227 226\n# define BOOST_PP_DEC_228 227\n# define BOOST_PP_DEC_229 228\n# define BOOST_PP_DEC_230 229\n# define BOOST_PP_DEC_231 230\n# define BOOST_PP_DEC_232 231\n# define BOOST_PP_DEC_233 232\n# define BOOST_PP_DEC_234 233\n# define BOOST_PP_DEC_235 234\n# define BOOST_PP_DEC_236 235\n# define BOOST_PP_DEC_237 236\n# define BOOST_PP_DEC_238 237\n# define BOOST_PP_DEC_239 238\n# define BOOST_PP_DEC_240 239\n# define BOOST_PP_DEC_241 240\n# define BOOST_PP_DEC_242 241\n# define BOOST_PP_DEC_243 242\n# define BOOST_PP_DEC_244 243\n# define BOOST_PP_DEC_245 244\n# define BOOST_PP_DEC_246 245\n# define BOOST_PP_DEC_247 246\n# define BOOST_PP_DEC_248 247\n# define BOOST_PP_DEC_249 248\n# define BOOST_PP_DEC_250 249\n# define BOOST_PP_DEC_251 250\n# define BOOST_PP_DEC_252 251\n# define BOOST_PP_DEC_253 252\n# define BOOST_PP_DEC_254 253\n# define BOOST_PP_DEC_255 254\n# define BOOST_PP_DEC_256 255\n# define BOOST_PP_DEC_257 256\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/detail/div_base.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DETAIL_DIV_BASE_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_DETAIL_DIV_BASE_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/arithmetic/sub.hpp>\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_DIV_BASE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_DIV_BASE(x, y) BOOST_PP_WHILE(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))\n# else\n#    define BOOST_PP_DIV_BASE(x, y) BOOST_PP_DIV_BASE_I(x, y)\n#    define BOOST_PP_DIV_BASE_I(x, y) BOOST_PP_WHILE(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_DIV_BASE_P(d, rxy) BOOST_PP_DIV_BASE_P_IM(d, BOOST_PP_TUPLE_REM_3 rxy)\n#    define BOOST_PP_DIV_BASE_P_IM(d, im) BOOST_PP_DIV_BASE_P_I(d, im)\n# else\n#    define BOOST_PP_DIV_BASE_P(d, rxy) BOOST_PP_DIV_BASE_P_I(d, BOOST_PP_TUPLE_ELEM(3, 0, rxy), BOOST_PP_TUPLE_ELEM(3, 1, rxy), BOOST_PP_TUPLE_ELEM(3, 2, rxy))\n# endif\n#\n# define BOOST_PP_DIV_BASE_P_I(d, r, x, y) BOOST_PP_LESS_EQUAL_D(d, y, x)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_DIV_BASE_O(d, rxy) BOOST_PP_DIV_BASE_O_IM(d, BOOST_PP_TUPLE_REM_3 rxy)\n#    define BOOST_PP_DIV_BASE_O_IM(d, im) BOOST_PP_DIV_BASE_O_I(d, im)\n# else\n#    define BOOST_PP_DIV_BASE_O(d, rxy) BOOST_PP_DIV_BASE_O_I(d, BOOST_PP_TUPLE_ELEM(3, 0, rxy), BOOST_PP_TUPLE_ELEM(3, 1, rxy), BOOST_PP_TUPLE_ELEM(3, 2, rxy))\n# endif\n#\n# define BOOST_PP_DIV_BASE_O_I(d, r, x, y) (BOOST_PP_INC(r), BOOST_PP_SUB_D(d, x, y), y)\n#\n# /* BOOST_PP_DIV_BASE_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_DIV_BASE_D(d, x, y) BOOST_PP_WHILE_ ## d(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))\n# else\n#    define BOOST_PP_DIV_BASE_D(d, x, y) BOOST_PP_DIV_BASE_D_I(d, x, y)\n#    define BOOST_PP_DIV_BASE_D_I(d, x, y) BOOST_PP_WHILE_ ## d(BOOST_PP_DIV_BASE_P, BOOST_PP_DIV_BASE_O, (0, x, y))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/div.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_DIV_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_DIV_HPP\n#\n# include <boost/preprocessor/arithmetic/detail/div_base.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_DIV */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_DIV(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y))\n# else\n#    define BOOST_PP_DIV(x, y) BOOST_PP_DIV_I(x, y)\n#    define BOOST_PP_DIV_I(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE(x, y))\n# endif\n#\n# /* BOOST_PP_DIV_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_DIV_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y))\n# else\n#    define BOOST_PP_DIV_D(d, x, y) BOOST_PP_DIV_D_I(d, x, y)\n#    define BOOST_PP_DIV_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_DIV_BASE_D(d, x, y))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/inc.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_INC_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_INC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_INC */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_INC(x) BOOST_PP_INC_I(x)\n# else\n#    define BOOST_PP_INC(x) BOOST_PP_INC_OO((x))\n#    define BOOST_PP_INC_OO(par) BOOST_PP_INC_I ## par\n# endif\n#\n# define BOOST_PP_INC_I(x) BOOST_PP_INC_ ## x\n#\n# define BOOST_PP_INC_0 1\n# define BOOST_PP_INC_1 2\n# define BOOST_PP_INC_2 3\n# define BOOST_PP_INC_3 4\n# define BOOST_PP_INC_4 5\n# define BOOST_PP_INC_5 6\n# define BOOST_PP_INC_6 7\n# define BOOST_PP_INC_7 8\n# define BOOST_PP_INC_8 9\n# define BOOST_PP_INC_9 10\n# define BOOST_PP_INC_10 11\n# define BOOST_PP_INC_11 12\n# define BOOST_PP_INC_12 13\n# define BOOST_PP_INC_13 14\n# define BOOST_PP_INC_14 15\n# define BOOST_PP_INC_15 16\n# define BOOST_PP_INC_16 17\n# define BOOST_PP_INC_17 18\n# define BOOST_PP_INC_18 19\n# define BOOST_PP_INC_19 20\n# define BOOST_PP_INC_20 21\n# define BOOST_PP_INC_21 22\n# define BOOST_PP_INC_22 23\n# define BOOST_PP_INC_23 24\n# define BOOST_PP_INC_24 25\n# define BOOST_PP_INC_25 26\n# define BOOST_PP_INC_26 27\n# define BOOST_PP_INC_27 28\n# define BOOST_PP_INC_28 29\n# define BOOST_PP_INC_29 30\n# define BOOST_PP_INC_30 31\n# define BOOST_PP_INC_31 32\n# define BOOST_PP_INC_32 33\n# define BOOST_PP_INC_33 34\n# define BOOST_PP_INC_34 35\n# define BOOST_PP_INC_35 36\n# define BOOST_PP_INC_36 37\n# define BOOST_PP_INC_37 38\n# define BOOST_PP_INC_38 39\n# define BOOST_PP_INC_39 40\n# define BOOST_PP_INC_40 41\n# define BOOST_PP_INC_41 42\n# define BOOST_PP_INC_42 43\n# define BOOST_PP_INC_43 44\n# define BOOST_PP_INC_44 45\n# define BOOST_PP_INC_45 46\n# define BOOST_PP_INC_46 47\n# define BOOST_PP_INC_47 48\n# define BOOST_PP_INC_48 49\n# define BOOST_PP_INC_49 50\n# define BOOST_PP_INC_50 51\n# define BOOST_PP_INC_51 52\n# define BOOST_PP_INC_52 53\n# define BOOST_PP_INC_53 54\n# define BOOST_PP_INC_54 55\n# define BOOST_PP_INC_55 56\n# define BOOST_PP_INC_56 57\n# define BOOST_PP_INC_57 58\n# define BOOST_PP_INC_58 59\n# define BOOST_PP_INC_59 60\n# define BOOST_PP_INC_60 61\n# define BOOST_PP_INC_61 62\n# define BOOST_PP_INC_62 63\n# define BOOST_PP_INC_63 64\n# define BOOST_PP_INC_64 65\n# define BOOST_PP_INC_65 66\n# define BOOST_PP_INC_66 67\n# define BOOST_PP_INC_67 68\n# define BOOST_PP_INC_68 69\n# define BOOST_PP_INC_69 70\n# define BOOST_PP_INC_70 71\n# define BOOST_PP_INC_71 72\n# define BOOST_PP_INC_72 73\n# define BOOST_PP_INC_73 74\n# define BOOST_PP_INC_74 75\n# define BOOST_PP_INC_75 76\n# define BOOST_PP_INC_76 77\n# define BOOST_PP_INC_77 78\n# define BOOST_PP_INC_78 79\n# define BOOST_PP_INC_79 80\n# define BOOST_PP_INC_80 81\n# define BOOST_PP_INC_81 82\n# define BOOST_PP_INC_82 83\n# define BOOST_PP_INC_83 84\n# define BOOST_PP_INC_84 85\n# define BOOST_PP_INC_85 86\n# define BOOST_PP_INC_86 87\n# define BOOST_PP_INC_87 88\n# define BOOST_PP_INC_88 89\n# define BOOST_PP_INC_89 90\n# define BOOST_PP_INC_90 91\n# define BOOST_PP_INC_91 92\n# define BOOST_PP_INC_92 93\n# define BOOST_PP_INC_93 94\n# define BOOST_PP_INC_94 95\n# define BOOST_PP_INC_95 96\n# define BOOST_PP_INC_96 97\n# define BOOST_PP_INC_97 98\n# define BOOST_PP_INC_98 99\n# define BOOST_PP_INC_99 100\n# define BOOST_PP_INC_100 101\n# define BOOST_PP_INC_101 102\n# define BOOST_PP_INC_102 103\n# define BOOST_PP_INC_103 104\n# define BOOST_PP_INC_104 105\n# define BOOST_PP_INC_105 106\n# define BOOST_PP_INC_106 107\n# define BOOST_PP_INC_107 108\n# define BOOST_PP_INC_108 109\n# define BOOST_PP_INC_109 110\n# define BOOST_PP_INC_110 111\n# define BOOST_PP_INC_111 112\n# define BOOST_PP_INC_112 113\n# define BOOST_PP_INC_113 114\n# define BOOST_PP_INC_114 115\n# define BOOST_PP_INC_115 116\n# define BOOST_PP_INC_116 117\n# define BOOST_PP_INC_117 118\n# define BOOST_PP_INC_118 119\n# define BOOST_PP_INC_119 120\n# define BOOST_PP_INC_120 121\n# define BOOST_PP_INC_121 122\n# define BOOST_PP_INC_122 123\n# define BOOST_PP_INC_123 124\n# define BOOST_PP_INC_124 125\n# define BOOST_PP_INC_125 126\n# define BOOST_PP_INC_126 127\n# define BOOST_PP_INC_127 128\n# define BOOST_PP_INC_128 129\n# define BOOST_PP_INC_129 130\n# define BOOST_PP_INC_130 131\n# define BOOST_PP_INC_131 132\n# define BOOST_PP_INC_132 133\n# define BOOST_PP_INC_133 134\n# define BOOST_PP_INC_134 135\n# define BOOST_PP_INC_135 136\n# define BOOST_PP_INC_136 137\n# define BOOST_PP_INC_137 138\n# define BOOST_PP_INC_138 139\n# define BOOST_PP_INC_139 140\n# define BOOST_PP_INC_140 141\n# define BOOST_PP_INC_141 142\n# define BOOST_PP_INC_142 143\n# define BOOST_PP_INC_143 144\n# define BOOST_PP_INC_144 145\n# define BOOST_PP_INC_145 146\n# define BOOST_PP_INC_146 147\n# define BOOST_PP_INC_147 148\n# define BOOST_PP_INC_148 149\n# define BOOST_PP_INC_149 150\n# define BOOST_PP_INC_150 151\n# define BOOST_PP_INC_151 152\n# define BOOST_PP_INC_152 153\n# define BOOST_PP_INC_153 154\n# define BOOST_PP_INC_154 155\n# define BOOST_PP_INC_155 156\n# define BOOST_PP_INC_156 157\n# define BOOST_PP_INC_157 158\n# define BOOST_PP_INC_158 159\n# define BOOST_PP_INC_159 160\n# define BOOST_PP_INC_160 161\n# define BOOST_PP_INC_161 162\n# define BOOST_PP_INC_162 163\n# define BOOST_PP_INC_163 164\n# define BOOST_PP_INC_164 165\n# define BOOST_PP_INC_165 166\n# define BOOST_PP_INC_166 167\n# define BOOST_PP_INC_167 168\n# define BOOST_PP_INC_168 169\n# define BOOST_PP_INC_169 170\n# define BOOST_PP_INC_170 171\n# define BOOST_PP_INC_171 172\n# define BOOST_PP_INC_172 173\n# define BOOST_PP_INC_173 174\n# define BOOST_PP_INC_174 175\n# define BOOST_PP_INC_175 176\n# define BOOST_PP_INC_176 177\n# define BOOST_PP_INC_177 178\n# define BOOST_PP_INC_178 179\n# define BOOST_PP_INC_179 180\n# define BOOST_PP_INC_180 181\n# define BOOST_PP_INC_181 182\n# define BOOST_PP_INC_182 183\n# define BOOST_PP_INC_183 184\n# define BOOST_PP_INC_184 185\n# define BOOST_PP_INC_185 186\n# define BOOST_PP_INC_186 187\n# define BOOST_PP_INC_187 188\n# define BOOST_PP_INC_188 189\n# define BOOST_PP_INC_189 190\n# define BOOST_PP_INC_190 191\n# define BOOST_PP_INC_191 192\n# define BOOST_PP_INC_192 193\n# define BOOST_PP_INC_193 194\n# define BOOST_PP_INC_194 195\n# define BOOST_PP_INC_195 196\n# define BOOST_PP_INC_196 197\n# define BOOST_PP_INC_197 198\n# define BOOST_PP_INC_198 199\n# define BOOST_PP_INC_199 200\n# define BOOST_PP_INC_200 201\n# define BOOST_PP_INC_201 202\n# define BOOST_PP_INC_202 203\n# define BOOST_PP_INC_203 204\n# define BOOST_PP_INC_204 205\n# define BOOST_PP_INC_205 206\n# define BOOST_PP_INC_206 207\n# define BOOST_PP_INC_207 208\n# define BOOST_PP_INC_208 209\n# define BOOST_PP_INC_209 210\n# define BOOST_PP_INC_210 211\n# define BOOST_PP_INC_211 212\n# define BOOST_PP_INC_212 213\n# define BOOST_PP_INC_213 214\n# define BOOST_PP_INC_214 215\n# define BOOST_PP_INC_215 216\n# define BOOST_PP_INC_216 217\n# define BOOST_PP_INC_217 218\n# define BOOST_PP_INC_218 219\n# define BOOST_PP_INC_219 220\n# define BOOST_PP_INC_220 221\n# define BOOST_PP_INC_221 222\n# define BOOST_PP_INC_222 223\n# define BOOST_PP_INC_223 224\n# define BOOST_PP_INC_224 225\n# define BOOST_PP_INC_225 226\n# define BOOST_PP_INC_226 227\n# define BOOST_PP_INC_227 228\n# define BOOST_PP_INC_228 229\n# define BOOST_PP_INC_229 230\n# define BOOST_PP_INC_230 231\n# define BOOST_PP_INC_231 232\n# define BOOST_PP_INC_232 233\n# define BOOST_PP_INC_233 234\n# define BOOST_PP_INC_234 235\n# define BOOST_PP_INC_235 236\n# define BOOST_PP_INC_236 237\n# define BOOST_PP_INC_237 238\n# define BOOST_PP_INC_238 239\n# define BOOST_PP_INC_239 240\n# define BOOST_PP_INC_240 241\n# define BOOST_PP_INC_241 242\n# define BOOST_PP_INC_242 243\n# define BOOST_PP_INC_243 244\n# define BOOST_PP_INC_244 245\n# define BOOST_PP_INC_245 246\n# define BOOST_PP_INC_246 247\n# define BOOST_PP_INC_247 248\n# define BOOST_PP_INC_248 249\n# define BOOST_PP_INC_249 250\n# define BOOST_PP_INC_250 251\n# define BOOST_PP_INC_251 252\n# define BOOST_PP_INC_252 253\n# define BOOST_PP_INC_253 254\n# define BOOST_PP_INC_254 255\n# define BOOST_PP_INC_255 256\n# define BOOST_PP_INC_256 256\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/mod.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_MOD_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_MOD_HPP\n#\n# include <boost/preprocessor/arithmetic/detail/div_base.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_MOD */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MOD(x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE(x, y))\n# else\n#    define BOOST_PP_MOD(x, y) BOOST_PP_MOD_I(x, y)\n#    define BOOST_PP_MOD_I(x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE(x, y))\n# endif\n#\n# /* BOOST_PP_MOD_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MOD_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE_D(d, x, y))\n# else\n#    define BOOST_PP_MOD_D(d, x, y) BOOST_PP_MOD_D_I(d, x, y)\n#    define BOOST_PP_MOD_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_DIV_BASE_D(d, x, y))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/mul.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_MUL_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_MUL_HPP\n#\n# include <boost/preprocessor/arithmetic/add.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_MUL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MUL(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))\n# else\n#    define BOOST_PP_MUL(x, y) BOOST_PP_MUL_I(x, y)\n#    define BOOST_PP_MUL_I(x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))\n# endif\n#\n# define BOOST_PP_MUL_P(d, rxy) BOOST_PP_TUPLE_ELEM(3, 2, rxy)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_MUL_O(d, rxy) BOOST_PP_MUL_O_IM(d, BOOST_PP_TUPLE_REM_3 rxy)\n#    define BOOST_PP_MUL_O_IM(d, im) BOOST_PP_MUL_O_I(d, im)\n# else\n#    define BOOST_PP_MUL_O(d, rxy) BOOST_PP_MUL_O_I(d, BOOST_PP_TUPLE_ELEM(3, 0, rxy), BOOST_PP_TUPLE_ELEM(3, 1, rxy), BOOST_PP_TUPLE_ELEM(3, 2, rxy))\n# endif\n#\n# define BOOST_PP_MUL_O_I(d, r, x, y) (BOOST_PP_ADD_D(d, r, x), x, BOOST_PP_DEC(y))\n#\n# /* BOOST_PP_MUL_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MUL_D(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))\n# else\n#    define BOOST_PP_MUL_D(d, x, y) BOOST_PP_MUL_D_I(d, x, y)\n#    define BOOST_PP_MUL_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_MUL_P, BOOST_PP_MUL_O, (0, x, y)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic/sub.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_SUB_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_SUB_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_SUB */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SUB(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# else\n#    define BOOST_PP_SUB(x, y) BOOST_PP_SUB_I(x, y)\n#    define BOOST_PP_SUB_I(x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# endif\n#\n# define BOOST_PP_SUB_P(d, xy) BOOST_PP_TUPLE_ELEM(2, 1, xy)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SUB_O(d, xy) BOOST_PP_SUB_O_I xy\n# else\n#    define BOOST_PP_SUB_O(d, xy) BOOST_PP_SUB_O_I(BOOST_PP_TUPLE_ELEM(2, 0, xy), BOOST_PP_TUPLE_ELEM(2, 1, xy))\n# endif\n#\n# define BOOST_PP_SUB_O_I(x, y) (BOOST_PP_DEC(x), BOOST_PP_DEC(y))\n#\n# /* BOOST_PP_SUB_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SUB_D(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# else\n#    define BOOST_PP_SUB_D(d, x, y) BOOST_PP_SUB_D_I(d, x, y)\n#    define BOOST_PP_SUB_D_I(d, x, y) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_SUB_P, BOOST_PP_SUB_O, (x, y)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/arithmetic.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARITHMETIC_HPP\n# define BOOST_PREPROCESSOR_ARITHMETIC_HPP\n#\n# include <boost/preprocessor/arithmetic/add.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/div.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/arithmetic/mod.hpp>\n# include <boost/preprocessor/arithmetic/mul.hpp>\n# include <boost/preprocessor/arithmetic/sub.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/data.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_DATA_HPP\n# define BOOST_PREPROCESSOR_ARRAY_DATA_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_DATA */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_DATA(array) BOOST_PP_TUPLE_ELEM(2, 1, array)\n# else\n#    define BOOST_PP_ARRAY_DATA(array) BOOST_PP_ARRAY_DATA_I(array)\n#    define BOOST_PP_ARRAY_DATA_I(array) BOOST_PP_ARRAY_DATA_II array\n#    define BOOST_PP_ARRAY_DATA_II(size, data) data\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/detail/get_data.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP\n# define BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/facilities/is_1.hpp>\n#\n# /* BOOST_PP_ARRAY_DETAIL_GET_DATA */\n#\n# define BOOST_PP_ARRAY_DETAIL_GET_DATA_NONE(size, data)\n\n# if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400)\n# \t if BOOST_PP_VARIADICS_MSVC\n# \t\tdefine BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_DEFAULT(size, data) BOOST_PP_TUPLE_REM(size) data\n# \t\tdefine BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_CAT(size, data) BOOST_PP_TUPLE_REM_CAT(size) data\n# \t\tdefine BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) \\\n\t\t\tBOOST_PP_IIF \\\n\t\t\t\t( \\\n\t\t\t\tBOOST_PP_IS_1(size), \\\n\t\t\t\tBOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_CAT, \\\n\t\t\t\tBOOST_PP_ARRAY_DETAIL_GET_DATA_ANY_VC_DEFAULT \\\n\t\t\t\t) \\\n\t\t\t(size,data) \\\n/**/\n#    else\n# \t\tdefine BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) BOOST_PP_TUPLE_REM(size) data\n#    endif\n# else\n# \t define BOOST_PP_ARRAY_DETAIL_GET_DATA_ANY(size, data) BOOST_PP_TUPLE_REM(size) data\n# endif\n\n# define BOOST_PP_ARRAY_DETAIL_GET_DATA(size, data) \\\n\tBOOST_PP_IF \\\n\t\t( \\\n\t\tsize, \\\n\t\tBOOST_PP_ARRAY_DETAIL_GET_DATA_ANY, \\\n\t\tBOOST_PP_ARRAY_DETAIL_GET_DATA_NONE \\\n\t\t) \\\n\t(size,data) \\\n/**/\n#\n# endif /* BOOST_PREPROCESSOR_ARRAY_DETAIL_GET_DATA_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/elem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_ELEM_HPP\n# define BOOST_PREPROCESSOR_ARRAY_ELEM_HPP\n#\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_ELEM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_ELEM(i, array) BOOST_PP_TUPLE_ELEM(BOOST_PP_ARRAY_SIZE(array), i, BOOST_PP_ARRAY_DATA(array))\n# else\n#    define BOOST_PP_ARRAY_ELEM(i, array) BOOST_PP_ARRAY_ELEM_I(i, array)\n#    define BOOST_PP_ARRAY_ELEM_I(i, array) BOOST_PP_TUPLE_ELEM(BOOST_PP_ARRAY_SIZE(array), i, BOOST_PP_ARRAY_DATA(array))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/enum.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_ENUM_HPP\n# define BOOST_PREPROCESSOR_ARRAY_ENUM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ARRAY_ENUM */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_ARRAY_ENUM(array) BOOST_PP_ARRAY_ENUM_I(BOOST_PP_TUPLE_REM_CTOR, array)\n#    define BOOST_PP_ARRAY_ENUM_I(m, args) BOOST_PP_ARRAY_ENUM_II(m, args)\n#    define BOOST_PP_ARRAY_ENUM_II(m, args) BOOST_PP_CAT(m ## args,)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_ARRAY_ENUM(array) BOOST_PP_ARRAY_ENUM_I(array)\n#    define BOOST_PP_ARRAY_ENUM_I(array) BOOST_PP_TUPLE_REM_CTOR ## array\n# else\n#    define BOOST_PP_ARRAY_ENUM(array) BOOST_PP_TUPLE_REM_CTOR array\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/insert.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_INSERT_HPP\n# define BOOST_PREPROCESSOR_ARRAY_INSERT_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/push_back.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/control/deduce_d.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_INSERT */\n#\n# define BOOST_PP_ARRAY_INSERT(array, i, elem) BOOST_PP_ARRAY_INSERT_I(BOOST_PP_DEDUCE_D(), array, i, elem)\n# define BOOST_PP_ARRAY_INSERT_I(d, array, i, elem) BOOST_PP_ARRAY_INSERT_D(d, array, i, elem)\n#\n# /* BOOST_PP_ARRAY_INSERT_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_INSERT_D(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_INSERT_P, BOOST_PP_ARRAY_INSERT_O, (0, i, elem, (0, ()), array)))\n# else\n#    define BOOST_PP_ARRAY_INSERT_D(d, array, i, elem) BOOST_PP_ARRAY_INSERT_D_I(d, array, i, elem)\n#    define BOOST_PP_ARRAY_INSERT_D_I(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_INSERT_P, BOOST_PP_ARRAY_INSERT_O, (0, i, elem, (0, ()), array)))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ARRAY_INSERT_P(d, state) BOOST_PP_ARRAY_INSERT_P_I state\n# else\n#    define BOOST_PP_ARRAY_INSERT_P(d, state) BOOST_PP_ARRAY_INSERT_P_I(nil, nil, nil, BOOST_PP_TUPLE_ELEM(5, 3, state), BOOST_PP_TUPLE_ELEM(5, 4, state))\n# endif\n#\n# define BOOST_PP_ARRAY_INSERT_P_I(_i, _ii, _iii, res, arr) BOOST_PP_NOT_EQUAL(BOOST_PP_ARRAY_SIZE(res), BOOST_PP_INC(BOOST_PP_ARRAY_SIZE(arr)))\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ARRAY_INSERT_O(d, state) BOOST_PP_ARRAY_INSERT_O_I state\n# else\n#    define BOOST_PP_ARRAY_INSERT_O(d, state) BOOST_PP_ARRAY_INSERT_O_I(BOOST_PP_TUPLE_ELEM(5, 0, state), BOOST_PP_TUPLE_ELEM(5, 1, state), BOOST_PP_TUPLE_ELEM(5, 2, state), BOOST_PP_TUPLE_ELEM(5, 3, state), BOOST_PP_TUPLE_ELEM(5, 4, state))\n# endif\n#\n# define BOOST_PP_ARRAY_INSERT_O_I(n, i, elem, res, arr) (BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(BOOST_PP_ARRAY_SIZE(res), i), BOOST_PP_INC(n), n), i, elem, BOOST_PP_ARRAY_PUSH_BACK(res, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(BOOST_PP_ARRAY_SIZE(res), i), BOOST_PP_ARRAY_ELEM(n, arr), elem)), arr)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/pop_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_POP_BACK_HPP\n# define BOOST_PREPROCESSOR_ARRAY_POP_BACK_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/repetition/enum.hpp>\n# include <boost/preprocessor/repetition/deduce_z.hpp>\n#\n# /* BOOST_PP_ARRAY_POP_BACK */\n#\n# define BOOST_PP_ARRAY_POP_BACK(array) BOOST_PP_ARRAY_POP_BACK_Z(BOOST_PP_DEDUCE_Z(), array)\n#\n# /* BOOST_PP_ARRAY_POP_BACK_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_POP_BACK_Z(z, array) BOOST_PP_ARRAY_POP_BACK_I(z, BOOST_PP_ARRAY_SIZE(array), array)\n# else\n#    define BOOST_PP_ARRAY_POP_BACK_Z(z, array) BOOST_PP_ARRAY_POP_BACK_Z_D(z, array)\n#    define BOOST_PP_ARRAY_POP_BACK_Z_D(z, array) BOOST_PP_ARRAY_POP_BACK_I(z, BOOST_PP_ARRAY_SIZE(array), array)\n# endif\n#\n# define BOOST_PP_ARRAY_POP_BACK_I(z, size, array) (BOOST_PP_DEC(size), (BOOST_PP_ENUM_ ## z(BOOST_PP_DEC(size), BOOST_PP_ARRAY_POP_BACK_M, array)))\n# define BOOST_PP_ARRAY_POP_BACK_M(z, n, data) BOOST_PP_ARRAY_ELEM(n, data)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/pop_front.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_POP_FRONT_HPP\n# define BOOST_PREPROCESSOR_ARRAY_POP_FRONT_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/repetition/enum.hpp>\n# include <boost/preprocessor/repetition/deduce_z.hpp>\n#\n# /* BOOST_PP_ARRAY_POP_FRONT */\n#\n# define BOOST_PP_ARRAY_POP_FRONT(array) BOOST_PP_ARRAY_POP_FRONT_Z(BOOST_PP_DEDUCE_Z(), array)\n#\n# /* BOOST_PP_ARRAY_POP_FRONT_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_POP_FRONT_Z(z, array) BOOST_PP_ARRAY_POP_FRONT_I(z, BOOST_PP_ARRAY_SIZE(array), array)\n# else\n#    define BOOST_PP_ARRAY_POP_FRONT_Z(z, array) BOOST_PP_ARRAY_POP_FRONT_Z_D(z, array)\n#    define BOOST_PP_ARRAY_POP_FRONT_Z_D(z, array) BOOST_PP_ARRAY_POP_FRONT_I(z, BOOST_PP_ARRAY_SIZE(array), array)\n# endif\n#\n# define BOOST_PP_ARRAY_POP_FRONT_I(z, size, array) (BOOST_PP_DEC(size), (BOOST_PP_ENUM_ ## z(BOOST_PP_DEC(size), BOOST_PP_ARRAY_POP_FRONT_M, array)))\n# define BOOST_PP_ARRAY_POP_FRONT_M(z, n, data) BOOST_PP_ARRAY_ELEM(BOOST_PP_INC(n), data)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/push_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_PUSH_BACK_HPP\n# define BOOST_PREPROCESSOR_ARRAY_PUSH_BACK_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/array/detail/get_data.hpp>\n#\n# /* BOOST_PP_ARRAY_PUSH_BACK */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_PUSH_BACK(array, elem) BOOST_PP_ARRAY_PUSH_BACK_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)\n# else\n#    define BOOST_PP_ARRAY_PUSH_BACK(array, elem) BOOST_PP_ARRAY_PUSH_BACK_D(array, elem)\n#    define BOOST_PP_ARRAY_PUSH_BACK_D(array, elem) BOOST_PP_ARRAY_PUSH_BACK_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)\n# endif\n#\n# define BOOST_PP_ARRAY_PUSH_BACK_I(size, data, elem) (BOOST_PP_INC(size), (BOOST_PP_ARRAY_DETAIL_GET_DATA(size,data) BOOST_PP_COMMA_IF(size) elem))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/push_front.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_PUSH_FRONT_HPP\n# define BOOST_PREPROCESSOR_ARRAY_PUSH_FRONT_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/array/detail/get_data.hpp>\n#\n# /* BOOST_PP_ARRAY_PUSH_FRONT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_PUSH_FRONT(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)\n# else\n#    define BOOST_PP_ARRAY_PUSH_FRONT(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_D(array, elem)\n#    define BOOST_PP_ARRAY_PUSH_FRONT_D(array, elem) BOOST_PP_ARRAY_PUSH_FRONT_I(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array), elem)\n# endif\n#\n# define BOOST_PP_ARRAY_PUSH_FRONT_I(size, data, elem) (BOOST_PP_INC(size), (elem BOOST_PP_COMMA_IF(size) BOOST_PP_ARRAY_DETAIL_GET_DATA(size,data)))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/remove.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_REMOVE_HPP\n# define BOOST_PREPROCESSOR_ARRAY_REMOVE_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/push_back.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/control/deduce_d.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_REMOVE */\n#\n# define BOOST_PP_ARRAY_REMOVE(array, i) BOOST_PP_ARRAY_REMOVE_I(BOOST_PP_DEDUCE_D(), array, i)\n# define BOOST_PP_ARRAY_REMOVE_I(d, array, i) BOOST_PP_ARRAY_REMOVE_D(d, array, i)\n#\n# /* BOOST_PP_ARRAY_REMOVE_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_REMOVE_D(d, array, i) BOOST_PP_TUPLE_ELEM(4, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REMOVE_P, BOOST_PP_ARRAY_REMOVE_O, (0, i, (0, ()), array)))\n# else\n#    define BOOST_PP_ARRAY_REMOVE_D(d, array, i) BOOST_PP_ARRAY_REMOVE_D_I(d, array, i)\n#    define BOOST_PP_ARRAY_REMOVE_D_I(d, array, i) BOOST_PP_TUPLE_ELEM(4, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REMOVE_P, BOOST_PP_ARRAY_REMOVE_O, (0, i, (0, ()), array)))\n# endif\n#\n# define BOOST_PP_ARRAY_REMOVE_P(d, st) BOOST_PP_NOT_EQUAL(BOOST_PP_TUPLE_ELEM(4, 0, st), BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_ELEM(4, 3, st)))\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ARRAY_REMOVE_O(d, st) BOOST_PP_ARRAY_REMOVE_O_I st\n# else\n#    define BOOST_PP_ARRAY_REMOVE_O(d, st) BOOST_PP_ARRAY_REMOVE_O_I(BOOST_PP_TUPLE_ELEM(4, 0, st), BOOST_PP_TUPLE_ELEM(4, 1, st), BOOST_PP_TUPLE_ELEM(4, 2, st), BOOST_PP_TUPLE_ELEM(4, 3, st))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_ARRAY_REMOVE_O_I(n, i, res, arr) (BOOST_PP_INC(n), i, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(n, i), BOOST_PP_ARRAY_PUSH_BACK, res BOOST_PP_TUPLE_EAT_2)(res, BOOST_PP_ARRAY_ELEM(n, arr)), arr)\n# else\n#    define BOOST_PP_ARRAY_REMOVE_O_I(n, i, res, arr) (BOOST_PP_INC(n), i, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(n, i), BOOST_PP_ARRAY_PUSH_BACK, BOOST_PP_TUPLE_ELEM_2_0)(res, BOOST_PP_ARRAY_ELEM(n, arr)), arr)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/replace.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_REPLACE_HPP\n# define BOOST_PREPROCESSOR_ARRAY_REPLACE_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/push_back.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/deduce_d.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_REPLACE */\n#\n# define BOOST_PP_ARRAY_REPLACE(array, i, elem) BOOST_PP_ARRAY_REPLACE_I(BOOST_PP_DEDUCE_D(), array, i, elem)\n# define BOOST_PP_ARRAY_REPLACE_I(d, array, i, elem) BOOST_PP_ARRAY_REPLACE_D(d, array, i, elem)\n#\n# /* BOOST_PP_ARRAY_REPLACE_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_REPLACE_D(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REPLACE_P, BOOST_PP_ARRAY_REPLACE_O, (0, i, elem, (0, ()), array)))\n# else\n#    define BOOST_PP_ARRAY_REPLACE_D(d, array, i, elem) BOOST_PP_ARRAY_REPLACE_D_I(d, array, i, elem)\n#    define BOOST_PP_ARRAY_REPLACE_D_I(d, array, i, elem) BOOST_PP_TUPLE_ELEM(5, 3, BOOST_PP_WHILE_ ## d(BOOST_PP_ARRAY_REPLACE_P, BOOST_PP_ARRAY_REPLACE_O, (0, i, elem, (0, ()), array)))\n# endif\n#\n# define BOOST_PP_ARRAY_REPLACE_P(d, state) BOOST_PP_NOT_EQUAL(BOOST_PP_TUPLE_ELEM(5, 0, state), BOOST_PP_ARRAY_SIZE(BOOST_PP_TUPLE_ELEM(5, 4, state)))\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ARRAY_REPLACE_O(d, state) BOOST_PP_ARRAY_REPLACE_O_I state\n# else\n#    define BOOST_PP_ARRAY_REPLACE_O(d, state) BOOST_PP_ARRAY_REPLACE_O_I(BOOST_PP_TUPLE_ELEM(5, 0, state), BOOST_PP_TUPLE_ELEM(5, 1, state), BOOST_PP_TUPLE_ELEM(5, 2, state), BOOST_PP_TUPLE_ELEM(5, 3, state), BOOST_PP_TUPLE_ELEM(5, 4, state))\n# endif\n#\n# define BOOST_PP_ARRAY_REPLACE_O_I(n, i, elem, res, arr) (BOOST_PP_INC(n), i, elem, BOOST_PP_ARRAY_PUSH_BACK(res, BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(n, i), BOOST_PP_ARRAY_ELEM(n, arr), elem)), arr)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/reverse.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_REVERSE_HPP\n# define BOOST_PREPROCESSOR_ARRAY_REVERSE_HPP\n#\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/reverse.hpp>\n#\n# /* BOOST_PP_ARRAY_REVERSE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_REVERSE(array) (BOOST_PP_ARRAY_SIZE(array), BOOST_PP_TUPLE_REVERSE(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array)))\n# else\n#    define BOOST_PP_ARRAY_REVERSE(array) BOOST_PP_ARRAY_REVERSE_I(array)\n#    define BOOST_PP_ARRAY_REVERSE_I(array) (BOOST_PP_ARRAY_SIZE(array), BOOST_PP_TUPLE_REVERSE(BOOST_PP_ARRAY_SIZE(array), BOOST_PP_ARRAY_DATA(array)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_SIZE_HPP\n# define BOOST_PREPROCESSOR_ARRAY_SIZE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ARRAY_SIZE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ARRAY_SIZE(array) BOOST_PP_TUPLE_ELEM(2, 0, array)\n# else\n#    define BOOST_PP_ARRAY_SIZE(array) BOOST_PP_ARRAY_SIZE_I(array)\n#    define BOOST_PP_ARRAY_SIZE_I(array) BOOST_PP_ARRAY_SIZE_II array\n#    define BOOST_PP_ARRAY_SIZE_II(size, data) size\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/to_list.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_TO_LIST_HPP\n# define BOOST_PREPROCESSOR_ARRAY_TO_LIST_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/to_list.hpp>\n#\n# /* BOOST_PP_ARRAY_TO_LIST */\n#\n#    define BOOST_PP_ARRAY_TO_LIST(array) \\\n\t\tBOOST_PP_IF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_ARRAY_SIZE(array), \\\n\t\t\tBOOST_PP_ARRAY_TO_LIST_DO, \\\n\t\t\tBOOST_PP_ARRAY_TO_LIST_EMPTY \\\n\t\t\t) \\\n\t\t(array) \\\n/**/\n#\n#    define BOOST_PP_ARRAY_TO_LIST_EMPTY(array) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_ARRAY_TO_LIST_DO(array) BOOST_PP_ARRAY_TO_LIST_I(BOOST_PP_TUPLE_TO_LIST, array)\n#    define BOOST_PP_ARRAY_TO_LIST_I(m, args) BOOST_PP_ARRAY_TO_LIST_II(m, args)\n#    define BOOST_PP_ARRAY_TO_LIST_II(m, args) BOOST_PP_CAT(m ## args,)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_ARRAY_TO_LIST_DO(array) BOOST_PP_ARRAY_TO_LIST_I(array)\n#    define BOOST_PP_ARRAY_TO_LIST_I(array) BOOST_PP_TUPLE_TO_LIST ## array\n# else\n#    define BOOST_PP_ARRAY_TO_LIST_DO(array) BOOST_PP_TUPLE_TO_LIST array\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/to_seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_TO_SEQ_HPP\n# define BOOST_PREPROCESSOR_ARRAY_TO_SEQ_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/to_seq.hpp>\n#\n# /* BOOST_PP_ARRAY_TO_SEQ */\n#\n#    define BOOST_PP_ARRAY_TO_SEQ(array) \\\n\t\tBOOST_PP_IF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_ARRAY_SIZE(array), \\\n\t\t\tBOOST_PP_ARRAY_TO_SEQ_DO, \\\n\t\t\tBOOST_PP_ARRAY_TO_SEQ_EMPTY \\\n\t\t\t) \\\n\t\t(array) \\\n/**/\n#    define BOOST_PP_ARRAY_TO_SEQ_EMPTY(array)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_ARRAY_TO_SEQ_DO(array) BOOST_PP_ARRAY_TO_SEQ_I(BOOST_PP_TUPLE_TO_SEQ, array)\n#    define BOOST_PP_ARRAY_TO_SEQ_I(m, args) BOOST_PP_ARRAY_TO_SEQ_II(m, args)\n#    define BOOST_PP_ARRAY_TO_SEQ_II(m, args) BOOST_PP_CAT(m ## args,)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_ARRAY_TO_SEQ_DO(array) BOOST_PP_ARRAY_TO_SEQ_I(array)\n#    define BOOST_PP_ARRAY_TO_SEQ_I(array) BOOST_PP_TUPLE_TO_SEQ ## array\n# else\n#    define BOOST_PP_ARRAY_TO_SEQ_DO(array) BOOST_PP_TUPLE_TO_SEQ array\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array/to_tuple.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_TO_TUPLE_HPP\n# define BOOST_PREPROCESSOR_ARRAY_TO_TUPLE_HPP\n#\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/control/if.hpp>\n#\n# /* BOOST_PP_ARRAY_TO_TUPLE */\n#\n#    define BOOST_PP_ARRAY_TO_TUPLE(array) \\\n\t\tBOOST_PP_IF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_ARRAY_SIZE(array), \\\n\t\t\tBOOST_PP_ARRAY_DATA, \\\n\t\t\tBOOST_PP_ARRAY_TO_TUPLE_EMPTY \\\n\t\t\t) \\\n\t\t(array) \\\n/**/\n#    define BOOST_PP_ARRAY_TO_TUPLE_EMPTY(array)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/array.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ARRAY_HPP\n# define BOOST_PREPROCESSOR_ARRAY_HPP\n#\n# include <boost/preprocessor/array/data.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/enum.hpp>\n# include <boost/preprocessor/array/insert.hpp>\n# include <boost/preprocessor/array/pop_back.hpp>\n# include <boost/preprocessor/array/pop_front.hpp>\n# include <boost/preprocessor/array/push_back.hpp>\n# include <boost/preprocessor/array/push_front.hpp>\n# include <boost/preprocessor/array/remove.hpp>\n# include <boost/preprocessor/array/replace.hpp>\n# include <boost/preprocessor/array/reverse.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/array/to_list.hpp>\n# include <boost/preprocessor/array/to_seq.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/assert_msg.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ASSERT_MSG_HPP\n# define BOOST_PREPROCESSOR_ASSERT_MSG_HPP\n#\n# include <boost/preprocessor/debug/assert.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/cat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CAT_HPP\n# define BOOST_PREPROCESSOR_CAT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_CAT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b)\n# else\n#    define BOOST_PP_CAT(a, b) BOOST_PP_CAT_OO((a, b))\n#    define BOOST_PP_CAT_OO(par) BOOST_PP_CAT_I ## par\n# endif\n#\n# if (~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1700)\n#    define BOOST_PP_CAT_I(a, b) a ## b\n# else\n#    define BOOST_PP_CAT_I(a, b) BOOST_PP_CAT_II(~, a ## b)\n#    define BOOST_PP_CAT_II(p, res) res\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comma.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMMA_HPP\n# define BOOST_PREPROCESSOR_COMMA_HPP\n#\n# include <boost/preprocessor/punctuation/comma.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comma_if.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMMA_IF_HPP\n# define BOOST_PREPROCESSOR_COMMA_IF_HPP\n#\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison/equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_EQUAL_HPP\n#\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n#\n# /* BOOST_PP_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_EQUAL(x, y) BOOST_PP_COMPL(BOOST_PP_NOT_EQUAL(x, y))\n# else\n#    define BOOST_PP_EQUAL(x, y) BOOST_PP_EQUAL_I(x, y)\n#    define BOOST_PP_EQUAL_I(x, y) BOOST_PP_COMPL(BOOST_PP_NOT_EQUAL(x, y))\n# endif\n#\n# /* BOOST_PP_EQUAL_D */\n#\n# define BOOST_PP_EQUAL_D(d, x, y) BOOST_PP_EQUAL(x, y)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison/greater.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_GREATER_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_GREATER_HPP\n#\n# include <boost/preprocessor/comparison/less.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_GREATER */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_GREATER(x, y) BOOST_PP_LESS(y, x)\n# else\n#    define BOOST_PP_GREATER(x, y) BOOST_PP_GREATER_I(x, y)\n#    define BOOST_PP_GREATER_I(x, y) BOOST_PP_LESS(y, x)\n# endif\n#\n# /* BOOST_PP_GREATER_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_GREATER_D(d, x, y) BOOST_PP_LESS_D(d, y, x)\n# else\n#    define BOOST_PP_GREATER_D(d, x, y) BOOST_PP_GREATER_D_I(d, x, y)\n#    define BOOST_PP_GREATER_D_I(d, x, y) BOOST_PP_LESS_D(d, y, x)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison/greater_equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_GREATER_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_GREATER_EQUAL_HPP\n#\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_GREATER_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_GREATER_EQUAL(x, y) BOOST_PP_LESS_EQUAL(y, x)\n# else\n#    define BOOST_PP_GREATER_EQUAL(x, y) BOOST_PP_GREATER_EQUAL_I(x, y)\n#    define BOOST_PP_GREATER_EQUAL_I(x, y) BOOST_PP_LESS_EQUAL(y, x)\n# endif\n#\n# /* BOOST_PP_GREATER_EQUAL_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_GREATER_EQUAL_D(d, x, y) BOOST_PP_LESS_EQUAL_D(d, y, x)\n# else\n#    define BOOST_PP_GREATER_EQUAL_D(d, x, y) BOOST_PP_GREATER_EQUAL_D_I(d, x, y)\n#    define BOOST_PP_GREATER_EQUAL_D_I(d, x, y) BOOST_PP_LESS_EQUAL_D(d, y, x)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison/less.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_LESS_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_LESS_HPP\n#\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_LESS */\n#\n# if BOOST_PP_CONFIG_FLAGS() & (BOOST_PP_CONFIG_MWCC() | BOOST_PP_CONFIG_DMC())\n#    define BOOST_PP_LESS(x, y) BOOST_PP_BITAND(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL(x, y))\n# elif ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LESS(x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL, 0 BOOST_PP_TUPLE_EAT_2)(x, y)\n# else\n#    define BOOST_PP_LESS(x, y) BOOST_PP_LESS_I(x, y)\n#    define BOOST_PP_LESS_I(x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL, 0 BOOST_PP_TUPLE_EAT_2)(x, y)\n# endif\n#\n# /* BOOST_PP_LESS_D */\n#\n# if BOOST_PP_CONFIG_FLAGS() & (BOOST_PP_CONFIG_MWCC() | BOOST_PP_CONFIG_DMC())\n#    define BOOST_PP_LESS_D(d, x, y) BOOST_PP_BITAND(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL_D(d, x, y))\n# elif ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LESS_D(d, x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL_D, 0 BOOST_PP_TUPLE_EAT_3)(d, x, y)\n# else\n#    define BOOST_PP_LESS_D(d, x, y) BOOST_PP_LESS_D_I(d, x, y)\n#    define BOOST_PP_LESS_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_NOT_EQUAL(x, y), BOOST_PP_LESS_EQUAL_D, 0 BOOST_PP_TUPLE_EAT_3)(d, x, y)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison/less_equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_LESS_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_LESS_EQUAL_HPP\n#\n# include <boost/preprocessor/arithmetic/sub.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/not.hpp>\n#\n# /* BOOST_PP_LESS_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LESS_EQUAL(x, y) BOOST_PP_NOT(BOOST_PP_SUB(x, y))\n# else\n#    define BOOST_PP_LESS_EQUAL(x, y) BOOST_PP_LESS_EQUAL_I(x, y)\n#    define BOOST_PP_LESS_EQUAL_I(x, y) BOOST_PP_NOT(BOOST_PP_SUB(x, y))\n# endif\n#\n# /* BOOST_PP_LESS_EQUAL_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LESS_EQUAL_D(d, x, y) BOOST_PP_NOT(BOOST_PP_SUB_D(d, x, y))\n# else\n#    define BOOST_PP_LESS_EQUAL_D(d, x, y) BOOST_PP_LESS_EQUAL_D_I(d, x, y)\n#    define BOOST_PP_LESS_EQUAL_D_I(d, x, y) BOOST_PP_NOT(BOOST_PP_SUB_D(d, x, y))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison/not_equal.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_NOT_EQUAL_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_NOT_EQUAL_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_NOT_EQUAL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_NOT_EQUAL(x, y) BOOST_PP_NOT_EQUAL_I(x, y)\n# else\n#    define BOOST_PP_NOT_EQUAL(x, y) BOOST_PP_NOT_EQUAL_OO((x, y))\n#    define BOOST_PP_NOT_EQUAL_OO(par) BOOST_PP_NOT_EQUAL_I ## par\n# endif\n#\n# define BOOST_PP_NOT_EQUAL_I(x, y) BOOST_PP_CAT(BOOST_PP_NOT_EQUAL_CHECK_, BOOST_PP_NOT_EQUAL_ ## x(0, BOOST_PP_NOT_EQUAL_ ## y))\n#\n# /* BOOST_PP_NOT_EQUAL_D */\n#\n# define BOOST_PP_NOT_EQUAL_D(d, x, y) BOOST_PP_NOT_EQUAL(x, y)\n#\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_0(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_1(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_2(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_3(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_4(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_5(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_6(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_7(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_8(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_9(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_10(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_11(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_12(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_13(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_14(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_15(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_16(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_17(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_18(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_19(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_20(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_21(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_22(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_23(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_24(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_25(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_26(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_27(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_28(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_29(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_30(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_31(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_32(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_33(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_34(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_35(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_36(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_37(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_38(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_39(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_40(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_41(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_42(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_43(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_44(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_45(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_46(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_47(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_48(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_49(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_50(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_51(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_52(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_53(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_54(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_55(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_56(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_57(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_58(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_59(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_60(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_61(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_62(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_63(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_64(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_65(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_66(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_67(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_68(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_69(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_70(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_71(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_72(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_73(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_74(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_75(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_76(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_77(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_78(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_79(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_80(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_81(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_82(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_83(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_84(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_85(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_86(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_87(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_88(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_89(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_90(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_91(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_92(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_93(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_94(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_95(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_96(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_97(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_98(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_99(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_100(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_101(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_102(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_103(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_104(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_105(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_106(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_107(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_108(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_109(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_110(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_111(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_112(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_113(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_114(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_115(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_116(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_117(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_118(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_119(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_120(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_121(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_122(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_123(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_124(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_125(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_126(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_127(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_128(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_129(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_130(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_131(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_132(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_133(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_134(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_135(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_136(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_137(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_138(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_139(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_140(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_141(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_142(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_143(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_144(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_145(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_146(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_147(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_148(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_149(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_150(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_151(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_152(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_153(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_154(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_155(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_156(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_157(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_158(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_159(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_160(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_161(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_162(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_163(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_164(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_165(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_166(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_167(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_168(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_169(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_170(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_171(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_172(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_173(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_174(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_175(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_176(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_177(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_178(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_179(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_180(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_181(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_182(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_183(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_184(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_185(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_186(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_187(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_188(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_189(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_190(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_191(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_192(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_193(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_194(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_195(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_196(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_197(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_198(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_199(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_200(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_201(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_202(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_203(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_204(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_205(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_206(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_207(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_208(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_209(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_210(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_211(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_212(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_213(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_214(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_215(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_216(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_217(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_218(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_219(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_220(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_221(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_222(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_223(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_224(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_225(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_226(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_227(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_228(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_229(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_230(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_231(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_232(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_233(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_234(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_235(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_236(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_237(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_238(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_239(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_240(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_241(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_242(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_243(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_244(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_245(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_246(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_247(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_248(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_249(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_250(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_251(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_252(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_253(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_254(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_255(c, y) 0\n# define BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_256(c, y) 0\n#\n#if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_NOT_EQUAL_0(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_1(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_2(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_3(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_4(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_5(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_6(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_7(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_8(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_9(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_10(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_11(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_12(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_13(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_14(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_15(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_16(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_17(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_18(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_19(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_20(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_21(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_22(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_23(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_24(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_25(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_26(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_27(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_28(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_29(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_30(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_31(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_32(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_33(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_34(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_35(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_36(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_37(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_38(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_39(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_40(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_41(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_42(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_43(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_44(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_45(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_46(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_47(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_48(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_49(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_50(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_51(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_52(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_53(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_54(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_55(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_56(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_57(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_58(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_59(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_60(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_61(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_62(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_63(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_64(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_65(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_66(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_67(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_68(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_69(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_70(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_71(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_72(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_73(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_74(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_75(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_76(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_77(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_78(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_79(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_80(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_81(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_82(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_83(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_84(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_85(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_86(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_87(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_88(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_89(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_90(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_91(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_92(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_93(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_94(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_95(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_96(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_97(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_98(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_99(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_100(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_101(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_102(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_103(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_104(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_105(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_106(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_107(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_108(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_109(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_110(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_111(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_112(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_113(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_114(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_115(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_116(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_117(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_118(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_119(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_120(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_121(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_122(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_123(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_124(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_125(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_126(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_127(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_128(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_129(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_130(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_131(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_132(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_133(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_134(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_135(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_136(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_137(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_138(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_139(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_140(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_141(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_142(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_143(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_144(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_145(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_146(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_147(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_148(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_149(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_150(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_151(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_152(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_153(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_154(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_155(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_156(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_157(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_158(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_159(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_160(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_161(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_162(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_163(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_164(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_165(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_166(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_167(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_168(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_169(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_170(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_171(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_172(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_173(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_174(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_175(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_176(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_177(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_178(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_179(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_180(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_181(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_182(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_183(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_184(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_185(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_186(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_187(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_188(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_189(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_190(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_191(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_192(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_193(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_194(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_195(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_196(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_197(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_198(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_199(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_200(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_201(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_202(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_203(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_204(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_205(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_206(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_207(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_208(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_209(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_210(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_211(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_212(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_213(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_214(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_215(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_216(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_217(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_218(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_219(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_220(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_221(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_222(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_223(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_224(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_225(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_226(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_227(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_228(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_229(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_230(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_231(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_232(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_233(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_234(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_235(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_236(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_237(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_238(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_239(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_240(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_241(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_242(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_243(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_244(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_245(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_246(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_247(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_248(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_249(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_250(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_251(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_252(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_253(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_254(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_255(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_256(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y(1, BOOST_PP_NIL))\n# else\n#    define BOOST_PP_NOT_EQUAL_0(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_1(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_2(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_3(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_4(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_5(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_6(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_7(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_8(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_9(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_10(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_11(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_12(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_13(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_14(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_15(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_16(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_17(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_18(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_19(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_20(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_21(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_22(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_23(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_24(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_25(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_26(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_27(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_28(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_29(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_30(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_31(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_32(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_33(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_34(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_35(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_36(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_37(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_38(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_39(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_40(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_41(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_42(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_43(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_44(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_45(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_46(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_47(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_48(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_49(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_50(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_51(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_52(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_53(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_54(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_55(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_56(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_57(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_58(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_59(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_60(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_61(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_62(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_63(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_64(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_65(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_66(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_67(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_68(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_69(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_70(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_71(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_72(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_73(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_74(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_75(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_76(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_77(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_78(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_79(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_80(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_81(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_82(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_83(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_84(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_85(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_86(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_87(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_88(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_89(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_90(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_91(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_92(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_93(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_94(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_95(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_96(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_97(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_98(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_99(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_100(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_101(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_102(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_103(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_104(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_105(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_106(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_107(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_108(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_109(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_110(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_111(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_112(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_113(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_114(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_115(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_116(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_117(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_118(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_119(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_120(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_121(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_122(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_123(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_124(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_125(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_126(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_127(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_128(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_129(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_130(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_131(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_132(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_133(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_134(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_135(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_136(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_137(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_138(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_139(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_140(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_141(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_142(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_143(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_144(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_145(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_146(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_147(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_148(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_149(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_150(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_151(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_152(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_153(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_154(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_155(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_156(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_157(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_158(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_159(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_160(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_161(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_162(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_163(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_164(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_165(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_166(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_167(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_168(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_169(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_170(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_171(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_172(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_173(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_174(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_175(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_176(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_177(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_178(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_179(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_180(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_181(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_182(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_183(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_184(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_185(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_186(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_187(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_188(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_189(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_190(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_191(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_192(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_193(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_194(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_195(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_196(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_197(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_198(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_199(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_200(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_201(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_202(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_203(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_204(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_205(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_206(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_207(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_208(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_209(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_210(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_211(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_212(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_213(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_214(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_215(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_216(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_217(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_218(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_219(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_220(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_221(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_222(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_223(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_224(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_225(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_226(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_227(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_228(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_229(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_230(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_231(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_232(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_233(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_234(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_235(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_236(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_237(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_238(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_239(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_240(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_241(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_242(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_243(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_244(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_245(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_246(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_247(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_248(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_249(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_250(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_251(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_252(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_253(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_254(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_255(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n#    define BOOST_PP_NOT_EQUAL_256(c, y) BOOST_PP_IIF(c, BOOST_PP_NIL, y##(1, BOOST_PP_NIL))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/comparison.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_COMPARISON_HPP\n# define BOOST_PREPROCESSOR_COMPARISON_HPP\n#\n# include <boost/preprocessor/comparison/equal.hpp>\n# include <boost/preprocessor/comparison/greater.hpp>\n# include <boost/preprocessor/comparison/greater_equal.hpp>\n# include <boost/preprocessor/comparison/less.hpp>\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/config/config.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONFIG_CONFIG_HPP\n# define BOOST_PREPROCESSOR_CONFIG_CONFIG_HPP\n#\n# /* BOOST_PP_CONFIG_FLAGS */\n#\n# define BOOST_PP_CONFIG_STRICT() 0x0001\n# define BOOST_PP_CONFIG_IDEAL() 0x0002\n#\n# define BOOST_PP_CONFIG_MSVC() 0x0004\n# define BOOST_PP_CONFIG_MWCC() 0x0008\n# define BOOST_PP_CONFIG_BCC() 0x0010\n# define BOOST_PP_CONFIG_EDG() 0x0020\n# define BOOST_PP_CONFIG_DMC() 0x0040\n#\n# ifndef BOOST_PP_CONFIG_FLAGS\n#    if defined(__GCCXML__) || defined(__WAVE__) || defined(__MWERKS__) && __MWERKS__ >= 0x3200\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__EDG__) || defined(__EDG_VERSION__)\n#        if defined(_MSC_VER) && !defined(__clang__) && (defined(__INTELLISENSE__) || __EDG_VERSION__ >= 308)\n#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())\n#        else\n#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_EDG() | BOOST_PP_CONFIG_STRICT())\n#        endif\n#    elif defined(_MSC_VER) && defined(__clang__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__MWERKS__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MWCC())\n#    elif defined(__DMC__)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_DMC())\n#    elif defined(__BORLANDC__) && __BORLANDC__ >= 0x581\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    elif defined(__BORLANDC__) || defined(__IBMC__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_BCC())\n#    elif defined(_MSC_VER)\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())\n#    else\n#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())\n#    endif\n# endif\n#\n# /* BOOST_PP_CONFIG_EXTENDED_LINE_INFO */\n#\n# ifndef BOOST_PP_CONFIG_EXTENDED_LINE_INFO\n#    define BOOST_PP_CONFIG_EXTENDED_LINE_INFO 0\n# endif\n#\n# /* BOOST_PP_CONFIG_ERRORS */\n#\n# ifndef BOOST_PP_CONFIG_ERRORS\n#    ifdef NDEBUG\n#        define BOOST_PP_CONFIG_ERRORS 0\n#    else\n#        define BOOST_PP_CONFIG_ERRORS 1\n#    endif\n# endif\n#\n# /* BOOST_PP_VARIADICS */\n#\n# define BOOST_PP_VARIADICS_MSVC 0\n# if !defined BOOST_PP_VARIADICS\n#    /* variadic support explicitly disabled for all untested compilers */\n#    if defined __GCCXML__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || ( defined __SUNPRO_CC && __SUNPRO_CC < 0x5120 ) || defined __HP_aCC && !defined __EDG__ || defined __MRC__ || defined __SC__ || defined __PGI\n#        define BOOST_PP_VARIADICS 0\n#    elif defined(__CUDACC__)\n#        define BOOST_PP_VARIADICS 1\n#    elif defined(_MSC_VER) && defined(__clang__)\n#        define BOOST_PP_VARIADICS 1\n#    /* VC++ (C/C++) and Intel C++ Compiler >= 17.0 with MSVC */\n#    elif defined _MSC_VER && _MSC_VER >= 1400 && (!defined __EDG__ || defined(__INTELLISENSE__) || defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1700)\n#        define BOOST_PP_VARIADICS 1\n#        undef BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADICS_MSVC 1\n#    /* Wave (C/C++), GCC (C++) */\n#    elif defined __WAVE__ && __WAVE_HAS_VARIADICS__ || defined __GNUC__ && defined __GXX_EXPERIMENTAL_CXX0X__ && __GXX_EXPERIMENTAL_CXX0X__\n#        define BOOST_PP_VARIADICS 1\n#    /* EDG-based (C/C++), GCC (C), and unknown (C/C++) */\n#    elif !defined __cplusplus && __STDC_VERSION__ >= 199901L || __cplusplus >= 201103L\n#        define BOOST_PP_VARIADICS 1\n#    else\n#        define BOOST_PP_VARIADICS 0\n#    endif\n# elif !BOOST_PP_VARIADICS + 1 < 2\n#    undef BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADICS 1\n#    if defined _MSC_VER && _MSC_VER >= 1400 && !defined(__clang__) && (defined(__INTELLISENSE__) || (defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1700) || !(defined __EDG__ || defined __GCCXML__ || defined __CUDACC__ || defined __PATHSCALE__ || defined __DMC__ || defined __CODEGEARC__ || defined __BORLANDC__ || defined __MWERKS__ || defined __SUNPRO_CC || defined __HP_aCC || defined __MRC__ || defined __SC__ || defined __IBMCPP__ || defined __PGI))\n#        undef BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADICS_MSVC 1\n#    endif\n# else\n#    undef BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADICS 0\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/config/limits.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n# /* Revised by Edward Diener (2011) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONFIG_LIMITS_HPP\n# define BOOST_PREPROCESSOR_CONFIG_LIMITS_HPP\n#\n# define BOOST_PP_LIMIT_MAG 256\n# define BOOST_PP_LIMIT_TUPLE 64\n# define BOOST_PP_LIMIT_DIM 3\n# define BOOST_PP_LIMIT_REPEAT 256\n# define BOOST_PP_LIMIT_WHILE 256\n# define BOOST_PP_LIMIT_FOR 256\n# define BOOST_PP_LIMIT_ITERATION 256\n# define BOOST_PP_LIMIT_ITERATION_DIM 3\n# define BOOST_PP_LIMIT_SEQ 256\n# define BOOST_PP_LIMIT_SLOT_SIG 10\n# define BOOST_PP_LIMIT_SLOT_COUNT 5\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/deduce_d.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DEDUCE_D_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DEDUCE_D_HPP\n#\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# /* BOOST_PP_DEDUCE_D */\n#\n# define BOOST_PP_DEDUCE_D() BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/detail/dmc/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_C(BOOST_PP_BOOL(p##(2, s)), p, o, s)\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_C(BOOST_PP_BOOL(p##(3, s)), p, o, s)\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_C(BOOST_PP_BOOL(p##(4, s)), p, o, s)\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_C(BOOST_PP_BOOL(p##(5, s)), p, o, s)\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_C(BOOST_PP_BOOL(p##(6, s)), p, o, s)\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_C(BOOST_PP_BOOL(p##(7, s)), p, o, s)\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_C(BOOST_PP_BOOL(p##(8, s)), p, o, s)\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_C(BOOST_PP_BOOL(p##(9, s)), p, o, s)\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_C(BOOST_PP_BOOL(p##(10, s)), p, o, s)\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_C(BOOST_PP_BOOL(p##(11, s)), p, o, s)\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_C(BOOST_PP_BOOL(p##(12, s)), p, o, s)\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_C(BOOST_PP_BOOL(p##(13, s)), p, o, s)\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_C(BOOST_PP_BOOL(p##(14, s)), p, o, s)\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_C(BOOST_PP_BOOL(p##(15, s)), p, o, s)\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_C(BOOST_PP_BOOL(p##(16, s)), p, o, s)\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_C(BOOST_PP_BOOL(p##(17, s)), p, o, s)\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_C(BOOST_PP_BOOL(p##(18, s)), p, o, s)\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_C(BOOST_PP_BOOL(p##(19, s)), p, o, s)\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_C(BOOST_PP_BOOL(p##(20, s)), p, o, s)\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_C(BOOST_PP_BOOL(p##(21, s)), p, o, s)\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_C(BOOST_PP_BOOL(p##(22, s)), p, o, s)\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_C(BOOST_PP_BOOL(p##(23, s)), p, o, s)\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_C(BOOST_PP_BOOL(p##(24, s)), p, o, s)\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_C(BOOST_PP_BOOL(p##(25, s)), p, o, s)\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_C(BOOST_PP_BOOL(p##(26, s)), p, o, s)\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_C(BOOST_PP_BOOL(p##(27, s)), p, o, s)\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_C(BOOST_PP_BOOL(p##(28, s)), p, o, s)\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_C(BOOST_PP_BOOL(p##(29, s)), p, o, s)\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_C(BOOST_PP_BOOL(p##(30, s)), p, o, s)\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_C(BOOST_PP_BOOL(p##(31, s)), p, o, s)\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_C(BOOST_PP_BOOL(p##(32, s)), p, o, s)\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_C(BOOST_PP_BOOL(p##(33, s)), p, o, s)\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_C(BOOST_PP_BOOL(p##(34, s)), p, o, s)\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_C(BOOST_PP_BOOL(p##(35, s)), p, o, s)\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_C(BOOST_PP_BOOL(p##(36, s)), p, o, s)\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_C(BOOST_PP_BOOL(p##(37, s)), p, o, s)\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_C(BOOST_PP_BOOL(p##(38, s)), p, o, s)\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_C(BOOST_PP_BOOL(p##(39, s)), p, o, s)\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_C(BOOST_PP_BOOL(p##(40, s)), p, o, s)\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_C(BOOST_PP_BOOL(p##(41, s)), p, o, s)\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_C(BOOST_PP_BOOL(p##(42, s)), p, o, s)\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_C(BOOST_PP_BOOL(p##(43, s)), p, o, s)\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_C(BOOST_PP_BOOL(p##(44, s)), p, o, s)\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_C(BOOST_PP_BOOL(p##(45, s)), p, o, s)\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_C(BOOST_PP_BOOL(p##(46, s)), p, o, s)\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_C(BOOST_PP_BOOL(p##(47, s)), p, o, s)\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_C(BOOST_PP_BOOL(p##(48, s)), p, o, s)\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_C(BOOST_PP_BOOL(p##(49, s)), p, o, s)\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_C(BOOST_PP_BOOL(p##(50, s)), p, o, s)\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_C(BOOST_PP_BOOL(p##(51, s)), p, o, s)\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_C(BOOST_PP_BOOL(p##(52, s)), p, o, s)\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_C(BOOST_PP_BOOL(p##(53, s)), p, o, s)\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_C(BOOST_PP_BOOL(p##(54, s)), p, o, s)\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_C(BOOST_PP_BOOL(p##(55, s)), p, o, s)\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_C(BOOST_PP_BOOL(p##(56, s)), p, o, s)\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_C(BOOST_PP_BOOL(p##(57, s)), p, o, s)\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_C(BOOST_PP_BOOL(p##(58, s)), p, o, s)\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_C(BOOST_PP_BOOL(p##(59, s)), p, o, s)\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_C(BOOST_PP_BOOL(p##(60, s)), p, o, s)\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_C(BOOST_PP_BOOL(p##(61, s)), p, o, s)\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_C(BOOST_PP_BOOL(p##(62, s)), p, o, s)\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_C(BOOST_PP_BOOL(p##(63, s)), p, o, s)\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_C(BOOST_PP_BOOL(p##(64, s)), p, o, s)\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_C(BOOST_PP_BOOL(p##(65, s)), p, o, s)\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_C(BOOST_PP_BOOL(p##(66, s)), p, o, s)\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_C(BOOST_PP_BOOL(p##(67, s)), p, o, s)\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_C(BOOST_PP_BOOL(p##(68, s)), p, o, s)\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_C(BOOST_PP_BOOL(p##(69, s)), p, o, s)\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_C(BOOST_PP_BOOL(p##(70, s)), p, o, s)\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_C(BOOST_PP_BOOL(p##(71, s)), p, o, s)\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_C(BOOST_PP_BOOL(p##(72, s)), p, o, s)\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_C(BOOST_PP_BOOL(p##(73, s)), p, o, s)\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_C(BOOST_PP_BOOL(p##(74, s)), p, o, s)\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_C(BOOST_PP_BOOL(p##(75, s)), p, o, s)\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_C(BOOST_PP_BOOL(p##(76, s)), p, o, s)\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_C(BOOST_PP_BOOL(p##(77, s)), p, o, s)\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_C(BOOST_PP_BOOL(p##(78, s)), p, o, s)\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_C(BOOST_PP_BOOL(p##(79, s)), p, o, s)\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_C(BOOST_PP_BOOL(p##(80, s)), p, o, s)\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_C(BOOST_PP_BOOL(p##(81, s)), p, o, s)\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_C(BOOST_PP_BOOL(p##(82, s)), p, o, s)\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_C(BOOST_PP_BOOL(p##(83, s)), p, o, s)\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_C(BOOST_PP_BOOL(p##(84, s)), p, o, s)\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_C(BOOST_PP_BOOL(p##(85, s)), p, o, s)\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_C(BOOST_PP_BOOL(p##(86, s)), p, o, s)\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_C(BOOST_PP_BOOL(p##(87, s)), p, o, s)\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_C(BOOST_PP_BOOL(p##(88, s)), p, o, s)\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_C(BOOST_PP_BOOL(p##(89, s)), p, o, s)\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_C(BOOST_PP_BOOL(p##(90, s)), p, o, s)\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_C(BOOST_PP_BOOL(p##(91, s)), p, o, s)\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_C(BOOST_PP_BOOL(p##(92, s)), p, o, s)\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_C(BOOST_PP_BOOL(p##(93, s)), p, o, s)\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_C(BOOST_PP_BOOL(p##(94, s)), p, o, s)\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_C(BOOST_PP_BOOL(p##(95, s)), p, o, s)\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_C(BOOST_PP_BOOL(p##(96, s)), p, o, s)\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_C(BOOST_PP_BOOL(p##(97, s)), p, o, s)\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_C(BOOST_PP_BOOL(p##(98, s)), p, o, s)\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_C(BOOST_PP_BOOL(p##(99, s)), p, o, s)\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_C(BOOST_PP_BOOL(p##(100, s)), p, o, s)\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_C(BOOST_PP_BOOL(p##(101, s)), p, o, s)\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_C(BOOST_PP_BOOL(p##(102, s)), p, o, s)\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_C(BOOST_PP_BOOL(p##(103, s)), p, o, s)\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_C(BOOST_PP_BOOL(p##(104, s)), p, o, s)\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_C(BOOST_PP_BOOL(p##(105, s)), p, o, s)\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_C(BOOST_PP_BOOL(p##(106, s)), p, o, s)\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_C(BOOST_PP_BOOL(p##(107, s)), p, o, s)\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_C(BOOST_PP_BOOL(p##(108, s)), p, o, s)\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_C(BOOST_PP_BOOL(p##(109, s)), p, o, s)\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_C(BOOST_PP_BOOL(p##(110, s)), p, o, s)\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_C(BOOST_PP_BOOL(p##(111, s)), p, o, s)\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_C(BOOST_PP_BOOL(p##(112, s)), p, o, s)\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_C(BOOST_PP_BOOL(p##(113, s)), p, o, s)\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_C(BOOST_PP_BOOL(p##(114, s)), p, o, s)\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_C(BOOST_PP_BOOL(p##(115, s)), p, o, s)\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_C(BOOST_PP_BOOL(p##(116, s)), p, o, s)\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_C(BOOST_PP_BOOL(p##(117, s)), p, o, s)\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_C(BOOST_PP_BOOL(p##(118, s)), p, o, s)\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_C(BOOST_PP_BOOL(p##(119, s)), p, o, s)\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_C(BOOST_PP_BOOL(p##(120, s)), p, o, s)\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_C(BOOST_PP_BOOL(p##(121, s)), p, o, s)\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_C(BOOST_PP_BOOL(p##(122, s)), p, o, s)\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_C(BOOST_PP_BOOL(p##(123, s)), p, o, s)\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_C(BOOST_PP_BOOL(p##(124, s)), p, o, s)\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_C(BOOST_PP_BOOL(p##(125, s)), p, o, s)\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_C(BOOST_PP_BOOL(p##(126, s)), p, o, s)\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_C(BOOST_PP_BOOL(p##(127, s)), p, o, s)\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_C(BOOST_PP_BOOL(p##(128, s)), p, o, s)\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_C(BOOST_PP_BOOL(p##(129, s)), p, o, s)\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_C(BOOST_PP_BOOL(p##(130, s)), p, o, s)\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_C(BOOST_PP_BOOL(p##(131, s)), p, o, s)\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_C(BOOST_PP_BOOL(p##(132, s)), p, o, s)\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_C(BOOST_PP_BOOL(p##(133, s)), p, o, s)\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_C(BOOST_PP_BOOL(p##(134, s)), p, o, s)\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_C(BOOST_PP_BOOL(p##(135, s)), p, o, s)\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_C(BOOST_PP_BOOL(p##(136, s)), p, o, s)\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_C(BOOST_PP_BOOL(p##(137, s)), p, o, s)\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_C(BOOST_PP_BOOL(p##(138, s)), p, o, s)\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_C(BOOST_PP_BOOL(p##(139, s)), p, o, s)\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_C(BOOST_PP_BOOL(p##(140, s)), p, o, s)\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_C(BOOST_PP_BOOL(p##(141, s)), p, o, s)\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_C(BOOST_PP_BOOL(p##(142, s)), p, o, s)\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_C(BOOST_PP_BOOL(p##(143, s)), p, o, s)\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_C(BOOST_PP_BOOL(p##(144, s)), p, o, s)\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_C(BOOST_PP_BOOL(p##(145, s)), p, o, s)\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_C(BOOST_PP_BOOL(p##(146, s)), p, o, s)\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_C(BOOST_PP_BOOL(p##(147, s)), p, o, s)\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_C(BOOST_PP_BOOL(p##(148, s)), p, o, s)\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_C(BOOST_PP_BOOL(p##(149, s)), p, o, s)\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_C(BOOST_PP_BOOL(p##(150, s)), p, o, s)\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_C(BOOST_PP_BOOL(p##(151, s)), p, o, s)\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_C(BOOST_PP_BOOL(p##(152, s)), p, o, s)\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_C(BOOST_PP_BOOL(p##(153, s)), p, o, s)\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_C(BOOST_PP_BOOL(p##(154, s)), p, o, s)\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_C(BOOST_PP_BOOL(p##(155, s)), p, o, s)\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_C(BOOST_PP_BOOL(p##(156, s)), p, o, s)\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_C(BOOST_PP_BOOL(p##(157, s)), p, o, s)\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_C(BOOST_PP_BOOL(p##(158, s)), p, o, s)\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_C(BOOST_PP_BOOL(p##(159, s)), p, o, s)\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_C(BOOST_PP_BOOL(p##(160, s)), p, o, s)\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_C(BOOST_PP_BOOL(p##(161, s)), p, o, s)\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_C(BOOST_PP_BOOL(p##(162, s)), p, o, s)\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_C(BOOST_PP_BOOL(p##(163, s)), p, o, s)\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_C(BOOST_PP_BOOL(p##(164, s)), p, o, s)\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_C(BOOST_PP_BOOL(p##(165, s)), p, o, s)\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_C(BOOST_PP_BOOL(p##(166, s)), p, o, s)\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_C(BOOST_PP_BOOL(p##(167, s)), p, o, s)\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_C(BOOST_PP_BOOL(p##(168, s)), p, o, s)\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_C(BOOST_PP_BOOL(p##(169, s)), p, o, s)\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_C(BOOST_PP_BOOL(p##(170, s)), p, o, s)\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_C(BOOST_PP_BOOL(p##(171, s)), p, o, s)\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_C(BOOST_PP_BOOL(p##(172, s)), p, o, s)\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_C(BOOST_PP_BOOL(p##(173, s)), p, o, s)\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_C(BOOST_PP_BOOL(p##(174, s)), p, o, s)\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_C(BOOST_PP_BOOL(p##(175, s)), p, o, s)\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_C(BOOST_PP_BOOL(p##(176, s)), p, o, s)\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_C(BOOST_PP_BOOL(p##(177, s)), p, o, s)\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_C(BOOST_PP_BOOL(p##(178, s)), p, o, s)\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_C(BOOST_PP_BOOL(p##(179, s)), p, o, s)\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_C(BOOST_PP_BOOL(p##(180, s)), p, o, s)\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_C(BOOST_PP_BOOL(p##(181, s)), p, o, s)\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_C(BOOST_PP_BOOL(p##(182, s)), p, o, s)\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_C(BOOST_PP_BOOL(p##(183, s)), p, o, s)\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_C(BOOST_PP_BOOL(p##(184, s)), p, o, s)\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_C(BOOST_PP_BOOL(p##(185, s)), p, o, s)\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_C(BOOST_PP_BOOL(p##(186, s)), p, o, s)\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_C(BOOST_PP_BOOL(p##(187, s)), p, o, s)\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_C(BOOST_PP_BOOL(p##(188, s)), p, o, s)\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_C(BOOST_PP_BOOL(p##(189, s)), p, o, s)\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_C(BOOST_PP_BOOL(p##(190, s)), p, o, s)\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_C(BOOST_PP_BOOL(p##(191, s)), p, o, s)\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_C(BOOST_PP_BOOL(p##(192, s)), p, o, s)\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_C(BOOST_PP_BOOL(p##(193, s)), p, o, s)\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_C(BOOST_PP_BOOL(p##(194, s)), p, o, s)\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_C(BOOST_PP_BOOL(p##(195, s)), p, o, s)\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_C(BOOST_PP_BOOL(p##(196, s)), p, o, s)\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_C(BOOST_PP_BOOL(p##(197, s)), p, o, s)\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_C(BOOST_PP_BOOL(p##(198, s)), p, o, s)\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_C(BOOST_PP_BOOL(p##(199, s)), p, o, s)\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_C(BOOST_PP_BOOL(p##(200, s)), p, o, s)\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_C(BOOST_PP_BOOL(p##(201, s)), p, o, s)\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_C(BOOST_PP_BOOL(p##(202, s)), p, o, s)\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_C(BOOST_PP_BOOL(p##(203, s)), p, o, s)\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_C(BOOST_PP_BOOL(p##(204, s)), p, o, s)\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_C(BOOST_PP_BOOL(p##(205, s)), p, o, s)\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_C(BOOST_PP_BOOL(p##(206, s)), p, o, s)\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_C(BOOST_PP_BOOL(p##(207, s)), p, o, s)\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_C(BOOST_PP_BOOL(p##(208, s)), p, o, s)\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_C(BOOST_PP_BOOL(p##(209, s)), p, o, s)\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_C(BOOST_PP_BOOL(p##(210, s)), p, o, s)\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_C(BOOST_PP_BOOL(p##(211, s)), p, o, s)\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_C(BOOST_PP_BOOL(p##(212, s)), p, o, s)\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_C(BOOST_PP_BOOL(p##(213, s)), p, o, s)\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_C(BOOST_PP_BOOL(p##(214, s)), p, o, s)\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_C(BOOST_PP_BOOL(p##(215, s)), p, o, s)\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_C(BOOST_PP_BOOL(p##(216, s)), p, o, s)\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_C(BOOST_PP_BOOL(p##(217, s)), p, o, s)\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_C(BOOST_PP_BOOL(p##(218, s)), p, o, s)\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_C(BOOST_PP_BOOL(p##(219, s)), p, o, s)\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_C(BOOST_PP_BOOL(p##(220, s)), p, o, s)\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_C(BOOST_PP_BOOL(p##(221, s)), p, o, s)\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_C(BOOST_PP_BOOL(p##(222, s)), p, o, s)\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_C(BOOST_PP_BOOL(p##(223, s)), p, o, s)\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_C(BOOST_PP_BOOL(p##(224, s)), p, o, s)\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_C(BOOST_PP_BOOL(p##(225, s)), p, o, s)\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_C(BOOST_PP_BOOL(p##(226, s)), p, o, s)\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_C(BOOST_PP_BOOL(p##(227, s)), p, o, s)\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_C(BOOST_PP_BOOL(p##(228, s)), p, o, s)\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_C(BOOST_PP_BOOL(p##(229, s)), p, o, s)\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_C(BOOST_PP_BOOL(p##(230, s)), p, o, s)\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_C(BOOST_PP_BOOL(p##(231, s)), p, o, s)\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_C(BOOST_PP_BOOL(p##(232, s)), p, o, s)\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_C(BOOST_PP_BOOL(p##(233, s)), p, o, s)\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_C(BOOST_PP_BOOL(p##(234, s)), p, o, s)\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_C(BOOST_PP_BOOL(p##(235, s)), p, o, s)\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_C(BOOST_PP_BOOL(p##(236, s)), p, o, s)\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_C(BOOST_PP_BOOL(p##(237, s)), p, o, s)\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_C(BOOST_PP_BOOL(p##(238, s)), p, o, s)\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_C(BOOST_PP_BOOL(p##(239, s)), p, o, s)\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_C(BOOST_PP_BOOL(p##(240, s)), p, o, s)\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_C(BOOST_PP_BOOL(p##(241, s)), p, o, s)\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_C(BOOST_PP_BOOL(p##(242, s)), p, o, s)\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_C(BOOST_PP_BOOL(p##(243, s)), p, o, s)\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_C(BOOST_PP_BOOL(p##(244, s)), p, o, s)\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_C(BOOST_PP_BOOL(p##(245, s)), p, o, s)\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_C(BOOST_PP_BOOL(p##(246, s)), p, o, s)\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_C(BOOST_PP_BOOL(p##(247, s)), p, o, s)\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_C(BOOST_PP_BOOL(p##(248, s)), p, o, s)\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_C(BOOST_PP_BOOL(p##(249, s)), p, o, s)\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_C(BOOST_PP_BOOL(p##(250, s)), p, o, s)\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_C(BOOST_PP_BOOL(p##(251, s)), p, o, s)\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_C(BOOST_PP_BOOL(p##(252, s)), p, o, s)\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_C(BOOST_PP_BOOL(p##(253, s)), p, o, s)\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_C(BOOST_PP_BOOL(p##(254, s)), p, o, s)\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_C(BOOST_PP_BOOL(p##(255, s)), p, o, s)\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_C(BOOST_PP_BOOL(p##(256, s)), p, o, s)\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_C(BOOST_PP_BOOL(p##(257, s)), p, o, s)\n#\n# define BOOST_PP_WHILE_1_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_2, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(2, s))\n# define BOOST_PP_WHILE_2_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_3, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(3, s))\n# define BOOST_PP_WHILE_3_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_4, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(4, s))\n# define BOOST_PP_WHILE_4_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_5, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(5, s))\n# define BOOST_PP_WHILE_5_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_6, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(6, s))\n# define BOOST_PP_WHILE_6_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_7, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(7, s))\n# define BOOST_PP_WHILE_7_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_8, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(8, s))\n# define BOOST_PP_WHILE_8_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_9, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(9, s))\n# define BOOST_PP_WHILE_9_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_10, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(10, s))\n# define BOOST_PP_WHILE_10_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_11, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(11, s))\n# define BOOST_PP_WHILE_11_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_12, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(12, s))\n# define BOOST_PP_WHILE_12_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_13, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(13, s))\n# define BOOST_PP_WHILE_13_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_14, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(14, s))\n# define BOOST_PP_WHILE_14_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_15, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(15, s))\n# define BOOST_PP_WHILE_15_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_16, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(16, s))\n# define BOOST_PP_WHILE_16_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_17, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(17, s))\n# define BOOST_PP_WHILE_17_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_18, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(18, s))\n# define BOOST_PP_WHILE_18_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_19, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(19, s))\n# define BOOST_PP_WHILE_19_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_20, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(20, s))\n# define BOOST_PP_WHILE_20_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_21, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(21, s))\n# define BOOST_PP_WHILE_21_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_22, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(22, s))\n# define BOOST_PP_WHILE_22_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_23, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(23, s))\n# define BOOST_PP_WHILE_23_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_24, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(24, s))\n# define BOOST_PP_WHILE_24_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_25, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(25, s))\n# define BOOST_PP_WHILE_25_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_26, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(26, s))\n# define BOOST_PP_WHILE_26_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_27, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(27, s))\n# define BOOST_PP_WHILE_27_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_28, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(28, s))\n# define BOOST_PP_WHILE_28_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_29, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(29, s))\n# define BOOST_PP_WHILE_29_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_30, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(30, s))\n# define BOOST_PP_WHILE_30_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_31, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(31, s))\n# define BOOST_PP_WHILE_31_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_32, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(32, s))\n# define BOOST_PP_WHILE_32_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_33, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(33, s))\n# define BOOST_PP_WHILE_33_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_34, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(34, s))\n# define BOOST_PP_WHILE_34_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_35, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(35, s))\n# define BOOST_PP_WHILE_35_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_36, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(36, s))\n# define BOOST_PP_WHILE_36_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_37, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(37, s))\n# define BOOST_PP_WHILE_37_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_38, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(38, s))\n# define BOOST_PP_WHILE_38_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_39, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(39, s))\n# define BOOST_PP_WHILE_39_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_40, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(40, s))\n# define BOOST_PP_WHILE_40_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_41, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(41, s))\n# define BOOST_PP_WHILE_41_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_42, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(42, s))\n# define BOOST_PP_WHILE_42_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_43, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(43, s))\n# define BOOST_PP_WHILE_43_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_44, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(44, s))\n# define BOOST_PP_WHILE_44_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_45, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(45, s))\n# define BOOST_PP_WHILE_45_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_46, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(46, s))\n# define BOOST_PP_WHILE_46_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_47, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(47, s))\n# define BOOST_PP_WHILE_47_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_48, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(48, s))\n# define BOOST_PP_WHILE_48_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_49, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(49, s))\n# define BOOST_PP_WHILE_49_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_50, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(50, s))\n# define BOOST_PP_WHILE_50_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_51, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(51, s))\n# define BOOST_PP_WHILE_51_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_52, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(52, s))\n# define BOOST_PP_WHILE_52_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_53, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(53, s))\n# define BOOST_PP_WHILE_53_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_54, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(54, s))\n# define BOOST_PP_WHILE_54_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_55, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(55, s))\n# define BOOST_PP_WHILE_55_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_56, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(56, s))\n# define BOOST_PP_WHILE_56_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_57, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(57, s))\n# define BOOST_PP_WHILE_57_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_58, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(58, s))\n# define BOOST_PP_WHILE_58_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_59, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(59, s))\n# define BOOST_PP_WHILE_59_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_60, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(60, s))\n# define BOOST_PP_WHILE_60_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_61, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(61, s))\n# define BOOST_PP_WHILE_61_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_62, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(62, s))\n# define BOOST_PP_WHILE_62_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_63, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(63, s))\n# define BOOST_PP_WHILE_63_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_64, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(64, s))\n# define BOOST_PP_WHILE_64_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_65, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(65, s))\n# define BOOST_PP_WHILE_65_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_66, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(66, s))\n# define BOOST_PP_WHILE_66_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_67, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(67, s))\n# define BOOST_PP_WHILE_67_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_68, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(68, s))\n# define BOOST_PP_WHILE_68_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_69, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(69, s))\n# define BOOST_PP_WHILE_69_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_70, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(70, s))\n# define BOOST_PP_WHILE_70_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_71, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(71, s))\n# define BOOST_PP_WHILE_71_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_72, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(72, s))\n# define BOOST_PP_WHILE_72_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_73, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(73, s))\n# define BOOST_PP_WHILE_73_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_74, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(74, s))\n# define BOOST_PP_WHILE_74_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_75, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(75, s))\n# define BOOST_PP_WHILE_75_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_76, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(76, s))\n# define BOOST_PP_WHILE_76_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_77, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(77, s))\n# define BOOST_PP_WHILE_77_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_78, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(78, s))\n# define BOOST_PP_WHILE_78_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_79, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(79, s))\n# define BOOST_PP_WHILE_79_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_80, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(80, s))\n# define BOOST_PP_WHILE_80_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_81, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(81, s))\n# define BOOST_PP_WHILE_81_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_82, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(82, s))\n# define BOOST_PP_WHILE_82_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_83, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(83, s))\n# define BOOST_PP_WHILE_83_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_84, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(84, s))\n# define BOOST_PP_WHILE_84_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_85, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(85, s))\n# define BOOST_PP_WHILE_85_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_86, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(86, s))\n# define BOOST_PP_WHILE_86_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_87, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(87, s))\n# define BOOST_PP_WHILE_87_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_88, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(88, s))\n# define BOOST_PP_WHILE_88_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_89, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(89, s))\n# define BOOST_PP_WHILE_89_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_90, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(90, s))\n# define BOOST_PP_WHILE_90_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_91, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(91, s))\n# define BOOST_PP_WHILE_91_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_92, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(92, s))\n# define BOOST_PP_WHILE_92_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_93, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(93, s))\n# define BOOST_PP_WHILE_93_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_94, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(94, s))\n# define BOOST_PP_WHILE_94_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_95, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(95, s))\n# define BOOST_PP_WHILE_95_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_96, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(96, s))\n# define BOOST_PP_WHILE_96_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_97, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(97, s))\n# define BOOST_PP_WHILE_97_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_98, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(98, s))\n# define BOOST_PP_WHILE_98_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_99, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(99, s))\n# define BOOST_PP_WHILE_99_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_100, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(100, s))\n# define BOOST_PP_WHILE_100_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_101, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(101, s))\n# define BOOST_PP_WHILE_101_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_102, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(102, s))\n# define BOOST_PP_WHILE_102_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_103, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(103, s))\n# define BOOST_PP_WHILE_103_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_104, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(104, s))\n# define BOOST_PP_WHILE_104_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_105, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(105, s))\n# define BOOST_PP_WHILE_105_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_106, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(106, s))\n# define BOOST_PP_WHILE_106_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_107, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(107, s))\n# define BOOST_PP_WHILE_107_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_108, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(108, s))\n# define BOOST_PP_WHILE_108_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_109, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(109, s))\n# define BOOST_PP_WHILE_109_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_110, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(110, s))\n# define BOOST_PP_WHILE_110_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_111, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(111, s))\n# define BOOST_PP_WHILE_111_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_112, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(112, s))\n# define BOOST_PP_WHILE_112_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_113, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(113, s))\n# define BOOST_PP_WHILE_113_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_114, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(114, s))\n# define BOOST_PP_WHILE_114_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_115, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(115, s))\n# define BOOST_PP_WHILE_115_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_116, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(116, s))\n# define BOOST_PP_WHILE_116_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_117, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(117, s))\n# define BOOST_PP_WHILE_117_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_118, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(118, s))\n# define BOOST_PP_WHILE_118_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_119, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(119, s))\n# define BOOST_PP_WHILE_119_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_120, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(120, s))\n# define BOOST_PP_WHILE_120_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_121, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(121, s))\n# define BOOST_PP_WHILE_121_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_122, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(122, s))\n# define BOOST_PP_WHILE_122_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_123, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(123, s))\n# define BOOST_PP_WHILE_123_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_124, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(124, s))\n# define BOOST_PP_WHILE_124_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_125, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(125, s))\n# define BOOST_PP_WHILE_125_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_126, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(126, s))\n# define BOOST_PP_WHILE_126_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_127, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(127, s))\n# define BOOST_PP_WHILE_127_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_128, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(128, s))\n# define BOOST_PP_WHILE_128_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_129, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(129, s))\n# define BOOST_PP_WHILE_129_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_130, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(130, s))\n# define BOOST_PP_WHILE_130_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_131, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(131, s))\n# define BOOST_PP_WHILE_131_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_132, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(132, s))\n# define BOOST_PP_WHILE_132_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_133, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(133, s))\n# define BOOST_PP_WHILE_133_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_134, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(134, s))\n# define BOOST_PP_WHILE_134_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_135, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(135, s))\n# define BOOST_PP_WHILE_135_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_136, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(136, s))\n# define BOOST_PP_WHILE_136_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_137, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(137, s))\n# define BOOST_PP_WHILE_137_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_138, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(138, s))\n# define BOOST_PP_WHILE_138_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_139, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(139, s))\n# define BOOST_PP_WHILE_139_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_140, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(140, s))\n# define BOOST_PP_WHILE_140_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_141, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(141, s))\n# define BOOST_PP_WHILE_141_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_142, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(142, s))\n# define BOOST_PP_WHILE_142_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_143, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(143, s))\n# define BOOST_PP_WHILE_143_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_144, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(144, s))\n# define BOOST_PP_WHILE_144_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_145, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(145, s))\n# define BOOST_PP_WHILE_145_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_146, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(146, s))\n# define BOOST_PP_WHILE_146_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_147, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(147, s))\n# define BOOST_PP_WHILE_147_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_148, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(148, s))\n# define BOOST_PP_WHILE_148_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_149, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(149, s))\n# define BOOST_PP_WHILE_149_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_150, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(150, s))\n# define BOOST_PP_WHILE_150_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_151, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(151, s))\n# define BOOST_PP_WHILE_151_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_152, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(152, s))\n# define BOOST_PP_WHILE_152_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_153, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(153, s))\n# define BOOST_PP_WHILE_153_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_154, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(154, s))\n# define BOOST_PP_WHILE_154_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_155, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(155, s))\n# define BOOST_PP_WHILE_155_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_156, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(156, s))\n# define BOOST_PP_WHILE_156_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_157, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(157, s))\n# define BOOST_PP_WHILE_157_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_158, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(158, s))\n# define BOOST_PP_WHILE_158_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_159, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(159, s))\n# define BOOST_PP_WHILE_159_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_160, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(160, s))\n# define BOOST_PP_WHILE_160_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_161, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(161, s))\n# define BOOST_PP_WHILE_161_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_162, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(162, s))\n# define BOOST_PP_WHILE_162_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_163, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(163, s))\n# define BOOST_PP_WHILE_163_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_164, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(164, s))\n# define BOOST_PP_WHILE_164_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_165, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(165, s))\n# define BOOST_PP_WHILE_165_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_166, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(166, s))\n# define BOOST_PP_WHILE_166_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_167, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(167, s))\n# define BOOST_PP_WHILE_167_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_168, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(168, s))\n# define BOOST_PP_WHILE_168_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_169, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(169, s))\n# define BOOST_PP_WHILE_169_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_170, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(170, s))\n# define BOOST_PP_WHILE_170_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_171, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(171, s))\n# define BOOST_PP_WHILE_171_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_172, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(172, s))\n# define BOOST_PP_WHILE_172_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_173, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(173, s))\n# define BOOST_PP_WHILE_173_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_174, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(174, s))\n# define BOOST_PP_WHILE_174_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_175, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(175, s))\n# define BOOST_PP_WHILE_175_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_176, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(176, s))\n# define BOOST_PP_WHILE_176_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_177, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(177, s))\n# define BOOST_PP_WHILE_177_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_178, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(178, s))\n# define BOOST_PP_WHILE_178_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_179, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(179, s))\n# define BOOST_PP_WHILE_179_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_180, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(180, s))\n# define BOOST_PP_WHILE_180_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_181, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(181, s))\n# define BOOST_PP_WHILE_181_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_182, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(182, s))\n# define BOOST_PP_WHILE_182_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_183, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(183, s))\n# define BOOST_PP_WHILE_183_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_184, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(184, s))\n# define BOOST_PP_WHILE_184_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_185, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(185, s))\n# define BOOST_PP_WHILE_185_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_186, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(186, s))\n# define BOOST_PP_WHILE_186_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_187, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(187, s))\n# define BOOST_PP_WHILE_187_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_188, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(188, s))\n# define BOOST_PP_WHILE_188_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_189, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(189, s))\n# define BOOST_PP_WHILE_189_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_190, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(190, s))\n# define BOOST_PP_WHILE_190_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_191, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(191, s))\n# define BOOST_PP_WHILE_191_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_192, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(192, s))\n# define BOOST_PP_WHILE_192_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_193, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(193, s))\n# define BOOST_PP_WHILE_193_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_194, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(194, s))\n# define BOOST_PP_WHILE_194_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_195, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(195, s))\n# define BOOST_PP_WHILE_195_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_196, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(196, s))\n# define BOOST_PP_WHILE_196_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_197, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(197, s))\n# define BOOST_PP_WHILE_197_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_198, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(198, s))\n# define BOOST_PP_WHILE_198_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_199, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(199, s))\n# define BOOST_PP_WHILE_199_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_200, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(200, s))\n# define BOOST_PP_WHILE_200_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_201, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(201, s))\n# define BOOST_PP_WHILE_201_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_202, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(202, s))\n# define BOOST_PP_WHILE_202_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_203, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(203, s))\n# define BOOST_PP_WHILE_203_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_204, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(204, s))\n# define BOOST_PP_WHILE_204_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_205, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(205, s))\n# define BOOST_PP_WHILE_205_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_206, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(206, s))\n# define BOOST_PP_WHILE_206_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_207, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(207, s))\n# define BOOST_PP_WHILE_207_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_208, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(208, s))\n# define BOOST_PP_WHILE_208_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_209, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(209, s))\n# define BOOST_PP_WHILE_209_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_210, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(210, s))\n# define BOOST_PP_WHILE_210_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_211, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(211, s))\n# define BOOST_PP_WHILE_211_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_212, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(212, s))\n# define BOOST_PP_WHILE_212_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_213, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(213, s))\n# define BOOST_PP_WHILE_213_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_214, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(214, s))\n# define BOOST_PP_WHILE_214_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_215, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(215, s))\n# define BOOST_PP_WHILE_215_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_216, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(216, s))\n# define BOOST_PP_WHILE_216_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_217, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(217, s))\n# define BOOST_PP_WHILE_217_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_218, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(218, s))\n# define BOOST_PP_WHILE_218_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_219, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(219, s))\n# define BOOST_PP_WHILE_219_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_220, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(220, s))\n# define BOOST_PP_WHILE_220_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_221, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(221, s))\n# define BOOST_PP_WHILE_221_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_222, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(222, s))\n# define BOOST_PP_WHILE_222_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_223, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(223, s))\n# define BOOST_PP_WHILE_223_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_224, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(224, s))\n# define BOOST_PP_WHILE_224_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_225, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(225, s))\n# define BOOST_PP_WHILE_225_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_226, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(226, s))\n# define BOOST_PP_WHILE_226_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_227, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(227, s))\n# define BOOST_PP_WHILE_227_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_228, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(228, s))\n# define BOOST_PP_WHILE_228_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_229, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(229, s))\n# define BOOST_PP_WHILE_229_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_230, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(230, s))\n# define BOOST_PP_WHILE_230_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_231, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(231, s))\n# define BOOST_PP_WHILE_231_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_232, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(232, s))\n# define BOOST_PP_WHILE_232_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_233, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(233, s))\n# define BOOST_PP_WHILE_233_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_234, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(234, s))\n# define BOOST_PP_WHILE_234_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_235, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(235, s))\n# define BOOST_PP_WHILE_235_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_236, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(236, s))\n# define BOOST_PP_WHILE_236_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_237, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(237, s))\n# define BOOST_PP_WHILE_237_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_238, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(238, s))\n# define BOOST_PP_WHILE_238_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_239, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(239, s))\n# define BOOST_PP_WHILE_239_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_240, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(240, s))\n# define BOOST_PP_WHILE_240_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_241, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(241, s))\n# define BOOST_PP_WHILE_241_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_242, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(242, s))\n# define BOOST_PP_WHILE_242_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_243, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(243, s))\n# define BOOST_PP_WHILE_243_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_244, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(244, s))\n# define BOOST_PP_WHILE_244_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_245, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(245, s))\n# define BOOST_PP_WHILE_245_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_246, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(246, s))\n# define BOOST_PP_WHILE_246_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_247, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(247, s))\n# define BOOST_PP_WHILE_247_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_248, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(248, s))\n# define BOOST_PP_WHILE_248_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_249, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(249, s))\n# define BOOST_PP_WHILE_249_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_250, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(250, s))\n# define BOOST_PP_WHILE_250_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_251, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(251, s))\n# define BOOST_PP_WHILE_251_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_252, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(252, s))\n# define BOOST_PP_WHILE_252_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_253, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(253, s))\n# define BOOST_PP_WHILE_253_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_254, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(254, s))\n# define BOOST_PP_WHILE_254_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_255, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(255, s))\n# define BOOST_PP_WHILE_255_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_256, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(256, s))\n# define BOOST_PP_WHILE_256_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_257, BOOST_PP_TUPLE_ELEM_3_2)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_TUPLE_ELEM_2_1)(257, s))\n#\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/detail/edg/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_EDG_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_EDG_WHILE_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_I(p, o, s)\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_I(p, o, s)\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_I(p, o, s)\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_I(p, o, s)\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_I(p, o, s)\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_I(p, o, s)\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_I(p, o, s)\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_I(p, o, s)\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_I(p, o, s)\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_I(p, o, s)\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_I(p, o, s)\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_I(p, o, s)\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_I(p, o, s)\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_I(p, o, s)\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_I(p, o, s)\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_I(p, o, s)\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_I(p, o, s)\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_I(p, o, s)\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_I(p, o, s)\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_I(p, o, s)\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_I(p, o, s)\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_I(p, o, s)\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_I(p, o, s)\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_I(p, o, s)\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_I(p, o, s)\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_I(p, o, s)\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_I(p, o, s)\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_I(p, o, s)\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_I(p, o, s)\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_I(p, o, s)\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_I(p, o, s)\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_I(p, o, s)\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_I(p, o, s)\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_I(p, o, s)\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_I(p, o, s)\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_I(p, o, s)\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_I(p, o, s)\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_I(p, o, s)\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_I(p, o, s)\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_I(p, o, s)\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_I(p, o, s)\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_I(p, o, s)\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_I(p, o, s)\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_I(p, o, s)\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_I(p, o, s)\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_I(p, o, s)\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_I(p, o, s)\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_I(p, o, s)\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_I(p, o, s)\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_I(p, o, s)\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_I(p, o, s)\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_I(p, o, s)\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_I(p, o, s)\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_I(p, o, s)\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_I(p, o, s)\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_I(p, o, s)\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_I(p, o, s)\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_I(p, o, s)\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_I(p, o, s)\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_I(p, o, s)\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_I(p, o, s)\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_I(p, o, s)\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_I(p, o, s)\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_I(p, o, s)\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_I(p, o, s)\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_I(p, o, s)\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_I(p, o, s)\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_I(p, o, s)\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_I(p, o, s)\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_I(p, o, s)\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_I(p, o, s)\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_I(p, o, s)\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_I(p, o, s)\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_I(p, o, s)\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_I(p, o, s)\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_I(p, o, s)\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_I(p, o, s)\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_I(p, o, s)\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_I(p, o, s)\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_I(p, o, s)\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_I(p, o, s)\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_I(p, o, s)\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_I(p, o, s)\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_I(p, o, s)\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_I(p, o, s)\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_I(p, o, s)\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_I(p, o, s)\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_I(p, o, s)\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_I(p, o, s)\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_I(p, o, s)\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_I(p, o, s)\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_I(p, o, s)\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_I(p, o, s)\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_I(p, o, s)\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_I(p, o, s)\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_I(p, o, s)\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_I(p, o, s)\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_I(p, o, s)\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_I(p, o, s)\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_I(p, o, s)\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_I(p, o, s)\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_I(p, o, s)\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_I(p, o, s)\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_I(p, o, s)\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_I(p, o, s)\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_I(p, o, s)\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_I(p, o, s)\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_I(p, o, s)\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_I(p, o, s)\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_I(p, o, s)\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_I(p, o, s)\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_I(p, o, s)\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_I(p, o, s)\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_I(p, o, s)\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_I(p, o, s)\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_I(p, o, s)\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_I(p, o, s)\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_I(p, o, s)\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_I(p, o, s)\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_I(p, o, s)\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_I(p, o, s)\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_I(p, o, s)\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_I(p, o, s)\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_I(p, o, s)\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_I(p, o, s)\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_I(p, o, s)\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_I(p, o, s)\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_I(p, o, s)\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_I(p, o, s)\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_I(p, o, s)\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_I(p, o, s)\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_I(p, o, s)\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_I(p, o, s)\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_I(p, o, s)\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_I(p, o, s)\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_I(p, o, s)\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_I(p, o, s)\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_I(p, o, s)\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_I(p, o, s)\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_I(p, o, s)\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_I(p, o, s)\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_I(p, o, s)\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_I(p, o, s)\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_I(p, o, s)\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_I(p, o, s)\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_I(p, o, s)\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_I(p, o, s)\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_I(p, o, s)\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_I(p, o, s)\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_I(p, o, s)\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_I(p, o, s)\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_I(p, o, s)\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_I(p, o, s)\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_I(p, o, s)\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_I(p, o, s)\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_I(p, o, s)\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_I(p, o, s)\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_I(p, o, s)\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_I(p, o, s)\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_I(p, o, s)\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_I(p, o, s)\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_I(p, o, s)\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_I(p, o, s)\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_I(p, o, s)\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_I(p, o, s)\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_I(p, o, s)\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_I(p, o, s)\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_I(p, o, s)\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_I(p, o, s)\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_I(p, o, s)\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_I(p, o, s)\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_I(p, o, s)\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_I(p, o, s)\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_I(p, o, s)\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_I(p, o, s)\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_I(p, o, s)\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_I(p, o, s)\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_I(p, o, s)\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_I(p, o, s)\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_I(p, o, s)\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_I(p, o, s)\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_I(p, o, s)\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_I(p, o, s)\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_I(p, o, s)\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_I(p, o, s)\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_I(p, o, s)\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_I(p, o, s)\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_I(p, o, s)\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_I(p, o, s)\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_I(p, o, s)\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_I(p, o, s)\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_I(p, o, s)\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_I(p, o, s)\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_I(p, o, s)\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_I(p, o, s)\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_I(p, o, s)\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_I(p, o, s)\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_I(p, o, s)\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_I(p, o, s)\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_I(p, o, s)\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_I(p, o, s)\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_I(p, o, s)\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_I(p, o, s)\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_I(p, o, s)\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_I(p, o, s)\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_I(p, o, s)\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_I(p, o, s)\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_I(p, o, s)\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_I(p, o, s)\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_I(p, o, s)\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_I(p, o, s)\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_I(p, o, s)\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_I(p, o, s)\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_I(p, o, s)\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_I(p, o, s)\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_I(p, o, s)\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_I(p, o, s)\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_I(p, o, s)\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_I(p, o, s)\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_I(p, o, s)\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_I(p, o, s)\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_I(p, o, s)\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_I(p, o, s)\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_I(p, o, s)\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_I(p, o, s)\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_I(p, o, s)\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_I(p, o, s)\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_I(p, o, s)\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_I(p, o, s)\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_I(p, o, s)\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_I(p, o, s)\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_I(p, o, s)\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_I(p, o, s)\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_I(p, o, s)\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_I(p, o, s)\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_I(p, o, s)\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_I(p, o, s)\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_I(p, o, s)\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_I(p, o, s)\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_I(p, o, s)\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_I(p, o, s)\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_I(p, o, s)\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_I(p, o, s)\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_I(p, o, s)\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_I(p, o, s)\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_I(p, o, s)\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_I(p, o, s)\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_I(p, o, s)\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_I(p, o, s)\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_I(p, o, s)\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_I(p, o, s)\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_I(p, o, s)\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_I(p, o, s)\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_I(p, o, s)\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_I(p, o, s)\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_I(p, o, s)\n#\n# define BOOST_PP_WHILE_1_I(p, o, s) BOOST_PP_IF(p(2, s), BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, o(2, s))\n# define BOOST_PP_WHILE_2_I(p, o, s) BOOST_PP_IF(p(3, s), BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, o(3, s))\n# define BOOST_PP_WHILE_3_I(p, o, s) BOOST_PP_IF(p(4, s), BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, o(4, s))\n# define BOOST_PP_WHILE_4_I(p, o, s) BOOST_PP_IF(p(5, s), BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, o(5, s))\n# define BOOST_PP_WHILE_5_I(p, o, s) BOOST_PP_IF(p(6, s), BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, o(6, s))\n# define BOOST_PP_WHILE_6_I(p, o, s) BOOST_PP_IF(p(7, s), BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, o(7, s))\n# define BOOST_PP_WHILE_7_I(p, o, s) BOOST_PP_IF(p(8, s), BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, o(8, s))\n# define BOOST_PP_WHILE_8_I(p, o, s) BOOST_PP_IF(p(9, s), BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, o(9, s))\n# define BOOST_PP_WHILE_9_I(p, o, s) BOOST_PP_IF(p(10, s), BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, o(10, s))\n# define BOOST_PP_WHILE_10_I(p, o, s) BOOST_PP_IF(p(11, s), BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, o(11, s))\n# define BOOST_PP_WHILE_11_I(p, o, s) BOOST_PP_IF(p(12, s), BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, o(12, s))\n# define BOOST_PP_WHILE_12_I(p, o, s) BOOST_PP_IF(p(13, s), BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, o(13, s))\n# define BOOST_PP_WHILE_13_I(p, o, s) BOOST_PP_IF(p(14, s), BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, o(14, s))\n# define BOOST_PP_WHILE_14_I(p, o, s) BOOST_PP_IF(p(15, s), BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, o(15, s))\n# define BOOST_PP_WHILE_15_I(p, o, s) BOOST_PP_IF(p(16, s), BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, o(16, s))\n# define BOOST_PP_WHILE_16_I(p, o, s) BOOST_PP_IF(p(17, s), BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, o(17, s))\n# define BOOST_PP_WHILE_17_I(p, o, s) BOOST_PP_IF(p(18, s), BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, o(18, s))\n# define BOOST_PP_WHILE_18_I(p, o, s) BOOST_PP_IF(p(19, s), BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, o(19, s))\n# define BOOST_PP_WHILE_19_I(p, o, s) BOOST_PP_IF(p(20, s), BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, o(20, s))\n# define BOOST_PP_WHILE_20_I(p, o, s) BOOST_PP_IF(p(21, s), BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, o(21, s))\n# define BOOST_PP_WHILE_21_I(p, o, s) BOOST_PP_IF(p(22, s), BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, o(22, s))\n# define BOOST_PP_WHILE_22_I(p, o, s) BOOST_PP_IF(p(23, s), BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, o(23, s))\n# define BOOST_PP_WHILE_23_I(p, o, s) BOOST_PP_IF(p(24, s), BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, o(24, s))\n# define BOOST_PP_WHILE_24_I(p, o, s) BOOST_PP_IF(p(25, s), BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, o(25, s))\n# define BOOST_PP_WHILE_25_I(p, o, s) BOOST_PP_IF(p(26, s), BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, o(26, s))\n# define BOOST_PP_WHILE_26_I(p, o, s) BOOST_PP_IF(p(27, s), BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, o(27, s))\n# define BOOST_PP_WHILE_27_I(p, o, s) BOOST_PP_IF(p(28, s), BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, o(28, s))\n# define BOOST_PP_WHILE_28_I(p, o, s) BOOST_PP_IF(p(29, s), BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, o(29, s))\n# define BOOST_PP_WHILE_29_I(p, o, s) BOOST_PP_IF(p(30, s), BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, o(30, s))\n# define BOOST_PP_WHILE_30_I(p, o, s) BOOST_PP_IF(p(31, s), BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, o(31, s))\n# define BOOST_PP_WHILE_31_I(p, o, s) BOOST_PP_IF(p(32, s), BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, o(32, s))\n# define BOOST_PP_WHILE_32_I(p, o, s) BOOST_PP_IF(p(33, s), BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, o(33, s))\n# define BOOST_PP_WHILE_33_I(p, o, s) BOOST_PP_IF(p(34, s), BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, o(34, s))\n# define BOOST_PP_WHILE_34_I(p, o, s) BOOST_PP_IF(p(35, s), BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, o(35, s))\n# define BOOST_PP_WHILE_35_I(p, o, s) BOOST_PP_IF(p(36, s), BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, o(36, s))\n# define BOOST_PP_WHILE_36_I(p, o, s) BOOST_PP_IF(p(37, s), BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, o(37, s))\n# define BOOST_PP_WHILE_37_I(p, o, s) BOOST_PP_IF(p(38, s), BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, o(38, s))\n# define BOOST_PP_WHILE_38_I(p, o, s) BOOST_PP_IF(p(39, s), BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, o(39, s))\n# define BOOST_PP_WHILE_39_I(p, o, s) BOOST_PP_IF(p(40, s), BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, o(40, s))\n# define BOOST_PP_WHILE_40_I(p, o, s) BOOST_PP_IF(p(41, s), BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, o(41, s))\n# define BOOST_PP_WHILE_41_I(p, o, s) BOOST_PP_IF(p(42, s), BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, o(42, s))\n# define BOOST_PP_WHILE_42_I(p, o, s) BOOST_PP_IF(p(43, s), BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, o(43, s))\n# define BOOST_PP_WHILE_43_I(p, o, s) BOOST_PP_IF(p(44, s), BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, o(44, s))\n# define BOOST_PP_WHILE_44_I(p, o, s) BOOST_PP_IF(p(45, s), BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, o(45, s))\n# define BOOST_PP_WHILE_45_I(p, o, s) BOOST_PP_IF(p(46, s), BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, o(46, s))\n# define BOOST_PP_WHILE_46_I(p, o, s) BOOST_PP_IF(p(47, s), BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, o(47, s))\n# define BOOST_PP_WHILE_47_I(p, o, s) BOOST_PP_IF(p(48, s), BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, o(48, s))\n# define BOOST_PP_WHILE_48_I(p, o, s) BOOST_PP_IF(p(49, s), BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, o(49, s))\n# define BOOST_PP_WHILE_49_I(p, o, s) BOOST_PP_IF(p(50, s), BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, o(50, s))\n# define BOOST_PP_WHILE_50_I(p, o, s) BOOST_PP_IF(p(51, s), BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, o(51, s))\n# define BOOST_PP_WHILE_51_I(p, o, s) BOOST_PP_IF(p(52, s), BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, o(52, s))\n# define BOOST_PP_WHILE_52_I(p, o, s) BOOST_PP_IF(p(53, s), BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, o(53, s))\n# define BOOST_PP_WHILE_53_I(p, o, s) BOOST_PP_IF(p(54, s), BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, o(54, s))\n# define BOOST_PP_WHILE_54_I(p, o, s) BOOST_PP_IF(p(55, s), BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, o(55, s))\n# define BOOST_PP_WHILE_55_I(p, o, s) BOOST_PP_IF(p(56, s), BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, o(56, s))\n# define BOOST_PP_WHILE_56_I(p, o, s) BOOST_PP_IF(p(57, s), BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, o(57, s))\n# define BOOST_PP_WHILE_57_I(p, o, s) BOOST_PP_IF(p(58, s), BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, o(58, s))\n# define BOOST_PP_WHILE_58_I(p, o, s) BOOST_PP_IF(p(59, s), BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, o(59, s))\n# define BOOST_PP_WHILE_59_I(p, o, s) BOOST_PP_IF(p(60, s), BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, o(60, s))\n# define BOOST_PP_WHILE_60_I(p, o, s) BOOST_PP_IF(p(61, s), BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, o(61, s))\n# define BOOST_PP_WHILE_61_I(p, o, s) BOOST_PP_IF(p(62, s), BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, o(62, s))\n# define BOOST_PP_WHILE_62_I(p, o, s) BOOST_PP_IF(p(63, s), BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, o(63, s))\n# define BOOST_PP_WHILE_63_I(p, o, s) BOOST_PP_IF(p(64, s), BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, o(64, s))\n# define BOOST_PP_WHILE_64_I(p, o, s) BOOST_PP_IF(p(65, s), BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, o(65, s))\n# define BOOST_PP_WHILE_65_I(p, o, s) BOOST_PP_IF(p(66, s), BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, o(66, s))\n# define BOOST_PP_WHILE_66_I(p, o, s) BOOST_PP_IF(p(67, s), BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, o(67, s))\n# define BOOST_PP_WHILE_67_I(p, o, s) BOOST_PP_IF(p(68, s), BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, o(68, s))\n# define BOOST_PP_WHILE_68_I(p, o, s) BOOST_PP_IF(p(69, s), BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, o(69, s))\n# define BOOST_PP_WHILE_69_I(p, o, s) BOOST_PP_IF(p(70, s), BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, o(70, s))\n# define BOOST_PP_WHILE_70_I(p, o, s) BOOST_PP_IF(p(71, s), BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, o(71, s))\n# define BOOST_PP_WHILE_71_I(p, o, s) BOOST_PP_IF(p(72, s), BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, o(72, s))\n# define BOOST_PP_WHILE_72_I(p, o, s) BOOST_PP_IF(p(73, s), BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, o(73, s))\n# define BOOST_PP_WHILE_73_I(p, o, s) BOOST_PP_IF(p(74, s), BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, o(74, s))\n# define BOOST_PP_WHILE_74_I(p, o, s) BOOST_PP_IF(p(75, s), BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, o(75, s))\n# define BOOST_PP_WHILE_75_I(p, o, s) BOOST_PP_IF(p(76, s), BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, o(76, s))\n# define BOOST_PP_WHILE_76_I(p, o, s) BOOST_PP_IF(p(77, s), BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, o(77, s))\n# define BOOST_PP_WHILE_77_I(p, o, s) BOOST_PP_IF(p(78, s), BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, o(78, s))\n# define BOOST_PP_WHILE_78_I(p, o, s) BOOST_PP_IF(p(79, s), BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, o(79, s))\n# define BOOST_PP_WHILE_79_I(p, o, s) BOOST_PP_IF(p(80, s), BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, o(80, s))\n# define BOOST_PP_WHILE_80_I(p, o, s) BOOST_PP_IF(p(81, s), BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, o(81, s))\n# define BOOST_PP_WHILE_81_I(p, o, s) BOOST_PP_IF(p(82, s), BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, o(82, s))\n# define BOOST_PP_WHILE_82_I(p, o, s) BOOST_PP_IF(p(83, s), BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, o(83, s))\n# define BOOST_PP_WHILE_83_I(p, o, s) BOOST_PP_IF(p(84, s), BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, o(84, s))\n# define BOOST_PP_WHILE_84_I(p, o, s) BOOST_PP_IF(p(85, s), BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, o(85, s))\n# define BOOST_PP_WHILE_85_I(p, o, s) BOOST_PP_IF(p(86, s), BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, o(86, s))\n# define BOOST_PP_WHILE_86_I(p, o, s) BOOST_PP_IF(p(87, s), BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, o(87, s))\n# define BOOST_PP_WHILE_87_I(p, o, s) BOOST_PP_IF(p(88, s), BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, o(88, s))\n# define BOOST_PP_WHILE_88_I(p, o, s) BOOST_PP_IF(p(89, s), BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, o(89, s))\n# define BOOST_PP_WHILE_89_I(p, o, s) BOOST_PP_IF(p(90, s), BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, o(90, s))\n# define BOOST_PP_WHILE_90_I(p, o, s) BOOST_PP_IF(p(91, s), BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, o(91, s))\n# define BOOST_PP_WHILE_91_I(p, o, s) BOOST_PP_IF(p(92, s), BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, o(92, s))\n# define BOOST_PP_WHILE_92_I(p, o, s) BOOST_PP_IF(p(93, s), BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, o(93, s))\n# define BOOST_PP_WHILE_93_I(p, o, s) BOOST_PP_IF(p(94, s), BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, o(94, s))\n# define BOOST_PP_WHILE_94_I(p, o, s) BOOST_PP_IF(p(95, s), BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, o(95, s))\n# define BOOST_PP_WHILE_95_I(p, o, s) BOOST_PP_IF(p(96, s), BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, o(96, s))\n# define BOOST_PP_WHILE_96_I(p, o, s) BOOST_PP_IF(p(97, s), BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, o(97, s))\n# define BOOST_PP_WHILE_97_I(p, o, s) BOOST_PP_IF(p(98, s), BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, o(98, s))\n# define BOOST_PP_WHILE_98_I(p, o, s) BOOST_PP_IF(p(99, s), BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, o(99, s))\n# define BOOST_PP_WHILE_99_I(p, o, s) BOOST_PP_IF(p(100, s), BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, o(100, s))\n# define BOOST_PP_WHILE_100_I(p, o, s) BOOST_PP_IF(p(101, s), BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, o(101, s))\n# define BOOST_PP_WHILE_101_I(p, o, s) BOOST_PP_IF(p(102, s), BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, o(102, s))\n# define BOOST_PP_WHILE_102_I(p, o, s) BOOST_PP_IF(p(103, s), BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, o(103, s))\n# define BOOST_PP_WHILE_103_I(p, o, s) BOOST_PP_IF(p(104, s), BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, o(104, s))\n# define BOOST_PP_WHILE_104_I(p, o, s) BOOST_PP_IF(p(105, s), BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, o(105, s))\n# define BOOST_PP_WHILE_105_I(p, o, s) BOOST_PP_IF(p(106, s), BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, o(106, s))\n# define BOOST_PP_WHILE_106_I(p, o, s) BOOST_PP_IF(p(107, s), BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, o(107, s))\n# define BOOST_PP_WHILE_107_I(p, o, s) BOOST_PP_IF(p(108, s), BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, o(108, s))\n# define BOOST_PP_WHILE_108_I(p, o, s) BOOST_PP_IF(p(109, s), BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, o(109, s))\n# define BOOST_PP_WHILE_109_I(p, o, s) BOOST_PP_IF(p(110, s), BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, o(110, s))\n# define BOOST_PP_WHILE_110_I(p, o, s) BOOST_PP_IF(p(111, s), BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, o(111, s))\n# define BOOST_PP_WHILE_111_I(p, o, s) BOOST_PP_IF(p(112, s), BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, o(112, s))\n# define BOOST_PP_WHILE_112_I(p, o, s) BOOST_PP_IF(p(113, s), BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, o(113, s))\n# define BOOST_PP_WHILE_113_I(p, o, s) BOOST_PP_IF(p(114, s), BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, o(114, s))\n# define BOOST_PP_WHILE_114_I(p, o, s) BOOST_PP_IF(p(115, s), BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, o(115, s))\n# define BOOST_PP_WHILE_115_I(p, o, s) BOOST_PP_IF(p(116, s), BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, o(116, s))\n# define BOOST_PP_WHILE_116_I(p, o, s) BOOST_PP_IF(p(117, s), BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, o(117, s))\n# define BOOST_PP_WHILE_117_I(p, o, s) BOOST_PP_IF(p(118, s), BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, o(118, s))\n# define BOOST_PP_WHILE_118_I(p, o, s) BOOST_PP_IF(p(119, s), BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, o(119, s))\n# define BOOST_PP_WHILE_119_I(p, o, s) BOOST_PP_IF(p(120, s), BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, o(120, s))\n# define BOOST_PP_WHILE_120_I(p, o, s) BOOST_PP_IF(p(121, s), BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, o(121, s))\n# define BOOST_PP_WHILE_121_I(p, o, s) BOOST_PP_IF(p(122, s), BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, o(122, s))\n# define BOOST_PP_WHILE_122_I(p, o, s) BOOST_PP_IF(p(123, s), BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, o(123, s))\n# define BOOST_PP_WHILE_123_I(p, o, s) BOOST_PP_IF(p(124, s), BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, o(124, s))\n# define BOOST_PP_WHILE_124_I(p, o, s) BOOST_PP_IF(p(125, s), BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, o(125, s))\n# define BOOST_PP_WHILE_125_I(p, o, s) BOOST_PP_IF(p(126, s), BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, o(126, s))\n# define BOOST_PP_WHILE_126_I(p, o, s) BOOST_PP_IF(p(127, s), BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, o(127, s))\n# define BOOST_PP_WHILE_127_I(p, o, s) BOOST_PP_IF(p(128, s), BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, o(128, s))\n# define BOOST_PP_WHILE_128_I(p, o, s) BOOST_PP_IF(p(129, s), BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, o(129, s))\n# define BOOST_PP_WHILE_129_I(p, o, s) BOOST_PP_IF(p(130, s), BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, o(130, s))\n# define BOOST_PP_WHILE_130_I(p, o, s) BOOST_PP_IF(p(131, s), BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, o(131, s))\n# define BOOST_PP_WHILE_131_I(p, o, s) BOOST_PP_IF(p(132, s), BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, o(132, s))\n# define BOOST_PP_WHILE_132_I(p, o, s) BOOST_PP_IF(p(133, s), BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, o(133, s))\n# define BOOST_PP_WHILE_133_I(p, o, s) BOOST_PP_IF(p(134, s), BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, o(134, s))\n# define BOOST_PP_WHILE_134_I(p, o, s) BOOST_PP_IF(p(135, s), BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, o(135, s))\n# define BOOST_PP_WHILE_135_I(p, o, s) BOOST_PP_IF(p(136, s), BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, o(136, s))\n# define BOOST_PP_WHILE_136_I(p, o, s) BOOST_PP_IF(p(137, s), BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, o(137, s))\n# define BOOST_PP_WHILE_137_I(p, o, s) BOOST_PP_IF(p(138, s), BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, o(138, s))\n# define BOOST_PP_WHILE_138_I(p, o, s) BOOST_PP_IF(p(139, s), BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, o(139, s))\n# define BOOST_PP_WHILE_139_I(p, o, s) BOOST_PP_IF(p(140, s), BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, o(140, s))\n# define BOOST_PP_WHILE_140_I(p, o, s) BOOST_PP_IF(p(141, s), BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, o(141, s))\n# define BOOST_PP_WHILE_141_I(p, o, s) BOOST_PP_IF(p(142, s), BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, o(142, s))\n# define BOOST_PP_WHILE_142_I(p, o, s) BOOST_PP_IF(p(143, s), BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, o(143, s))\n# define BOOST_PP_WHILE_143_I(p, o, s) BOOST_PP_IF(p(144, s), BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, o(144, s))\n# define BOOST_PP_WHILE_144_I(p, o, s) BOOST_PP_IF(p(145, s), BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, o(145, s))\n# define BOOST_PP_WHILE_145_I(p, o, s) BOOST_PP_IF(p(146, s), BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, o(146, s))\n# define BOOST_PP_WHILE_146_I(p, o, s) BOOST_PP_IF(p(147, s), BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, o(147, s))\n# define BOOST_PP_WHILE_147_I(p, o, s) BOOST_PP_IF(p(148, s), BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, o(148, s))\n# define BOOST_PP_WHILE_148_I(p, o, s) BOOST_PP_IF(p(149, s), BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, o(149, s))\n# define BOOST_PP_WHILE_149_I(p, o, s) BOOST_PP_IF(p(150, s), BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, o(150, s))\n# define BOOST_PP_WHILE_150_I(p, o, s) BOOST_PP_IF(p(151, s), BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, o(151, s))\n# define BOOST_PP_WHILE_151_I(p, o, s) BOOST_PP_IF(p(152, s), BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, o(152, s))\n# define BOOST_PP_WHILE_152_I(p, o, s) BOOST_PP_IF(p(153, s), BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, o(153, s))\n# define BOOST_PP_WHILE_153_I(p, o, s) BOOST_PP_IF(p(154, s), BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, o(154, s))\n# define BOOST_PP_WHILE_154_I(p, o, s) BOOST_PP_IF(p(155, s), BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, o(155, s))\n# define BOOST_PP_WHILE_155_I(p, o, s) BOOST_PP_IF(p(156, s), BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, o(156, s))\n# define BOOST_PP_WHILE_156_I(p, o, s) BOOST_PP_IF(p(157, s), BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, o(157, s))\n# define BOOST_PP_WHILE_157_I(p, o, s) BOOST_PP_IF(p(158, s), BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, o(158, s))\n# define BOOST_PP_WHILE_158_I(p, o, s) BOOST_PP_IF(p(159, s), BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, o(159, s))\n# define BOOST_PP_WHILE_159_I(p, o, s) BOOST_PP_IF(p(160, s), BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, o(160, s))\n# define BOOST_PP_WHILE_160_I(p, o, s) BOOST_PP_IF(p(161, s), BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, o(161, s))\n# define BOOST_PP_WHILE_161_I(p, o, s) BOOST_PP_IF(p(162, s), BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, o(162, s))\n# define BOOST_PP_WHILE_162_I(p, o, s) BOOST_PP_IF(p(163, s), BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, o(163, s))\n# define BOOST_PP_WHILE_163_I(p, o, s) BOOST_PP_IF(p(164, s), BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, o(164, s))\n# define BOOST_PP_WHILE_164_I(p, o, s) BOOST_PP_IF(p(165, s), BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, o(165, s))\n# define BOOST_PP_WHILE_165_I(p, o, s) BOOST_PP_IF(p(166, s), BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, o(166, s))\n# define BOOST_PP_WHILE_166_I(p, o, s) BOOST_PP_IF(p(167, s), BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, o(167, s))\n# define BOOST_PP_WHILE_167_I(p, o, s) BOOST_PP_IF(p(168, s), BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, o(168, s))\n# define BOOST_PP_WHILE_168_I(p, o, s) BOOST_PP_IF(p(169, s), BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, o(169, s))\n# define BOOST_PP_WHILE_169_I(p, o, s) BOOST_PP_IF(p(170, s), BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, o(170, s))\n# define BOOST_PP_WHILE_170_I(p, o, s) BOOST_PP_IF(p(171, s), BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, o(171, s))\n# define BOOST_PP_WHILE_171_I(p, o, s) BOOST_PP_IF(p(172, s), BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, o(172, s))\n# define BOOST_PP_WHILE_172_I(p, o, s) BOOST_PP_IF(p(173, s), BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, o(173, s))\n# define BOOST_PP_WHILE_173_I(p, o, s) BOOST_PP_IF(p(174, s), BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, o(174, s))\n# define BOOST_PP_WHILE_174_I(p, o, s) BOOST_PP_IF(p(175, s), BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, o(175, s))\n# define BOOST_PP_WHILE_175_I(p, o, s) BOOST_PP_IF(p(176, s), BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, o(176, s))\n# define BOOST_PP_WHILE_176_I(p, o, s) BOOST_PP_IF(p(177, s), BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, o(177, s))\n# define BOOST_PP_WHILE_177_I(p, o, s) BOOST_PP_IF(p(178, s), BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, o(178, s))\n# define BOOST_PP_WHILE_178_I(p, o, s) BOOST_PP_IF(p(179, s), BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, o(179, s))\n# define BOOST_PP_WHILE_179_I(p, o, s) BOOST_PP_IF(p(180, s), BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, o(180, s))\n# define BOOST_PP_WHILE_180_I(p, o, s) BOOST_PP_IF(p(181, s), BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, o(181, s))\n# define BOOST_PP_WHILE_181_I(p, o, s) BOOST_PP_IF(p(182, s), BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, o(182, s))\n# define BOOST_PP_WHILE_182_I(p, o, s) BOOST_PP_IF(p(183, s), BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, o(183, s))\n# define BOOST_PP_WHILE_183_I(p, o, s) BOOST_PP_IF(p(184, s), BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, o(184, s))\n# define BOOST_PP_WHILE_184_I(p, o, s) BOOST_PP_IF(p(185, s), BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, o(185, s))\n# define BOOST_PP_WHILE_185_I(p, o, s) BOOST_PP_IF(p(186, s), BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, o(186, s))\n# define BOOST_PP_WHILE_186_I(p, o, s) BOOST_PP_IF(p(187, s), BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, o(187, s))\n# define BOOST_PP_WHILE_187_I(p, o, s) BOOST_PP_IF(p(188, s), BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, o(188, s))\n# define BOOST_PP_WHILE_188_I(p, o, s) BOOST_PP_IF(p(189, s), BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, o(189, s))\n# define BOOST_PP_WHILE_189_I(p, o, s) BOOST_PP_IF(p(190, s), BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, o(190, s))\n# define BOOST_PP_WHILE_190_I(p, o, s) BOOST_PP_IF(p(191, s), BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, o(191, s))\n# define BOOST_PP_WHILE_191_I(p, o, s) BOOST_PP_IF(p(192, s), BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, o(192, s))\n# define BOOST_PP_WHILE_192_I(p, o, s) BOOST_PP_IF(p(193, s), BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, o(193, s))\n# define BOOST_PP_WHILE_193_I(p, o, s) BOOST_PP_IF(p(194, s), BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, o(194, s))\n# define BOOST_PP_WHILE_194_I(p, o, s) BOOST_PP_IF(p(195, s), BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, o(195, s))\n# define BOOST_PP_WHILE_195_I(p, o, s) BOOST_PP_IF(p(196, s), BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, o(196, s))\n# define BOOST_PP_WHILE_196_I(p, o, s) BOOST_PP_IF(p(197, s), BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, o(197, s))\n# define BOOST_PP_WHILE_197_I(p, o, s) BOOST_PP_IF(p(198, s), BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, o(198, s))\n# define BOOST_PP_WHILE_198_I(p, o, s) BOOST_PP_IF(p(199, s), BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, o(199, s))\n# define BOOST_PP_WHILE_199_I(p, o, s) BOOST_PP_IF(p(200, s), BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, o(200, s))\n# define BOOST_PP_WHILE_200_I(p, o, s) BOOST_PP_IF(p(201, s), BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, o(201, s))\n# define BOOST_PP_WHILE_201_I(p, o, s) BOOST_PP_IF(p(202, s), BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, o(202, s))\n# define BOOST_PP_WHILE_202_I(p, o, s) BOOST_PP_IF(p(203, s), BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, o(203, s))\n# define BOOST_PP_WHILE_203_I(p, o, s) BOOST_PP_IF(p(204, s), BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, o(204, s))\n# define BOOST_PP_WHILE_204_I(p, o, s) BOOST_PP_IF(p(205, s), BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, o(205, s))\n# define BOOST_PP_WHILE_205_I(p, o, s) BOOST_PP_IF(p(206, s), BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, o(206, s))\n# define BOOST_PP_WHILE_206_I(p, o, s) BOOST_PP_IF(p(207, s), BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, o(207, s))\n# define BOOST_PP_WHILE_207_I(p, o, s) BOOST_PP_IF(p(208, s), BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, o(208, s))\n# define BOOST_PP_WHILE_208_I(p, o, s) BOOST_PP_IF(p(209, s), BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, o(209, s))\n# define BOOST_PP_WHILE_209_I(p, o, s) BOOST_PP_IF(p(210, s), BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, o(210, s))\n# define BOOST_PP_WHILE_210_I(p, o, s) BOOST_PP_IF(p(211, s), BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, o(211, s))\n# define BOOST_PP_WHILE_211_I(p, o, s) BOOST_PP_IF(p(212, s), BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, o(212, s))\n# define BOOST_PP_WHILE_212_I(p, o, s) BOOST_PP_IF(p(213, s), BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, o(213, s))\n# define BOOST_PP_WHILE_213_I(p, o, s) BOOST_PP_IF(p(214, s), BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, o(214, s))\n# define BOOST_PP_WHILE_214_I(p, o, s) BOOST_PP_IF(p(215, s), BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, o(215, s))\n# define BOOST_PP_WHILE_215_I(p, o, s) BOOST_PP_IF(p(216, s), BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, o(216, s))\n# define BOOST_PP_WHILE_216_I(p, o, s) BOOST_PP_IF(p(217, s), BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, o(217, s))\n# define BOOST_PP_WHILE_217_I(p, o, s) BOOST_PP_IF(p(218, s), BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, o(218, s))\n# define BOOST_PP_WHILE_218_I(p, o, s) BOOST_PP_IF(p(219, s), BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, o(219, s))\n# define BOOST_PP_WHILE_219_I(p, o, s) BOOST_PP_IF(p(220, s), BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, o(220, s))\n# define BOOST_PP_WHILE_220_I(p, o, s) BOOST_PP_IF(p(221, s), BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, o(221, s))\n# define BOOST_PP_WHILE_221_I(p, o, s) BOOST_PP_IF(p(222, s), BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, o(222, s))\n# define BOOST_PP_WHILE_222_I(p, o, s) BOOST_PP_IF(p(223, s), BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, o(223, s))\n# define BOOST_PP_WHILE_223_I(p, o, s) BOOST_PP_IF(p(224, s), BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, o(224, s))\n# define BOOST_PP_WHILE_224_I(p, o, s) BOOST_PP_IF(p(225, s), BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, o(225, s))\n# define BOOST_PP_WHILE_225_I(p, o, s) BOOST_PP_IF(p(226, s), BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, o(226, s))\n# define BOOST_PP_WHILE_226_I(p, o, s) BOOST_PP_IF(p(227, s), BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, o(227, s))\n# define BOOST_PP_WHILE_227_I(p, o, s) BOOST_PP_IF(p(228, s), BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, o(228, s))\n# define BOOST_PP_WHILE_228_I(p, o, s) BOOST_PP_IF(p(229, s), BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, o(229, s))\n# define BOOST_PP_WHILE_229_I(p, o, s) BOOST_PP_IF(p(230, s), BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, o(230, s))\n# define BOOST_PP_WHILE_230_I(p, o, s) BOOST_PP_IF(p(231, s), BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, o(231, s))\n# define BOOST_PP_WHILE_231_I(p, o, s) BOOST_PP_IF(p(232, s), BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, o(232, s))\n# define BOOST_PP_WHILE_232_I(p, o, s) BOOST_PP_IF(p(233, s), BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, o(233, s))\n# define BOOST_PP_WHILE_233_I(p, o, s) BOOST_PP_IF(p(234, s), BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, o(234, s))\n# define BOOST_PP_WHILE_234_I(p, o, s) BOOST_PP_IF(p(235, s), BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, o(235, s))\n# define BOOST_PP_WHILE_235_I(p, o, s) BOOST_PP_IF(p(236, s), BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, o(236, s))\n# define BOOST_PP_WHILE_236_I(p, o, s) BOOST_PP_IF(p(237, s), BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, o(237, s))\n# define BOOST_PP_WHILE_237_I(p, o, s) BOOST_PP_IF(p(238, s), BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, o(238, s))\n# define BOOST_PP_WHILE_238_I(p, o, s) BOOST_PP_IF(p(239, s), BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, o(239, s))\n# define BOOST_PP_WHILE_239_I(p, o, s) BOOST_PP_IF(p(240, s), BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, o(240, s))\n# define BOOST_PP_WHILE_240_I(p, o, s) BOOST_PP_IF(p(241, s), BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, o(241, s))\n# define BOOST_PP_WHILE_241_I(p, o, s) BOOST_PP_IF(p(242, s), BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, o(242, s))\n# define BOOST_PP_WHILE_242_I(p, o, s) BOOST_PP_IF(p(243, s), BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, o(243, s))\n# define BOOST_PP_WHILE_243_I(p, o, s) BOOST_PP_IF(p(244, s), BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, o(244, s))\n# define BOOST_PP_WHILE_244_I(p, o, s) BOOST_PP_IF(p(245, s), BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, o(245, s))\n# define BOOST_PP_WHILE_245_I(p, o, s) BOOST_PP_IF(p(246, s), BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, o(246, s))\n# define BOOST_PP_WHILE_246_I(p, o, s) BOOST_PP_IF(p(247, s), BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, o(247, s))\n# define BOOST_PP_WHILE_247_I(p, o, s) BOOST_PP_IF(p(248, s), BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, o(248, s))\n# define BOOST_PP_WHILE_248_I(p, o, s) BOOST_PP_IF(p(249, s), BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, o(249, s))\n# define BOOST_PP_WHILE_249_I(p, o, s) BOOST_PP_IF(p(250, s), BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, o(250, s))\n# define BOOST_PP_WHILE_250_I(p, o, s) BOOST_PP_IF(p(251, s), BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, o(251, s))\n# define BOOST_PP_WHILE_251_I(p, o, s) BOOST_PP_IF(p(252, s), BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, o(252, s))\n# define BOOST_PP_WHILE_252_I(p, o, s) BOOST_PP_IF(p(253, s), BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, o(253, s))\n# define BOOST_PP_WHILE_253_I(p, o, s) BOOST_PP_IF(p(254, s), BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, o(254, s))\n# define BOOST_PP_WHILE_254_I(p, o, s) BOOST_PP_IF(p(255, s), BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, o(255, s))\n# define BOOST_PP_WHILE_255_I(p, o, s) BOOST_PP_IF(p(256, s), BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, o(256, s))\n# define BOOST_PP_WHILE_256_I(p, o, s) BOOST_PP_IF(p(257, s), BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, o(257, s))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/detail/msvc/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_MSVC_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_MSVC_WHILE_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_IF(p(2, s), BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, o(2, s))\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_IF(p(3, s), BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, o(3, s))\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_IF(p(4, s), BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, o(4, s))\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_IF(p(5, s), BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, o(5, s))\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_IF(p(6, s), BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, o(6, s))\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_IF(p(7, s), BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, o(7, s))\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_IF(p(8, s), BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, o(8, s))\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_IF(p(9, s), BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, o(9, s))\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_IF(p(10, s), BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, o(10, s))\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_IF(p(11, s), BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, o(11, s))\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_IF(p(12, s), BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, o(12, s))\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_IF(p(13, s), BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, o(13, s))\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_IF(p(14, s), BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, o(14, s))\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_IF(p(15, s), BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, o(15, s))\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_IF(p(16, s), BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, o(16, s))\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_IF(p(17, s), BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, o(17, s))\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_IF(p(18, s), BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, o(18, s))\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_IF(p(19, s), BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, o(19, s))\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_IF(p(20, s), BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, o(20, s))\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_IF(p(21, s), BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, o(21, s))\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_IF(p(22, s), BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, o(22, s))\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_IF(p(23, s), BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, o(23, s))\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_IF(p(24, s), BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, o(24, s))\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_IF(p(25, s), BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, o(25, s))\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_IF(p(26, s), BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, o(26, s))\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_IF(p(27, s), BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, o(27, s))\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_IF(p(28, s), BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, o(28, s))\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_IF(p(29, s), BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, o(29, s))\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_IF(p(30, s), BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, o(30, s))\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_IF(p(31, s), BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, o(31, s))\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_IF(p(32, s), BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, o(32, s))\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_IF(p(33, s), BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, o(33, s))\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_IF(p(34, s), BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, o(34, s))\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_IF(p(35, s), BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, o(35, s))\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_IF(p(36, s), BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, o(36, s))\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_IF(p(37, s), BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, o(37, s))\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_IF(p(38, s), BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, o(38, s))\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_IF(p(39, s), BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, o(39, s))\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_IF(p(40, s), BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, o(40, s))\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_IF(p(41, s), BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, o(41, s))\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_IF(p(42, s), BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, o(42, s))\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_IF(p(43, s), BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, o(43, s))\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_IF(p(44, s), BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, o(44, s))\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_IF(p(45, s), BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, o(45, s))\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_IF(p(46, s), BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, o(46, s))\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_IF(p(47, s), BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, o(47, s))\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_IF(p(48, s), BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, o(48, s))\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_IF(p(49, s), BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, o(49, s))\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_IF(p(50, s), BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, o(50, s))\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_IF(p(51, s), BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, o(51, s))\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_IF(p(52, s), BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, o(52, s))\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_IF(p(53, s), BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, o(53, s))\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_IF(p(54, s), BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, o(54, s))\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_IF(p(55, s), BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, o(55, s))\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_IF(p(56, s), BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, o(56, s))\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_IF(p(57, s), BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, o(57, s))\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_IF(p(58, s), BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, o(58, s))\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_IF(p(59, s), BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, o(59, s))\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_IF(p(60, s), BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, o(60, s))\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_IF(p(61, s), BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, o(61, s))\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_IF(p(62, s), BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, o(62, s))\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_IF(p(63, s), BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, o(63, s))\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_IF(p(64, s), BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, o(64, s))\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_IF(p(65, s), BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, o(65, s))\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_IF(p(66, s), BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, o(66, s))\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_IF(p(67, s), BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, o(67, s))\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_IF(p(68, s), BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, o(68, s))\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_IF(p(69, s), BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, o(69, s))\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_IF(p(70, s), BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, o(70, s))\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_IF(p(71, s), BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, o(71, s))\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_IF(p(72, s), BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, o(72, s))\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_IF(p(73, s), BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, o(73, s))\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_IF(p(74, s), BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, o(74, s))\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_IF(p(75, s), BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, o(75, s))\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_IF(p(76, s), BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, o(76, s))\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_IF(p(77, s), BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, o(77, s))\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_IF(p(78, s), BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, o(78, s))\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_IF(p(79, s), BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, o(79, s))\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_IF(p(80, s), BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, o(80, s))\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_IF(p(81, s), BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, o(81, s))\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_IF(p(82, s), BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, o(82, s))\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_IF(p(83, s), BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, o(83, s))\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_IF(p(84, s), BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, o(84, s))\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_IF(p(85, s), BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, o(85, s))\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_IF(p(86, s), BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, o(86, s))\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_IF(p(87, s), BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, o(87, s))\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_IF(p(88, s), BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, o(88, s))\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_IF(p(89, s), BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, o(89, s))\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_IF(p(90, s), BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, o(90, s))\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_IF(p(91, s), BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, o(91, s))\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_IF(p(92, s), BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, o(92, s))\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_IF(p(93, s), BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, o(93, s))\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_IF(p(94, s), BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, o(94, s))\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_IF(p(95, s), BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, o(95, s))\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_IF(p(96, s), BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, o(96, s))\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_IF(p(97, s), BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, o(97, s))\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_IF(p(98, s), BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, o(98, s))\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_IF(p(99, s), BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, o(99, s))\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_IF(p(100, s), BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, o(100, s))\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_IF(p(101, s), BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, o(101, s))\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_IF(p(102, s), BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, o(102, s))\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_IF(p(103, s), BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, o(103, s))\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_IF(p(104, s), BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, o(104, s))\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_IF(p(105, s), BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, o(105, s))\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_IF(p(106, s), BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, o(106, s))\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_IF(p(107, s), BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, o(107, s))\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_IF(p(108, s), BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, o(108, s))\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_IF(p(109, s), BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, o(109, s))\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_IF(p(110, s), BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, o(110, s))\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_IF(p(111, s), BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, o(111, s))\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_IF(p(112, s), BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, o(112, s))\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_IF(p(113, s), BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, o(113, s))\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_IF(p(114, s), BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, o(114, s))\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_IF(p(115, s), BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, o(115, s))\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_IF(p(116, s), BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, o(116, s))\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_IF(p(117, s), BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, o(117, s))\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_IF(p(118, s), BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, o(118, s))\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_IF(p(119, s), BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, o(119, s))\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_IF(p(120, s), BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, o(120, s))\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_IF(p(121, s), BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, o(121, s))\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_IF(p(122, s), BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, o(122, s))\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_IF(p(123, s), BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, o(123, s))\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_IF(p(124, s), BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, o(124, s))\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_IF(p(125, s), BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, o(125, s))\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_IF(p(126, s), BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, o(126, s))\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_IF(p(127, s), BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, o(127, s))\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_IF(p(128, s), BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, o(128, s))\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_IF(p(129, s), BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, o(129, s))\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_IF(p(130, s), BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, o(130, s))\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_IF(p(131, s), BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, o(131, s))\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_IF(p(132, s), BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, o(132, s))\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_IF(p(133, s), BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, o(133, s))\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_IF(p(134, s), BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, o(134, s))\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_IF(p(135, s), BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, o(135, s))\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_IF(p(136, s), BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, o(136, s))\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_IF(p(137, s), BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, o(137, s))\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_IF(p(138, s), BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, o(138, s))\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_IF(p(139, s), BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, o(139, s))\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_IF(p(140, s), BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, o(140, s))\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_IF(p(141, s), BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, o(141, s))\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_IF(p(142, s), BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, o(142, s))\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_IF(p(143, s), BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, o(143, s))\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_IF(p(144, s), BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, o(144, s))\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_IF(p(145, s), BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, o(145, s))\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_IF(p(146, s), BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, o(146, s))\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_IF(p(147, s), BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, o(147, s))\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_IF(p(148, s), BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, o(148, s))\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_IF(p(149, s), BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, o(149, s))\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_IF(p(150, s), BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, o(150, s))\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_IF(p(151, s), BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, o(151, s))\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_IF(p(152, s), BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, o(152, s))\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_IF(p(153, s), BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, o(153, s))\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_IF(p(154, s), BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, o(154, s))\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_IF(p(155, s), BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, o(155, s))\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_IF(p(156, s), BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, o(156, s))\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_IF(p(157, s), BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, o(157, s))\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_IF(p(158, s), BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, o(158, s))\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_IF(p(159, s), BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, o(159, s))\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_IF(p(160, s), BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, o(160, s))\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_IF(p(161, s), BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, o(161, s))\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_IF(p(162, s), BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, o(162, s))\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_IF(p(163, s), BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, o(163, s))\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_IF(p(164, s), BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, o(164, s))\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_IF(p(165, s), BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, o(165, s))\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_IF(p(166, s), BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, o(166, s))\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_IF(p(167, s), BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, o(167, s))\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_IF(p(168, s), BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, o(168, s))\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_IF(p(169, s), BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, o(169, s))\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_IF(p(170, s), BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, o(170, s))\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_IF(p(171, s), BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, o(171, s))\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_IF(p(172, s), BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, o(172, s))\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_IF(p(173, s), BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, o(173, s))\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_IF(p(174, s), BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, o(174, s))\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_IF(p(175, s), BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, o(175, s))\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_IF(p(176, s), BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, o(176, s))\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_IF(p(177, s), BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, o(177, s))\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_IF(p(178, s), BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, o(178, s))\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_IF(p(179, s), BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, o(179, s))\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_IF(p(180, s), BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, o(180, s))\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_IF(p(181, s), BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, o(181, s))\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_IF(p(182, s), BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, o(182, s))\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_IF(p(183, s), BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, o(183, s))\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_IF(p(184, s), BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, o(184, s))\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_IF(p(185, s), BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, o(185, s))\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_IF(p(186, s), BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, o(186, s))\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_IF(p(187, s), BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, o(187, s))\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_IF(p(188, s), BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, o(188, s))\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_IF(p(189, s), BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, o(189, s))\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_IF(p(190, s), BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, o(190, s))\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_IF(p(191, s), BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, o(191, s))\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_IF(p(192, s), BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, o(192, s))\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_IF(p(193, s), BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, o(193, s))\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_IF(p(194, s), BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, o(194, s))\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_IF(p(195, s), BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, o(195, s))\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_IF(p(196, s), BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, o(196, s))\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_IF(p(197, s), BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, o(197, s))\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_IF(p(198, s), BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, o(198, s))\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_IF(p(199, s), BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, o(199, s))\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_IF(p(200, s), BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, o(200, s))\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_IF(p(201, s), BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, o(201, s))\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_IF(p(202, s), BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, o(202, s))\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_IF(p(203, s), BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, o(203, s))\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_IF(p(204, s), BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, o(204, s))\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_IF(p(205, s), BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, o(205, s))\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_IF(p(206, s), BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, o(206, s))\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_IF(p(207, s), BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, o(207, s))\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_IF(p(208, s), BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, o(208, s))\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_IF(p(209, s), BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, o(209, s))\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_IF(p(210, s), BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, o(210, s))\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_IF(p(211, s), BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, o(211, s))\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_IF(p(212, s), BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, o(212, s))\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_IF(p(213, s), BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, o(213, s))\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_IF(p(214, s), BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, o(214, s))\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_IF(p(215, s), BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, o(215, s))\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_IF(p(216, s), BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, o(216, s))\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_IF(p(217, s), BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, o(217, s))\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_IF(p(218, s), BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, o(218, s))\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_IF(p(219, s), BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, o(219, s))\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_IF(p(220, s), BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, o(220, s))\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_IF(p(221, s), BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, o(221, s))\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_IF(p(222, s), BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, o(222, s))\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_IF(p(223, s), BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, o(223, s))\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_IF(p(224, s), BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, o(224, s))\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_IF(p(225, s), BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, o(225, s))\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_IF(p(226, s), BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, o(226, s))\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_IF(p(227, s), BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, o(227, s))\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_IF(p(228, s), BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, o(228, s))\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_IF(p(229, s), BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, o(229, s))\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_IF(p(230, s), BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, o(230, s))\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_IF(p(231, s), BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, o(231, s))\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_IF(p(232, s), BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, o(232, s))\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_IF(p(233, s), BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, o(233, s))\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_IF(p(234, s), BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, o(234, s))\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_IF(p(235, s), BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, o(235, s))\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_IF(p(236, s), BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, o(236, s))\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_IF(p(237, s), BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, o(237, s))\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_IF(p(238, s), BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, o(238, s))\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_IF(p(239, s), BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, o(239, s))\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_IF(p(240, s), BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, o(240, s))\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_IF(p(241, s), BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, o(241, s))\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_IF(p(242, s), BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, o(242, s))\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_IF(p(243, s), BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, o(243, s))\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_IF(p(244, s), BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, o(244, s))\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_IF(p(245, s), BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, o(245, s))\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_IF(p(246, s), BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, o(246, s))\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_IF(p(247, s), BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, o(247, s))\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_IF(p(248, s), BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, o(248, s))\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_IF(p(249, s), BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, o(249, s))\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_IF(p(250, s), BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, o(250, s))\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_IF(p(251, s), BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, o(251, s))\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_IF(p(252, s), BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, o(252, s))\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_IF(p(253, s), BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, o(253, s))\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_IF(p(254, s), BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, o(254, s))\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_IF(p(255, s), BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, o(255, s))\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_IF(p(256, s), BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, o(256, s))\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_IF(p(257, s), BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, o(257, s))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/detail/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_DETAIL_WHILE_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_WHILE_1(p, o, s) BOOST_PP_WHILE_1_C(BOOST_PP_BOOL(p(2, s)), p, o, s)\n# define BOOST_PP_WHILE_2(p, o, s) BOOST_PP_WHILE_2_C(BOOST_PP_BOOL(p(3, s)), p, o, s)\n# define BOOST_PP_WHILE_3(p, o, s) BOOST_PP_WHILE_3_C(BOOST_PP_BOOL(p(4, s)), p, o, s)\n# define BOOST_PP_WHILE_4(p, o, s) BOOST_PP_WHILE_4_C(BOOST_PP_BOOL(p(5, s)), p, o, s)\n# define BOOST_PP_WHILE_5(p, o, s) BOOST_PP_WHILE_5_C(BOOST_PP_BOOL(p(6, s)), p, o, s)\n# define BOOST_PP_WHILE_6(p, o, s) BOOST_PP_WHILE_6_C(BOOST_PP_BOOL(p(7, s)), p, o, s)\n# define BOOST_PP_WHILE_7(p, o, s) BOOST_PP_WHILE_7_C(BOOST_PP_BOOL(p(8, s)), p, o, s)\n# define BOOST_PP_WHILE_8(p, o, s) BOOST_PP_WHILE_8_C(BOOST_PP_BOOL(p(9, s)), p, o, s)\n# define BOOST_PP_WHILE_9(p, o, s) BOOST_PP_WHILE_9_C(BOOST_PP_BOOL(p(10, s)), p, o, s)\n# define BOOST_PP_WHILE_10(p, o, s) BOOST_PP_WHILE_10_C(BOOST_PP_BOOL(p(11, s)), p, o, s)\n# define BOOST_PP_WHILE_11(p, o, s) BOOST_PP_WHILE_11_C(BOOST_PP_BOOL(p(12, s)), p, o, s)\n# define BOOST_PP_WHILE_12(p, o, s) BOOST_PP_WHILE_12_C(BOOST_PP_BOOL(p(13, s)), p, o, s)\n# define BOOST_PP_WHILE_13(p, o, s) BOOST_PP_WHILE_13_C(BOOST_PP_BOOL(p(14, s)), p, o, s)\n# define BOOST_PP_WHILE_14(p, o, s) BOOST_PP_WHILE_14_C(BOOST_PP_BOOL(p(15, s)), p, o, s)\n# define BOOST_PP_WHILE_15(p, o, s) BOOST_PP_WHILE_15_C(BOOST_PP_BOOL(p(16, s)), p, o, s)\n# define BOOST_PP_WHILE_16(p, o, s) BOOST_PP_WHILE_16_C(BOOST_PP_BOOL(p(17, s)), p, o, s)\n# define BOOST_PP_WHILE_17(p, o, s) BOOST_PP_WHILE_17_C(BOOST_PP_BOOL(p(18, s)), p, o, s)\n# define BOOST_PP_WHILE_18(p, o, s) BOOST_PP_WHILE_18_C(BOOST_PP_BOOL(p(19, s)), p, o, s)\n# define BOOST_PP_WHILE_19(p, o, s) BOOST_PP_WHILE_19_C(BOOST_PP_BOOL(p(20, s)), p, o, s)\n# define BOOST_PP_WHILE_20(p, o, s) BOOST_PP_WHILE_20_C(BOOST_PP_BOOL(p(21, s)), p, o, s)\n# define BOOST_PP_WHILE_21(p, o, s) BOOST_PP_WHILE_21_C(BOOST_PP_BOOL(p(22, s)), p, o, s)\n# define BOOST_PP_WHILE_22(p, o, s) BOOST_PP_WHILE_22_C(BOOST_PP_BOOL(p(23, s)), p, o, s)\n# define BOOST_PP_WHILE_23(p, o, s) BOOST_PP_WHILE_23_C(BOOST_PP_BOOL(p(24, s)), p, o, s)\n# define BOOST_PP_WHILE_24(p, o, s) BOOST_PP_WHILE_24_C(BOOST_PP_BOOL(p(25, s)), p, o, s)\n# define BOOST_PP_WHILE_25(p, o, s) BOOST_PP_WHILE_25_C(BOOST_PP_BOOL(p(26, s)), p, o, s)\n# define BOOST_PP_WHILE_26(p, o, s) BOOST_PP_WHILE_26_C(BOOST_PP_BOOL(p(27, s)), p, o, s)\n# define BOOST_PP_WHILE_27(p, o, s) BOOST_PP_WHILE_27_C(BOOST_PP_BOOL(p(28, s)), p, o, s)\n# define BOOST_PP_WHILE_28(p, o, s) BOOST_PP_WHILE_28_C(BOOST_PP_BOOL(p(29, s)), p, o, s)\n# define BOOST_PP_WHILE_29(p, o, s) BOOST_PP_WHILE_29_C(BOOST_PP_BOOL(p(30, s)), p, o, s)\n# define BOOST_PP_WHILE_30(p, o, s) BOOST_PP_WHILE_30_C(BOOST_PP_BOOL(p(31, s)), p, o, s)\n# define BOOST_PP_WHILE_31(p, o, s) BOOST_PP_WHILE_31_C(BOOST_PP_BOOL(p(32, s)), p, o, s)\n# define BOOST_PP_WHILE_32(p, o, s) BOOST_PP_WHILE_32_C(BOOST_PP_BOOL(p(33, s)), p, o, s)\n# define BOOST_PP_WHILE_33(p, o, s) BOOST_PP_WHILE_33_C(BOOST_PP_BOOL(p(34, s)), p, o, s)\n# define BOOST_PP_WHILE_34(p, o, s) BOOST_PP_WHILE_34_C(BOOST_PP_BOOL(p(35, s)), p, o, s)\n# define BOOST_PP_WHILE_35(p, o, s) BOOST_PP_WHILE_35_C(BOOST_PP_BOOL(p(36, s)), p, o, s)\n# define BOOST_PP_WHILE_36(p, o, s) BOOST_PP_WHILE_36_C(BOOST_PP_BOOL(p(37, s)), p, o, s)\n# define BOOST_PP_WHILE_37(p, o, s) BOOST_PP_WHILE_37_C(BOOST_PP_BOOL(p(38, s)), p, o, s)\n# define BOOST_PP_WHILE_38(p, o, s) BOOST_PP_WHILE_38_C(BOOST_PP_BOOL(p(39, s)), p, o, s)\n# define BOOST_PP_WHILE_39(p, o, s) BOOST_PP_WHILE_39_C(BOOST_PP_BOOL(p(40, s)), p, o, s)\n# define BOOST_PP_WHILE_40(p, o, s) BOOST_PP_WHILE_40_C(BOOST_PP_BOOL(p(41, s)), p, o, s)\n# define BOOST_PP_WHILE_41(p, o, s) BOOST_PP_WHILE_41_C(BOOST_PP_BOOL(p(42, s)), p, o, s)\n# define BOOST_PP_WHILE_42(p, o, s) BOOST_PP_WHILE_42_C(BOOST_PP_BOOL(p(43, s)), p, o, s)\n# define BOOST_PP_WHILE_43(p, o, s) BOOST_PP_WHILE_43_C(BOOST_PP_BOOL(p(44, s)), p, o, s)\n# define BOOST_PP_WHILE_44(p, o, s) BOOST_PP_WHILE_44_C(BOOST_PP_BOOL(p(45, s)), p, o, s)\n# define BOOST_PP_WHILE_45(p, o, s) BOOST_PP_WHILE_45_C(BOOST_PP_BOOL(p(46, s)), p, o, s)\n# define BOOST_PP_WHILE_46(p, o, s) BOOST_PP_WHILE_46_C(BOOST_PP_BOOL(p(47, s)), p, o, s)\n# define BOOST_PP_WHILE_47(p, o, s) BOOST_PP_WHILE_47_C(BOOST_PP_BOOL(p(48, s)), p, o, s)\n# define BOOST_PP_WHILE_48(p, o, s) BOOST_PP_WHILE_48_C(BOOST_PP_BOOL(p(49, s)), p, o, s)\n# define BOOST_PP_WHILE_49(p, o, s) BOOST_PP_WHILE_49_C(BOOST_PP_BOOL(p(50, s)), p, o, s)\n# define BOOST_PP_WHILE_50(p, o, s) BOOST_PP_WHILE_50_C(BOOST_PP_BOOL(p(51, s)), p, o, s)\n# define BOOST_PP_WHILE_51(p, o, s) BOOST_PP_WHILE_51_C(BOOST_PP_BOOL(p(52, s)), p, o, s)\n# define BOOST_PP_WHILE_52(p, o, s) BOOST_PP_WHILE_52_C(BOOST_PP_BOOL(p(53, s)), p, o, s)\n# define BOOST_PP_WHILE_53(p, o, s) BOOST_PP_WHILE_53_C(BOOST_PP_BOOL(p(54, s)), p, o, s)\n# define BOOST_PP_WHILE_54(p, o, s) BOOST_PP_WHILE_54_C(BOOST_PP_BOOL(p(55, s)), p, o, s)\n# define BOOST_PP_WHILE_55(p, o, s) BOOST_PP_WHILE_55_C(BOOST_PP_BOOL(p(56, s)), p, o, s)\n# define BOOST_PP_WHILE_56(p, o, s) BOOST_PP_WHILE_56_C(BOOST_PP_BOOL(p(57, s)), p, o, s)\n# define BOOST_PP_WHILE_57(p, o, s) BOOST_PP_WHILE_57_C(BOOST_PP_BOOL(p(58, s)), p, o, s)\n# define BOOST_PP_WHILE_58(p, o, s) BOOST_PP_WHILE_58_C(BOOST_PP_BOOL(p(59, s)), p, o, s)\n# define BOOST_PP_WHILE_59(p, o, s) BOOST_PP_WHILE_59_C(BOOST_PP_BOOL(p(60, s)), p, o, s)\n# define BOOST_PP_WHILE_60(p, o, s) BOOST_PP_WHILE_60_C(BOOST_PP_BOOL(p(61, s)), p, o, s)\n# define BOOST_PP_WHILE_61(p, o, s) BOOST_PP_WHILE_61_C(BOOST_PP_BOOL(p(62, s)), p, o, s)\n# define BOOST_PP_WHILE_62(p, o, s) BOOST_PP_WHILE_62_C(BOOST_PP_BOOL(p(63, s)), p, o, s)\n# define BOOST_PP_WHILE_63(p, o, s) BOOST_PP_WHILE_63_C(BOOST_PP_BOOL(p(64, s)), p, o, s)\n# define BOOST_PP_WHILE_64(p, o, s) BOOST_PP_WHILE_64_C(BOOST_PP_BOOL(p(65, s)), p, o, s)\n# define BOOST_PP_WHILE_65(p, o, s) BOOST_PP_WHILE_65_C(BOOST_PP_BOOL(p(66, s)), p, o, s)\n# define BOOST_PP_WHILE_66(p, o, s) BOOST_PP_WHILE_66_C(BOOST_PP_BOOL(p(67, s)), p, o, s)\n# define BOOST_PP_WHILE_67(p, o, s) BOOST_PP_WHILE_67_C(BOOST_PP_BOOL(p(68, s)), p, o, s)\n# define BOOST_PP_WHILE_68(p, o, s) BOOST_PP_WHILE_68_C(BOOST_PP_BOOL(p(69, s)), p, o, s)\n# define BOOST_PP_WHILE_69(p, o, s) BOOST_PP_WHILE_69_C(BOOST_PP_BOOL(p(70, s)), p, o, s)\n# define BOOST_PP_WHILE_70(p, o, s) BOOST_PP_WHILE_70_C(BOOST_PP_BOOL(p(71, s)), p, o, s)\n# define BOOST_PP_WHILE_71(p, o, s) BOOST_PP_WHILE_71_C(BOOST_PP_BOOL(p(72, s)), p, o, s)\n# define BOOST_PP_WHILE_72(p, o, s) BOOST_PP_WHILE_72_C(BOOST_PP_BOOL(p(73, s)), p, o, s)\n# define BOOST_PP_WHILE_73(p, o, s) BOOST_PP_WHILE_73_C(BOOST_PP_BOOL(p(74, s)), p, o, s)\n# define BOOST_PP_WHILE_74(p, o, s) BOOST_PP_WHILE_74_C(BOOST_PP_BOOL(p(75, s)), p, o, s)\n# define BOOST_PP_WHILE_75(p, o, s) BOOST_PP_WHILE_75_C(BOOST_PP_BOOL(p(76, s)), p, o, s)\n# define BOOST_PP_WHILE_76(p, o, s) BOOST_PP_WHILE_76_C(BOOST_PP_BOOL(p(77, s)), p, o, s)\n# define BOOST_PP_WHILE_77(p, o, s) BOOST_PP_WHILE_77_C(BOOST_PP_BOOL(p(78, s)), p, o, s)\n# define BOOST_PP_WHILE_78(p, o, s) BOOST_PP_WHILE_78_C(BOOST_PP_BOOL(p(79, s)), p, o, s)\n# define BOOST_PP_WHILE_79(p, o, s) BOOST_PP_WHILE_79_C(BOOST_PP_BOOL(p(80, s)), p, o, s)\n# define BOOST_PP_WHILE_80(p, o, s) BOOST_PP_WHILE_80_C(BOOST_PP_BOOL(p(81, s)), p, o, s)\n# define BOOST_PP_WHILE_81(p, o, s) BOOST_PP_WHILE_81_C(BOOST_PP_BOOL(p(82, s)), p, o, s)\n# define BOOST_PP_WHILE_82(p, o, s) BOOST_PP_WHILE_82_C(BOOST_PP_BOOL(p(83, s)), p, o, s)\n# define BOOST_PP_WHILE_83(p, o, s) BOOST_PP_WHILE_83_C(BOOST_PP_BOOL(p(84, s)), p, o, s)\n# define BOOST_PP_WHILE_84(p, o, s) BOOST_PP_WHILE_84_C(BOOST_PP_BOOL(p(85, s)), p, o, s)\n# define BOOST_PP_WHILE_85(p, o, s) BOOST_PP_WHILE_85_C(BOOST_PP_BOOL(p(86, s)), p, o, s)\n# define BOOST_PP_WHILE_86(p, o, s) BOOST_PP_WHILE_86_C(BOOST_PP_BOOL(p(87, s)), p, o, s)\n# define BOOST_PP_WHILE_87(p, o, s) BOOST_PP_WHILE_87_C(BOOST_PP_BOOL(p(88, s)), p, o, s)\n# define BOOST_PP_WHILE_88(p, o, s) BOOST_PP_WHILE_88_C(BOOST_PP_BOOL(p(89, s)), p, o, s)\n# define BOOST_PP_WHILE_89(p, o, s) BOOST_PP_WHILE_89_C(BOOST_PP_BOOL(p(90, s)), p, o, s)\n# define BOOST_PP_WHILE_90(p, o, s) BOOST_PP_WHILE_90_C(BOOST_PP_BOOL(p(91, s)), p, o, s)\n# define BOOST_PP_WHILE_91(p, o, s) BOOST_PP_WHILE_91_C(BOOST_PP_BOOL(p(92, s)), p, o, s)\n# define BOOST_PP_WHILE_92(p, o, s) BOOST_PP_WHILE_92_C(BOOST_PP_BOOL(p(93, s)), p, o, s)\n# define BOOST_PP_WHILE_93(p, o, s) BOOST_PP_WHILE_93_C(BOOST_PP_BOOL(p(94, s)), p, o, s)\n# define BOOST_PP_WHILE_94(p, o, s) BOOST_PP_WHILE_94_C(BOOST_PP_BOOL(p(95, s)), p, o, s)\n# define BOOST_PP_WHILE_95(p, o, s) BOOST_PP_WHILE_95_C(BOOST_PP_BOOL(p(96, s)), p, o, s)\n# define BOOST_PP_WHILE_96(p, o, s) BOOST_PP_WHILE_96_C(BOOST_PP_BOOL(p(97, s)), p, o, s)\n# define BOOST_PP_WHILE_97(p, o, s) BOOST_PP_WHILE_97_C(BOOST_PP_BOOL(p(98, s)), p, o, s)\n# define BOOST_PP_WHILE_98(p, o, s) BOOST_PP_WHILE_98_C(BOOST_PP_BOOL(p(99, s)), p, o, s)\n# define BOOST_PP_WHILE_99(p, o, s) BOOST_PP_WHILE_99_C(BOOST_PP_BOOL(p(100, s)), p, o, s)\n# define BOOST_PP_WHILE_100(p, o, s) BOOST_PP_WHILE_100_C(BOOST_PP_BOOL(p(101, s)), p, o, s)\n# define BOOST_PP_WHILE_101(p, o, s) BOOST_PP_WHILE_101_C(BOOST_PP_BOOL(p(102, s)), p, o, s)\n# define BOOST_PP_WHILE_102(p, o, s) BOOST_PP_WHILE_102_C(BOOST_PP_BOOL(p(103, s)), p, o, s)\n# define BOOST_PP_WHILE_103(p, o, s) BOOST_PP_WHILE_103_C(BOOST_PP_BOOL(p(104, s)), p, o, s)\n# define BOOST_PP_WHILE_104(p, o, s) BOOST_PP_WHILE_104_C(BOOST_PP_BOOL(p(105, s)), p, o, s)\n# define BOOST_PP_WHILE_105(p, o, s) BOOST_PP_WHILE_105_C(BOOST_PP_BOOL(p(106, s)), p, o, s)\n# define BOOST_PP_WHILE_106(p, o, s) BOOST_PP_WHILE_106_C(BOOST_PP_BOOL(p(107, s)), p, o, s)\n# define BOOST_PP_WHILE_107(p, o, s) BOOST_PP_WHILE_107_C(BOOST_PP_BOOL(p(108, s)), p, o, s)\n# define BOOST_PP_WHILE_108(p, o, s) BOOST_PP_WHILE_108_C(BOOST_PP_BOOL(p(109, s)), p, o, s)\n# define BOOST_PP_WHILE_109(p, o, s) BOOST_PP_WHILE_109_C(BOOST_PP_BOOL(p(110, s)), p, o, s)\n# define BOOST_PP_WHILE_110(p, o, s) BOOST_PP_WHILE_110_C(BOOST_PP_BOOL(p(111, s)), p, o, s)\n# define BOOST_PP_WHILE_111(p, o, s) BOOST_PP_WHILE_111_C(BOOST_PP_BOOL(p(112, s)), p, o, s)\n# define BOOST_PP_WHILE_112(p, o, s) BOOST_PP_WHILE_112_C(BOOST_PP_BOOL(p(113, s)), p, o, s)\n# define BOOST_PP_WHILE_113(p, o, s) BOOST_PP_WHILE_113_C(BOOST_PP_BOOL(p(114, s)), p, o, s)\n# define BOOST_PP_WHILE_114(p, o, s) BOOST_PP_WHILE_114_C(BOOST_PP_BOOL(p(115, s)), p, o, s)\n# define BOOST_PP_WHILE_115(p, o, s) BOOST_PP_WHILE_115_C(BOOST_PP_BOOL(p(116, s)), p, o, s)\n# define BOOST_PP_WHILE_116(p, o, s) BOOST_PP_WHILE_116_C(BOOST_PP_BOOL(p(117, s)), p, o, s)\n# define BOOST_PP_WHILE_117(p, o, s) BOOST_PP_WHILE_117_C(BOOST_PP_BOOL(p(118, s)), p, o, s)\n# define BOOST_PP_WHILE_118(p, o, s) BOOST_PP_WHILE_118_C(BOOST_PP_BOOL(p(119, s)), p, o, s)\n# define BOOST_PP_WHILE_119(p, o, s) BOOST_PP_WHILE_119_C(BOOST_PP_BOOL(p(120, s)), p, o, s)\n# define BOOST_PP_WHILE_120(p, o, s) BOOST_PP_WHILE_120_C(BOOST_PP_BOOL(p(121, s)), p, o, s)\n# define BOOST_PP_WHILE_121(p, o, s) BOOST_PP_WHILE_121_C(BOOST_PP_BOOL(p(122, s)), p, o, s)\n# define BOOST_PP_WHILE_122(p, o, s) BOOST_PP_WHILE_122_C(BOOST_PP_BOOL(p(123, s)), p, o, s)\n# define BOOST_PP_WHILE_123(p, o, s) BOOST_PP_WHILE_123_C(BOOST_PP_BOOL(p(124, s)), p, o, s)\n# define BOOST_PP_WHILE_124(p, o, s) BOOST_PP_WHILE_124_C(BOOST_PP_BOOL(p(125, s)), p, o, s)\n# define BOOST_PP_WHILE_125(p, o, s) BOOST_PP_WHILE_125_C(BOOST_PP_BOOL(p(126, s)), p, o, s)\n# define BOOST_PP_WHILE_126(p, o, s) BOOST_PP_WHILE_126_C(BOOST_PP_BOOL(p(127, s)), p, o, s)\n# define BOOST_PP_WHILE_127(p, o, s) BOOST_PP_WHILE_127_C(BOOST_PP_BOOL(p(128, s)), p, o, s)\n# define BOOST_PP_WHILE_128(p, o, s) BOOST_PP_WHILE_128_C(BOOST_PP_BOOL(p(129, s)), p, o, s)\n# define BOOST_PP_WHILE_129(p, o, s) BOOST_PP_WHILE_129_C(BOOST_PP_BOOL(p(130, s)), p, o, s)\n# define BOOST_PP_WHILE_130(p, o, s) BOOST_PP_WHILE_130_C(BOOST_PP_BOOL(p(131, s)), p, o, s)\n# define BOOST_PP_WHILE_131(p, o, s) BOOST_PP_WHILE_131_C(BOOST_PP_BOOL(p(132, s)), p, o, s)\n# define BOOST_PP_WHILE_132(p, o, s) BOOST_PP_WHILE_132_C(BOOST_PP_BOOL(p(133, s)), p, o, s)\n# define BOOST_PP_WHILE_133(p, o, s) BOOST_PP_WHILE_133_C(BOOST_PP_BOOL(p(134, s)), p, o, s)\n# define BOOST_PP_WHILE_134(p, o, s) BOOST_PP_WHILE_134_C(BOOST_PP_BOOL(p(135, s)), p, o, s)\n# define BOOST_PP_WHILE_135(p, o, s) BOOST_PP_WHILE_135_C(BOOST_PP_BOOL(p(136, s)), p, o, s)\n# define BOOST_PP_WHILE_136(p, o, s) BOOST_PP_WHILE_136_C(BOOST_PP_BOOL(p(137, s)), p, o, s)\n# define BOOST_PP_WHILE_137(p, o, s) BOOST_PP_WHILE_137_C(BOOST_PP_BOOL(p(138, s)), p, o, s)\n# define BOOST_PP_WHILE_138(p, o, s) BOOST_PP_WHILE_138_C(BOOST_PP_BOOL(p(139, s)), p, o, s)\n# define BOOST_PP_WHILE_139(p, o, s) BOOST_PP_WHILE_139_C(BOOST_PP_BOOL(p(140, s)), p, o, s)\n# define BOOST_PP_WHILE_140(p, o, s) BOOST_PP_WHILE_140_C(BOOST_PP_BOOL(p(141, s)), p, o, s)\n# define BOOST_PP_WHILE_141(p, o, s) BOOST_PP_WHILE_141_C(BOOST_PP_BOOL(p(142, s)), p, o, s)\n# define BOOST_PP_WHILE_142(p, o, s) BOOST_PP_WHILE_142_C(BOOST_PP_BOOL(p(143, s)), p, o, s)\n# define BOOST_PP_WHILE_143(p, o, s) BOOST_PP_WHILE_143_C(BOOST_PP_BOOL(p(144, s)), p, o, s)\n# define BOOST_PP_WHILE_144(p, o, s) BOOST_PP_WHILE_144_C(BOOST_PP_BOOL(p(145, s)), p, o, s)\n# define BOOST_PP_WHILE_145(p, o, s) BOOST_PP_WHILE_145_C(BOOST_PP_BOOL(p(146, s)), p, o, s)\n# define BOOST_PP_WHILE_146(p, o, s) BOOST_PP_WHILE_146_C(BOOST_PP_BOOL(p(147, s)), p, o, s)\n# define BOOST_PP_WHILE_147(p, o, s) BOOST_PP_WHILE_147_C(BOOST_PP_BOOL(p(148, s)), p, o, s)\n# define BOOST_PP_WHILE_148(p, o, s) BOOST_PP_WHILE_148_C(BOOST_PP_BOOL(p(149, s)), p, o, s)\n# define BOOST_PP_WHILE_149(p, o, s) BOOST_PP_WHILE_149_C(BOOST_PP_BOOL(p(150, s)), p, o, s)\n# define BOOST_PP_WHILE_150(p, o, s) BOOST_PP_WHILE_150_C(BOOST_PP_BOOL(p(151, s)), p, o, s)\n# define BOOST_PP_WHILE_151(p, o, s) BOOST_PP_WHILE_151_C(BOOST_PP_BOOL(p(152, s)), p, o, s)\n# define BOOST_PP_WHILE_152(p, o, s) BOOST_PP_WHILE_152_C(BOOST_PP_BOOL(p(153, s)), p, o, s)\n# define BOOST_PP_WHILE_153(p, o, s) BOOST_PP_WHILE_153_C(BOOST_PP_BOOL(p(154, s)), p, o, s)\n# define BOOST_PP_WHILE_154(p, o, s) BOOST_PP_WHILE_154_C(BOOST_PP_BOOL(p(155, s)), p, o, s)\n# define BOOST_PP_WHILE_155(p, o, s) BOOST_PP_WHILE_155_C(BOOST_PP_BOOL(p(156, s)), p, o, s)\n# define BOOST_PP_WHILE_156(p, o, s) BOOST_PP_WHILE_156_C(BOOST_PP_BOOL(p(157, s)), p, o, s)\n# define BOOST_PP_WHILE_157(p, o, s) BOOST_PP_WHILE_157_C(BOOST_PP_BOOL(p(158, s)), p, o, s)\n# define BOOST_PP_WHILE_158(p, o, s) BOOST_PP_WHILE_158_C(BOOST_PP_BOOL(p(159, s)), p, o, s)\n# define BOOST_PP_WHILE_159(p, o, s) BOOST_PP_WHILE_159_C(BOOST_PP_BOOL(p(160, s)), p, o, s)\n# define BOOST_PP_WHILE_160(p, o, s) BOOST_PP_WHILE_160_C(BOOST_PP_BOOL(p(161, s)), p, o, s)\n# define BOOST_PP_WHILE_161(p, o, s) BOOST_PP_WHILE_161_C(BOOST_PP_BOOL(p(162, s)), p, o, s)\n# define BOOST_PP_WHILE_162(p, o, s) BOOST_PP_WHILE_162_C(BOOST_PP_BOOL(p(163, s)), p, o, s)\n# define BOOST_PP_WHILE_163(p, o, s) BOOST_PP_WHILE_163_C(BOOST_PP_BOOL(p(164, s)), p, o, s)\n# define BOOST_PP_WHILE_164(p, o, s) BOOST_PP_WHILE_164_C(BOOST_PP_BOOL(p(165, s)), p, o, s)\n# define BOOST_PP_WHILE_165(p, o, s) BOOST_PP_WHILE_165_C(BOOST_PP_BOOL(p(166, s)), p, o, s)\n# define BOOST_PP_WHILE_166(p, o, s) BOOST_PP_WHILE_166_C(BOOST_PP_BOOL(p(167, s)), p, o, s)\n# define BOOST_PP_WHILE_167(p, o, s) BOOST_PP_WHILE_167_C(BOOST_PP_BOOL(p(168, s)), p, o, s)\n# define BOOST_PP_WHILE_168(p, o, s) BOOST_PP_WHILE_168_C(BOOST_PP_BOOL(p(169, s)), p, o, s)\n# define BOOST_PP_WHILE_169(p, o, s) BOOST_PP_WHILE_169_C(BOOST_PP_BOOL(p(170, s)), p, o, s)\n# define BOOST_PP_WHILE_170(p, o, s) BOOST_PP_WHILE_170_C(BOOST_PP_BOOL(p(171, s)), p, o, s)\n# define BOOST_PP_WHILE_171(p, o, s) BOOST_PP_WHILE_171_C(BOOST_PP_BOOL(p(172, s)), p, o, s)\n# define BOOST_PP_WHILE_172(p, o, s) BOOST_PP_WHILE_172_C(BOOST_PP_BOOL(p(173, s)), p, o, s)\n# define BOOST_PP_WHILE_173(p, o, s) BOOST_PP_WHILE_173_C(BOOST_PP_BOOL(p(174, s)), p, o, s)\n# define BOOST_PP_WHILE_174(p, o, s) BOOST_PP_WHILE_174_C(BOOST_PP_BOOL(p(175, s)), p, o, s)\n# define BOOST_PP_WHILE_175(p, o, s) BOOST_PP_WHILE_175_C(BOOST_PP_BOOL(p(176, s)), p, o, s)\n# define BOOST_PP_WHILE_176(p, o, s) BOOST_PP_WHILE_176_C(BOOST_PP_BOOL(p(177, s)), p, o, s)\n# define BOOST_PP_WHILE_177(p, o, s) BOOST_PP_WHILE_177_C(BOOST_PP_BOOL(p(178, s)), p, o, s)\n# define BOOST_PP_WHILE_178(p, o, s) BOOST_PP_WHILE_178_C(BOOST_PP_BOOL(p(179, s)), p, o, s)\n# define BOOST_PP_WHILE_179(p, o, s) BOOST_PP_WHILE_179_C(BOOST_PP_BOOL(p(180, s)), p, o, s)\n# define BOOST_PP_WHILE_180(p, o, s) BOOST_PP_WHILE_180_C(BOOST_PP_BOOL(p(181, s)), p, o, s)\n# define BOOST_PP_WHILE_181(p, o, s) BOOST_PP_WHILE_181_C(BOOST_PP_BOOL(p(182, s)), p, o, s)\n# define BOOST_PP_WHILE_182(p, o, s) BOOST_PP_WHILE_182_C(BOOST_PP_BOOL(p(183, s)), p, o, s)\n# define BOOST_PP_WHILE_183(p, o, s) BOOST_PP_WHILE_183_C(BOOST_PP_BOOL(p(184, s)), p, o, s)\n# define BOOST_PP_WHILE_184(p, o, s) BOOST_PP_WHILE_184_C(BOOST_PP_BOOL(p(185, s)), p, o, s)\n# define BOOST_PP_WHILE_185(p, o, s) BOOST_PP_WHILE_185_C(BOOST_PP_BOOL(p(186, s)), p, o, s)\n# define BOOST_PP_WHILE_186(p, o, s) BOOST_PP_WHILE_186_C(BOOST_PP_BOOL(p(187, s)), p, o, s)\n# define BOOST_PP_WHILE_187(p, o, s) BOOST_PP_WHILE_187_C(BOOST_PP_BOOL(p(188, s)), p, o, s)\n# define BOOST_PP_WHILE_188(p, o, s) BOOST_PP_WHILE_188_C(BOOST_PP_BOOL(p(189, s)), p, o, s)\n# define BOOST_PP_WHILE_189(p, o, s) BOOST_PP_WHILE_189_C(BOOST_PP_BOOL(p(190, s)), p, o, s)\n# define BOOST_PP_WHILE_190(p, o, s) BOOST_PP_WHILE_190_C(BOOST_PP_BOOL(p(191, s)), p, o, s)\n# define BOOST_PP_WHILE_191(p, o, s) BOOST_PP_WHILE_191_C(BOOST_PP_BOOL(p(192, s)), p, o, s)\n# define BOOST_PP_WHILE_192(p, o, s) BOOST_PP_WHILE_192_C(BOOST_PP_BOOL(p(193, s)), p, o, s)\n# define BOOST_PP_WHILE_193(p, o, s) BOOST_PP_WHILE_193_C(BOOST_PP_BOOL(p(194, s)), p, o, s)\n# define BOOST_PP_WHILE_194(p, o, s) BOOST_PP_WHILE_194_C(BOOST_PP_BOOL(p(195, s)), p, o, s)\n# define BOOST_PP_WHILE_195(p, o, s) BOOST_PP_WHILE_195_C(BOOST_PP_BOOL(p(196, s)), p, o, s)\n# define BOOST_PP_WHILE_196(p, o, s) BOOST_PP_WHILE_196_C(BOOST_PP_BOOL(p(197, s)), p, o, s)\n# define BOOST_PP_WHILE_197(p, o, s) BOOST_PP_WHILE_197_C(BOOST_PP_BOOL(p(198, s)), p, o, s)\n# define BOOST_PP_WHILE_198(p, o, s) BOOST_PP_WHILE_198_C(BOOST_PP_BOOL(p(199, s)), p, o, s)\n# define BOOST_PP_WHILE_199(p, o, s) BOOST_PP_WHILE_199_C(BOOST_PP_BOOL(p(200, s)), p, o, s)\n# define BOOST_PP_WHILE_200(p, o, s) BOOST_PP_WHILE_200_C(BOOST_PP_BOOL(p(201, s)), p, o, s)\n# define BOOST_PP_WHILE_201(p, o, s) BOOST_PP_WHILE_201_C(BOOST_PP_BOOL(p(202, s)), p, o, s)\n# define BOOST_PP_WHILE_202(p, o, s) BOOST_PP_WHILE_202_C(BOOST_PP_BOOL(p(203, s)), p, o, s)\n# define BOOST_PP_WHILE_203(p, o, s) BOOST_PP_WHILE_203_C(BOOST_PP_BOOL(p(204, s)), p, o, s)\n# define BOOST_PP_WHILE_204(p, o, s) BOOST_PP_WHILE_204_C(BOOST_PP_BOOL(p(205, s)), p, o, s)\n# define BOOST_PP_WHILE_205(p, o, s) BOOST_PP_WHILE_205_C(BOOST_PP_BOOL(p(206, s)), p, o, s)\n# define BOOST_PP_WHILE_206(p, o, s) BOOST_PP_WHILE_206_C(BOOST_PP_BOOL(p(207, s)), p, o, s)\n# define BOOST_PP_WHILE_207(p, o, s) BOOST_PP_WHILE_207_C(BOOST_PP_BOOL(p(208, s)), p, o, s)\n# define BOOST_PP_WHILE_208(p, o, s) BOOST_PP_WHILE_208_C(BOOST_PP_BOOL(p(209, s)), p, o, s)\n# define BOOST_PP_WHILE_209(p, o, s) BOOST_PP_WHILE_209_C(BOOST_PP_BOOL(p(210, s)), p, o, s)\n# define BOOST_PP_WHILE_210(p, o, s) BOOST_PP_WHILE_210_C(BOOST_PP_BOOL(p(211, s)), p, o, s)\n# define BOOST_PP_WHILE_211(p, o, s) BOOST_PP_WHILE_211_C(BOOST_PP_BOOL(p(212, s)), p, o, s)\n# define BOOST_PP_WHILE_212(p, o, s) BOOST_PP_WHILE_212_C(BOOST_PP_BOOL(p(213, s)), p, o, s)\n# define BOOST_PP_WHILE_213(p, o, s) BOOST_PP_WHILE_213_C(BOOST_PP_BOOL(p(214, s)), p, o, s)\n# define BOOST_PP_WHILE_214(p, o, s) BOOST_PP_WHILE_214_C(BOOST_PP_BOOL(p(215, s)), p, o, s)\n# define BOOST_PP_WHILE_215(p, o, s) BOOST_PP_WHILE_215_C(BOOST_PP_BOOL(p(216, s)), p, o, s)\n# define BOOST_PP_WHILE_216(p, o, s) BOOST_PP_WHILE_216_C(BOOST_PP_BOOL(p(217, s)), p, o, s)\n# define BOOST_PP_WHILE_217(p, o, s) BOOST_PP_WHILE_217_C(BOOST_PP_BOOL(p(218, s)), p, o, s)\n# define BOOST_PP_WHILE_218(p, o, s) BOOST_PP_WHILE_218_C(BOOST_PP_BOOL(p(219, s)), p, o, s)\n# define BOOST_PP_WHILE_219(p, o, s) BOOST_PP_WHILE_219_C(BOOST_PP_BOOL(p(220, s)), p, o, s)\n# define BOOST_PP_WHILE_220(p, o, s) BOOST_PP_WHILE_220_C(BOOST_PP_BOOL(p(221, s)), p, o, s)\n# define BOOST_PP_WHILE_221(p, o, s) BOOST_PP_WHILE_221_C(BOOST_PP_BOOL(p(222, s)), p, o, s)\n# define BOOST_PP_WHILE_222(p, o, s) BOOST_PP_WHILE_222_C(BOOST_PP_BOOL(p(223, s)), p, o, s)\n# define BOOST_PP_WHILE_223(p, o, s) BOOST_PP_WHILE_223_C(BOOST_PP_BOOL(p(224, s)), p, o, s)\n# define BOOST_PP_WHILE_224(p, o, s) BOOST_PP_WHILE_224_C(BOOST_PP_BOOL(p(225, s)), p, o, s)\n# define BOOST_PP_WHILE_225(p, o, s) BOOST_PP_WHILE_225_C(BOOST_PP_BOOL(p(226, s)), p, o, s)\n# define BOOST_PP_WHILE_226(p, o, s) BOOST_PP_WHILE_226_C(BOOST_PP_BOOL(p(227, s)), p, o, s)\n# define BOOST_PP_WHILE_227(p, o, s) BOOST_PP_WHILE_227_C(BOOST_PP_BOOL(p(228, s)), p, o, s)\n# define BOOST_PP_WHILE_228(p, o, s) BOOST_PP_WHILE_228_C(BOOST_PP_BOOL(p(229, s)), p, o, s)\n# define BOOST_PP_WHILE_229(p, o, s) BOOST_PP_WHILE_229_C(BOOST_PP_BOOL(p(230, s)), p, o, s)\n# define BOOST_PP_WHILE_230(p, o, s) BOOST_PP_WHILE_230_C(BOOST_PP_BOOL(p(231, s)), p, o, s)\n# define BOOST_PP_WHILE_231(p, o, s) BOOST_PP_WHILE_231_C(BOOST_PP_BOOL(p(232, s)), p, o, s)\n# define BOOST_PP_WHILE_232(p, o, s) BOOST_PP_WHILE_232_C(BOOST_PP_BOOL(p(233, s)), p, o, s)\n# define BOOST_PP_WHILE_233(p, o, s) BOOST_PP_WHILE_233_C(BOOST_PP_BOOL(p(234, s)), p, o, s)\n# define BOOST_PP_WHILE_234(p, o, s) BOOST_PP_WHILE_234_C(BOOST_PP_BOOL(p(235, s)), p, o, s)\n# define BOOST_PP_WHILE_235(p, o, s) BOOST_PP_WHILE_235_C(BOOST_PP_BOOL(p(236, s)), p, o, s)\n# define BOOST_PP_WHILE_236(p, o, s) BOOST_PP_WHILE_236_C(BOOST_PP_BOOL(p(237, s)), p, o, s)\n# define BOOST_PP_WHILE_237(p, o, s) BOOST_PP_WHILE_237_C(BOOST_PP_BOOL(p(238, s)), p, o, s)\n# define BOOST_PP_WHILE_238(p, o, s) BOOST_PP_WHILE_238_C(BOOST_PP_BOOL(p(239, s)), p, o, s)\n# define BOOST_PP_WHILE_239(p, o, s) BOOST_PP_WHILE_239_C(BOOST_PP_BOOL(p(240, s)), p, o, s)\n# define BOOST_PP_WHILE_240(p, o, s) BOOST_PP_WHILE_240_C(BOOST_PP_BOOL(p(241, s)), p, o, s)\n# define BOOST_PP_WHILE_241(p, o, s) BOOST_PP_WHILE_241_C(BOOST_PP_BOOL(p(242, s)), p, o, s)\n# define BOOST_PP_WHILE_242(p, o, s) BOOST_PP_WHILE_242_C(BOOST_PP_BOOL(p(243, s)), p, o, s)\n# define BOOST_PP_WHILE_243(p, o, s) BOOST_PP_WHILE_243_C(BOOST_PP_BOOL(p(244, s)), p, o, s)\n# define BOOST_PP_WHILE_244(p, o, s) BOOST_PP_WHILE_244_C(BOOST_PP_BOOL(p(245, s)), p, o, s)\n# define BOOST_PP_WHILE_245(p, o, s) BOOST_PP_WHILE_245_C(BOOST_PP_BOOL(p(246, s)), p, o, s)\n# define BOOST_PP_WHILE_246(p, o, s) BOOST_PP_WHILE_246_C(BOOST_PP_BOOL(p(247, s)), p, o, s)\n# define BOOST_PP_WHILE_247(p, o, s) BOOST_PP_WHILE_247_C(BOOST_PP_BOOL(p(248, s)), p, o, s)\n# define BOOST_PP_WHILE_248(p, o, s) BOOST_PP_WHILE_248_C(BOOST_PP_BOOL(p(249, s)), p, o, s)\n# define BOOST_PP_WHILE_249(p, o, s) BOOST_PP_WHILE_249_C(BOOST_PP_BOOL(p(250, s)), p, o, s)\n# define BOOST_PP_WHILE_250(p, o, s) BOOST_PP_WHILE_250_C(BOOST_PP_BOOL(p(251, s)), p, o, s)\n# define BOOST_PP_WHILE_251(p, o, s) BOOST_PP_WHILE_251_C(BOOST_PP_BOOL(p(252, s)), p, o, s)\n# define BOOST_PP_WHILE_252(p, o, s) BOOST_PP_WHILE_252_C(BOOST_PP_BOOL(p(253, s)), p, o, s)\n# define BOOST_PP_WHILE_253(p, o, s) BOOST_PP_WHILE_253_C(BOOST_PP_BOOL(p(254, s)), p, o, s)\n# define BOOST_PP_WHILE_254(p, o, s) BOOST_PP_WHILE_254_C(BOOST_PP_BOOL(p(255, s)), p, o, s)\n# define BOOST_PP_WHILE_255(p, o, s) BOOST_PP_WHILE_255_C(BOOST_PP_BOOL(p(256, s)), p, o, s)\n# define BOOST_PP_WHILE_256(p, o, s) BOOST_PP_WHILE_256_C(BOOST_PP_BOOL(p(257, s)), p, o, s)\n#\n# define BOOST_PP_WHILE_1_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_2, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(2, s))\n# define BOOST_PP_WHILE_2_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_3, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(3, s))\n# define BOOST_PP_WHILE_3_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_4, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(4, s))\n# define BOOST_PP_WHILE_4_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_5, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(5, s))\n# define BOOST_PP_WHILE_5_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_6, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(6, s))\n# define BOOST_PP_WHILE_6_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_7, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(7, s))\n# define BOOST_PP_WHILE_7_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_8, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(8, s))\n# define BOOST_PP_WHILE_8_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_9, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(9, s))\n# define BOOST_PP_WHILE_9_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_10, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(10, s))\n# define BOOST_PP_WHILE_10_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_11, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(11, s))\n# define BOOST_PP_WHILE_11_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_12, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(12, s))\n# define BOOST_PP_WHILE_12_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_13, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(13, s))\n# define BOOST_PP_WHILE_13_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_14, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(14, s))\n# define BOOST_PP_WHILE_14_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_15, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(15, s))\n# define BOOST_PP_WHILE_15_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_16, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(16, s))\n# define BOOST_PP_WHILE_16_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_17, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(17, s))\n# define BOOST_PP_WHILE_17_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_18, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(18, s))\n# define BOOST_PP_WHILE_18_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_19, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(19, s))\n# define BOOST_PP_WHILE_19_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_20, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(20, s))\n# define BOOST_PP_WHILE_20_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_21, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(21, s))\n# define BOOST_PP_WHILE_21_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_22, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(22, s))\n# define BOOST_PP_WHILE_22_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_23, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(23, s))\n# define BOOST_PP_WHILE_23_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_24, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(24, s))\n# define BOOST_PP_WHILE_24_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_25, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(25, s))\n# define BOOST_PP_WHILE_25_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_26, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(26, s))\n# define BOOST_PP_WHILE_26_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_27, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(27, s))\n# define BOOST_PP_WHILE_27_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_28, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(28, s))\n# define BOOST_PP_WHILE_28_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_29, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(29, s))\n# define BOOST_PP_WHILE_29_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_30, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(30, s))\n# define BOOST_PP_WHILE_30_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_31, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(31, s))\n# define BOOST_PP_WHILE_31_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_32, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(32, s))\n# define BOOST_PP_WHILE_32_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_33, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(33, s))\n# define BOOST_PP_WHILE_33_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_34, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(34, s))\n# define BOOST_PP_WHILE_34_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_35, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(35, s))\n# define BOOST_PP_WHILE_35_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_36, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(36, s))\n# define BOOST_PP_WHILE_36_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_37, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(37, s))\n# define BOOST_PP_WHILE_37_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_38, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(38, s))\n# define BOOST_PP_WHILE_38_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_39, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(39, s))\n# define BOOST_PP_WHILE_39_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_40, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(40, s))\n# define BOOST_PP_WHILE_40_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_41, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(41, s))\n# define BOOST_PP_WHILE_41_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_42, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(42, s))\n# define BOOST_PP_WHILE_42_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_43, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(43, s))\n# define BOOST_PP_WHILE_43_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_44, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(44, s))\n# define BOOST_PP_WHILE_44_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_45, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(45, s))\n# define BOOST_PP_WHILE_45_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_46, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(46, s))\n# define BOOST_PP_WHILE_46_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_47, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(47, s))\n# define BOOST_PP_WHILE_47_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_48, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(48, s))\n# define BOOST_PP_WHILE_48_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_49, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(49, s))\n# define BOOST_PP_WHILE_49_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_50, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(50, s))\n# define BOOST_PP_WHILE_50_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_51, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(51, s))\n# define BOOST_PP_WHILE_51_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_52, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(52, s))\n# define BOOST_PP_WHILE_52_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_53, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(53, s))\n# define BOOST_PP_WHILE_53_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_54, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(54, s))\n# define BOOST_PP_WHILE_54_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_55, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(55, s))\n# define BOOST_PP_WHILE_55_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_56, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(56, s))\n# define BOOST_PP_WHILE_56_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_57, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(57, s))\n# define BOOST_PP_WHILE_57_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_58, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(58, s))\n# define BOOST_PP_WHILE_58_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_59, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(59, s))\n# define BOOST_PP_WHILE_59_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_60, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(60, s))\n# define BOOST_PP_WHILE_60_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_61, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(61, s))\n# define BOOST_PP_WHILE_61_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_62, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(62, s))\n# define BOOST_PP_WHILE_62_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_63, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(63, s))\n# define BOOST_PP_WHILE_63_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_64, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(64, s))\n# define BOOST_PP_WHILE_64_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_65, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(65, s))\n# define BOOST_PP_WHILE_65_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_66, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(66, s))\n# define BOOST_PP_WHILE_66_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_67, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(67, s))\n# define BOOST_PP_WHILE_67_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_68, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(68, s))\n# define BOOST_PP_WHILE_68_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_69, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(69, s))\n# define BOOST_PP_WHILE_69_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_70, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(70, s))\n# define BOOST_PP_WHILE_70_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_71, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(71, s))\n# define BOOST_PP_WHILE_71_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_72, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(72, s))\n# define BOOST_PP_WHILE_72_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_73, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(73, s))\n# define BOOST_PP_WHILE_73_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_74, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(74, s))\n# define BOOST_PP_WHILE_74_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_75, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(75, s))\n# define BOOST_PP_WHILE_75_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_76, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(76, s))\n# define BOOST_PP_WHILE_76_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_77, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(77, s))\n# define BOOST_PP_WHILE_77_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_78, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(78, s))\n# define BOOST_PP_WHILE_78_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_79, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(79, s))\n# define BOOST_PP_WHILE_79_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_80, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(80, s))\n# define BOOST_PP_WHILE_80_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_81, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(81, s))\n# define BOOST_PP_WHILE_81_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_82, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(82, s))\n# define BOOST_PP_WHILE_82_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_83, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(83, s))\n# define BOOST_PP_WHILE_83_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_84, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(84, s))\n# define BOOST_PP_WHILE_84_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_85, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(85, s))\n# define BOOST_PP_WHILE_85_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_86, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(86, s))\n# define BOOST_PP_WHILE_86_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_87, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(87, s))\n# define BOOST_PP_WHILE_87_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_88, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(88, s))\n# define BOOST_PP_WHILE_88_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_89, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(89, s))\n# define BOOST_PP_WHILE_89_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_90, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(90, s))\n# define BOOST_PP_WHILE_90_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_91, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(91, s))\n# define BOOST_PP_WHILE_91_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_92, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(92, s))\n# define BOOST_PP_WHILE_92_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_93, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(93, s))\n# define BOOST_PP_WHILE_93_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_94, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(94, s))\n# define BOOST_PP_WHILE_94_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_95, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(95, s))\n# define BOOST_PP_WHILE_95_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_96, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(96, s))\n# define BOOST_PP_WHILE_96_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_97, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(97, s))\n# define BOOST_PP_WHILE_97_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_98, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(98, s))\n# define BOOST_PP_WHILE_98_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_99, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(99, s))\n# define BOOST_PP_WHILE_99_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_100, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(100, s))\n# define BOOST_PP_WHILE_100_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_101, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(101, s))\n# define BOOST_PP_WHILE_101_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_102, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(102, s))\n# define BOOST_PP_WHILE_102_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_103, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(103, s))\n# define BOOST_PP_WHILE_103_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_104, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(104, s))\n# define BOOST_PP_WHILE_104_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_105, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(105, s))\n# define BOOST_PP_WHILE_105_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_106, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(106, s))\n# define BOOST_PP_WHILE_106_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_107, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(107, s))\n# define BOOST_PP_WHILE_107_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_108, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(108, s))\n# define BOOST_PP_WHILE_108_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_109, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(109, s))\n# define BOOST_PP_WHILE_109_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_110, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(110, s))\n# define BOOST_PP_WHILE_110_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_111, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(111, s))\n# define BOOST_PP_WHILE_111_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_112, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(112, s))\n# define BOOST_PP_WHILE_112_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_113, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(113, s))\n# define BOOST_PP_WHILE_113_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_114, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(114, s))\n# define BOOST_PP_WHILE_114_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_115, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(115, s))\n# define BOOST_PP_WHILE_115_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_116, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(116, s))\n# define BOOST_PP_WHILE_116_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_117, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(117, s))\n# define BOOST_PP_WHILE_117_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_118, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(118, s))\n# define BOOST_PP_WHILE_118_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_119, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(119, s))\n# define BOOST_PP_WHILE_119_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_120, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(120, s))\n# define BOOST_PP_WHILE_120_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_121, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(121, s))\n# define BOOST_PP_WHILE_121_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_122, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(122, s))\n# define BOOST_PP_WHILE_122_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_123, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(123, s))\n# define BOOST_PP_WHILE_123_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_124, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(124, s))\n# define BOOST_PP_WHILE_124_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_125, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(125, s))\n# define BOOST_PP_WHILE_125_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_126, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(126, s))\n# define BOOST_PP_WHILE_126_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_127, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(127, s))\n# define BOOST_PP_WHILE_127_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_128, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(128, s))\n# define BOOST_PP_WHILE_128_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_129, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(129, s))\n# define BOOST_PP_WHILE_129_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_130, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(130, s))\n# define BOOST_PP_WHILE_130_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_131, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(131, s))\n# define BOOST_PP_WHILE_131_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_132, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(132, s))\n# define BOOST_PP_WHILE_132_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_133, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(133, s))\n# define BOOST_PP_WHILE_133_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_134, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(134, s))\n# define BOOST_PP_WHILE_134_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_135, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(135, s))\n# define BOOST_PP_WHILE_135_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_136, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(136, s))\n# define BOOST_PP_WHILE_136_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_137, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(137, s))\n# define BOOST_PP_WHILE_137_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_138, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(138, s))\n# define BOOST_PP_WHILE_138_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_139, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(139, s))\n# define BOOST_PP_WHILE_139_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_140, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(140, s))\n# define BOOST_PP_WHILE_140_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_141, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(141, s))\n# define BOOST_PP_WHILE_141_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_142, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(142, s))\n# define BOOST_PP_WHILE_142_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_143, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(143, s))\n# define BOOST_PP_WHILE_143_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_144, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(144, s))\n# define BOOST_PP_WHILE_144_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_145, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(145, s))\n# define BOOST_PP_WHILE_145_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_146, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(146, s))\n# define BOOST_PP_WHILE_146_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_147, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(147, s))\n# define BOOST_PP_WHILE_147_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_148, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(148, s))\n# define BOOST_PP_WHILE_148_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_149, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(149, s))\n# define BOOST_PP_WHILE_149_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_150, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(150, s))\n# define BOOST_PP_WHILE_150_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_151, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(151, s))\n# define BOOST_PP_WHILE_151_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_152, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(152, s))\n# define BOOST_PP_WHILE_152_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_153, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(153, s))\n# define BOOST_PP_WHILE_153_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_154, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(154, s))\n# define BOOST_PP_WHILE_154_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_155, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(155, s))\n# define BOOST_PP_WHILE_155_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_156, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(156, s))\n# define BOOST_PP_WHILE_156_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_157, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(157, s))\n# define BOOST_PP_WHILE_157_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_158, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(158, s))\n# define BOOST_PP_WHILE_158_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_159, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(159, s))\n# define BOOST_PP_WHILE_159_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_160, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(160, s))\n# define BOOST_PP_WHILE_160_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_161, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(161, s))\n# define BOOST_PP_WHILE_161_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_162, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(162, s))\n# define BOOST_PP_WHILE_162_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_163, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(163, s))\n# define BOOST_PP_WHILE_163_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_164, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(164, s))\n# define BOOST_PP_WHILE_164_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_165, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(165, s))\n# define BOOST_PP_WHILE_165_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_166, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(166, s))\n# define BOOST_PP_WHILE_166_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_167, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(167, s))\n# define BOOST_PP_WHILE_167_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_168, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(168, s))\n# define BOOST_PP_WHILE_168_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_169, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(169, s))\n# define BOOST_PP_WHILE_169_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_170, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(170, s))\n# define BOOST_PP_WHILE_170_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_171, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(171, s))\n# define BOOST_PP_WHILE_171_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_172, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(172, s))\n# define BOOST_PP_WHILE_172_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_173, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(173, s))\n# define BOOST_PP_WHILE_173_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_174, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(174, s))\n# define BOOST_PP_WHILE_174_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_175, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(175, s))\n# define BOOST_PP_WHILE_175_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_176, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(176, s))\n# define BOOST_PP_WHILE_176_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_177, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(177, s))\n# define BOOST_PP_WHILE_177_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_178, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(178, s))\n# define BOOST_PP_WHILE_178_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_179, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(179, s))\n# define BOOST_PP_WHILE_179_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_180, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(180, s))\n# define BOOST_PP_WHILE_180_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_181, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(181, s))\n# define BOOST_PP_WHILE_181_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_182, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(182, s))\n# define BOOST_PP_WHILE_182_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_183, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(183, s))\n# define BOOST_PP_WHILE_183_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_184, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(184, s))\n# define BOOST_PP_WHILE_184_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_185, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(185, s))\n# define BOOST_PP_WHILE_185_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_186, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(186, s))\n# define BOOST_PP_WHILE_186_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_187, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(187, s))\n# define BOOST_PP_WHILE_187_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_188, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(188, s))\n# define BOOST_PP_WHILE_188_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_189, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(189, s))\n# define BOOST_PP_WHILE_189_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_190, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(190, s))\n# define BOOST_PP_WHILE_190_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_191, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(191, s))\n# define BOOST_PP_WHILE_191_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_192, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(192, s))\n# define BOOST_PP_WHILE_192_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_193, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(193, s))\n# define BOOST_PP_WHILE_193_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_194, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(194, s))\n# define BOOST_PP_WHILE_194_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_195, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(195, s))\n# define BOOST_PP_WHILE_195_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_196, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(196, s))\n# define BOOST_PP_WHILE_196_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_197, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(197, s))\n# define BOOST_PP_WHILE_197_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_198, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(198, s))\n# define BOOST_PP_WHILE_198_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_199, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(199, s))\n# define BOOST_PP_WHILE_199_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_200, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(200, s))\n# define BOOST_PP_WHILE_200_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_201, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(201, s))\n# define BOOST_PP_WHILE_201_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_202, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(202, s))\n# define BOOST_PP_WHILE_202_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_203, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(203, s))\n# define BOOST_PP_WHILE_203_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_204, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(204, s))\n# define BOOST_PP_WHILE_204_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_205, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(205, s))\n# define BOOST_PP_WHILE_205_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_206, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(206, s))\n# define BOOST_PP_WHILE_206_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_207, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(207, s))\n# define BOOST_PP_WHILE_207_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_208, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(208, s))\n# define BOOST_PP_WHILE_208_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_209, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(209, s))\n# define BOOST_PP_WHILE_209_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_210, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(210, s))\n# define BOOST_PP_WHILE_210_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_211, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(211, s))\n# define BOOST_PP_WHILE_211_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_212, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(212, s))\n# define BOOST_PP_WHILE_212_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_213, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(213, s))\n# define BOOST_PP_WHILE_213_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_214, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(214, s))\n# define BOOST_PP_WHILE_214_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_215, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(215, s))\n# define BOOST_PP_WHILE_215_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_216, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(216, s))\n# define BOOST_PP_WHILE_216_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_217, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(217, s))\n# define BOOST_PP_WHILE_217_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_218, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(218, s))\n# define BOOST_PP_WHILE_218_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_219, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(219, s))\n# define BOOST_PP_WHILE_219_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_220, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(220, s))\n# define BOOST_PP_WHILE_220_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_221, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(221, s))\n# define BOOST_PP_WHILE_221_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_222, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(222, s))\n# define BOOST_PP_WHILE_222_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_223, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(223, s))\n# define BOOST_PP_WHILE_223_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_224, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(224, s))\n# define BOOST_PP_WHILE_224_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_225, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(225, s))\n# define BOOST_PP_WHILE_225_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_226, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(226, s))\n# define BOOST_PP_WHILE_226_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_227, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(227, s))\n# define BOOST_PP_WHILE_227_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_228, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(228, s))\n# define BOOST_PP_WHILE_228_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_229, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(229, s))\n# define BOOST_PP_WHILE_229_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_230, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(230, s))\n# define BOOST_PP_WHILE_230_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_231, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(231, s))\n# define BOOST_PP_WHILE_231_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_232, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(232, s))\n# define BOOST_PP_WHILE_232_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_233, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(233, s))\n# define BOOST_PP_WHILE_233_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_234, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(234, s))\n# define BOOST_PP_WHILE_234_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_235, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(235, s))\n# define BOOST_PP_WHILE_235_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_236, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(236, s))\n# define BOOST_PP_WHILE_236_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_237, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(237, s))\n# define BOOST_PP_WHILE_237_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_238, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(238, s))\n# define BOOST_PP_WHILE_238_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_239, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(239, s))\n# define BOOST_PP_WHILE_239_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_240, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(240, s))\n# define BOOST_PP_WHILE_240_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_241, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(241, s))\n# define BOOST_PP_WHILE_241_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_242, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(242, s))\n# define BOOST_PP_WHILE_242_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_243, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(243, s))\n# define BOOST_PP_WHILE_243_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_244, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(244, s))\n# define BOOST_PP_WHILE_244_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_245, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(245, s))\n# define BOOST_PP_WHILE_245_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_246, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(246, s))\n# define BOOST_PP_WHILE_246_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_247, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(247, s))\n# define BOOST_PP_WHILE_247_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_248, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(248, s))\n# define BOOST_PP_WHILE_248_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_249, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(249, s))\n# define BOOST_PP_WHILE_249_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_250, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(250, s))\n# define BOOST_PP_WHILE_250_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_251, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(251, s))\n# define BOOST_PP_WHILE_251_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_252, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(252, s))\n# define BOOST_PP_WHILE_252_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_253, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(253, s))\n# define BOOST_PP_WHILE_253_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_254, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(254, s))\n# define BOOST_PP_WHILE_254_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_255, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(255, s))\n# define BOOST_PP_WHILE_255_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_256, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(256, s))\n# define BOOST_PP_WHILE_256_C(c, p, o, s) BOOST_PP_IIF(c, BOOST_PP_WHILE_257, s BOOST_PP_TUPLE_EAT_3)(p, o, BOOST_PP_IIF(c, o, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_2)(257, s))\n#\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/expr_if.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_EXPR_IF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_EXPR_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n#\n# /* BOOST_PP_EXPR_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_EXPR_IF(cond, expr) BOOST_PP_EXPR_IIF(BOOST_PP_BOOL(cond), expr)\n# else\n#    define BOOST_PP_EXPR_IF(cond, expr) BOOST_PP_EXPR_IF_I(cond, expr)\n#    define BOOST_PP_EXPR_IF_I(cond, expr) BOOST_PP_EXPR_IIF(BOOST_PP_BOOL(cond), expr)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/expr_iif.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_EXPR_IIF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_EXPR_IIF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_EXPR_IIF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_EXPR_IIF(bit, expr) BOOST_PP_EXPR_IIF_I(bit, expr)\n# else\n#    define BOOST_PP_EXPR_IIF(bit, expr) BOOST_PP_EXPR_IIF_OO((bit, expr))\n#    define BOOST_PP_EXPR_IIF_OO(par) BOOST_PP_EXPR_IIF_I ## par\n# endif\n#\n# define BOOST_PP_EXPR_IIF_I(bit, expr) BOOST_PP_EXPR_IIF_ ## bit(expr)\n#\n# define BOOST_PP_EXPR_IIF_0(expr)\n# define BOOST_PP_EXPR_IIF_1(expr) expr\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/if.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_IF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n#\n# /* BOOST_PP_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IF(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)\n# else\n#    define BOOST_PP_IF(cond, t, f) BOOST_PP_IF_I(cond, t, f)\n#    define BOOST_PP_IF_I(cond, t, f) BOOST_PP_IIF(BOOST_PP_BOOL(cond), t, f)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/iif.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_IIF_HPP\n# define BOOST_PREPROCESSOR_CONTROL_IIF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_I(bit, t, f)\n# else\n#    define BOOST_PP_IIF(bit, t, f) BOOST_PP_IIF_OO((bit, t, f))\n#    define BOOST_PP_IIF_OO(par) BOOST_PP_IIF_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_ ## bit(t, f)\n# else\n#    define BOOST_PP_IIF_I(bit, t, f) BOOST_PP_IIF_II(BOOST_PP_IIF_ ## bit(t, f))\n#    define BOOST_PP_IIF_II(id) id\n# endif\n#\n# define BOOST_PP_IIF_0(t, f) f\n# define BOOST_PP_IIF_1(t, f) t\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control/while.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_WHILE_HPP\n# define BOOST_PREPROCESSOR_CONTROL_WHILE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/list/fold_left.hpp>\n# include <boost/preprocessor/list/fold_right.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n#\n# /* BOOST_PP_WHILE */\n#\n# if 0\n#    define BOOST_PP_WHILE(pred, op, state)\n# endif\n#\n# define BOOST_PP_WHILE BOOST_PP_CAT(BOOST_PP_WHILE_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_WHILE_P(n) BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_WHILE_CHECK_, BOOST_PP_WHILE_ ## n(BOOST_PP_WHILE_F, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_CHECK_, BOOST_PP_LIST_FOLD_LEFT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_CAT(BOOST_PP_LIST_FOLD_RIGHT_CHECK_, BOOST_PP_LIST_FOLD_RIGHT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL))))\n# else\n#    define BOOST_PP_WHILE_P(n) BOOST_PP_BITAND(BOOST_PP_CAT(BOOST_PP_WHILE_CHECK_, BOOST_PP_WHILE_ ## n(BOOST_PP_WHILE_F, BOOST_PP_NIL, BOOST_PP_NIL)), BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_CHECK_, BOOST_PP_LIST_FOLD_LEFT_ ## n(BOOST_PP_NIL, BOOST_PP_NIL, BOOST_PP_NIL)))\n# endif\n#\n# define BOOST_PP_WHILE_F(d, _) 0\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/control/detail/edg/while.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    include <boost/preprocessor/control/detail/msvc/while.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    include <boost/preprocessor/control/detail/dmc/while.hpp>\n# else\n#    include <boost/preprocessor/control/detail/while.hpp>\n# endif\n#\n# define BOOST_PP_WHILE_257(p, o, s) BOOST_PP_ERROR(0x0001)\n#\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_1(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_2(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_3(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_4(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_5(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_6(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_7(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_8(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_9(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_10(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_11(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_12(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_13(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_14(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_15(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_16(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_17(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_18(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_19(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_20(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_21(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_22(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_23(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_24(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_25(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_26(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_27(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_28(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_29(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_30(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_31(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_32(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_33(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_34(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_35(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_36(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_37(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_38(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_39(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_40(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_41(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_42(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_43(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_44(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_45(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_46(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_47(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_48(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_49(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_50(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_51(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_52(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_53(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_54(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_55(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_56(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_57(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_58(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_59(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_60(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_61(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_62(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_63(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_64(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_65(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_66(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_67(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_68(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_69(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_70(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_71(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_72(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_73(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_74(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_75(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_76(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_77(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_78(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_79(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_80(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_81(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_82(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_83(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_84(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_85(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_86(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_87(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_88(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_89(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_90(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_91(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_92(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_93(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_94(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_95(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_96(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_97(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_98(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_99(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_100(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_101(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_102(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_103(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_104(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_105(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_106(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_107(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_108(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_109(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_110(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_111(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_112(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_113(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_114(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_115(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_116(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_117(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_118(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_119(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_120(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_121(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_122(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_123(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_124(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_125(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_126(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_127(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_128(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_129(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_130(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_131(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_132(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_133(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_134(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_135(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_136(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_137(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_138(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_139(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_140(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_141(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_142(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_143(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_144(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_145(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_146(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_147(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_148(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_149(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_150(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_151(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_152(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_153(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_154(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_155(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_156(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_157(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_158(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_159(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_160(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_161(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_162(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_163(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_164(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_165(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_166(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_167(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_168(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_169(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_170(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_171(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_172(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_173(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_174(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_175(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_176(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_177(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_178(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_179(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_180(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_181(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_182(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_183(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_184(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_185(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_186(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_187(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_188(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_189(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_190(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_191(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_192(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_193(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_194(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_195(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_196(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_197(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_198(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_199(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_200(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_201(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_202(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_203(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_204(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_205(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_206(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_207(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_208(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_209(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_210(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_211(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_212(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_213(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_214(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_215(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_216(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_217(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_218(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_219(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_220(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_221(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_222(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_223(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_224(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_225(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_226(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_227(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_228(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_229(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_230(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_231(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_232(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_233(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_234(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_235(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_236(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_237(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_238(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_239(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_240(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_241(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_242(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_243(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_244(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_245(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_246(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_247(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_248(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_249(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_250(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_251(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_252(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_253(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_254(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_255(p, o, s) 0\n# define BOOST_PP_WHILE_CHECK_BOOST_PP_WHILE_256(p, o, s) 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/control.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_CONTROL_HPP\n# define BOOST_PREPROCESSOR_CONTROL_HPP\n#\n# include <boost/preprocessor/control/deduce_d.hpp>\n# include <boost/preprocessor/control/expr_if.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/control/while.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/debug/assert.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEBUG_ASSERT_HPP\n# define BOOST_PREPROCESSOR_DEBUG_ASSERT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/not.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_ASSERT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ASSERT BOOST_PP_ASSERT_D\n# else\n#    define BOOST_PP_ASSERT(cond) BOOST_PP_ASSERT_D(cond)\n# endif\n#\n# define BOOST_PP_ASSERT_D(cond) BOOST_PP_IIF(BOOST_PP_NOT(cond), BOOST_PP_ASSERT_ERROR, BOOST_PP_TUPLE_EAT_1)(...)\n# define BOOST_PP_ASSERT_ERROR(x, y, z)\n#\n# /* BOOST_PP_ASSERT_MSG */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ASSERT_MSG BOOST_PP_ASSERT_MSG_D\n# else\n#    define BOOST_PP_ASSERT_MSG(cond, msg) BOOST_PP_ASSERT_MSG_D(cond, msg)\n# endif\n#\n# define BOOST_PP_ASSERT_MSG_D(cond, msg) BOOST_PP_EXPR_IIF(BOOST_PP_NOT(cond), msg)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/debug/error.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEBUG_ERROR_HPP\n# define BOOST_PREPROCESSOR_DEBUG_ERROR_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_ERROR */\n#\n# if BOOST_PP_CONFIG_ERRORS\n#    define BOOST_PP_ERROR(code) BOOST_PP_CAT(BOOST_PP_ERROR_, code)\n# endif\n#\n# define BOOST_PP_ERROR_0x0000 BOOST_PP_ERROR(0x0000, BOOST_PP_INDEX_OUT_OF_BOUNDS)\n# define BOOST_PP_ERROR_0x0001 BOOST_PP_ERROR(0x0001, BOOST_PP_WHILE_OVERFLOW)\n# define BOOST_PP_ERROR_0x0002 BOOST_PP_ERROR(0x0002, BOOST_PP_FOR_OVERFLOW)\n# define BOOST_PP_ERROR_0x0003 BOOST_PP_ERROR(0x0003, BOOST_PP_REPEAT_OVERFLOW)\n# define BOOST_PP_ERROR_0x0004 BOOST_PP_ERROR(0x0004, BOOST_PP_LIST_FOLD_OVERFLOW)\n# define BOOST_PP_ERROR_0x0005 BOOST_PP_ERROR(0x0005, BOOST_PP_SEQ_FOLD_OVERFLOW)\n# define BOOST_PP_ERROR_0x0006 BOOST_PP_ERROR(0x0006, BOOST_PP_ARITHMETIC_OVERFLOW)\n# define BOOST_PP_ERROR_0x0007 BOOST_PP_ERROR(0x0007, BOOST_PP_DIVISION_BY_ZERO)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/debug/line.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEBUG_LINE_HPP\n# define BOOST_PREPROCESSOR_DEBUG_LINE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/iteration/iterate.hpp>\n# include <boost/preprocessor/stringize.hpp>\n#\n# /* BOOST_PP_LINE */\n#\n# if BOOST_PP_CONFIG_EXTENDED_LINE_INFO\n#    define BOOST_PP_LINE(line, file) line BOOST_PP_CAT(BOOST_PP_LINE_, BOOST_PP_IS_ITERATING)(file)\n#    define BOOST_PP_LINE_BOOST_PP_IS_ITERATING(file) #file\n#    define BOOST_PP_LINE_1(file) BOOST_PP_STRINGIZE(file BOOST_PP_CAT(BOOST_PP_LINE_I_, BOOST_PP_ITERATION_DEPTH())())\n#    define BOOST_PP_LINE_I_1() [BOOST_PP_FRAME_ITERATION(1)]\n#    define BOOST_PP_LINE_I_2() BOOST_PP_LINE_I_1()[BOOST_PP_FRAME_ITERATION(2)]\n#    define BOOST_PP_LINE_I_3() BOOST_PP_LINE_I_2()[BOOST_PP_FRAME_ITERATION(3)]\n#    define BOOST_PP_LINE_I_4() BOOST_PP_LINE_I_3()[BOOST_PP_FRAME_ITERATION(4)]\n#    define BOOST_PP_LINE_I_5() BOOST_PP_LINE_I_4()[BOOST_PP_FRAME_ITERATION(5)]\n# else\n#    define BOOST_PP_LINE(line, file) line __FILE__\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/debug.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEBUG_HPP\n# define BOOST_PREPROCESSOR_DEBUG_HPP\n#\n# include <boost/preprocessor/debug/assert.hpp>\n# include <boost/preprocessor/debug/line.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/dec.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DEC_HPP\n# define BOOST_PREPROCESSOR_DEC_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/auto_rec.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#     include <boost/preprocessor/detail/dmc/auto_rec.hpp>\n# else\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n# define BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_AUTO_REC */\n#\n# define BOOST_PP_AUTO_REC(pred, n) BOOST_PP_NODE_ENTRY_ ## n(pred)\n#\n# define BOOST_PP_NODE_ENTRY_256(p) BOOST_PP_NODE_128(p)(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_128(p) BOOST_PP_NODE_64(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_64(p) BOOST_PP_NODE_32(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_32(p) BOOST_PP_NODE_16(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_16(p) BOOST_PP_NODE_8(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_8(p) BOOST_PP_NODE_4(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_4(p) BOOST_PP_NODE_2(p)(p)\n# define BOOST_PP_NODE_ENTRY_2(p) BOOST_PP_NODE_1(p)\n#\n# define BOOST_PP_NODE_128(p) BOOST_PP_IIF(p(128), BOOST_PP_NODE_64, BOOST_PP_NODE_192)\n#    define BOOST_PP_NODE_64(p) BOOST_PP_IIF(p(64), BOOST_PP_NODE_32, BOOST_PP_NODE_96)\n#        define BOOST_PP_NODE_32(p) BOOST_PP_IIF(p(32), BOOST_PP_NODE_16, BOOST_PP_NODE_48)\n#            define BOOST_PP_NODE_16(p) BOOST_PP_IIF(p(16), BOOST_PP_NODE_8, BOOST_PP_NODE_24)\n#                define BOOST_PP_NODE_8(p) BOOST_PP_IIF(p(8), BOOST_PP_NODE_4, BOOST_PP_NODE_12)\n#                    define BOOST_PP_NODE_4(p) BOOST_PP_IIF(p(4), BOOST_PP_NODE_2, BOOST_PP_NODE_6)\n#                        define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)\n#                            define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p(1), 1, 2)\n#                            define BOOST_PP_NODE_3(p) BOOST_PP_IIF(p(3), 3, 4)\n#                        define BOOST_PP_NODE_6(p) BOOST_PP_IIF(p(6), BOOST_PP_NODE_5, BOOST_PP_NODE_7)\n#                            define BOOST_PP_NODE_5(p) BOOST_PP_IIF(p(5), 5, 6)\n#                            define BOOST_PP_NODE_7(p) BOOST_PP_IIF(p(7), 7, 8)\n#                    define BOOST_PP_NODE_12(p) BOOST_PP_IIF(p(12), BOOST_PP_NODE_10, BOOST_PP_NODE_14)\n#                        define BOOST_PP_NODE_10(p) BOOST_PP_IIF(p(10), BOOST_PP_NODE_9, BOOST_PP_NODE_11)\n#                            define BOOST_PP_NODE_9(p) BOOST_PP_IIF(p(9), 9, 10)\n#                            define BOOST_PP_NODE_11(p) BOOST_PP_IIF(p(11), 11, 12)\n#                        define BOOST_PP_NODE_14(p) BOOST_PP_IIF(p(14), BOOST_PP_NODE_13, BOOST_PP_NODE_15)\n#                            define BOOST_PP_NODE_13(p) BOOST_PP_IIF(p(13), 13, 14)\n#                            define BOOST_PP_NODE_15(p) BOOST_PP_IIF(p(15), 15, 16)\n#                define BOOST_PP_NODE_24(p) BOOST_PP_IIF(p(24), BOOST_PP_NODE_20, BOOST_PP_NODE_28)\n#                    define BOOST_PP_NODE_20(p) BOOST_PP_IIF(p(20), BOOST_PP_NODE_18, BOOST_PP_NODE_22)\n#                        define BOOST_PP_NODE_18(p) BOOST_PP_IIF(p(18), BOOST_PP_NODE_17, BOOST_PP_NODE_19)\n#                            define BOOST_PP_NODE_17(p) BOOST_PP_IIF(p(17), 17, 18)\n#                            define BOOST_PP_NODE_19(p) BOOST_PP_IIF(p(19), 19, 20)\n#                        define BOOST_PP_NODE_22(p) BOOST_PP_IIF(p(22), BOOST_PP_NODE_21, BOOST_PP_NODE_23)\n#                            define BOOST_PP_NODE_21(p) BOOST_PP_IIF(p(21), 21, 22)\n#                            define BOOST_PP_NODE_23(p) BOOST_PP_IIF(p(23), 23, 24)\n#                    define BOOST_PP_NODE_28(p) BOOST_PP_IIF(p(28), BOOST_PP_NODE_26, BOOST_PP_NODE_30)\n#                        define BOOST_PP_NODE_26(p) BOOST_PP_IIF(p(26), BOOST_PP_NODE_25, BOOST_PP_NODE_27)\n#                            define BOOST_PP_NODE_25(p) BOOST_PP_IIF(p(25), 25, 26)\n#                            define BOOST_PP_NODE_27(p) BOOST_PP_IIF(p(27), 27, 28)\n#                        define BOOST_PP_NODE_30(p) BOOST_PP_IIF(p(30), BOOST_PP_NODE_29, BOOST_PP_NODE_31)\n#                            define BOOST_PP_NODE_29(p) BOOST_PP_IIF(p(29), 29, 30)\n#                            define BOOST_PP_NODE_31(p) BOOST_PP_IIF(p(31), 31, 32)\n#            define BOOST_PP_NODE_48(p) BOOST_PP_IIF(p(48), BOOST_PP_NODE_40, BOOST_PP_NODE_56)\n#                define BOOST_PP_NODE_40(p) BOOST_PP_IIF(p(40), BOOST_PP_NODE_36, BOOST_PP_NODE_44)\n#                    define BOOST_PP_NODE_36(p) BOOST_PP_IIF(p(36), BOOST_PP_NODE_34, BOOST_PP_NODE_38)\n#                        define BOOST_PP_NODE_34(p) BOOST_PP_IIF(p(34), BOOST_PP_NODE_33, BOOST_PP_NODE_35)\n#                            define BOOST_PP_NODE_33(p) BOOST_PP_IIF(p(33), 33, 34)\n#                            define BOOST_PP_NODE_35(p) BOOST_PP_IIF(p(35), 35, 36)\n#                        define BOOST_PP_NODE_38(p) BOOST_PP_IIF(p(38), BOOST_PP_NODE_37, BOOST_PP_NODE_39)\n#                            define BOOST_PP_NODE_37(p) BOOST_PP_IIF(p(37), 37, 38)\n#                            define BOOST_PP_NODE_39(p) BOOST_PP_IIF(p(39), 39, 40)\n#                    define BOOST_PP_NODE_44(p) BOOST_PP_IIF(p(44), BOOST_PP_NODE_42, BOOST_PP_NODE_46)\n#                        define BOOST_PP_NODE_42(p) BOOST_PP_IIF(p(42), BOOST_PP_NODE_41, BOOST_PP_NODE_43)\n#                            define BOOST_PP_NODE_41(p) BOOST_PP_IIF(p(41), 41, 42)\n#                            define BOOST_PP_NODE_43(p) BOOST_PP_IIF(p(43), 43, 44)\n#                        define BOOST_PP_NODE_46(p) BOOST_PP_IIF(p(46), BOOST_PP_NODE_45, BOOST_PP_NODE_47)\n#                            define BOOST_PP_NODE_45(p) BOOST_PP_IIF(p(45), 45, 46)\n#                            define BOOST_PP_NODE_47(p) BOOST_PP_IIF(p(47), 47, 48)\n#                define BOOST_PP_NODE_56(p) BOOST_PP_IIF(p(56), BOOST_PP_NODE_52, BOOST_PP_NODE_60)\n#                    define BOOST_PP_NODE_52(p) BOOST_PP_IIF(p(52), BOOST_PP_NODE_50, BOOST_PP_NODE_54)\n#                        define BOOST_PP_NODE_50(p) BOOST_PP_IIF(p(50), BOOST_PP_NODE_49, BOOST_PP_NODE_51)\n#                            define BOOST_PP_NODE_49(p) BOOST_PP_IIF(p(49), 49, 50)\n#                            define BOOST_PP_NODE_51(p) BOOST_PP_IIF(p(51), 51, 52)\n#                        define BOOST_PP_NODE_54(p) BOOST_PP_IIF(p(54), BOOST_PP_NODE_53, BOOST_PP_NODE_55)\n#                            define BOOST_PP_NODE_53(p) BOOST_PP_IIF(p(53), 53, 54)\n#                            define BOOST_PP_NODE_55(p) BOOST_PP_IIF(p(55), 55, 56)\n#                    define BOOST_PP_NODE_60(p) BOOST_PP_IIF(p(60), BOOST_PP_NODE_58, BOOST_PP_NODE_62)\n#                        define BOOST_PP_NODE_58(p) BOOST_PP_IIF(p(58), BOOST_PP_NODE_57, BOOST_PP_NODE_59)\n#                            define BOOST_PP_NODE_57(p) BOOST_PP_IIF(p(57), 57, 58)\n#                            define BOOST_PP_NODE_59(p) BOOST_PP_IIF(p(59), 59, 60)\n#                        define BOOST_PP_NODE_62(p) BOOST_PP_IIF(p(62), BOOST_PP_NODE_61, BOOST_PP_NODE_63)\n#                            define BOOST_PP_NODE_61(p) BOOST_PP_IIF(p(61), 61, 62)\n#                            define BOOST_PP_NODE_63(p) BOOST_PP_IIF(p(63), 63, 64)\n#        define BOOST_PP_NODE_96(p) BOOST_PP_IIF(p(96), BOOST_PP_NODE_80, BOOST_PP_NODE_112)\n#            define BOOST_PP_NODE_80(p) BOOST_PP_IIF(p(80), BOOST_PP_NODE_72, BOOST_PP_NODE_88)\n#                define BOOST_PP_NODE_72(p) BOOST_PP_IIF(p(72), BOOST_PP_NODE_68, BOOST_PP_NODE_76)\n#                    define BOOST_PP_NODE_68(p) BOOST_PP_IIF(p(68), BOOST_PP_NODE_66, BOOST_PP_NODE_70)\n#                        define BOOST_PP_NODE_66(p) BOOST_PP_IIF(p(66), BOOST_PP_NODE_65, BOOST_PP_NODE_67)\n#                            define BOOST_PP_NODE_65(p) BOOST_PP_IIF(p(65), 65, 66)\n#                            define BOOST_PP_NODE_67(p) BOOST_PP_IIF(p(67), 67, 68)\n#                        define BOOST_PP_NODE_70(p) BOOST_PP_IIF(p(70), BOOST_PP_NODE_69, BOOST_PP_NODE_71)\n#                            define BOOST_PP_NODE_69(p) BOOST_PP_IIF(p(69), 69, 70)\n#                            define BOOST_PP_NODE_71(p) BOOST_PP_IIF(p(71), 71, 72)\n#                    define BOOST_PP_NODE_76(p) BOOST_PP_IIF(p(76), BOOST_PP_NODE_74, BOOST_PP_NODE_78)\n#                        define BOOST_PP_NODE_74(p) BOOST_PP_IIF(p(74), BOOST_PP_NODE_73, BOOST_PP_NODE_75)\n#                            define BOOST_PP_NODE_73(p) BOOST_PP_IIF(p(73), 73, 74)\n#                            define BOOST_PP_NODE_75(p) BOOST_PP_IIF(p(75), 75, 76)\n#                        define BOOST_PP_NODE_78(p) BOOST_PP_IIF(p(78), BOOST_PP_NODE_77, BOOST_PP_NODE_79)\n#                            define BOOST_PP_NODE_77(p) BOOST_PP_IIF(p(77), 77, 78)\n#                            define BOOST_PP_NODE_79(p) BOOST_PP_IIF(p(79), 79, 80)\n#                define BOOST_PP_NODE_88(p) BOOST_PP_IIF(p(88), BOOST_PP_NODE_84, BOOST_PP_NODE_92)\n#                    define BOOST_PP_NODE_84(p) BOOST_PP_IIF(p(84), BOOST_PP_NODE_82, BOOST_PP_NODE_86)\n#                        define BOOST_PP_NODE_82(p) BOOST_PP_IIF(p(82), BOOST_PP_NODE_81, BOOST_PP_NODE_83)\n#                            define BOOST_PP_NODE_81(p) BOOST_PP_IIF(p(81), 81, 82)\n#                            define BOOST_PP_NODE_83(p) BOOST_PP_IIF(p(83), 83, 84)\n#                        define BOOST_PP_NODE_86(p) BOOST_PP_IIF(p(86), BOOST_PP_NODE_85, BOOST_PP_NODE_87)\n#                            define BOOST_PP_NODE_85(p) BOOST_PP_IIF(p(85), 85, 86)\n#                            define BOOST_PP_NODE_87(p) BOOST_PP_IIF(p(87), 87, 88)\n#                    define BOOST_PP_NODE_92(p) BOOST_PP_IIF(p(92), BOOST_PP_NODE_90, BOOST_PP_NODE_94)\n#                        define BOOST_PP_NODE_90(p) BOOST_PP_IIF(p(90), BOOST_PP_NODE_89, BOOST_PP_NODE_91)\n#                            define BOOST_PP_NODE_89(p) BOOST_PP_IIF(p(89), 89, 90)\n#                            define BOOST_PP_NODE_91(p) BOOST_PP_IIF(p(91), 91, 92)\n#                        define BOOST_PP_NODE_94(p) BOOST_PP_IIF(p(94), BOOST_PP_NODE_93, BOOST_PP_NODE_95)\n#                            define BOOST_PP_NODE_93(p) BOOST_PP_IIF(p(93), 93, 94)\n#                            define BOOST_PP_NODE_95(p) BOOST_PP_IIF(p(95), 95, 96)\n#            define BOOST_PP_NODE_112(p) BOOST_PP_IIF(p(112), BOOST_PP_NODE_104, BOOST_PP_NODE_120)\n#                define BOOST_PP_NODE_104(p) BOOST_PP_IIF(p(104), BOOST_PP_NODE_100, BOOST_PP_NODE_108)\n#                    define BOOST_PP_NODE_100(p) BOOST_PP_IIF(p(100), BOOST_PP_NODE_98, BOOST_PP_NODE_102)\n#                        define BOOST_PP_NODE_98(p) BOOST_PP_IIF(p(98), BOOST_PP_NODE_97, BOOST_PP_NODE_99)\n#                            define BOOST_PP_NODE_97(p) BOOST_PP_IIF(p(97), 97, 98)\n#                            define BOOST_PP_NODE_99(p) BOOST_PP_IIF(p(99), 99, 100)\n#                        define BOOST_PP_NODE_102(p) BOOST_PP_IIF(p(102), BOOST_PP_NODE_101, BOOST_PP_NODE_103)\n#                            define BOOST_PP_NODE_101(p) BOOST_PP_IIF(p(101), 101, 102)\n#                            define BOOST_PP_NODE_103(p) BOOST_PP_IIF(p(103), 103, 104)\n#                    define BOOST_PP_NODE_108(p) BOOST_PP_IIF(p(108), BOOST_PP_NODE_106, BOOST_PP_NODE_110)\n#                        define BOOST_PP_NODE_106(p) BOOST_PP_IIF(p(106), BOOST_PP_NODE_105, BOOST_PP_NODE_107)\n#                            define BOOST_PP_NODE_105(p) BOOST_PP_IIF(p(105), 105, 106)\n#                            define BOOST_PP_NODE_107(p) BOOST_PP_IIF(p(107), 107, 108)\n#                        define BOOST_PP_NODE_110(p) BOOST_PP_IIF(p(110), BOOST_PP_NODE_109, BOOST_PP_NODE_111)\n#                            define BOOST_PP_NODE_109(p) BOOST_PP_IIF(p(109), 109, 110)\n#                            define BOOST_PP_NODE_111(p) BOOST_PP_IIF(p(111), 111, 112)\n#                define BOOST_PP_NODE_120(p) BOOST_PP_IIF(p(120), BOOST_PP_NODE_116, BOOST_PP_NODE_124)\n#                    define BOOST_PP_NODE_116(p) BOOST_PP_IIF(p(116), BOOST_PP_NODE_114, BOOST_PP_NODE_118)\n#                        define BOOST_PP_NODE_114(p) BOOST_PP_IIF(p(114), BOOST_PP_NODE_113, BOOST_PP_NODE_115)\n#                            define BOOST_PP_NODE_113(p) BOOST_PP_IIF(p(113), 113, 114)\n#                            define BOOST_PP_NODE_115(p) BOOST_PP_IIF(p(115), 115, 116)\n#                        define BOOST_PP_NODE_118(p) BOOST_PP_IIF(p(118), BOOST_PP_NODE_117, BOOST_PP_NODE_119)\n#                            define BOOST_PP_NODE_117(p) BOOST_PP_IIF(p(117), 117, 118)\n#                            define BOOST_PP_NODE_119(p) BOOST_PP_IIF(p(119), 119, 120)\n#                    define BOOST_PP_NODE_124(p) BOOST_PP_IIF(p(124), BOOST_PP_NODE_122, BOOST_PP_NODE_126)\n#                        define BOOST_PP_NODE_122(p) BOOST_PP_IIF(p(122), BOOST_PP_NODE_121, BOOST_PP_NODE_123)\n#                            define BOOST_PP_NODE_121(p) BOOST_PP_IIF(p(121), 121, 122)\n#                            define BOOST_PP_NODE_123(p) BOOST_PP_IIF(p(123), 123, 124)\n#                        define BOOST_PP_NODE_126(p) BOOST_PP_IIF(p(126), BOOST_PP_NODE_125, BOOST_PP_NODE_127)\n#                            define BOOST_PP_NODE_125(p) BOOST_PP_IIF(p(125), 125, 126)\n#                            define BOOST_PP_NODE_127(p) BOOST_PP_IIF(p(127), 127, 128)\n#    define BOOST_PP_NODE_192(p) BOOST_PP_IIF(p(192), BOOST_PP_NODE_160, BOOST_PP_NODE_224)\n#        define BOOST_PP_NODE_160(p) BOOST_PP_IIF(p(160), BOOST_PP_NODE_144, BOOST_PP_NODE_176)\n#            define BOOST_PP_NODE_144(p) BOOST_PP_IIF(p(144), BOOST_PP_NODE_136, BOOST_PP_NODE_152)\n#                define BOOST_PP_NODE_136(p) BOOST_PP_IIF(p(136), BOOST_PP_NODE_132, BOOST_PP_NODE_140)\n#                    define BOOST_PP_NODE_132(p) BOOST_PP_IIF(p(132), BOOST_PP_NODE_130, BOOST_PP_NODE_134)\n#                        define BOOST_PP_NODE_130(p) BOOST_PP_IIF(p(130), BOOST_PP_NODE_129, BOOST_PP_NODE_131)\n#                            define BOOST_PP_NODE_129(p) BOOST_PP_IIF(p(129), 129, 130)\n#                            define BOOST_PP_NODE_131(p) BOOST_PP_IIF(p(131), 131, 132)\n#                        define BOOST_PP_NODE_134(p) BOOST_PP_IIF(p(134), BOOST_PP_NODE_133, BOOST_PP_NODE_135)\n#                            define BOOST_PP_NODE_133(p) BOOST_PP_IIF(p(133), 133, 134)\n#                            define BOOST_PP_NODE_135(p) BOOST_PP_IIF(p(135), 135, 136)\n#                    define BOOST_PP_NODE_140(p) BOOST_PP_IIF(p(140), BOOST_PP_NODE_138, BOOST_PP_NODE_142)\n#                        define BOOST_PP_NODE_138(p) BOOST_PP_IIF(p(138), BOOST_PP_NODE_137, BOOST_PP_NODE_139)\n#                            define BOOST_PP_NODE_137(p) BOOST_PP_IIF(p(137), 137, 138)\n#                            define BOOST_PP_NODE_139(p) BOOST_PP_IIF(p(139), 139, 140)\n#                        define BOOST_PP_NODE_142(p) BOOST_PP_IIF(p(142), BOOST_PP_NODE_141, BOOST_PP_NODE_143)\n#                            define BOOST_PP_NODE_141(p) BOOST_PP_IIF(p(141), 141, 142)\n#                            define BOOST_PP_NODE_143(p) BOOST_PP_IIF(p(143), 143, 144)\n#                define BOOST_PP_NODE_152(p) BOOST_PP_IIF(p(152), BOOST_PP_NODE_148, BOOST_PP_NODE_156)\n#                    define BOOST_PP_NODE_148(p) BOOST_PP_IIF(p(148), BOOST_PP_NODE_146, BOOST_PP_NODE_150)\n#                        define BOOST_PP_NODE_146(p) BOOST_PP_IIF(p(146), BOOST_PP_NODE_145, BOOST_PP_NODE_147)\n#                            define BOOST_PP_NODE_145(p) BOOST_PP_IIF(p(145), 145, 146)\n#                            define BOOST_PP_NODE_147(p) BOOST_PP_IIF(p(147), 147, 148)\n#                        define BOOST_PP_NODE_150(p) BOOST_PP_IIF(p(150), BOOST_PP_NODE_149, BOOST_PP_NODE_151)\n#                            define BOOST_PP_NODE_149(p) BOOST_PP_IIF(p(149), 149, 150)\n#                            define BOOST_PP_NODE_151(p) BOOST_PP_IIF(p(151), 151, 152)\n#                    define BOOST_PP_NODE_156(p) BOOST_PP_IIF(p(156), BOOST_PP_NODE_154, BOOST_PP_NODE_158)\n#                        define BOOST_PP_NODE_154(p) BOOST_PP_IIF(p(154), BOOST_PP_NODE_153, BOOST_PP_NODE_155)\n#                            define BOOST_PP_NODE_153(p) BOOST_PP_IIF(p(153), 153, 154)\n#                            define BOOST_PP_NODE_155(p) BOOST_PP_IIF(p(155), 155, 156)\n#                        define BOOST_PP_NODE_158(p) BOOST_PP_IIF(p(158), BOOST_PP_NODE_157, BOOST_PP_NODE_159)\n#                            define BOOST_PP_NODE_157(p) BOOST_PP_IIF(p(157), 157, 158)\n#                            define BOOST_PP_NODE_159(p) BOOST_PP_IIF(p(159), 159, 160)\n#            define BOOST_PP_NODE_176(p) BOOST_PP_IIF(p(176), BOOST_PP_NODE_168, BOOST_PP_NODE_184)\n#                define BOOST_PP_NODE_168(p) BOOST_PP_IIF(p(168), BOOST_PP_NODE_164, BOOST_PP_NODE_172)\n#                    define BOOST_PP_NODE_164(p) BOOST_PP_IIF(p(164), BOOST_PP_NODE_162, BOOST_PP_NODE_166)\n#                        define BOOST_PP_NODE_162(p) BOOST_PP_IIF(p(162), BOOST_PP_NODE_161, BOOST_PP_NODE_163)\n#                            define BOOST_PP_NODE_161(p) BOOST_PP_IIF(p(161), 161, 162)\n#                            define BOOST_PP_NODE_163(p) BOOST_PP_IIF(p(163), 163, 164)\n#                        define BOOST_PP_NODE_166(p) BOOST_PP_IIF(p(166), BOOST_PP_NODE_165, BOOST_PP_NODE_167)\n#                            define BOOST_PP_NODE_165(p) BOOST_PP_IIF(p(165), 165, 166)\n#                            define BOOST_PP_NODE_167(p) BOOST_PP_IIF(p(167), 167, 168)\n#                    define BOOST_PP_NODE_172(p) BOOST_PP_IIF(p(172), BOOST_PP_NODE_170, BOOST_PP_NODE_174)\n#                        define BOOST_PP_NODE_170(p) BOOST_PP_IIF(p(170), BOOST_PP_NODE_169, BOOST_PP_NODE_171)\n#                            define BOOST_PP_NODE_169(p) BOOST_PP_IIF(p(169), 169, 170)\n#                            define BOOST_PP_NODE_171(p) BOOST_PP_IIF(p(171), 171, 172)\n#                        define BOOST_PP_NODE_174(p) BOOST_PP_IIF(p(174), BOOST_PP_NODE_173, BOOST_PP_NODE_175)\n#                            define BOOST_PP_NODE_173(p) BOOST_PP_IIF(p(173), 173, 174)\n#                            define BOOST_PP_NODE_175(p) BOOST_PP_IIF(p(175), 175, 176)\n#                define BOOST_PP_NODE_184(p) BOOST_PP_IIF(p(184), BOOST_PP_NODE_180, BOOST_PP_NODE_188)\n#                    define BOOST_PP_NODE_180(p) BOOST_PP_IIF(p(180), BOOST_PP_NODE_178, BOOST_PP_NODE_182)\n#                        define BOOST_PP_NODE_178(p) BOOST_PP_IIF(p(178), BOOST_PP_NODE_177, BOOST_PP_NODE_179)\n#                            define BOOST_PP_NODE_177(p) BOOST_PP_IIF(p(177), 177, 178)\n#                            define BOOST_PP_NODE_179(p) BOOST_PP_IIF(p(179), 179, 180)\n#                        define BOOST_PP_NODE_182(p) BOOST_PP_IIF(p(182), BOOST_PP_NODE_181, BOOST_PP_NODE_183)\n#                            define BOOST_PP_NODE_181(p) BOOST_PP_IIF(p(181), 181, 182)\n#                            define BOOST_PP_NODE_183(p) BOOST_PP_IIF(p(183), 183, 184)\n#                    define BOOST_PP_NODE_188(p) BOOST_PP_IIF(p(188), BOOST_PP_NODE_186, BOOST_PP_NODE_190)\n#                        define BOOST_PP_NODE_186(p) BOOST_PP_IIF(p(186), BOOST_PP_NODE_185, BOOST_PP_NODE_187)\n#                            define BOOST_PP_NODE_185(p) BOOST_PP_IIF(p(185), 185, 186)\n#                            define BOOST_PP_NODE_187(p) BOOST_PP_IIF(p(187), 187, 188)\n#                        define BOOST_PP_NODE_190(p) BOOST_PP_IIF(p(190), BOOST_PP_NODE_189, BOOST_PP_NODE_191)\n#                            define BOOST_PP_NODE_189(p) BOOST_PP_IIF(p(189), 189, 190)\n#                            define BOOST_PP_NODE_191(p) BOOST_PP_IIF(p(191), 191, 192)\n#        define BOOST_PP_NODE_224(p) BOOST_PP_IIF(p(224), BOOST_PP_NODE_208, BOOST_PP_NODE_240)\n#            define BOOST_PP_NODE_208(p) BOOST_PP_IIF(p(208), BOOST_PP_NODE_200, BOOST_PP_NODE_216)\n#                define BOOST_PP_NODE_200(p) BOOST_PP_IIF(p(200), BOOST_PP_NODE_196, BOOST_PP_NODE_204)\n#                    define BOOST_PP_NODE_196(p) BOOST_PP_IIF(p(196), BOOST_PP_NODE_194, BOOST_PP_NODE_198)\n#                        define BOOST_PP_NODE_194(p) BOOST_PP_IIF(p(194), BOOST_PP_NODE_193, BOOST_PP_NODE_195)\n#                            define BOOST_PP_NODE_193(p) BOOST_PP_IIF(p(193), 193, 194)\n#                            define BOOST_PP_NODE_195(p) BOOST_PP_IIF(p(195), 195, 196)\n#                        define BOOST_PP_NODE_198(p) BOOST_PP_IIF(p(198), BOOST_PP_NODE_197, BOOST_PP_NODE_199)\n#                            define BOOST_PP_NODE_197(p) BOOST_PP_IIF(p(197), 197, 198)\n#                            define BOOST_PP_NODE_199(p) BOOST_PP_IIF(p(199), 199, 200)\n#                    define BOOST_PP_NODE_204(p) BOOST_PP_IIF(p(204), BOOST_PP_NODE_202, BOOST_PP_NODE_206)\n#                        define BOOST_PP_NODE_202(p) BOOST_PP_IIF(p(202), BOOST_PP_NODE_201, BOOST_PP_NODE_203)\n#                            define BOOST_PP_NODE_201(p) BOOST_PP_IIF(p(201), 201, 202)\n#                            define BOOST_PP_NODE_203(p) BOOST_PP_IIF(p(203), 203, 204)\n#                        define BOOST_PP_NODE_206(p) BOOST_PP_IIF(p(206), BOOST_PP_NODE_205, BOOST_PP_NODE_207)\n#                            define BOOST_PP_NODE_205(p) BOOST_PP_IIF(p(205), 205, 206)\n#                            define BOOST_PP_NODE_207(p) BOOST_PP_IIF(p(207), 207, 208)\n#                define BOOST_PP_NODE_216(p) BOOST_PP_IIF(p(216), BOOST_PP_NODE_212, BOOST_PP_NODE_220)\n#                    define BOOST_PP_NODE_212(p) BOOST_PP_IIF(p(212), BOOST_PP_NODE_210, BOOST_PP_NODE_214)\n#                        define BOOST_PP_NODE_210(p) BOOST_PP_IIF(p(210), BOOST_PP_NODE_209, BOOST_PP_NODE_211)\n#                            define BOOST_PP_NODE_209(p) BOOST_PP_IIF(p(209), 209, 210)\n#                            define BOOST_PP_NODE_211(p) BOOST_PP_IIF(p(211), 211, 212)\n#                        define BOOST_PP_NODE_214(p) BOOST_PP_IIF(p(214), BOOST_PP_NODE_213, BOOST_PP_NODE_215)\n#                            define BOOST_PP_NODE_213(p) BOOST_PP_IIF(p(213), 213, 214)\n#                            define BOOST_PP_NODE_215(p) BOOST_PP_IIF(p(215), 215, 216)\n#                    define BOOST_PP_NODE_220(p) BOOST_PP_IIF(p(220), BOOST_PP_NODE_218, BOOST_PP_NODE_222)\n#                        define BOOST_PP_NODE_218(p) BOOST_PP_IIF(p(218), BOOST_PP_NODE_217, BOOST_PP_NODE_219)\n#                            define BOOST_PP_NODE_217(p) BOOST_PP_IIF(p(217), 217, 218)\n#                            define BOOST_PP_NODE_219(p) BOOST_PP_IIF(p(219), 219, 220)\n#                        define BOOST_PP_NODE_222(p) BOOST_PP_IIF(p(222), BOOST_PP_NODE_221, BOOST_PP_NODE_223)\n#                            define BOOST_PP_NODE_221(p) BOOST_PP_IIF(p(221), 221, 222)\n#                            define BOOST_PP_NODE_223(p) BOOST_PP_IIF(p(223), 223, 224)\n#            define BOOST_PP_NODE_240(p) BOOST_PP_IIF(p(240), BOOST_PP_NODE_232, BOOST_PP_NODE_248)\n#                define BOOST_PP_NODE_232(p) BOOST_PP_IIF(p(232), BOOST_PP_NODE_228, BOOST_PP_NODE_236)\n#                    define BOOST_PP_NODE_228(p) BOOST_PP_IIF(p(228), BOOST_PP_NODE_226, BOOST_PP_NODE_230)\n#                        define BOOST_PP_NODE_226(p) BOOST_PP_IIF(p(226), BOOST_PP_NODE_225, BOOST_PP_NODE_227)\n#                            define BOOST_PP_NODE_225(p) BOOST_PP_IIF(p(225), 225, 226)\n#                            define BOOST_PP_NODE_227(p) BOOST_PP_IIF(p(227), 227, 228)\n#                        define BOOST_PP_NODE_230(p) BOOST_PP_IIF(p(230), BOOST_PP_NODE_229, BOOST_PP_NODE_231)\n#                            define BOOST_PP_NODE_229(p) BOOST_PP_IIF(p(229), 229, 230)\n#                            define BOOST_PP_NODE_231(p) BOOST_PP_IIF(p(231), 231, 232)\n#                    define BOOST_PP_NODE_236(p) BOOST_PP_IIF(p(236), BOOST_PP_NODE_234, BOOST_PP_NODE_238)\n#                        define BOOST_PP_NODE_234(p) BOOST_PP_IIF(p(234), BOOST_PP_NODE_233, BOOST_PP_NODE_235)\n#                            define BOOST_PP_NODE_233(p) BOOST_PP_IIF(p(233), 233, 234)\n#                            define BOOST_PP_NODE_235(p) BOOST_PP_IIF(p(235), 235, 236)\n#                        define BOOST_PP_NODE_238(p) BOOST_PP_IIF(p(238), BOOST_PP_NODE_237, BOOST_PP_NODE_239)\n#                            define BOOST_PP_NODE_237(p) BOOST_PP_IIF(p(237), 237, 238)\n#                            define BOOST_PP_NODE_239(p) BOOST_PP_IIF(p(239), 239, 240)\n#                define BOOST_PP_NODE_248(p) BOOST_PP_IIF(p(248), BOOST_PP_NODE_244, BOOST_PP_NODE_252)\n#                    define BOOST_PP_NODE_244(p) BOOST_PP_IIF(p(244), BOOST_PP_NODE_242, BOOST_PP_NODE_246)\n#                        define BOOST_PP_NODE_242(p) BOOST_PP_IIF(p(242), BOOST_PP_NODE_241, BOOST_PP_NODE_243)\n#                            define BOOST_PP_NODE_241(p) BOOST_PP_IIF(p(241), 241, 242)\n#                            define BOOST_PP_NODE_243(p) BOOST_PP_IIF(p(243), 243, 244)\n#                        define BOOST_PP_NODE_246(p) BOOST_PP_IIF(p(246), BOOST_PP_NODE_245, BOOST_PP_NODE_247)\n#                            define BOOST_PP_NODE_245(p) BOOST_PP_IIF(p(245), 245, 246)\n#                            define BOOST_PP_NODE_247(p) BOOST_PP_IIF(p(247), 247, 248)\n#                    define BOOST_PP_NODE_252(p) BOOST_PP_IIF(p(252), BOOST_PP_NODE_250, BOOST_PP_NODE_254)\n#                        define BOOST_PP_NODE_250(p) BOOST_PP_IIF(p(250), BOOST_PP_NODE_249, BOOST_PP_NODE_251)\n#                            define BOOST_PP_NODE_249(p) BOOST_PP_IIF(p(249), 249, 250)\n#                            define BOOST_PP_NODE_251(p) BOOST_PP_IIF(p(251), 251, 252)\n#                        define BOOST_PP_NODE_254(p) BOOST_PP_IIF(p(254), BOOST_PP_NODE_253, BOOST_PP_NODE_255)\n#                            define BOOST_PP_NODE_253(p) BOOST_PP_IIF(p(253), 253, 254)\n#                            define BOOST_PP_NODE_255(p) BOOST_PP_IIF(p(255), 255, 256)\n#\n# endif\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/check.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_CHECK_HPP\n# define BOOST_PREPROCESSOR_DETAIL_CHECK_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_CHECK */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_CHECK(x, type) BOOST_PP_CHECK_D(x, type)\n# else\n#    define BOOST_PP_CHECK(x, type) BOOST_PP_CHECK_OO((x, type))\n#    define BOOST_PP_CHECK_OO(par) BOOST_PP_CHECK_D ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_1(BOOST_PP_CAT(BOOST_PP_CHECK_RESULT_, type x))\n#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)\n#    define BOOST_PP_CHECK_2(res, _) res\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_1(type x)\n#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)\n#    define BOOST_PP_CHECK_2(chk) BOOST_PP_CHECK_3((BOOST_PP_CHECK_RESULT_ ## chk))\n#    define BOOST_PP_CHECK_3(im) BOOST_PP_CHECK_5(BOOST_PP_CHECK_4 im)\n#    define BOOST_PP_CHECK_4(res, _) res\n#    define BOOST_PP_CHECK_5(res) res\n# else /* DMC */\n#    define BOOST_PP_CHECK_D(x, type) BOOST_PP_CHECK_OO((type x))\n#    define BOOST_PP_CHECK_OO(par) BOOST_PP_CHECK_0 ## par\n#    define BOOST_PP_CHECK_0(chk) BOOST_PP_CHECK_1(BOOST_PP_CAT(BOOST_PP_CHECK_RESULT_, chk))\n#    define BOOST_PP_CHECK_1(chk) BOOST_PP_CHECK_2(chk)\n#    define BOOST_PP_CHECK_2(res, _) res\n# endif\n#\n# define BOOST_PP_CHECK_RESULT_1 1, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/dmc/auto_rec.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n# define BOOST_PREPROCESSOR_DETAIL_AUTO_REC_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_AUTO_REC */\n#\n# define BOOST_PP_AUTO_REC(pred, n) BOOST_PP_NODE_ENTRY_ ## n(pred)\n#\n# define BOOST_PP_NODE_ENTRY_256(p) BOOST_PP_NODE_128(p)(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_128(p) BOOST_PP_NODE_64(p)(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_64(p) BOOST_PP_NODE_32(p)(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_32(p) BOOST_PP_NODE_16(p)(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_16(p) BOOST_PP_NODE_8(p)(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_8(p) BOOST_PP_NODE_4(p)(p)(p)\n# define BOOST_PP_NODE_ENTRY_4(p) BOOST_PP_NODE_2(p)(p)\n# define BOOST_PP_NODE_ENTRY_2(p) BOOST_PP_NODE_1(p)\n#\n# define BOOST_PP_NODE_128(p) BOOST_PP_IIF(p##(128), BOOST_PP_NODE_64, BOOST_PP_NODE_192)\n#    define BOOST_PP_NODE_64(p) BOOST_PP_IIF(p##(64), BOOST_PP_NODE_32, BOOST_PP_NODE_96)\n#        define BOOST_PP_NODE_32(p) BOOST_PP_IIF(p##(32), BOOST_PP_NODE_16, BOOST_PP_NODE_48)\n#            define BOOST_PP_NODE_16(p) BOOST_PP_IIF(p##(16), BOOST_PP_NODE_8, BOOST_PP_NODE_24)\n#                define BOOST_PP_NODE_8(p) BOOST_PP_IIF(p##(8), BOOST_PP_NODE_4, BOOST_PP_NODE_12)\n#                    define BOOST_PP_NODE_4(p) BOOST_PP_IIF(p##(4), BOOST_PP_NODE_2, BOOST_PP_NODE_6)\n#                        define BOOST_PP_NODE_2(p) BOOST_PP_IIF(p##(2), BOOST_PP_NODE_1, BOOST_PP_NODE_3)\n#                            define BOOST_PP_NODE_1(p) BOOST_PP_IIF(p##(1), 1, 2)\n#                            define BOOST_PP_NODE_3(p) BOOST_PP_IIF(p##(3), 3, 4)\n#                        define BOOST_PP_NODE_6(p) BOOST_PP_IIF(p##(6), BOOST_PP_NODE_5, BOOST_PP_NODE_7)\n#                            define BOOST_PP_NODE_5(p) BOOST_PP_IIF(p##(5), 5, 6)\n#                            define BOOST_PP_NODE_7(p) BOOST_PP_IIF(p##(7), 7, 8)\n#                    define BOOST_PP_NODE_12(p) BOOST_PP_IIF(p##(12), BOOST_PP_NODE_10, BOOST_PP_NODE_14)\n#                        define BOOST_PP_NODE_10(p) BOOST_PP_IIF(p##(10), BOOST_PP_NODE_9, BOOST_PP_NODE_11)\n#                            define BOOST_PP_NODE_9(p) BOOST_PP_IIF(p##(9), 9, 10)\n#                            define BOOST_PP_NODE_11(p) BOOST_PP_IIF(p##(11), 11, 12)\n#                        define BOOST_PP_NODE_14(p) BOOST_PP_IIF(p##(14), BOOST_PP_NODE_13, BOOST_PP_NODE_15)\n#                            define BOOST_PP_NODE_13(p) BOOST_PP_IIF(p##(13), 13, 14)\n#                            define BOOST_PP_NODE_15(p) BOOST_PP_IIF(p##(15), 15, 16)\n#                define BOOST_PP_NODE_24(p) BOOST_PP_IIF(p##(24), BOOST_PP_NODE_20, BOOST_PP_NODE_28)\n#                    define BOOST_PP_NODE_20(p) BOOST_PP_IIF(p##(20), BOOST_PP_NODE_18, BOOST_PP_NODE_22)\n#                        define BOOST_PP_NODE_18(p) BOOST_PP_IIF(p##(18), BOOST_PP_NODE_17, BOOST_PP_NODE_19)\n#                            define BOOST_PP_NODE_17(p) BOOST_PP_IIF(p##(17), 17, 18)\n#                            define BOOST_PP_NODE_19(p) BOOST_PP_IIF(p##(19), 19, 20)\n#                        define BOOST_PP_NODE_22(p) BOOST_PP_IIF(p##(22), BOOST_PP_NODE_21, BOOST_PP_NODE_23)\n#                            define BOOST_PP_NODE_21(p) BOOST_PP_IIF(p##(21), 21, 22)\n#                            define BOOST_PP_NODE_23(p) BOOST_PP_IIF(p##(23), 23, 24)\n#                    define BOOST_PP_NODE_28(p) BOOST_PP_IIF(p##(28), BOOST_PP_NODE_26, BOOST_PP_NODE_30)\n#                        define BOOST_PP_NODE_26(p) BOOST_PP_IIF(p##(26), BOOST_PP_NODE_25, BOOST_PP_NODE_27)\n#                            define BOOST_PP_NODE_25(p) BOOST_PP_IIF(p##(25), 25, 26)\n#                            define BOOST_PP_NODE_27(p) BOOST_PP_IIF(p##(27), 27, 28)\n#                        define BOOST_PP_NODE_30(p) BOOST_PP_IIF(p##(30), BOOST_PP_NODE_29, BOOST_PP_NODE_31)\n#                            define BOOST_PP_NODE_29(p) BOOST_PP_IIF(p##(29), 29, 30)\n#                            define BOOST_PP_NODE_31(p) BOOST_PP_IIF(p##(31), 31, 32)\n#            define BOOST_PP_NODE_48(p) BOOST_PP_IIF(p##(48), BOOST_PP_NODE_40, BOOST_PP_NODE_56)\n#                define BOOST_PP_NODE_40(p) BOOST_PP_IIF(p##(40), BOOST_PP_NODE_36, BOOST_PP_NODE_44)\n#                    define BOOST_PP_NODE_36(p) BOOST_PP_IIF(p##(36), BOOST_PP_NODE_34, BOOST_PP_NODE_38)\n#                        define BOOST_PP_NODE_34(p) BOOST_PP_IIF(p##(34), BOOST_PP_NODE_33, BOOST_PP_NODE_35)\n#                            define BOOST_PP_NODE_33(p) BOOST_PP_IIF(p##(33), 33, 34)\n#                            define BOOST_PP_NODE_35(p) BOOST_PP_IIF(p##(35), 35, 36)\n#                        define BOOST_PP_NODE_38(p) BOOST_PP_IIF(p##(38), BOOST_PP_NODE_37, BOOST_PP_NODE_39)\n#                            define BOOST_PP_NODE_37(p) BOOST_PP_IIF(p##(37), 37, 38)\n#                            define BOOST_PP_NODE_39(p) BOOST_PP_IIF(p##(39), 39, 40)\n#                    define BOOST_PP_NODE_44(p) BOOST_PP_IIF(p##(44), BOOST_PP_NODE_42, BOOST_PP_NODE_46)\n#                        define BOOST_PP_NODE_42(p) BOOST_PP_IIF(p##(42), BOOST_PP_NODE_41, BOOST_PP_NODE_43)\n#                            define BOOST_PP_NODE_41(p) BOOST_PP_IIF(p##(41), 41, 42)\n#                            define BOOST_PP_NODE_43(p) BOOST_PP_IIF(p##(43), 43, 44)\n#                        define BOOST_PP_NODE_46(p) BOOST_PP_IIF(p##(46), BOOST_PP_NODE_45, BOOST_PP_NODE_47)\n#                            define BOOST_PP_NODE_45(p) BOOST_PP_IIF(p##(45), 45, 46)\n#                            define BOOST_PP_NODE_47(p) BOOST_PP_IIF(p##(47), 47, 48)\n#                define BOOST_PP_NODE_56(p) BOOST_PP_IIF(p##(56), BOOST_PP_NODE_52, BOOST_PP_NODE_60)\n#                    define BOOST_PP_NODE_52(p) BOOST_PP_IIF(p##(52), BOOST_PP_NODE_50, BOOST_PP_NODE_54)\n#                        define BOOST_PP_NODE_50(p) BOOST_PP_IIF(p##(50), BOOST_PP_NODE_49, BOOST_PP_NODE_51)\n#                            define BOOST_PP_NODE_49(p) BOOST_PP_IIF(p##(49), 49, 50)\n#                            define BOOST_PP_NODE_51(p) BOOST_PP_IIF(p##(51), 51, 52)\n#                        define BOOST_PP_NODE_54(p) BOOST_PP_IIF(p##(54), BOOST_PP_NODE_53, BOOST_PP_NODE_55)\n#                            define BOOST_PP_NODE_53(p) BOOST_PP_IIF(p##(53), 53, 54)\n#                            define BOOST_PP_NODE_55(p) BOOST_PP_IIF(p##(55), 55, 56)\n#                    define BOOST_PP_NODE_60(p) BOOST_PP_IIF(p##(60), BOOST_PP_NODE_58, BOOST_PP_NODE_62)\n#                        define BOOST_PP_NODE_58(p) BOOST_PP_IIF(p##(58), BOOST_PP_NODE_57, BOOST_PP_NODE_59)\n#                            define BOOST_PP_NODE_57(p) BOOST_PP_IIF(p##(57), 57, 58)\n#                            define BOOST_PP_NODE_59(p) BOOST_PP_IIF(p##(59), 59, 60)\n#                        define BOOST_PP_NODE_62(p) BOOST_PP_IIF(p##(62), BOOST_PP_NODE_61, BOOST_PP_NODE_63)\n#                            define BOOST_PP_NODE_61(p) BOOST_PP_IIF(p##(61), 61, 62)\n#                            define BOOST_PP_NODE_63(p) BOOST_PP_IIF(p##(63), 63, 64)\n#        define BOOST_PP_NODE_96(p) BOOST_PP_IIF(p##(96), BOOST_PP_NODE_80, BOOST_PP_NODE_112)\n#            define BOOST_PP_NODE_80(p) BOOST_PP_IIF(p##(80), BOOST_PP_NODE_72, BOOST_PP_NODE_88)\n#                define BOOST_PP_NODE_72(p) BOOST_PP_IIF(p##(72), BOOST_PP_NODE_68, BOOST_PP_NODE_76)\n#                    define BOOST_PP_NODE_68(p) BOOST_PP_IIF(p##(68), BOOST_PP_NODE_66, BOOST_PP_NODE_70)\n#                        define BOOST_PP_NODE_66(p) BOOST_PP_IIF(p##(66), BOOST_PP_NODE_65, BOOST_PP_NODE_67)\n#                            define BOOST_PP_NODE_65(p) BOOST_PP_IIF(p##(65), 65, 66)\n#                            define BOOST_PP_NODE_67(p) BOOST_PP_IIF(p##(67), 67, 68)\n#                        define BOOST_PP_NODE_70(p) BOOST_PP_IIF(p##(70), BOOST_PP_NODE_69, BOOST_PP_NODE_71)\n#                            define BOOST_PP_NODE_69(p) BOOST_PP_IIF(p##(69), 69, 70)\n#                            define BOOST_PP_NODE_71(p) BOOST_PP_IIF(p##(71), 71, 72)\n#                    define BOOST_PP_NODE_76(p) BOOST_PP_IIF(p##(76), BOOST_PP_NODE_74, BOOST_PP_NODE_78)\n#                        define BOOST_PP_NODE_74(p) BOOST_PP_IIF(p##(74), BOOST_PP_NODE_73, BOOST_PP_NODE_75)\n#                            define BOOST_PP_NODE_73(p) BOOST_PP_IIF(p##(73), 73, 74)\n#                            define BOOST_PP_NODE_75(p) BOOST_PP_IIF(p##(75), 75, 76)\n#                        define BOOST_PP_NODE_78(p) BOOST_PP_IIF(p##(78), BOOST_PP_NODE_77, BOOST_PP_NODE_79)\n#                            define BOOST_PP_NODE_77(p) BOOST_PP_IIF(p##(77), 77, 78)\n#                            define BOOST_PP_NODE_79(p) BOOST_PP_IIF(p##(79), 79, 80)\n#                define BOOST_PP_NODE_88(p) BOOST_PP_IIF(p##(88), BOOST_PP_NODE_84, BOOST_PP_NODE_92)\n#                    define BOOST_PP_NODE_84(p) BOOST_PP_IIF(p##(84), BOOST_PP_NODE_82, BOOST_PP_NODE_86)\n#                        define BOOST_PP_NODE_82(p) BOOST_PP_IIF(p##(82), BOOST_PP_NODE_81, BOOST_PP_NODE_83)\n#                            define BOOST_PP_NODE_81(p) BOOST_PP_IIF(p##(81), 81, 82)\n#                            define BOOST_PP_NODE_83(p) BOOST_PP_IIF(p##(83), 83, 84)\n#                        define BOOST_PP_NODE_86(p) BOOST_PP_IIF(p##(86), BOOST_PP_NODE_85, BOOST_PP_NODE_87)\n#                            define BOOST_PP_NODE_85(p) BOOST_PP_IIF(p##(85), 85, 86)\n#                            define BOOST_PP_NODE_87(p) BOOST_PP_IIF(p##(87), 87, 88)\n#                    define BOOST_PP_NODE_92(p) BOOST_PP_IIF(p##(92), BOOST_PP_NODE_90, BOOST_PP_NODE_94)\n#                        define BOOST_PP_NODE_90(p) BOOST_PP_IIF(p##(90), BOOST_PP_NODE_89, BOOST_PP_NODE_91)\n#                            define BOOST_PP_NODE_89(p) BOOST_PP_IIF(p##(89), 89, 90)\n#                            define BOOST_PP_NODE_91(p) BOOST_PP_IIF(p##(91), 91, 92)\n#                        define BOOST_PP_NODE_94(p) BOOST_PP_IIF(p##(94), BOOST_PP_NODE_93, BOOST_PP_NODE_95)\n#                            define BOOST_PP_NODE_93(p) BOOST_PP_IIF(p##(93), 93, 94)\n#                            define BOOST_PP_NODE_95(p) BOOST_PP_IIF(p##(95), 95, 96)\n#            define BOOST_PP_NODE_112(p) BOOST_PP_IIF(p##(112), BOOST_PP_NODE_104, BOOST_PP_NODE_120)\n#                define BOOST_PP_NODE_104(p) BOOST_PP_IIF(p##(104), BOOST_PP_NODE_100, BOOST_PP_NODE_108)\n#                    define BOOST_PP_NODE_100(p) BOOST_PP_IIF(p##(100), BOOST_PP_NODE_98, BOOST_PP_NODE_102)\n#                        define BOOST_PP_NODE_98(p) BOOST_PP_IIF(p##(98), BOOST_PP_NODE_97, BOOST_PP_NODE_99)\n#                            define BOOST_PP_NODE_97(p) BOOST_PP_IIF(p##(97), 97, 98)\n#                            define BOOST_PP_NODE_99(p) BOOST_PP_IIF(p##(99), 99, 100)\n#                        define BOOST_PP_NODE_102(p) BOOST_PP_IIF(p##(102), BOOST_PP_NODE_101, BOOST_PP_NODE_103)\n#                            define BOOST_PP_NODE_101(p) BOOST_PP_IIF(p##(101), 101, 102)\n#                            define BOOST_PP_NODE_103(p) BOOST_PP_IIF(p##(103), 103, 104)\n#                    define BOOST_PP_NODE_108(p) BOOST_PP_IIF(p##(108), BOOST_PP_NODE_106, BOOST_PP_NODE_110)\n#                        define BOOST_PP_NODE_106(p) BOOST_PP_IIF(p##(106), BOOST_PP_NODE_105, BOOST_PP_NODE_107)\n#                            define BOOST_PP_NODE_105(p) BOOST_PP_IIF(p##(105), 105, 106)\n#                            define BOOST_PP_NODE_107(p) BOOST_PP_IIF(p##(107), 107, 108)\n#                        define BOOST_PP_NODE_110(p) BOOST_PP_IIF(p##(110), BOOST_PP_NODE_109, BOOST_PP_NODE_111)\n#                            define BOOST_PP_NODE_109(p) BOOST_PP_IIF(p##(109), 109, 110)\n#                            define BOOST_PP_NODE_111(p) BOOST_PP_IIF(p##(111), 111, 112)\n#                define BOOST_PP_NODE_120(p) BOOST_PP_IIF(p##(120), BOOST_PP_NODE_116, BOOST_PP_NODE_124)\n#                    define BOOST_PP_NODE_116(p) BOOST_PP_IIF(p##(116), BOOST_PP_NODE_114, BOOST_PP_NODE_118)\n#                        define BOOST_PP_NODE_114(p) BOOST_PP_IIF(p##(114), BOOST_PP_NODE_113, BOOST_PP_NODE_115)\n#                            define BOOST_PP_NODE_113(p) BOOST_PP_IIF(p##(113), 113, 114)\n#                            define BOOST_PP_NODE_115(p) BOOST_PP_IIF(p##(115), 115, 116)\n#                        define BOOST_PP_NODE_118(p) BOOST_PP_IIF(p##(118), BOOST_PP_NODE_117, BOOST_PP_NODE_119)\n#                            define BOOST_PP_NODE_117(p) BOOST_PP_IIF(p##(117), 117, 118)\n#                            define BOOST_PP_NODE_119(p) BOOST_PP_IIF(p##(119), 119, 120)\n#                    define BOOST_PP_NODE_124(p) BOOST_PP_IIF(p##(124), BOOST_PP_NODE_122, BOOST_PP_NODE_126)\n#                        define BOOST_PP_NODE_122(p) BOOST_PP_IIF(p##(122), BOOST_PP_NODE_121, BOOST_PP_NODE_123)\n#                            define BOOST_PP_NODE_121(p) BOOST_PP_IIF(p##(121), 121, 122)\n#                            define BOOST_PP_NODE_123(p) BOOST_PP_IIF(p##(123), 123, 124)\n#                        define BOOST_PP_NODE_126(p) BOOST_PP_IIF(p##(126), BOOST_PP_NODE_125, BOOST_PP_NODE_127)\n#                            define BOOST_PP_NODE_125(p) BOOST_PP_IIF(p##(125), 125, 126)\n#                            define BOOST_PP_NODE_127(p) BOOST_PP_IIF(p##(127), 127, 128)\n#    define BOOST_PP_NODE_192(p) BOOST_PP_IIF(p##(192), BOOST_PP_NODE_160, BOOST_PP_NODE_224)\n#        define BOOST_PP_NODE_160(p) BOOST_PP_IIF(p##(160), BOOST_PP_NODE_144, BOOST_PP_NODE_176)\n#            define BOOST_PP_NODE_144(p) BOOST_PP_IIF(p##(144), BOOST_PP_NODE_136, BOOST_PP_NODE_152)\n#                define BOOST_PP_NODE_136(p) BOOST_PP_IIF(p##(136), BOOST_PP_NODE_132, BOOST_PP_NODE_140)\n#                    define BOOST_PP_NODE_132(p) BOOST_PP_IIF(p##(132), BOOST_PP_NODE_130, BOOST_PP_NODE_134)\n#                        define BOOST_PP_NODE_130(p) BOOST_PP_IIF(p##(130), BOOST_PP_NODE_129, BOOST_PP_NODE_131)\n#                            define BOOST_PP_NODE_129(p) BOOST_PP_IIF(p##(129), 129, 130)\n#                            define BOOST_PP_NODE_131(p) BOOST_PP_IIF(p##(131), 131, 132)\n#                        define BOOST_PP_NODE_134(p) BOOST_PP_IIF(p##(134), BOOST_PP_NODE_133, BOOST_PP_NODE_135)\n#                            define BOOST_PP_NODE_133(p) BOOST_PP_IIF(p##(133), 133, 134)\n#                            define BOOST_PP_NODE_135(p) BOOST_PP_IIF(p##(135), 135, 136)\n#                    define BOOST_PP_NODE_140(p) BOOST_PP_IIF(p##(140), BOOST_PP_NODE_138, BOOST_PP_NODE_142)\n#                        define BOOST_PP_NODE_138(p) BOOST_PP_IIF(p##(138), BOOST_PP_NODE_137, BOOST_PP_NODE_139)\n#                            define BOOST_PP_NODE_137(p) BOOST_PP_IIF(p##(137), 137, 138)\n#                            define BOOST_PP_NODE_139(p) BOOST_PP_IIF(p##(139), 139, 140)\n#                        define BOOST_PP_NODE_142(p) BOOST_PP_IIF(p##(142), BOOST_PP_NODE_141, BOOST_PP_NODE_143)\n#                            define BOOST_PP_NODE_141(p) BOOST_PP_IIF(p##(141), 141, 142)\n#                            define BOOST_PP_NODE_143(p) BOOST_PP_IIF(p##(143), 143, 144)\n#                define BOOST_PP_NODE_152(p) BOOST_PP_IIF(p##(152), BOOST_PP_NODE_148, BOOST_PP_NODE_156)\n#                    define BOOST_PP_NODE_148(p) BOOST_PP_IIF(p##(148), BOOST_PP_NODE_146, BOOST_PP_NODE_150)\n#                        define BOOST_PP_NODE_146(p) BOOST_PP_IIF(p##(146), BOOST_PP_NODE_145, BOOST_PP_NODE_147)\n#                            define BOOST_PP_NODE_145(p) BOOST_PP_IIF(p##(145), 145, 146)\n#                            define BOOST_PP_NODE_147(p) BOOST_PP_IIF(p##(147), 147, 148)\n#                        define BOOST_PP_NODE_150(p) BOOST_PP_IIF(p##(150), BOOST_PP_NODE_149, BOOST_PP_NODE_151)\n#                            define BOOST_PP_NODE_149(p) BOOST_PP_IIF(p##(149), 149, 150)\n#                            define BOOST_PP_NODE_151(p) BOOST_PP_IIF(p##(151), 151, 152)\n#                    define BOOST_PP_NODE_156(p) BOOST_PP_IIF(p##(156), BOOST_PP_NODE_154, BOOST_PP_NODE_158)\n#                        define BOOST_PP_NODE_154(p) BOOST_PP_IIF(p##(154), BOOST_PP_NODE_153, BOOST_PP_NODE_155)\n#                            define BOOST_PP_NODE_153(p) BOOST_PP_IIF(p##(153), 153, 154)\n#                            define BOOST_PP_NODE_155(p) BOOST_PP_IIF(p##(155), 155, 156)\n#                        define BOOST_PP_NODE_158(p) BOOST_PP_IIF(p##(158), BOOST_PP_NODE_157, BOOST_PP_NODE_159)\n#                            define BOOST_PP_NODE_157(p) BOOST_PP_IIF(p##(157), 157, 158)\n#                            define BOOST_PP_NODE_159(p) BOOST_PP_IIF(p##(159), 159, 160)\n#            define BOOST_PP_NODE_176(p) BOOST_PP_IIF(p##(176), BOOST_PP_NODE_168, BOOST_PP_NODE_184)\n#                define BOOST_PP_NODE_168(p) BOOST_PP_IIF(p##(168), BOOST_PP_NODE_164, BOOST_PP_NODE_172)\n#                    define BOOST_PP_NODE_164(p) BOOST_PP_IIF(p##(164), BOOST_PP_NODE_162, BOOST_PP_NODE_166)\n#                        define BOOST_PP_NODE_162(p) BOOST_PP_IIF(p##(162), BOOST_PP_NODE_161, BOOST_PP_NODE_163)\n#                            define BOOST_PP_NODE_161(p) BOOST_PP_IIF(p##(161), 161, 162)\n#                            define BOOST_PP_NODE_163(p) BOOST_PP_IIF(p##(163), 163, 164)\n#                        define BOOST_PP_NODE_166(p) BOOST_PP_IIF(p##(166), BOOST_PP_NODE_165, BOOST_PP_NODE_167)\n#                            define BOOST_PP_NODE_165(p) BOOST_PP_IIF(p##(165), 165, 166)\n#                            define BOOST_PP_NODE_167(p) BOOST_PP_IIF(p##(167), 167, 168)\n#                    define BOOST_PP_NODE_172(p) BOOST_PP_IIF(p##(172), BOOST_PP_NODE_170, BOOST_PP_NODE_174)\n#                        define BOOST_PP_NODE_170(p) BOOST_PP_IIF(p##(170), BOOST_PP_NODE_169, BOOST_PP_NODE_171)\n#                            define BOOST_PP_NODE_169(p) BOOST_PP_IIF(p##(169), 169, 170)\n#                            define BOOST_PP_NODE_171(p) BOOST_PP_IIF(p##(171), 171, 172)\n#                        define BOOST_PP_NODE_174(p) BOOST_PP_IIF(p##(174), BOOST_PP_NODE_173, BOOST_PP_NODE_175)\n#                            define BOOST_PP_NODE_173(p) BOOST_PP_IIF(p##(173), 173, 174)\n#                            define BOOST_PP_NODE_175(p) BOOST_PP_IIF(p##(175), 175, 176)\n#                define BOOST_PP_NODE_184(p) BOOST_PP_IIF(p##(184), BOOST_PP_NODE_180, BOOST_PP_NODE_188)\n#                    define BOOST_PP_NODE_180(p) BOOST_PP_IIF(p##(180), BOOST_PP_NODE_178, BOOST_PP_NODE_182)\n#                        define BOOST_PP_NODE_178(p) BOOST_PP_IIF(p##(178), BOOST_PP_NODE_177, BOOST_PP_NODE_179)\n#                            define BOOST_PP_NODE_177(p) BOOST_PP_IIF(p##(177), 177, 178)\n#                            define BOOST_PP_NODE_179(p) BOOST_PP_IIF(p##(179), 179, 180)\n#                        define BOOST_PP_NODE_182(p) BOOST_PP_IIF(p##(182), BOOST_PP_NODE_181, BOOST_PP_NODE_183)\n#                            define BOOST_PP_NODE_181(p) BOOST_PP_IIF(p##(181), 181, 182)\n#                            define BOOST_PP_NODE_183(p) BOOST_PP_IIF(p##(183), 183, 184)\n#                    define BOOST_PP_NODE_188(p) BOOST_PP_IIF(p##(188), BOOST_PP_NODE_186, BOOST_PP_NODE_190)\n#                        define BOOST_PP_NODE_186(p) BOOST_PP_IIF(p##(186), BOOST_PP_NODE_185, BOOST_PP_NODE_187)\n#                            define BOOST_PP_NODE_185(p) BOOST_PP_IIF(p##(185), 185, 186)\n#                            define BOOST_PP_NODE_187(p) BOOST_PP_IIF(p##(187), 187, 188)\n#                        define BOOST_PP_NODE_190(p) BOOST_PP_IIF(p##(190), BOOST_PP_NODE_189, BOOST_PP_NODE_191)\n#                            define BOOST_PP_NODE_189(p) BOOST_PP_IIF(p##(189), 189, 190)\n#                            define BOOST_PP_NODE_191(p) BOOST_PP_IIF(p##(191), 191, 192)\n#        define BOOST_PP_NODE_224(p) BOOST_PP_IIF(p##(224), BOOST_PP_NODE_208, BOOST_PP_NODE_240)\n#            define BOOST_PP_NODE_208(p) BOOST_PP_IIF(p##(208), BOOST_PP_NODE_200, BOOST_PP_NODE_216)\n#                define BOOST_PP_NODE_200(p) BOOST_PP_IIF(p##(200), BOOST_PP_NODE_196, BOOST_PP_NODE_204)\n#                    define BOOST_PP_NODE_196(p) BOOST_PP_IIF(p##(196), BOOST_PP_NODE_194, BOOST_PP_NODE_198)\n#                        define BOOST_PP_NODE_194(p) BOOST_PP_IIF(p##(194), BOOST_PP_NODE_193, BOOST_PP_NODE_195)\n#                            define BOOST_PP_NODE_193(p) BOOST_PP_IIF(p##(193), 193, 194)\n#                            define BOOST_PP_NODE_195(p) BOOST_PP_IIF(p##(195), 195, 196)\n#                        define BOOST_PP_NODE_198(p) BOOST_PP_IIF(p##(198), BOOST_PP_NODE_197, BOOST_PP_NODE_199)\n#                            define BOOST_PP_NODE_197(p) BOOST_PP_IIF(p##(197), 197, 198)\n#                            define BOOST_PP_NODE_199(p) BOOST_PP_IIF(p##(199), 199, 200)\n#                    define BOOST_PP_NODE_204(p) BOOST_PP_IIF(p##(204), BOOST_PP_NODE_202, BOOST_PP_NODE_206)\n#                        define BOOST_PP_NODE_202(p) BOOST_PP_IIF(p##(202), BOOST_PP_NODE_201, BOOST_PP_NODE_203)\n#                            define BOOST_PP_NODE_201(p) BOOST_PP_IIF(p##(201), 201, 202)\n#                            define BOOST_PP_NODE_203(p) BOOST_PP_IIF(p##(203), 203, 204)\n#                        define BOOST_PP_NODE_206(p) BOOST_PP_IIF(p##(206), BOOST_PP_NODE_205, BOOST_PP_NODE_207)\n#                            define BOOST_PP_NODE_205(p) BOOST_PP_IIF(p##(205), 205, 206)\n#                            define BOOST_PP_NODE_207(p) BOOST_PP_IIF(p##(207), 207, 208)\n#                define BOOST_PP_NODE_216(p) BOOST_PP_IIF(p##(216), BOOST_PP_NODE_212, BOOST_PP_NODE_220)\n#                    define BOOST_PP_NODE_212(p) BOOST_PP_IIF(p##(212), BOOST_PP_NODE_210, BOOST_PP_NODE_214)\n#                        define BOOST_PP_NODE_210(p) BOOST_PP_IIF(p##(210), BOOST_PP_NODE_209, BOOST_PP_NODE_211)\n#                            define BOOST_PP_NODE_209(p) BOOST_PP_IIF(p##(209), 209, 210)\n#                            define BOOST_PP_NODE_211(p) BOOST_PP_IIF(p##(211), 211, 212)\n#                        define BOOST_PP_NODE_214(p) BOOST_PP_IIF(p##(214), BOOST_PP_NODE_213, BOOST_PP_NODE_215)\n#                            define BOOST_PP_NODE_213(p) BOOST_PP_IIF(p##(213), 213, 214)\n#                            define BOOST_PP_NODE_215(p) BOOST_PP_IIF(p##(215), 215, 216)\n#                    define BOOST_PP_NODE_220(p) BOOST_PP_IIF(p##(220), BOOST_PP_NODE_218, BOOST_PP_NODE_222)\n#                        define BOOST_PP_NODE_218(p) BOOST_PP_IIF(p##(218), BOOST_PP_NODE_217, BOOST_PP_NODE_219)\n#                            define BOOST_PP_NODE_217(p) BOOST_PP_IIF(p##(217), 217, 218)\n#                            define BOOST_PP_NODE_219(p) BOOST_PP_IIF(p##(219), 219, 220)\n#                        define BOOST_PP_NODE_222(p) BOOST_PP_IIF(p##(222), BOOST_PP_NODE_221, BOOST_PP_NODE_223)\n#                            define BOOST_PP_NODE_221(p) BOOST_PP_IIF(p##(221), 221, 222)\n#                            define BOOST_PP_NODE_223(p) BOOST_PP_IIF(p##(223), 223, 224)\n#            define BOOST_PP_NODE_240(p) BOOST_PP_IIF(p##(240), BOOST_PP_NODE_232, BOOST_PP_NODE_248)\n#                define BOOST_PP_NODE_232(p) BOOST_PP_IIF(p##(232), BOOST_PP_NODE_228, BOOST_PP_NODE_236)\n#                    define BOOST_PP_NODE_228(p) BOOST_PP_IIF(p##(228), BOOST_PP_NODE_226, BOOST_PP_NODE_230)\n#                        define BOOST_PP_NODE_226(p) BOOST_PP_IIF(p##(226), BOOST_PP_NODE_225, BOOST_PP_NODE_227)\n#                            define BOOST_PP_NODE_225(p) BOOST_PP_IIF(p##(225), 225, 226)\n#                            define BOOST_PP_NODE_227(p) BOOST_PP_IIF(p##(227), 227, 228)\n#                        define BOOST_PP_NODE_230(p) BOOST_PP_IIF(p##(230), BOOST_PP_NODE_229, BOOST_PP_NODE_231)\n#                            define BOOST_PP_NODE_229(p) BOOST_PP_IIF(p##(229), 229, 230)\n#                            define BOOST_PP_NODE_231(p) BOOST_PP_IIF(p##(231), 231, 232)\n#                    define BOOST_PP_NODE_236(p) BOOST_PP_IIF(p##(236), BOOST_PP_NODE_234, BOOST_PP_NODE_238)\n#                        define BOOST_PP_NODE_234(p) BOOST_PP_IIF(p##(234), BOOST_PP_NODE_233, BOOST_PP_NODE_235)\n#                            define BOOST_PP_NODE_233(p) BOOST_PP_IIF(p##(233), 233, 234)\n#                            define BOOST_PP_NODE_235(p) BOOST_PP_IIF(p##(235), 235, 236)\n#                        define BOOST_PP_NODE_238(p) BOOST_PP_IIF(p##(238), BOOST_PP_NODE_237, BOOST_PP_NODE_239)\n#                            define BOOST_PP_NODE_237(p) BOOST_PP_IIF(p##(237), 237, 238)\n#                            define BOOST_PP_NODE_239(p) BOOST_PP_IIF(p##(239), 239, 240)\n#                define BOOST_PP_NODE_248(p) BOOST_PP_IIF(p##(248), BOOST_PP_NODE_244, BOOST_PP_NODE_252)\n#                    define BOOST_PP_NODE_244(p) BOOST_PP_IIF(p##(244), BOOST_PP_NODE_242, BOOST_PP_NODE_246)\n#                        define BOOST_PP_NODE_242(p) BOOST_PP_IIF(p##(242), BOOST_PP_NODE_241, BOOST_PP_NODE_243)\n#                            define BOOST_PP_NODE_241(p) BOOST_PP_IIF(p##(241), 241, 242)\n#                            define BOOST_PP_NODE_243(p) BOOST_PP_IIF(p##(243), 243, 244)\n#                        define BOOST_PP_NODE_246(p) BOOST_PP_IIF(p##(246), BOOST_PP_NODE_245, BOOST_PP_NODE_247)\n#                            define BOOST_PP_NODE_245(p) BOOST_PP_IIF(p##(245), 245, 246)\n#                            define BOOST_PP_NODE_247(p) BOOST_PP_IIF(p##(247), 247, 248)\n#                    define BOOST_PP_NODE_252(p) BOOST_PP_IIF(p##(252), BOOST_PP_NODE_250, BOOST_PP_NODE_254)\n#                        define BOOST_PP_NODE_250(p) BOOST_PP_IIF(p##(250), BOOST_PP_NODE_249, BOOST_PP_NODE_251)\n#                            define BOOST_PP_NODE_249(p) BOOST_PP_IIF(p##(249), 249, 250)\n#                            define BOOST_PP_NODE_251(p) BOOST_PP_IIF(p##(251), 251, 252)\n#                        define BOOST_PP_NODE_254(p) BOOST_PP_IIF(p##(254), BOOST_PP_NODE_253, BOOST_PP_NODE_255)\n#                            define BOOST_PP_NODE_253(p) BOOST_PP_IIF(p##(253), 253, 254)\n#                            define BOOST_PP_NODE_255(p) BOOST_PP_IIF(p##(255), 255, 256)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/is_binary.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_IS_BINARY_HPP\n# define BOOST_PREPROCESSOR_DETAIL_IS_BINARY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/check.hpp>\n#\n# /* BOOST_PP_IS_BINARY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IS_BINARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_BINARY_CHECK)\n# else\n#    define BOOST_PP_IS_BINARY(x) BOOST_PP_IS_BINARY_I(x)\n#    define BOOST_PP_IS_BINARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_BINARY_CHECK)\n# endif\n#\n# define BOOST_PP_IS_BINARY_CHECK(a, b) 1\n# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_BINARY_CHECK 0, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/is_nullary.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_IS_NULLARY_HPP\n# define BOOST_PREPROCESSOR_DETAIL_IS_NULLARY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/check.hpp>\n#\n# /* BOOST_PP_IS_NULLARY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IS_NULLARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_NULLARY_CHECK)\n# else\n#    define BOOST_PP_IS_NULLARY(x) BOOST_PP_IS_NULLARY_I(x)\n#    define BOOST_PP_IS_NULLARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_NULLARY_CHECK)\n# endif\n#\n# define BOOST_PP_IS_NULLARY_CHECK() 1\n# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_NULLARY_CHECK 0, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/is_unary.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_IS_UNARY_HPP\n# define BOOST_PREPROCESSOR_DETAIL_IS_UNARY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/check.hpp>\n#\n# /* BOOST_PP_IS_UNARY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_IS_UNARY(x) BOOST_PP_CHECK(x, BOOST_PP_IS_UNARY_CHECK)\n# else\n#    define BOOST_PP_IS_UNARY(x) BOOST_PP_IS_UNARY_I(x)\n#    define BOOST_PP_IS_UNARY_I(x) BOOST_PP_CHECK(x, BOOST_PP_IS_UNARY_CHECK)\n# endif\n#\n# define BOOST_PP_IS_UNARY_CHECK(a) 1\n# define BOOST_PP_CHECK_RESULT_BOOST_PP_IS_UNARY_CHECK 0, BOOST_PP_NIL\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/null.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_NULL_HPP\n# define BOOST_PREPROCESSOR_DETAIL_NULL_HPP\n#\n# /* empty file */\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/detail/split.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# ifndef BOOST_PREPROCESSOR_DETAIL_SPLIT_HPP\n# define BOOST_PREPROCESSOR_DETAIL_SPLIT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_SPLIT */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I((n, im))\n#    define BOOST_PP_SPLIT_I(par) BOOST_PP_SPLIT_II ## par\n#    define BOOST_PP_SPLIT_II(n, a, b) BOOST_PP_SPLIT_ ## n(a, b)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I(n((im)))\n#    define BOOST_PP_SPLIT_I(n) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_II_ ## n)\n#    define BOOST_PP_SPLIT_II_0(s) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_0 s)\n#    define BOOST_PP_SPLIT_II_1(s) BOOST_PP_SPLIT_ID(BOOST_PP_SPLIT_1 s)\n#    define BOOST_PP_SPLIT_ID(id) id\n# else\n#    define BOOST_PP_SPLIT(n, im) BOOST_PP_SPLIT_I(n)(im)\n#    define BOOST_PP_SPLIT_I(n) BOOST_PP_SPLIT_ ## n\n# endif\n#\n# define BOOST_PP_SPLIT_0(a, b) a\n# define BOOST_PP_SPLIT_1(a, b) b\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_EMPTY_HPP\n# define BOOST_PREPROCESSOR_EMPTY_HPP\n#\n# include <boost/preprocessor/facilities/empty.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/enum.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_HPP\n# define BOOST_PREPROCESSOR_ENUM_HPP\n#\n# include <boost/preprocessor/repetition/enum.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/enum_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_HPP\n# define BOOST_PREPROCESSOR_ENUM_PARAMS_HPP\n#\n# include <boost/preprocessor/repetition/enum_params.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/enum_params_with_a_default.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n# define BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n#\n# include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/enum_params_with_defaults.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_DEFAULTS_HPP\n# define BOOST_PREPROCESSOR_ENUM_PARAMS_WITH_DEFAULTS_HPP\n#\n# include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/enum_shifted.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_SHIFTED_HPP\n# define BOOST_PREPROCESSOR_ENUM_SHIFTED_HPP\n#\n# include <boost/preprocessor/repetition/enum_shifted.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/enum_shifted_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS_HPP\n# define BOOST_PREPROCESSOR_ENUM_SHIFTED_PARAMS_HPP\n#\n# include <boost/preprocessor/repetition/enum_shifted_params.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/expand.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_EXPAND_HPP\n# define BOOST_PREPROCESSOR_EXPAND_HPP\n#\n# include <boost/preprocessor/facilities/expand.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/expr_if.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_EXPR_IF_HPP\n# define BOOST_PREPROCESSOR_EXPR_IF_HPP\n#\n# include <boost/preprocessor/control/expr_if.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/apply.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_APPLY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_APPLY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/detail/is_unary.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_APPLY */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_APPLY(x) BOOST_PP_APPLY_I(x)\n#    define BOOST_PP_APPLY_I(x) BOOST_PP_EXPR_IIF(BOOST_PP_IS_UNARY(x), BOOST_PP_TUPLE_REM_1 x)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()\n#    define BOOST_PP_APPLY(x) BOOST_PP_APPLY_I(x)\n#    define BOOST_PP_APPLY_I(x) BOOST_PP_APPLY_ ## x\n#    define BOOST_PP_APPLY_(x) x\n#    define BOOST_PP_APPLY_BOOST_PP_NIL\n# else\n#    define BOOST_PP_APPLY(x) BOOST_PP_EXPR_IIF(BOOST_PP_IS_UNARY(x), BOOST_PP_TUPLE_REM_1 x)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/detail/is_empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n#ifndef BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP\n#define BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP\n\n#include <boost/preprocessor/punctuation/is_begin_parens.hpp>\n\n#if BOOST_PP_VARIADICS_MSVC\n\n# pragma warning(once:4002)\n\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, b) b\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, b) t\n\n#else\n\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_0(t, ...) __VA_ARGS__\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF_1(t, ...) t\n\n#endif\n\n#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400\n\n#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(param) \\\n\tBOOST_PP_IS_BEGIN_PARENS \\\n    \t( \\\n        BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C param () \\\n        ) \\\n/**/\n\n#else\n\n#define BOOST_PP_DETAIL_IS_EMPTY_PROCESS(...) \\\n\tBOOST_PP_IS_BEGIN_PARENS \\\n        ( \\\n        BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \\\n        ) \\\n/**/\n\n#endif\n\n#define BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(a, b) a ## b\n#define BOOST_PP_DETAIL_IS_EMPTY_IIF(bit) BOOST_PP_DETAIL_IS_EMPTY_PRIMITIVE_CAT(BOOST_PP_DETAIL_IS_EMPTY_IIF_,bit)\n#define BOOST_PP_DETAIL_IS_EMPTY_NON_FUNCTION_C(...) ()\n\n#endif /* BOOST_PREPROCESSOR_DETAIL_IS_EMPTY_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/empty.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_EMPTY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_EMPTY */\n#\n# define BOOST_PP_EMPTY()\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/expand.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_EXPAND_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_EXPAND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_EXPAND(x) BOOST_PP_EXPAND_I(x)\n# else\n#    define BOOST_PP_EXPAND(x) BOOST_PP_EXPAND_OO((x))\n#    define BOOST_PP_EXPAND_OO(par) BOOST_PP_EXPAND_I ## par\n# endif\n#\n# define BOOST_PP_EXPAND_I(x) x\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/identity.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n# /* Revised by Edward Diener (2015) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IDENTITY_HPP\n#\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_IDENTITY */\n#\n# define BOOST_PP_IDENTITY(item) item BOOST_PP_EMPTY\n#\n# define BOOST_PP_IDENTITY_N(item,n) item BOOST_PP_TUPLE_EAT_N(n)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/intercept.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_INTERCEPT_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_INTERCEPT_HPP\n#\n# /* BOOST_PP_INTERCEPT */\n#\n# define BOOST_PP_INTERCEPT BOOST_PP_INTERCEPT_\n#\n# define BOOST_PP_INTERCEPT_0\n# define BOOST_PP_INTERCEPT_1\n# define BOOST_PP_INTERCEPT_2\n# define BOOST_PP_INTERCEPT_3\n# define BOOST_PP_INTERCEPT_4\n# define BOOST_PP_INTERCEPT_5\n# define BOOST_PP_INTERCEPT_6\n# define BOOST_PP_INTERCEPT_7\n# define BOOST_PP_INTERCEPT_8\n# define BOOST_PP_INTERCEPT_9\n# define BOOST_PP_INTERCEPT_10\n# define BOOST_PP_INTERCEPT_11\n# define BOOST_PP_INTERCEPT_12\n# define BOOST_PP_INTERCEPT_13\n# define BOOST_PP_INTERCEPT_14\n# define BOOST_PP_INTERCEPT_15\n# define BOOST_PP_INTERCEPT_16\n# define BOOST_PP_INTERCEPT_17\n# define BOOST_PP_INTERCEPT_18\n# define BOOST_PP_INTERCEPT_19\n# define BOOST_PP_INTERCEPT_20\n# define BOOST_PP_INTERCEPT_21\n# define BOOST_PP_INTERCEPT_22\n# define BOOST_PP_INTERCEPT_23\n# define BOOST_PP_INTERCEPT_24\n# define BOOST_PP_INTERCEPT_25\n# define BOOST_PP_INTERCEPT_26\n# define BOOST_PP_INTERCEPT_27\n# define BOOST_PP_INTERCEPT_28\n# define BOOST_PP_INTERCEPT_29\n# define BOOST_PP_INTERCEPT_30\n# define BOOST_PP_INTERCEPT_31\n# define BOOST_PP_INTERCEPT_32\n# define BOOST_PP_INTERCEPT_33\n# define BOOST_PP_INTERCEPT_34\n# define BOOST_PP_INTERCEPT_35\n# define BOOST_PP_INTERCEPT_36\n# define BOOST_PP_INTERCEPT_37\n# define BOOST_PP_INTERCEPT_38\n# define BOOST_PP_INTERCEPT_39\n# define BOOST_PP_INTERCEPT_40\n# define BOOST_PP_INTERCEPT_41\n# define BOOST_PP_INTERCEPT_42\n# define BOOST_PP_INTERCEPT_43\n# define BOOST_PP_INTERCEPT_44\n# define BOOST_PP_INTERCEPT_45\n# define BOOST_PP_INTERCEPT_46\n# define BOOST_PP_INTERCEPT_47\n# define BOOST_PP_INTERCEPT_48\n# define BOOST_PP_INTERCEPT_49\n# define BOOST_PP_INTERCEPT_50\n# define BOOST_PP_INTERCEPT_51\n# define BOOST_PP_INTERCEPT_52\n# define BOOST_PP_INTERCEPT_53\n# define BOOST_PP_INTERCEPT_54\n# define BOOST_PP_INTERCEPT_55\n# define BOOST_PP_INTERCEPT_56\n# define BOOST_PP_INTERCEPT_57\n# define BOOST_PP_INTERCEPT_58\n# define BOOST_PP_INTERCEPT_59\n# define BOOST_PP_INTERCEPT_60\n# define BOOST_PP_INTERCEPT_61\n# define BOOST_PP_INTERCEPT_62\n# define BOOST_PP_INTERCEPT_63\n# define BOOST_PP_INTERCEPT_64\n# define BOOST_PP_INTERCEPT_65\n# define BOOST_PP_INTERCEPT_66\n# define BOOST_PP_INTERCEPT_67\n# define BOOST_PP_INTERCEPT_68\n# define BOOST_PP_INTERCEPT_69\n# define BOOST_PP_INTERCEPT_70\n# define BOOST_PP_INTERCEPT_71\n# define BOOST_PP_INTERCEPT_72\n# define BOOST_PP_INTERCEPT_73\n# define BOOST_PP_INTERCEPT_74\n# define BOOST_PP_INTERCEPT_75\n# define BOOST_PP_INTERCEPT_76\n# define BOOST_PP_INTERCEPT_77\n# define BOOST_PP_INTERCEPT_78\n# define BOOST_PP_INTERCEPT_79\n# define BOOST_PP_INTERCEPT_80\n# define BOOST_PP_INTERCEPT_81\n# define BOOST_PP_INTERCEPT_82\n# define BOOST_PP_INTERCEPT_83\n# define BOOST_PP_INTERCEPT_84\n# define BOOST_PP_INTERCEPT_85\n# define BOOST_PP_INTERCEPT_86\n# define BOOST_PP_INTERCEPT_87\n# define BOOST_PP_INTERCEPT_88\n# define BOOST_PP_INTERCEPT_89\n# define BOOST_PP_INTERCEPT_90\n# define BOOST_PP_INTERCEPT_91\n# define BOOST_PP_INTERCEPT_92\n# define BOOST_PP_INTERCEPT_93\n# define BOOST_PP_INTERCEPT_94\n# define BOOST_PP_INTERCEPT_95\n# define BOOST_PP_INTERCEPT_96\n# define BOOST_PP_INTERCEPT_97\n# define BOOST_PP_INTERCEPT_98\n# define BOOST_PP_INTERCEPT_99\n# define BOOST_PP_INTERCEPT_100\n# define BOOST_PP_INTERCEPT_101\n# define BOOST_PP_INTERCEPT_102\n# define BOOST_PP_INTERCEPT_103\n# define BOOST_PP_INTERCEPT_104\n# define BOOST_PP_INTERCEPT_105\n# define BOOST_PP_INTERCEPT_106\n# define BOOST_PP_INTERCEPT_107\n# define BOOST_PP_INTERCEPT_108\n# define BOOST_PP_INTERCEPT_109\n# define BOOST_PP_INTERCEPT_110\n# define BOOST_PP_INTERCEPT_111\n# define BOOST_PP_INTERCEPT_112\n# define BOOST_PP_INTERCEPT_113\n# define BOOST_PP_INTERCEPT_114\n# define BOOST_PP_INTERCEPT_115\n# define BOOST_PP_INTERCEPT_116\n# define BOOST_PP_INTERCEPT_117\n# define BOOST_PP_INTERCEPT_118\n# define BOOST_PP_INTERCEPT_119\n# define BOOST_PP_INTERCEPT_120\n# define BOOST_PP_INTERCEPT_121\n# define BOOST_PP_INTERCEPT_122\n# define BOOST_PP_INTERCEPT_123\n# define BOOST_PP_INTERCEPT_124\n# define BOOST_PP_INTERCEPT_125\n# define BOOST_PP_INTERCEPT_126\n# define BOOST_PP_INTERCEPT_127\n# define BOOST_PP_INTERCEPT_128\n# define BOOST_PP_INTERCEPT_129\n# define BOOST_PP_INTERCEPT_130\n# define BOOST_PP_INTERCEPT_131\n# define BOOST_PP_INTERCEPT_132\n# define BOOST_PP_INTERCEPT_133\n# define BOOST_PP_INTERCEPT_134\n# define BOOST_PP_INTERCEPT_135\n# define BOOST_PP_INTERCEPT_136\n# define BOOST_PP_INTERCEPT_137\n# define BOOST_PP_INTERCEPT_138\n# define BOOST_PP_INTERCEPT_139\n# define BOOST_PP_INTERCEPT_140\n# define BOOST_PP_INTERCEPT_141\n# define BOOST_PP_INTERCEPT_142\n# define BOOST_PP_INTERCEPT_143\n# define BOOST_PP_INTERCEPT_144\n# define BOOST_PP_INTERCEPT_145\n# define BOOST_PP_INTERCEPT_146\n# define BOOST_PP_INTERCEPT_147\n# define BOOST_PP_INTERCEPT_148\n# define BOOST_PP_INTERCEPT_149\n# define BOOST_PP_INTERCEPT_150\n# define BOOST_PP_INTERCEPT_151\n# define BOOST_PP_INTERCEPT_152\n# define BOOST_PP_INTERCEPT_153\n# define BOOST_PP_INTERCEPT_154\n# define BOOST_PP_INTERCEPT_155\n# define BOOST_PP_INTERCEPT_156\n# define BOOST_PP_INTERCEPT_157\n# define BOOST_PP_INTERCEPT_158\n# define BOOST_PP_INTERCEPT_159\n# define BOOST_PP_INTERCEPT_160\n# define BOOST_PP_INTERCEPT_161\n# define BOOST_PP_INTERCEPT_162\n# define BOOST_PP_INTERCEPT_163\n# define BOOST_PP_INTERCEPT_164\n# define BOOST_PP_INTERCEPT_165\n# define BOOST_PP_INTERCEPT_166\n# define BOOST_PP_INTERCEPT_167\n# define BOOST_PP_INTERCEPT_168\n# define BOOST_PP_INTERCEPT_169\n# define BOOST_PP_INTERCEPT_170\n# define BOOST_PP_INTERCEPT_171\n# define BOOST_PP_INTERCEPT_172\n# define BOOST_PP_INTERCEPT_173\n# define BOOST_PP_INTERCEPT_174\n# define BOOST_PP_INTERCEPT_175\n# define BOOST_PP_INTERCEPT_176\n# define BOOST_PP_INTERCEPT_177\n# define BOOST_PP_INTERCEPT_178\n# define BOOST_PP_INTERCEPT_179\n# define BOOST_PP_INTERCEPT_180\n# define BOOST_PP_INTERCEPT_181\n# define BOOST_PP_INTERCEPT_182\n# define BOOST_PP_INTERCEPT_183\n# define BOOST_PP_INTERCEPT_184\n# define BOOST_PP_INTERCEPT_185\n# define BOOST_PP_INTERCEPT_186\n# define BOOST_PP_INTERCEPT_187\n# define BOOST_PP_INTERCEPT_188\n# define BOOST_PP_INTERCEPT_189\n# define BOOST_PP_INTERCEPT_190\n# define BOOST_PP_INTERCEPT_191\n# define BOOST_PP_INTERCEPT_192\n# define BOOST_PP_INTERCEPT_193\n# define BOOST_PP_INTERCEPT_194\n# define BOOST_PP_INTERCEPT_195\n# define BOOST_PP_INTERCEPT_196\n# define BOOST_PP_INTERCEPT_197\n# define BOOST_PP_INTERCEPT_198\n# define BOOST_PP_INTERCEPT_199\n# define BOOST_PP_INTERCEPT_200\n# define BOOST_PP_INTERCEPT_201\n# define BOOST_PP_INTERCEPT_202\n# define BOOST_PP_INTERCEPT_203\n# define BOOST_PP_INTERCEPT_204\n# define BOOST_PP_INTERCEPT_205\n# define BOOST_PP_INTERCEPT_206\n# define BOOST_PP_INTERCEPT_207\n# define BOOST_PP_INTERCEPT_208\n# define BOOST_PP_INTERCEPT_209\n# define BOOST_PP_INTERCEPT_210\n# define BOOST_PP_INTERCEPT_211\n# define BOOST_PP_INTERCEPT_212\n# define BOOST_PP_INTERCEPT_213\n# define BOOST_PP_INTERCEPT_214\n# define BOOST_PP_INTERCEPT_215\n# define BOOST_PP_INTERCEPT_216\n# define BOOST_PP_INTERCEPT_217\n# define BOOST_PP_INTERCEPT_218\n# define BOOST_PP_INTERCEPT_219\n# define BOOST_PP_INTERCEPT_220\n# define BOOST_PP_INTERCEPT_221\n# define BOOST_PP_INTERCEPT_222\n# define BOOST_PP_INTERCEPT_223\n# define BOOST_PP_INTERCEPT_224\n# define BOOST_PP_INTERCEPT_225\n# define BOOST_PP_INTERCEPT_226\n# define BOOST_PP_INTERCEPT_227\n# define BOOST_PP_INTERCEPT_228\n# define BOOST_PP_INTERCEPT_229\n# define BOOST_PP_INTERCEPT_230\n# define BOOST_PP_INTERCEPT_231\n# define BOOST_PP_INTERCEPT_232\n# define BOOST_PP_INTERCEPT_233\n# define BOOST_PP_INTERCEPT_234\n# define BOOST_PP_INTERCEPT_235\n# define BOOST_PP_INTERCEPT_236\n# define BOOST_PP_INTERCEPT_237\n# define BOOST_PP_INTERCEPT_238\n# define BOOST_PP_INTERCEPT_239\n# define BOOST_PP_INTERCEPT_240\n# define BOOST_PP_INTERCEPT_241\n# define BOOST_PP_INTERCEPT_242\n# define BOOST_PP_INTERCEPT_243\n# define BOOST_PP_INTERCEPT_244\n# define BOOST_PP_INTERCEPT_245\n# define BOOST_PP_INTERCEPT_246\n# define BOOST_PP_INTERCEPT_247\n# define BOOST_PP_INTERCEPT_248\n# define BOOST_PP_INTERCEPT_249\n# define BOOST_PP_INTERCEPT_250\n# define BOOST_PP_INTERCEPT_251\n# define BOOST_PP_INTERCEPT_252\n# define BOOST_PP_INTERCEPT_253\n# define BOOST_PP_INTERCEPT_254\n# define BOOST_PP_INTERCEPT_255\n# define BOOST_PP_INTERCEPT_256\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/is_1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2003.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_1_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_1_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/facilities/is_empty.hpp>\n#\n# /* BOOST_PP_IS_1 */\n#\n# define BOOST_PP_IS_1(x) BOOST_PP_IS_EMPTY(BOOST_PP_CAT(BOOST_PP_IS_1_HELPER_, x))\n# define BOOST_PP_IS_1_HELPER_1\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/is_empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2003.\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/facilities/is_empty_variadic.hpp>\n#\n# else\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/facilities/identity.hpp>\n# else\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/detail/split.hpp>\n# endif\n#\n# /* BOOST_PP_IS_EMPTY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(x BOOST_PP_IS_EMPTY_HELPER)\n#    define BOOST_PP_IS_EMPTY_I(contents) BOOST_PP_TUPLE_ELEM(2, 1, (BOOST_PP_IS_EMPTY_DEF_ ## contents()))\n#    define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 1, BOOST_PP_IDENTITY(1)\n#    define BOOST_PP_IS_EMPTY_HELPER() , 0\n# else\n#    if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#        define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I(BOOST_PP_IS_EMPTY_HELPER x ())\n#        define BOOST_PP_IS_EMPTY_I(test) BOOST_PP_IS_EMPTY_II(BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PP_IS_EMPTY_DEF_, test)))\n#        define BOOST_PP_IS_EMPTY_II(id) id\n#    else\n#        define BOOST_PP_IS_EMPTY(x) BOOST_PP_IS_EMPTY_I((BOOST_PP_IS_EMPTY_HELPER x ()))\n#        define BOOST_PP_IS_EMPTY_I(par) BOOST_PP_IS_EMPTY_II ## par\n#        define BOOST_PP_IS_EMPTY_II(test) BOOST_PP_SPLIT(0, BOOST_PP_CAT(BOOST_PP_IS_EMPTY_DEF_, test))\n#    endif\n#    define BOOST_PP_IS_EMPTY_HELPER() 1\n#    define BOOST_PP_IS_EMPTY_DEF_1 1, BOOST_PP_NIL\n#    define BOOST_PP_IS_EMPTY_DEF_BOOST_PP_IS_EMPTY_HELPER 0, BOOST_PP_NIL\n# endif\n#\n# endif /* BOOST_PP_VARIADICS */\n#\n# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/is_empty_or_1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2003.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_OR_1_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_OR_1_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/facilities/identity.hpp>\n# include <boost/preprocessor/facilities/is_1.hpp>\n# include <boost/preprocessor/facilities/is_empty.hpp>\n#\n# /* BOOST_PP_IS_EMPTY_OR_1 */\n#\n# define BOOST_PP_IS_EMPTY_OR_1(x) \\\n    BOOST_PP_IIF( \\\n        BOOST_PP_IS_EMPTY(x BOOST_PP_EMPTY()), \\\n        BOOST_PP_IDENTITY(1), \\\n        BOOST_PP_IS_1 \\\n    )(x) \\\n    /**/\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/is_empty_variadic.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/punctuation/is_begin_parens.hpp>\n# include <boost/preprocessor/facilities/detail/is_empty.hpp>\n#\n#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400\n#\n#define BOOST_PP_IS_EMPTY(param) \\\n    BOOST_PP_DETAIL_IS_EMPTY_IIF \\\n      ( \\\n      BOOST_PP_IS_BEGIN_PARENS \\\n        ( \\\n        param \\\n        ) \\\n      ) \\\n      ( \\\n      BOOST_PP_IS_EMPTY_ZERO, \\\n      BOOST_PP_DETAIL_IS_EMPTY_PROCESS \\\n      ) \\\n    (param) \\\n/**/\n#define BOOST_PP_IS_EMPTY_ZERO(param) 0\n# else\n#define BOOST_PP_IS_EMPTY(...) \\\n    BOOST_PP_DETAIL_IS_EMPTY_IIF \\\n      ( \\\n      BOOST_PP_IS_BEGIN_PARENS \\\n        ( \\\n        __VA_ARGS__ \\\n        ) \\\n      ) \\\n      ( \\\n      BOOST_PP_IS_EMPTY_ZERO, \\\n      BOOST_PP_DETAIL_IS_EMPTY_PROCESS \\\n      ) \\\n    (__VA_ARGS__) \\\n/**/\n#define BOOST_PP_IS_EMPTY_ZERO(...) 0\n# endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */\n# endif /* BOOST_PP_VARIADICS */\n# endif /* BOOST_PREPROCESSOR_FACILITIES_IS_EMPTY_VARIADIC_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities/overload.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_OVERLOAD_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_OVERLOAD_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_OVERLOAD */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_OVERLOAD(prefix, ...) BOOST_PP_CAT(prefix, BOOST_PP_VARIADIC_SIZE(__VA_ARGS__))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/facilities.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FACILITIES_HPP\n# define BOOST_PREPROCESSOR_FACILITIES_HPP\n#\n# include <boost/preprocessor/facilities/apply.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/facilities/expand.hpp>\n# include <boost/preprocessor/facilities/identity.hpp>\n# include <boost/preprocessor/facilities/intercept.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/for.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_FOR_HPP\n# define BOOST_PREPROCESSOR_FOR_HPP\n#\n# include <boost/preprocessor/repetition/for.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/identity.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_IDENTITY_HPP\n# define BOOST_PREPROCESSOR_IDENTITY_HPP\n#\n# include <boost/preprocessor/facilities/identity.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/if.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_IF_HPP\n# define BOOST_PREPROCESSOR_IF_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/inc.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_INC_HPP\n# define BOOST_PREPROCESSOR_INC_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iterate.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATE_HPP\n# define BOOST_PREPROCESSOR_ITERATE_HPP\n#\n# include <boost/preprocessor/iteration/iterate.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/lower1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_1\n#\n# undef BOOST_PP_ITERATION_START_1_DIGIT_1\n# undef BOOST_PP_ITERATION_START_1_DIGIT_2\n# undef BOOST_PP_ITERATION_START_1_DIGIT_3\n# undef BOOST_PP_ITERATION_START_1_DIGIT_4\n# undef BOOST_PP_ITERATION_START_1_DIGIT_5\n# undef BOOST_PP_ITERATION_START_1_DIGIT_6\n# undef BOOST_PP_ITERATION_START_1_DIGIT_7\n# undef BOOST_PP_ITERATION_START_1_DIGIT_8\n# undef BOOST_PP_ITERATION_START_1_DIGIT_9\n# undef BOOST_PP_ITERATION_START_1_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_1_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_1_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_1_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_1_DIGIT_3\n#    define BOOST_PP_ITERATION_START_1 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_1_DIGIT_3, BOOST_PP_ITERATION_START_1_DIGIT_2, BOOST_PP_ITERATION_START_1_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_1_DIGIT_2\n#    define BOOST_PP_ITERATION_START_1 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_1_DIGIT_2, BOOST_PP_ITERATION_START_1_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_1 BOOST_PP_ITERATION_START_1_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/lower2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_2\n#\n# undef BOOST_PP_ITERATION_START_2_DIGIT_1\n# undef BOOST_PP_ITERATION_START_2_DIGIT_2\n# undef BOOST_PP_ITERATION_START_2_DIGIT_3\n# undef BOOST_PP_ITERATION_START_2_DIGIT_4\n# undef BOOST_PP_ITERATION_START_2_DIGIT_5\n# undef BOOST_PP_ITERATION_START_2_DIGIT_6\n# undef BOOST_PP_ITERATION_START_2_DIGIT_7\n# undef BOOST_PP_ITERATION_START_2_DIGIT_8\n# undef BOOST_PP_ITERATION_START_2_DIGIT_9\n# undef BOOST_PP_ITERATION_START_2_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_2_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_2_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_2_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_2_DIGIT_3\n#    define BOOST_PP_ITERATION_START_2 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_2_DIGIT_3, BOOST_PP_ITERATION_START_2_DIGIT_2, BOOST_PP_ITERATION_START_2_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_2_DIGIT_2\n#    define BOOST_PP_ITERATION_START_2 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_2_DIGIT_2, BOOST_PP_ITERATION_START_2_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_2 BOOST_PP_ITERATION_START_2_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/lower3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_3\n#\n# undef BOOST_PP_ITERATION_START_3_DIGIT_1\n# undef BOOST_PP_ITERATION_START_3_DIGIT_2\n# undef BOOST_PP_ITERATION_START_3_DIGIT_3\n# undef BOOST_PP_ITERATION_START_3_DIGIT_4\n# undef BOOST_PP_ITERATION_START_3_DIGIT_5\n# undef BOOST_PP_ITERATION_START_3_DIGIT_6\n# undef BOOST_PP_ITERATION_START_3_DIGIT_7\n# undef BOOST_PP_ITERATION_START_3_DIGIT_8\n# undef BOOST_PP_ITERATION_START_3_DIGIT_9\n# undef BOOST_PP_ITERATION_START_3_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_3_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_3_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_3_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_3_DIGIT_3\n#    define BOOST_PP_ITERATION_START_3 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_3_DIGIT_3, BOOST_PP_ITERATION_START_3_DIGIT_2, BOOST_PP_ITERATION_START_3_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_3_DIGIT_2\n#    define BOOST_PP_ITERATION_START_3 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_3_DIGIT_2, BOOST_PP_ITERATION_START_3_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_3 BOOST_PP_ITERATION_START_3_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/lower4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_4\n#\n# undef BOOST_PP_ITERATION_START_4_DIGIT_1\n# undef BOOST_PP_ITERATION_START_4_DIGIT_2\n# undef BOOST_PP_ITERATION_START_4_DIGIT_3\n# undef BOOST_PP_ITERATION_START_4_DIGIT_4\n# undef BOOST_PP_ITERATION_START_4_DIGIT_5\n# undef BOOST_PP_ITERATION_START_4_DIGIT_6\n# undef BOOST_PP_ITERATION_START_4_DIGIT_7\n# undef BOOST_PP_ITERATION_START_4_DIGIT_8\n# undef BOOST_PP_ITERATION_START_4_DIGIT_9\n# undef BOOST_PP_ITERATION_START_4_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_4_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_4_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_4_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_4_DIGIT_3\n#    define BOOST_PP_ITERATION_START_4 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_4_DIGIT_3, BOOST_PP_ITERATION_START_4_DIGIT_2, BOOST_PP_ITERATION_START_4_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_4_DIGIT_2\n#    define BOOST_PP_ITERATION_START_4 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_4_DIGIT_2, BOOST_PP_ITERATION_START_4_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_4 BOOST_PP_ITERATION_START_4_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/lower5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_START_5\n#\n# undef BOOST_PP_ITERATION_START_5_DIGIT_1\n# undef BOOST_PP_ITERATION_START_5_DIGIT_2\n# undef BOOST_PP_ITERATION_START_5_DIGIT_3\n# undef BOOST_PP_ITERATION_START_5_DIGIT_4\n# undef BOOST_PP_ITERATION_START_5_DIGIT_5\n# undef BOOST_PP_ITERATION_START_5_DIGIT_6\n# undef BOOST_PP_ITERATION_START_5_DIGIT_7\n# undef BOOST_PP_ITERATION_START_5_DIGIT_8\n# undef BOOST_PP_ITERATION_START_5_DIGIT_9\n# undef BOOST_PP_ITERATION_START_5_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_START_5_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_START_5_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_START_5_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_START_5_DIGIT_3\n#    define BOOST_PP_ITERATION_START_5 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_START_5_DIGIT_3, BOOST_PP_ITERATION_START_5_DIGIT_2, BOOST_PP_ITERATION_START_5_DIGIT_1)\n# elif BOOST_PP_ITERATION_START_5_DIGIT_2\n#    define BOOST_PP_ITERATION_START_5 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_START_5_DIGIT_2, BOOST_PP_ITERATION_START_5_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_START_5 BOOST_PP_ITERATION_START_5_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/upper1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_1\n#\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_1_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_1_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_1_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_1_DIGIT_3, BOOST_PP_ITERATION_FINISH_1_DIGIT_2, BOOST_PP_ITERATION_FINISH_1_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_1_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_1_DIGIT_2, BOOST_PP_ITERATION_FINISH_1_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_1 BOOST_PP_ITERATION_FINISH_1_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/upper2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_2\n#\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_2_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_2_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_2_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_2_DIGIT_3, BOOST_PP_ITERATION_FINISH_2_DIGIT_2, BOOST_PP_ITERATION_FINISH_2_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_2_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_2_DIGIT_2, BOOST_PP_ITERATION_FINISH_2_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_2 BOOST_PP_ITERATION_FINISH_2_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/upper3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_3\n#\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_3_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_3_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_3_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_3_DIGIT_3, BOOST_PP_ITERATION_FINISH_3_DIGIT_2, BOOST_PP_ITERATION_FINISH_3_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_3_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_3_DIGIT_2, BOOST_PP_ITERATION_FINISH_3_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_3 BOOST_PP_ITERATION_FINISH_3_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/upper4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_4\n#\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_4_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_4_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_4_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_4_DIGIT_3, BOOST_PP_ITERATION_FINISH_4_DIGIT_2, BOOST_PP_ITERATION_FINISH_4_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_4_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_4_DIGIT_2, BOOST_PP_ITERATION_FINISH_4_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_4 BOOST_PP_ITERATION_FINISH_4_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/bounds/upper5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_ITERATION_FINISH_5\n#\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_1\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_2\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_3\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_4\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_5\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_6\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_7\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_8\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_9\n# undef BOOST_PP_ITERATION_FINISH_5_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_ITERATION_FINISH_5_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_ITERATION_FINISH_5_DIGIT_3\n#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_SLOT_CC_3(BOOST_PP_ITERATION_FINISH_5_DIGIT_3, BOOST_PP_ITERATION_FINISH_5_DIGIT_2, BOOST_PP_ITERATION_FINISH_5_DIGIT_1)\n# elif BOOST_PP_ITERATION_FINISH_5_DIGIT_2\n#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_SLOT_CC_2(BOOST_PP_ITERATION_FINISH_5_DIGIT_2, BOOST_PP_ITERATION_FINISH_5_DIGIT_1)\n# else\n#    define BOOST_PP_ITERATION_FINISH_5 BOOST_PP_ITERATION_FINISH_5_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/finish.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_LOCAL_FE\n#\n# undef BOOST_PP_LOCAL_FE_DIGIT_1\n# undef BOOST_PP_LOCAL_FE_DIGIT_2\n# undef BOOST_PP_LOCAL_FE_DIGIT_3\n# undef BOOST_PP_LOCAL_FE_DIGIT_4\n# undef BOOST_PP_LOCAL_FE_DIGIT_5\n# undef BOOST_PP_LOCAL_FE_DIGIT_6\n# undef BOOST_PP_LOCAL_FE_DIGIT_7\n# undef BOOST_PP_LOCAL_FE_DIGIT_8\n# undef BOOST_PP_LOCAL_FE_DIGIT_9\n# undef BOOST_PP_LOCAL_FE_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_LOCAL_FE_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_LOCAL_FE_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_LOCAL_FE_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_LOCAL_FE_DIGIT_3\n#    define BOOST_PP_LOCAL_FE() BOOST_PP_SLOT_CC_3(BOOST_PP_LOCAL_FE_DIGIT_3, BOOST_PP_LOCAL_FE_DIGIT_2, BOOST_PP_LOCAL_FE_DIGIT_1)\n# elif BOOST_PP_LOCAL_FE_DIGIT_2\n#    define BOOST_PP_LOCAL_FE() BOOST_PP_SLOT_CC_2(BOOST_PP_LOCAL_FE_DIGIT_2, BOOST_PP_LOCAL_FE_DIGIT_1)\n# else\n#    define BOOST_PP_LOCAL_FE() BOOST_PP_LOCAL_FE_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/forward1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_1)\n#        error BOOST_PP_ERROR:  depth #1 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower1.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper1.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_1() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_1)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_1)\n#    include <boost/preprocessor/iteration/detail/bounds/lower1.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_1)\n#    include <boost/preprocessor/iteration/detail/bounds/upper1.hpp>\n#    define BOOST_PP_FILENAME_1 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_1)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_1) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_1() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_1)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_1() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #1 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 1\n#\n# define BOOST_PP_IS_ITERATING 1\n#\n# if (BOOST_PP_ITERATION_START_1) > (BOOST_PP_ITERATION_FINISH_1)\n#    include <boost/preprocessor/iteration/detail/iter/reverse1.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_1 <= 0 && BOOST_PP_ITERATION_FINISH_1 >= 0\n#        define BOOST_PP_ITERATION_1 0\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 1 && BOOST_PP_ITERATION_FINISH_1 >= 1\n#        define BOOST_PP_ITERATION_1 1\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 2 && BOOST_PP_ITERATION_FINISH_1 >= 2\n#        define BOOST_PP_ITERATION_1 2\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 3 && BOOST_PP_ITERATION_FINISH_1 >= 3\n#        define BOOST_PP_ITERATION_1 3\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 4 && BOOST_PP_ITERATION_FINISH_1 >= 4\n#        define BOOST_PP_ITERATION_1 4\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 5 && BOOST_PP_ITERATION_FINISH_1 >= 5\n#        define BOOST_PP_ITERATION_1 5\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 6 && BOOST_PP_ITERATION_FINISH_1 >= 6\n#        define BOOST_PP_ITERATION_1 6\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 7 && BOOST_PP_ITERATION_FINISH_1 >= 7\n#        define BOOST_PP_ITERATION_1 7\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 8 && BOOST_PP_ITERATION_FINISH_1 >= 8\n#        define BOOST_PP_ITERATION_1 8\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 9 && BOOST_PP_ITERATION_FINISH_1 >= 9\n#        define BOOST_PP_ITERATION_1 9\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 10 && BOOST_PP_ITERATION_FINISH_1 >= 10\n#        define BOOST_PP_ITERATION_1 10\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 11 && BOOST_PP_ITERATION_FINISH_1 >= 11\n#        define BOOST_PP_ITERATION_1 11\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 12 && BOOST_PP_ITERATION_FINISH_1 >= 12\n#        define BOOST_PP_ITERATION_1 12\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 13 && BOOST_PP_ITERATION_FINISH_1 >= 13\n#        define BOOST_PP_ITERATION_1 13\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 14 && BOOST_PP_ITERATION_FINISH_1 >= 14\n#        define BOOST_PP_ITERATION_1 14\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 15 && BOOST_PP_ITERATION_FINISH_1 >= 15\n#        define BOOST_PP_ITERATION_1 15\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 16 && BOOST_PP_ITERATION_FINISH_1 >= 16\n#        define BOOST_PP_ITERATION_1 16\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 17 && BOOST_PP_ITERATION_FINISH_1 >= 17\n#        define BOOST_PP_ITERATION_1 17\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 18 && BOOST_PP_ITERATION_FINISH_1 >= 18\n#        define BOOST_PP_ITERATION_1 18\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 19 && BOOST_PP_ITERATION_FINISH_1 >= 19\n#        define BOOST_PP_ITERATION_1 19\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 20 && BOOST_PP_ITERATION_FINISH_1 >= 20\n#        define BOOST_PP_ITERATION_1 20\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 21 && BOOST_PP_ITERATION_FINISH_1 >= 21\n#        define BOOST_PP_ITERATION_1 21\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 22 && BOOST_PP_ITERATION_FINISH_1 >= 22\n#        define BOOST_PP_ITERATION_1 22\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 23 && BOOST_PP_ITERATION_FINISH_1 >= 23\n#        define BOOST_PP_ITERATION_1 23\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 24 && BOOST_PP_ITERATION_FINISH_1 >= 24\n#        define BOOST_PP_ITERATION_1 24\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 25 && BOOST_PP_ITERATION_FINISH_1 >= 25\n#        define BOOST_PP_ITERATION_1 25\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 26 && BOOST_PP_ITERATION_FINISH_1 >= 26\n#        define BOOST_PP_ITERATION_1 26\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 27 && BOOST_PP_ITERATION_FINISH_1 >= 27\n#        define BOOST_PP_ITERATION_1 27\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 28 && BOOST_PP_ITERATION_FINISH_1 >= 28\n#        define BOOST_PP_ITERATION_1 28\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 29 && BOOST_PP_ITERATION_FINISH_1 >= 29\n#        define BOOST_PP_ITERATION_1 29\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 30 && BOOST_PP_ITERATION_FINISH_1 >= 30\n#        define BOOST_PP_ITERATION_1 30\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 31 && BOOST_PP_ITERATION_FINISH_1 >= 31\n#        define BOOST_PP_ITERATION_1 31\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 32 && BOOST_PP_ITERATION_FINISH_1 >= 32\n#        define BOOST_PP_ITERATION_1 32\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 33 && BOOST_PP_ITERATION_FINISH_1 >= 33\n#        define BOOST_PP_ITERATION_1 33\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 34 && BOOST_PP_ITERATION_FINISH_1 >= 34\n#        define BOOST_PP_ITERATION_1 34\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 35 && BOOST_PP_ITERATION_FINISH_1 >= 35\n#        define BOOST_PP_ITERATION_1 35\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 36 && BOOST_PP_ITERATION_FINISH_1 >= 36\n#        define BOOST_PP_ITERATION_1 36\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 37 && BOOST_PP_ITERATION_FINISH_1 >= 37\n#        define BOOST_PP_ITERATION_1 37\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 38 && BOOST_PP_ITERATION_FINISH_1 >= 38\n#        define BOOST_PP_ITERATION_1 38\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 39 && BOOST_PP_ITERATION_FINISH_1 >= 39\n#        define BOOST_PP_ITERATION_1 39\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 40 && BOOST_PP_ITERATION_FINISH_1 >= 40\n#        define BOOST_PP_ITERATION_1 40\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 41 && BOOST_PP_ITERATION_FINISH_1 >= 41\n#        define BOOST_PP_ITERATION_1 41\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 42 && BOOST_PP_ITERATION_FINISH_1 >= 42\n#        define BOOST_PP_ITERATION_1 42\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 43 && BOOST_PP_ITERATION_FINISH_1 >= 43\n#        define BOOST_PP_ITERATION_1 43\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 44 && BOOST_PP_ITERATION_FINISH_1 >= 44\n#        define BOOST_PP_ITERATION_1 44\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 45 && BOOST_PP_ITERATION_FINISH_1 >= 45\n#        define BOOST_PP_ITERATION_1 45\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 46 && BOOST_PP_ITERATION_FINISH_1 >= 46\n#        define BOOST_PP_ITERATION_1 46\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 47 && BOOST_PP_ITERATION_FINISH_1 >= 47\n#        define BOOST_PP_ITERATION_1 47\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 48 && BOOST_PP_ITERATION_FINISH_1 >= 48\n#        define BOOST_PP_ITERATION_1 48\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 49 && BOOST_PP_ITERATION_FINISH_1 >= 49\n#        define BOOST_PP_ITERATION_1 49\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 50 && BOOST_PP_ITERATION_FINISH_1 >= 50\n#        define BOOST_PP_ITERATION_1 50\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 51 && BOOST_PP_ITERATION_FINISH_1 >= 51\n#        define BOOST_PP_ITERATION_1 51\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 52 && BOOST_PP_ITERATION_FINISH_1 >= 52\n#        define BOOST_PP_ITERATION_1 52\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 53 && BOOST_PP_ITERATION_FINISH_1 >= 53\n#        define BOOST_PP_ITERATION_1 53\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 54 && BOOST_PP_ITERATION_FINISH_1 >= 54\n#        define BOOST_PP_ITERATION_1 54\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 55 && BOOST_PP_ITERATION_FINISH_1 >= 55\n#        define BOOST_PP_ITERATION_1 55\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 56 && BOOST_PP_ITERATION_FINISH_1 >= 56\n#        define BOOST_PP_ITERATION_1 56\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 57 && BOOST_PP_ITERATION_FINISH_1 >= 57\n#        define BOOST_PP_ITERATION_1 57\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 58 && BOOST_PP_ITERATION_FINISH_1 >= 58\n#        define BOOST_PP_ITERATION_1 58\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 59 && BOOST_PP_ITERATION_FINISH_1 >= 59\n#        define BOOST_PP_ITERATION_1 59\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 60 && BOOST_PP_ITERATION_FINISH_1 >= 60\n#        define BOOST_PP_ITERATION_1 60\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 61 && BOOST_PP_ITERATION_FINISH_1 >= 61\n#        define BOOST_PP_ITERATION_1 61\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 62 && BOOST_PP_ITERATION_FINISH_1 >= 62\n#        define BOOST_PP_ITERATION_1 62\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 63 && BOOST_PP_ITERATION_FINISH_1 >= 63\n#        define BOOST_PP_ITERATION_1 63\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 64 && BOOST_PP_ITERATION_FINISH_1 >= 64\n#        define BOOST_PP_ITERATION_1 64\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 65 && BOOST_PP_ITERATION_FINISH_1 >= 65\n#        define BOOST_PP_ITERATION_1 65\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 66 && BOOST_PP_ITERATION_FINISH_1 >= 66\n#        define BOOST_PP_ITERATION_1 66\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 67 && BOOST_PP_ITERATION_FINISH_1 >= 67\n#        define BOOST_PP_ITERATION_1 67\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 68 && BOOST_PP_ITERATION_FINISH_1 >= 68\n#        define BOOST_PP_ITERATION_1 68\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 69 && BOOST_PP_ITERATION_FINISH_1 >= 69\n#        define BOOST_PP_ITERATION_1 69\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 70 && BOOST_PP_ITERATION_FINISH_1 >= 70\n#        define BOOST_PP_ITERATION_1 70\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 71 && BOOST_PP_ITERATION_FINISH_1 >= 71\n#        define BOOST_PP_ITERATION_1 71\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 72 && BOOST_PP_ITERATION_FINISH_1 >= 72\n#        define BOOST_PP_ITERATION_1 72\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 73 && BOOST_PP_ITERATION_FINISH_1 >= 73\n#        define BOOST_PP_ITERATION_1 73\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 74 && BOOST_PP_ITERATION_FINISH_1 >= 74\n#        define BOOST_PP_ITERATION_1 74\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 75 && BOOST_PP_ITERATION_FINISH_1 >= 75\n#        define BOOST_PP_ITERATION_1 75\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 76 && BOOST_PP_ITERATION_FINISH_1 >= 76\n#        define BOOST_PP_ITERATION_1 76\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 77 && BOOST_PP_ITERATION_FINISH_1 >= 77\n#        define BOOST_PP_ITERATION_1 77\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 78 && BOOST_PP_ITERATION_FINISH_1 >= 78\n#        define BOOST_PP_ITERATION_1 78\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 79 && BOOST_PP_ITERATION_FINISH_1 >= 79\n#        define BOOST_PP_ITERATION_1 79\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 80 && BOOST_PP_ITERATION_FINISH_1 >= 80\n#        define BOOST_PP_ITERATION_1 80\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 81 && BOOST_PP_ITERATION_FINISH_1 >= 81\n#        define BOOST_PP_ITERATION_1 81\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 82 && BOOST_PP_ITERATION_FINISH_1 >= 82\n#        define BOOST_PP_ITERATION_1 82\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 83 && BOOST_PP_ITERATION_FINISH_1 >= 83\n#        define BOOST_PP_ITERATION_1 83\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 84 && BOOST_PP_ITERATION_FINISH_1 >= 84\n#        define BOOST_PP_ITERATION_1 84\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 85 && BOOST_PP_ITERATION_FINISH_1 >= 85\n#        define BOOST_PP_ITERATION_1 85\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 86 && BOOST_PP_ITERATION_FINISH_1 >= 86\n#        define BOOST_PP_ITERATION_1 86\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 87 && BOOST_PP_ITERATION_FINISH_1 >= 87\n#        define BOOST_PP_ITERATION_1 87\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 88 && BOOST_PP_ITERATION_FINISH_1 >= 88\n#        define BOOST_PP_ITERATION_1 88\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 89 && BOOST_PP_ITERATION_FINISH_1 >= 89\n#        define BOOST_PP_ITERATION_1 89\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 90 && BOOST_PP_ITERATION_FINISH_1 >= 90\n#        define BOOST_PP_ITERATION_1 90\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 91 && BOOST_PP_ITERATION_FINISH_1 >= 91\n#        define BOOST_PP_ITERATION_1 91\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 92 && BOOST_PP_ITERATION_FINISH_1 >= 92\n#        define BOOST_PP_ITERATION_1 92\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 93 && BOOST_PP_ITERATION_FINISH_1 >= 93\n#        define BOOST_PP_ITERATION_1 93\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 94 && BOOST_PP_ITERATION_FINISH_1 >= 94\n#        define BOOST_PP_ITERATION_1 94\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 95 && BOOST_PP_ITERATION_FINISH_1 >= 95\n#        define BOOST_PP_ITERATION_1 95\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 96 && BOOST_PP_ITERATION_FINISH_1 >= 96\n#        define BOOST_PP_ITERATION_1 96\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 97 && BOOST_PP_ITERATION_FINISH_1 >= 97\n#        define BOOST_PP_ITERATION_1 97\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 98 && BOOST_PP_ITERATION_FINISH_1 >= 98\n#        define BOOST_PP_ITERATION_1 98\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 99 && BOOST_PP_ITERATION_FINISH_1 >= 99\n#        define BOOST_PP_ITERATION_1 99\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 100 && BOOST_PP_ITERATION_FINISH_1 >= 100\n#        define BOOST_PP_ITERATION_1 100\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 101 && BOOST_PP_ITERATION_FINISH_1 >= 101\n#        define BOOST_PP_ITERATION_1 101\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 102 && BOOST_PP_ITERATION_FINISH_1 >= 102\n#        define BOOST_PP_ITERATION_1 102\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 103 && BOOST_PP_ITERATION_FINISH_1 >= 103\n#        define BOOST_PP_ITERATION_1 103\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 104 && BOOST_PP_ITERATION_FINISH_1 >= 104\n#        define BOOST_PP_ITERATION_1 104\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 105 && BOOST_PP_ITERATION_FINISH_1 >= 105\n#        define BOOST_PP_ITERATION_1 105\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 106 && BOOST_PP_ITERATION_FINISH_1 >= 106\n#        define BOOST_PP_ITERATION_1 106\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 107 && BOOST_PP_ITERATION_FINISH_1 >= 107\n#        define BOOST_PP_ITERATION_1 107\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 108 && BOOST_PP_ITERATION_FINISH_1 >= 108\n#        define BOOST_PP_ITERATION_1 108\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 109 && BOOST_PP_ITERATION_FINISH_1 >= 109\n#        define BOOST_PP_ITERATION_1 109\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 110 && BOOST_PP_ITERATION_FINISH_1 >= 110\n#        define BOOST_PP_ITERATION_1 110\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 111 && BOOST_PP_ITERATION_FINISH_1 >= 111\n#        define BOOST_PP_ITERATION_1 111\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 112 && BOOST_PP_ITERATION_FINISH_1 >= 112\n#        define BOOST_PP_ITERATION_1 112\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 113 && BOOST_PP_ITERATION_FINISH_1 >= 113\n#        define BOOST_PP_ITERATION_1 113\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 114 && BOOST_PP_ITERATION_FINISH_1 >= 114\n#        define BOOST_PP_ITERATION_1 114\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 115 && BOOST_PP_ITERATION_FINISH_1 >= 115\n#        define BOOST_PP_ITERATION_1 115\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 116 && BOOST_PP_ITERATION_FINISH_1 >= 116\n#        define BOOST_PP_ITERATION_1 116\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 117 && BOOST_PP_ITERATION_FINISH_1 >= 117\n#        define BOOST_PP_ITERATION_1 117\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 118 && BOOST_PP_ITERATION_FINISH_1 >= 118\n#        define BOOST_PP_ITERATION_1 118\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 119 && BOOST_PP_ITERATION_FINISH_1 >= 119\n#        define BOOST_PP_ITERATION_1 119\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 120 && BOOST_PP_ITERATION_FINISH_1 >= 120\n#        define BOOST_PP_ITERATION_1 120\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 121 && BOOST_PP_ITERATION_FINISH_1 >= 121\n#        define BOOST_PP_ITERATION_1 121\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 122 && BOOST_PP_ITERATION_FINISH_1 >= 122\n#        define BOOST_PP_ITERATION_1 122\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 123 && BOOST_PP_ITERATION_FINISH_1 >= 123\n#        define BOOST_PP_ITERATION_1 123\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 124 && BOOST_PP_ITERATION_FINISH_1 >= 124\n#        define BOOST_PP_ITERATION_1 124\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 125 && BOOST_PP_ITERATION_FINISH_1 >= 125\n#        define BOOST_PP_ITERATION_1 125\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 126 && BOOST_PP_ITERATION_FINISH_1 >= 126\n#        define BOOST_PP_ITERATION_1 126\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 127 && BOOST_PP_ITERATION_FINISH_1 >= 127\n#        define BOOST_PP_ITERATION_1 127\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 128 && BOOST_PP_ITERATION_FINISH_1 >= 128\n#        define BOOST_PP_ITERATION_1 128\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 129 && BOOST_PP_ITERATION_FINISH_1 >= 129\n#        define BOOST_PP_ITERATION_1 129\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 130 && BOOST_PP_ITERATION_FINISH_1 >= 130\n#        define BOOST_PP_ITERATION_1 130\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 131 && BOOST_PP_ITERATION_FINISH_1 >= 131\n#        define BOOST_PP_ITERATION_1 131\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 132 && BOOST_PP_ITERATION_FINISH_1 >= 132\n#        define BOOST_PP_ITERATION_1 132\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 133 && BOOST_PP_ITERATION_FINISH_1 >= 133\n#        define BOOST_PP_ITERATION_1 133\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 134 && BOOST_PP_ITERATION_FINISH_1 >= 134\n#        define BOOST_PP_ITERATION_1 134\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 135 && BOOST_PP_ITERATION_FINISH_1 >= 135\n#        define BOOST_PP_ITERATION_1 135\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 136 && BOOST_PP_ITERATION_FINISH_1 >= 136\n#        define BOOST_PP_ITERATION_1 136\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 137 && BOOST_PP_ITERATION_FINISH_1 >= 137\n#        define BOOST_PP_ITERATION_1 137\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 138 && BOOST_PP_ITERATION_FINISH_1 >= 138\n#        define BOOST_PP_ITERATION_1 138\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 139 && BOOST_PP_ITERATION_FINISH_1 >= 139\n#        define BOOST_PP_ITERATION_1 139\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 140 && BOOST_PP_ITERATION_FINISH_1 >= 140\n#        define BOOST_PP_ITERATION_1 140\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 141 && BOOST_PP_ITERATION_FINISH_1 >= 141\n#        define BOOST_PP_ITERATION_1 141\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 142 && BOOST_PP_ITERATION_FINISH_1 >= 142\n#        define BOOST_PP_ITERATION_1 142\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 143 && BOOST_PP_ITERATION_FINISH_1 >= 143\n#        define BOOST_PP_ITERATION_1 143\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 144 && BOOST_PP_ITERATION_FINISH_1 >= 144\n#        define BOOST_PP_ITERATION_1 144\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 145 && BOOST_PP_ITERATION_FINISH_1 >= 145\n#        define BOOST_PP_ITERATION_1 145\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 146 && BOOST_PP_ITERATION_FINISH_1 >= 146\n#        define BOOST_PP_ITERATION_1 146\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 147 && BOOST_PP_ITERATION_FINISH_1 >= 147\n#        define BOOST_PP_ITERATION_1 147\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 148 && BOOST_PP_ITERATION_FINISH_1 >= 148\n#        define BOOST_PP_ITERATION_1 148\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 149 && BOOST_PP_ITERATION_FINISH_1 >= 149\n#        define BOOST_PP_ITERATION_1 149\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 150 && BOOST_PP_ITERATION_FINISH_1 >= 150\n#        define BOOST_PP_ITERATION_1 150\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 151 && BOOST_PP_ITERATION_FINISH_1 >= 151\n#        define BOOST_PP_ITERATION_1 151\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 152 && BOOST_PP_ITERATION_FINISH_1 >= 152\n#        define BOOST_PP_ITERATION_1 152\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 153 && BOOST_PP_ITERATION_FINISH_1 >= 153\n#        define BOOST_PP_ITERATION_1 153\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 154 && BOOST_PP_ITERATION_FINISH_1 >= 154\n#        define BOOST_PP_ITERATION_1 154\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 155 && BOOST_PP_ITERATION_FINISH_1 >= 155\n#        define BOOST_PP_ITERATION_1 155\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 156 && BOOST_PP_ITERATION_FINISH_1 >= 156\n#        define BOOST_PP_ITERATION_1 156\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 157 && BOOST_PP_ITERATION_FINISH_1 >= 157\n#        define BOOST_PP_ITERATION_1 157\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 158 && BOOST_PP_ITERATION_FINISH_1 >= 158\n#        define BOOST_PP_ITERATION_1 158\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 159 && BOOST_PP_ITERATION_FINISH_1 >= 159\n#        define BOOST_PP_ITERATION_1 159\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 160 && BOOST_PP_ITERATION_FINISH_1 >= 160\n#        define BOOST_PP_ITERATION_1 160\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 161 && BOOST_PP_ITERATION_FINISH_1 >= 161\n#        define BOOST_PP_ITERATION_1 161\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 162 && BOOST_PP_ITERATION_FINISH_1 >= 162\n#        define BOOST_PP_ITERATION_1 162\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 163 && BOOST_PP_ITERATION_FINISH_1 >= 163\n#        define BOOST_PP_ITERATION_1 163\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 164 && BOOST_PP_ITERATION_FINISH_1 >= 164\n#        define BOOST_PP_ITERATION_1 164\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 165 && BOOST_PP_ITERATION_FINISH_1 >= 165\n#        define BOOST_PP_ITERATION_1 165\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 166 && BOOST_PP_ITERATION_FINISH_1 >= 166\n#        define BOOST_PP_ITERATION_1 166\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 167 && BOOST_PP_ITERATION_FINISH_1 >= 167\n#        define BOOST_PP_ITERATION_1 167\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 168 && BOOST_PP_ITERATION_FINISH_1 >= 168\n#        define BOOST_PP_ITERATION_1 168\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 169 && BOOST_PP_ITERATION_FINISH_1 >= 169\n#        define BOOST_PP_ITERATION_1 169\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 170 && BOOST_PP_ITERATION_FINISH_1 >= 170\n#        define BOOST_PP_ITERATION_1 170\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 171 && BOOST_PP_ITERATION_FINISH_1 >= 171\n#        define BOOST_PP_ITERATION_1 171\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 172 && BOOST_PP_ITERATION_FINISH_1 >= 172\n#        define BOOST_PP_ITERATION_1 172\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 173 && BOOST_PP_ITERATION_FINISH_1 >= 173\n#        define BOOST_PP_ITERATION_1 173\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 174 && BOOST_PP_ITERATION_FINISH_1 >= 174\n#        define BOOST_PP_ITERATION_1 174\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 175 && BOOST_PP_ITERATION_FINISH_1 >= 175\n#        define BOOST_PP_ITERATION_1 175\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 176 && BOOST_PP_ITERATION_FINISH_1 >= 176\n#        define BOOST_PP_ITERATION_1 176\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 177 && BOOST_PP_ITERATION_FINISH_1 >= 177\n#        define BOOST_PP_ITERATION_1 177\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 178 && BOOST_PP_ITERATION_FINISH_1 >= 178\n#        define BOOST_PP_ITERATION_1 178\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 179 && BOOST_PP_ITERATION_FINISH_1 >= 179\n#        define BOOST_PP_ITERATION_1 179\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 180 && BOOST_PP_ITERATION_FINISH_1 >= 180\n#        define BOOST_PP_ITERATION_1 180\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 181 && BOOST_PP_ITERATION_FINISH_1 >= 181\n#        define BOOST_PP_ITERATION_1 181\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 182 && BOOST_PP_ITERATION_FINISH_1 >= 182\n#        define BOOST_PP_ITERATION_1 182\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 183 && BOOST_PP_ITERATION_FINISH_1 >= 183\n#        define BOOST_PP_ITERATION_1 183\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 184 && BOOST_PP_ITERATION_FINISH_1 >= 184\n#        define BOOST_PP_ITERATION_1 184\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 185 && BOOST_PP_ITERATION_FINISH_1 >= 185\n#        define BOOST_PP_ITERATION_1 185\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 186 && BOOST_PP_ITERATION_FINISH_1 >= 186\n#        define BOOST_PP_ITERATION_1 186\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 187 && BOOST_PP_ITERATION_FINISH_1 >= 187\n#        define BOOST_PP_ITERATION_1 187\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 188 && BOOST_PP_ITERATION_FINISH_1 >= 188\n#        define BOOST_PP_ITERATION_1 188\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 189 && BOOST_PP_ITERATION_FINISH_1 >= 189\n#        define BOOST_PP_ITERATION_1 189\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 190 && BOOST_PP_ITERATION_FINISH_1 >= 190\n#        define BOOST_PP_ITERATION_1 190\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 191 && BOOST_PP_ITERATION_FINISH_1 >= 191\n#        define BOOST_PP_ITERATION_1 191\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 192 && BOOST_PP_ITERATION_FINISH_1 >= 192\n#        define BOOST_PP_ITERATION_1 192\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 193 && BOOST_PP_ITERATION_FINISH_1 >= 193\n#        define BOOST_PP_ITERATION_1 193\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 194 && BOOST_PP_ITERATION_FINISH_1 >= 194\n#        define BOOST_PP_ITERATION_1 194\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 195 && BOOST_PP_ITERATION_FINISH_1 >= 195\n#        define BOOST_PP_ITERATION_1 195\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 196 && BOOST_PP_ITERATION_FINISH_1 >= 196\n#        define BOOST_PP_ITERATION_1 196\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 197 && BOOST_PP_ITERATION_FINISH_1 >= 197\n#        define BOOST_PP_ITERATION_1 197\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 198 && BOOST_PP_ITERATION_FINISH_1 >= 198\n#        define BOOST_PP_ITERATION_1 198\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 199 && BOOST_PP_ITERATION_FINISH_1 >= 199\n#        define BOOST_PP_ITERATION_1 199\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 200 && BOOST_PP_ITERATION_FINISH_1 >= 200\n#        define BOOST_PP_ITERATION_1 200\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 201 && BOOST_PP_ITERATION_FINISH_1 >= 201\n#        define BOOST_PP_ITERATION_1 201\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 202 && BOOST_PP_ITERATION_FINISH_1 >= 202\n#        define BOOST_PP_ITERATION_1 202\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 203 && BOOST_PP_ITERATION_FINISH_1 >= 203\n#        define BOOST_PP_ITERATION_1 203\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 204 && BOOST_PP_ITERATION_FINISH_1 >= 204\n#        define BOOST_PP_ITERATION_1 204\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 205 && BOOST_PP_ITERATION_FINISH_1 >= 205\n#        define BOOST_PP_ITERATION_1 205\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 206 && BOOST_PP_ITERATION_FINISH_1 >= 206\n#        define BOOST_PP_ITERATION_1 206\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 207 && BOOST_PP_ITERATION_FINISH_1 >= 207\n#        define BOOST_PP_ITERATION_1 207\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 208 && BOOST_PP_ITERATION_FINISH_1 >= 208\n#        define BOOST_PP_ITERATION_1 208\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 209 && BOOST_PP_ITERATION_FINISH_1 >= 209\n#        define BOOST_PP_ITERATION_1 209\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 210 && BOOST_PP_ITERATION_FINISH_1 >= 210\n#        define BOOST_PP_ITERATION_1 210\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 211 && BOOST_PP_ITERATION_FINISH_1 >= 211\n#        define BOOST_PP_ITERATION_1 211\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 212 && BOOST_PP_ITERATION_FINISH_1 >= 212\n#        define BOOST_PP_ITERATION_1 212\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 213 && BOOST_PP_ITERATION_FINISH_1 >= 213\n#        define BOOST_PP_ITERATION_1 213\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 214 && BOOST_PP_ITERATION_FINISH_1 >= 214\n#        define BOOST_PP_ITERATION_1 214\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 215 && BOOST_PP_ITERATION_FINISH_1 >= 215\n#        define BOOST_PP_ITERATION_1 215\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 216 && BOOST_PP_ITERATION_FINISH_1 >= 216\n#        define BOOST_PP_ITERATION_1 216\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 217 && BOOST_PP_ITERATION_FINISH_1 >= 217\n#        define BOOST_PP_ITERATION_1 217\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 218 && BOOST_PP_ITERATION_FINISH_1 >= 218\n#        define BOOST_PP_ITERATION_1 218\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 219 && BOOST_PP_ITERATION_FINISH_1 >= 219\n#        define BOOST_PP_ITERATION_1 219\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 220 && BOOST_PP_ITERATION_FINISH_1 >= 220\n#        define BOOST_PP_ITERATION_1 220\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 221 && BOOST_PP_ITERATION_FINISH_1 >= 221\n#        define BOOST_PP_ITERATION_1 221\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 222 && BOOST_PP_ITERATION_FINISH_1 >= 222\n#        define BOOST_PP_ITERATION_1 222\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 223 && BOOST_PP_ITERATION_FINISH_1 >= 223\n#        define BOOST_PP_ITERATION_1 223\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 224 && BOOST_PP_ITERATION_FINISH_1 >= 224\n#        define BOOST_PP_ITERATION_1 224\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 225 && BOOST_PP_ITERATION_FINISH_1 >= 225\n#        define BOOST_PP_ITERATION_1 225\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 226 && BOOST_PP_ITERATION_FINISH_1 >= 226\n#        define BOOST_PP_ITERATION_1 226\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 227 && BOOST_PP_ITERATION_FINISH_1 >= 227\n#        define BOOST_PP_ITERATION_1 227\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 228 && BOOST_PP_ITERATION_FINISH_1 >= 228\n#        define BOOST_PP_ITERATION_1 228\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 229 && BOOST_PP_ITERATION_FINISH_1 >= 229\n#        define BOOST_PP_ITERATION_1 229\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 230 && BOOST_PP_ITERATION_FINISH_1 >= 230\n#        define BOOST_PP_ITERATION_1 230\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 231 && BOOST_PP_ITERATION_FINISH_1 >= 231\n#        define BOOST_PP_ITERATION_1 231\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 232 && BOOST_PP_ITERATION_FINISH_1 >= 232\n#        define BOOST_PP_ITERATION_1 232\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 233 && BOOST_PP_ITERATION_FINISH_1 >= 233\n#        define BOOST_PP_ITERATION_1 233\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 234 && BOOST_PP_ITERATION_FINISH_1 >= 234\n#        define BOOST_PP_ITERATION_1 234\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 235 && BOOST_PP_ITERATION_FINISH_1 >= 235\n#        define BOOST_PP_ITERATION_1 235\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 236 && BOOST_PP_ITERATION_FINISH_1 >= 236\n#        define BOOST_PP_ITERATION_1 236\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 237 && BOOST_PP_ITERATION_FINISH_1 >= 237\n#        define BOOST_PP_ITERATION_1 237\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 238 && BOOST_PP_ITERATION_FINISH_1 >= 238\n#        define BOOST_PP_ITERATION_1 238\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 239 && BOOST_PP_ITERATION_FINISH_1 >= 239\n#        define BOOST_PP_ITERATION_1 239\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 240 && BOOST_PP_ITERATION_FINISH_1 >= 240\n#        define BOOST_PP_ITERATION_1 240\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 241 && BOOST_PP_ITERATION_FINISH_1 >= 241\n#        define BOOST_PP_ITERATION_1 241\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 242 && BOOST_PP_ITERATION_FINISH_1 >= 242\n#        define BOOST_PP_ITERATION_1 242\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 243 && BOOST_PP_ITERATION_FINISH_1 >= 243\n#        define BOOST_PP_ITERATION_1 243\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 244 && BOOST_PP_ITERATION_FINISH_1 >= 244\n#        define BOOST_PP_ITERATION_1 244\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 245 && BOOST_PP_ITERATION_FINISH_1 >= 245\n#        define BOOST_PP_ITERATION_1 245\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 246 && BOOST_PP_ITERATION_FINISH_1 >= 246\n#        define BOOST_PP_ITERATION_1 246\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 247 && BOOST_PP_ITERATION_FINISH_1 >= 247\n#        define BOOST_PP_ITERATION_1 247\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 248 && BOOST_PP_ITERATION_FINISH_1 >= 248\n#        define BOOST_PP_ITERATION_1 248\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 249 && BOOST_PP_ITERATION_FINISH_1 >= 249\n#        define BOOST_PP_ITERATION_1 249\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 250 && BOOST_PP_ITERATION_FINISH_1 >= 250\n#        define BOOST_PP_ITERATION_1 250\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 251 && BOOST_PP_ITERATION_FINISH_1 >= 251\n#        define BOOST_PP_ITERATION_1 251\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 252 && BOOST_PP_ITERATION_FINISH_1 >= 252\n#        define BOOST_PP_ITERATION_1 252\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 253 && BOOST_PP_ITERATION_FINISH_1 >= 253\n#        define BOOST_PP_ITERATION_1 253\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 254 && BOOST_PP_ITERATION_FINISH_1 >= 254\n#        define BOOST_PP_ITERATION_1 254\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 255 && BOOST_PP_ITERATION_FINISH_1 >= 255\n#        define BOOST_PP_ITERATION_1 255\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n#    if BOOST_PP_ITERATION_START_1 <= 256 && BOOST_PP_ITERATION_FINISH_1 >= 256\n#        define BOOST_PP_ITERATION_1 256\n#        include BOOST_PP_FILENAME_1\n#        undef BOOST_PP_ITERATION_1\n#    endif\n# endif\n#\n# undef BOOST_PP_IS_ITERATING\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 0\n#\n# undef BOOST_PP_ITERATION_START_1\n# undef BOOST_PP_ITERATION_FINISH_1\n# undef BOOST_PP_FILENAME_1\n#\n# undef BOOST_PP_ITERATION_FLAGS_1\n# undef BOOST_PP_ITERATION_PARAMS_1\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/forward2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_2)\n#        error BOOST_PP_ERROR:  depth #2 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower2.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper2.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_2() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_2)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_2)\n#    include <boost/preprocessor/iteration/detail/bounds/lower2.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_2)\n#    include <boost/preprocessor/iteration/detail/bounds/upper2.hpp>\n#    define BOOST_PP_FILENAME_2 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_2)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_2) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_2() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_2)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_2() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #2 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 2\n#\n# if (BOOST_PP_ITERATION_START_2) > (BOOST_PP_ITERATION_FINISH_2)\n#    include <boost/preprocessor/iteration/detail/iter/reverse2.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_2 <= 0 && BOOST_PP_ITERATION_FINISH_2 >= 0\n#        define BOOST_PP_ITERATION_2 0\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 1 && BOOST_PP_ITERATION_FINISH_2 >= 1\n#        define BOOST_PP_ITERATION_2 1\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 2 && BOOST_PP_ITERATION_FINISH_2 >= 2\n#        define BOOST_PP_ITERATION_2 2\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 3 && BOOST_PP_ITERATION_FINISH_2 >= 3\n#        define BOOST_PP_ITERATION_2 3\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 4 && BOOST_PP_ITERATION_FINISH_2 >= 4\n#        define BOOST_PP_ITERATION_2 4\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 5 && BOOST_PP_ITERATION_FINISH_2 >= 5\n#        define BOOST_PP_ITERATION_2 5\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 6 && BOOST_PP_ITERATION_FINISH_2 >= 6\n#        define BOOST_PP_ITERATION_2 6\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 7 && BOOST_PP_ITERATION_FINISH_2 >= 7\n#        define BOOST_PP_ITERATION_2 7\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 8 && BOOST_PP_ITERATION_FINISH_2 >= 8\n#        define BOOST_PP_ITERATION_2 8\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 9 && BOOST_PP_ITERATION_FINISH_2 >= 9\n#        define BOOST_PP_ITERATION_2 9\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 10 && BOOST_PP_ITERATION_FINISH_2 >= 10\n#        define BOOST_PP_ITERATION_2 10\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 11 && BOOST_PP_ITERATION_FINISH_2 >= 11\n#        define BOOST_PP_ITERATION_2 11\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 12 && BOOST_PP_ITERATION_FINISH_2 >= 12\n#        define BOOST_PP_ITERATION_2 12\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 13 && BOOST_PP_ITERATION_FINISH_2 >= 13\n#        define BOOST_PP_ITERATION_2 13\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 14 && BOOST_PP_ITERATION_FINISH_2 >= 14\n#        define BOOST_PP_ITERATION_2 14\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 15 && BOOST_PP_ITERATION_FINISH_2 >= 15\n#        define BOOST_PP_ITERATION_2 15\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 16 && BOOST_PP_ITERATION_FINISH_2 >= 16\n#        define BOOST_PP_ITERATION_2 16\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 17 && BOOST_PP_ITERATION_FINISH_2 >= 17\n#        define BOOST_PP_ITERATION_2 17\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 18 && BOOST_PP_ITERATION_FINISH_2 >= 18\n#        define BOOST_PP_ITERATION_2 18\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 19 && BOOST_PP_ITERATION_FINISH_2 >= 19\n#        define BOOST_PP_ITERATION_2 19\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 20 && BOOST_PP_ITERATION_FINISH_2 >= 20\n#        define BOOST_PP_ITERATION_2 20\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 21 && BOOST_PP_ITERATION_FINISH_2 >= 21\n#        define BOOST_PP_ITERATION_2 21\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 22 && BOOST_PP_ITERATION_FINISH_2 >= 22\n#        define BOOST_PP_ITERATION_2 22\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 23 && BOOST_PP_ITERATION_FINISH_2 >= 23\n#        define BOOST_PP_ITERATION_2 23\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 24 && BOOST_PP_ITERATION_FINISH_2 >= 24\n#        define BOOST_PP_ITERATION_2 24\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 25 && BOOST_PP_ITERATION_FINISH_2 >= 25\n#        define BOOST_PP_ITERATION_2 25\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 26 && BOOST_PP_ITERATION_FINISH_2 >= 26\n#        define BOOST_PP_ITERATION_2 26\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 27 && BOOST_PP_ITERATION_FINISH_2 >= 27\n#        define BOOST_PP_ITERATION_2 27\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 28 && BOOST_PP_ITERATION_FINISH_2 >= 28\n#        define BOOST_PP_ITERATION_2 28\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 29 && BOOST_PP_ITERATION_FINISH_2 >= 29\n#        define BOOST_PP_ITERATION_2 29\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 30 && BOOST_PP_ITERATION_FINISH_2 >= 30\n#        define BOOST_PP_ITERATION_2 30\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 31 && BOOST_PP_ITERATION_FINISH_2 >= 31\n#        define BOOST_PP_ITERATION_2 31\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 32 && BOOST_PP_ITERATION_FINISH_2 >= 32\n#        define BOOST_PP_ITERATION_2 32\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 33 && BOOST_PP_ITERATION_FINISH_2 >= 33\n#        define BOOST_PP_ITERATION_2 33\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 34 && BOOST_PP_ITERATION_FINISH_2 >= 34\n#        define BOOST_PP_ITERATION_2 34\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 35 && BOOST_PP_ITERATION_FINISH_2 >= 35\n#        define BOOST_PP_ITERATION_2 35\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 36 && BOOST_PP_ITERATION_FINISH_2 >= 36\n#        define BOOST_PP_ITERATION_2 36\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 37 && BOOST_PP_ITERATION_FINISH_2 >= 37\n#        define BOOST_PP_ITERATION_2 37\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 38 && BOOST_PP_ITERATION_FINISH_2 >= 38\n#        define BOOST_PP_ITERATION_2 38\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 39 && BOOST_PP_ITERATION_FINISH_2 >= 39\n#        define BOOST_PP_ITERATION_2 39\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 40 && BOOST_PP_ITERATION_FINISH_2 >= 40\n#        define BOOST_PP_ITERATION_2 40\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 41 && BOOST_PP_ITERATION_FINISH_2 >= 41\n#        define BOOST_PP_ITERATION_2 41\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 42 && BOOST_PP_ITERATION_FINISH_2 >= 42\n#        define BOOST_PP_ITERATION_2 42\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 43 && BOOST_PP_ITERATION_FINISH_2 >= 43\n#        define BOOST_PP_ITERATION_2 43\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 44 && BOOST_PP_ITERATION_FINISH_2 >= 44\n#        define BOOST_PP_ITERATION_2 44\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 45 && BOOST_PP_ITERATION_FINISH_2 >= 45\n#        define BOOST_PP_ITERATION_2 45\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 46 && BOOST_PP_ITERATION_FINISH_2 >= 46\n#        define BOOST_PP_ITERATION_2 46\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 47 && BOOST_PP_ITERATION_FINISH_2 >= 47\n#        define BOOST_PP_ITERATION_2 47\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 48 && BOOST_PP_ITERATION_FINISH_2 >= 48\n#        define BOOST_PP_ITERATION_2 48\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 49 && BOOST_PP_ITERATION_FINISH_2 >= 49\n#        define BOOST_PP_ITERATION_2 49\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 50 && BOOST_PP_ITERATION_FINISH_2 >= 50\n#        define BOOST_PP_ITERATION_2 50\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 51 && BOOST_PP_ITERATION_FINISH_2 >= 51\n#        define BOOST_PP_ITERATION_2 51\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 52 && BOOST_PP_ITERATION_FINISH_2 >= 52\n#        define BOOST_PP_ITERATION_2 52\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 53 && BOOST_PP_ITERATION_FINISH_2 >= 53\n#        define BOOST_PP_ITERATION_2 53\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 54 && BOOST_PP_ITERATION_FINISH_2 >= 54\n#        define BOOST_PP_ITERATION_2 54\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 55 && BOOST_PP_ITERATION_FINISH_2 >= 55\n#        define BOOST_PP_ITERATION_2 55\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 56 && BOOST_PP_ITERATION_FINISH_2 >= 56\n#        define BOOST_PP_ITERATION_2 56\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 57 && BOOST_PP_ITERATION_FINISH_2 >= 57\n#        define BOOST_PP_ITERATION_2 57\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 58 && BOOST_PP_ITERATION_FINISH_2 >= 58\n#        define BOOST_PP_ITERATION_2 58\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 59 && BOOST_PP_ITERATION_FINISH_2 >= 59\n#        define BOOST_PP_ITERATION_2 59\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 60 && BOOST_PP_ITERATION_FINISH_2 >= 60\n#        define BOOST_PP_ITERATION_2 60\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 61 && BOOST_PP_ITERATION_FINISH_2 >= 61\n#        define BOOST_PP_ITERATION_2 61\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 62 && BOOST_PP_ITERATION_FINISH_2 >= 62\n#        define BOOST_PP_ITERATION_2 62\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 63 && BOOST_PP_ITERATION_FINISH_2 >= 63\n#        define BOOST_PP_ITERATION_2 63\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 64 && BOOST_PP_ITERATION_FINISH_2 >= 64\n#        define BOOST_PP_ITERATION_2 64\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 65 && BOOST_PP_ITERATION_FINISH_2 >= 65\n#        define BOOST_PP_ITERATION_2 65\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 66 && BOOST_PP_ITERATION_FINISH_2 >= 66\n#        define BOOST_PP_ITERATION_2 66\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 67 && BOOST_PP_ITERATION_FINISH_2 >= 67\n#        define BOOST_PP_ITERATION_2 67\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 68 && BOOST_PP_ITERATION_FINISH_2 >= 68\n#        define BOOST_PP_ITERATION_2 68\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 69 && BOOST_PP_ITERATION_FINISH_2 >= 69\n#        define BOOST_PP_ITERATION_2 69\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 70 && BOOST_PP_ITERATION_FINISH_2 >= 70\n#        define BOOST_PP_ITERATION_2 70\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 71 && BOOST_PP_ITERATION_FINISH_2 >= 71\n#        define BOOST_PP_ITERATION_2 71\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 72 && BOOST_PP_ITERATION_FINISH_2 >= 72\n#        define BOOST_PP_ITERATION_2 72\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 73 && BOOST_PP_ITERATION_FINISH_2 >= 73\n#        define BOOST_PP_ITERATION_2 73\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 74 && BOOST_PP_ITERATION_FINISH_2 >= 74\n#        define BOOST_PP_ITERATION_2 74\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 75 && BOOST_PP_ITERATION_FINISH_2 >= 75\n#        define BOOST_PP_ITERATION_2 75\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 76 && BOOST_PP_ITERATION_FINISH_2 >= 76\n#        define BOOST_PP_ITERATION_2 76\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 77 && BOOST_PP_ITERATION_FINISH_2 >= 77\n#        define BOOST_PP_ITERATION_2 77\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 78 && BOOST_PP_ITERATION_FINISH_2 >= 78\n#        define BOOST_PP_ITERATION_2 78\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 79 && BOOST_PP_ITERATION_FINISH_2 >= 79\n#        define BOOST_PP_ITERATION_2 79\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 80 && BOOST_PP_ITERATION_FINISH_2 >= 80\n#        define BOOST_PP_ITERATION_2 80\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 81 && BOOST_PP_ITERATION_FINISH_2 >= 81\n#        define BOOST_PP_ITERATION_2 81\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 82 && BOOST_PP_ITERATION_FINISH_2 >= 82\n#        define BOOST_PP_ITERATION_2 82\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 83 && BOOST_PP_ITERATION_FINISH_2 >= 83\n#        define BOOST_PP_ITERATION_2 83\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 84 && BOOST_PP_ITERATION_FINISH_2 >= 84\n#        define BOOST_PP_ITERATION_2 84\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 85 && BOOST_PP_ITERATION_FINISH_2 >= 85\n#        define BOOST_PP_ITERATION_2 85\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 86 && BOOST_PP_ITERATION_FINISH_2 >= 86\n#        define BOOST_PP_ITERATION_2 86\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 87 && BOOST_PP_ITERATION_FINISH_2 >= 87\n#        define BOOST_PP_ITERATION_2 87\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 88 && BOOST_PP_ITERATION_FINISH_2 >= 88\n#        define BOOST_PP_ITERATION_2 88\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 89 && BOOST_PP_ITERATION_FINISH_2 >= 89\n#        define BOOST_PP_ITERATION_2 89\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 90 && BOOST_PP_ITERATION_FINISH_2 >= 90\n#        define BOOST_PP_ITERATION_2 90\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 91 && BOOST_PP_ITERATION_FINISH_2 >= 91\n#        define BOOST_PP_ITERATION_2 91\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 92 && BOOST_PP_ITERATION_FINISH_2 >= 92\n#        define BOOST_PP_ITERATION_2 92\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 93 && BOOST_PP_ITERATION_FINISH_2 >= 93\n#        define BOOST_PP_ITERATION_2 93\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 94 && BOOST_PP_ITERATION_FINISH_2 >= 94\n#        define BOOST_PP_ITERATION_2 94\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 95 && BOOST_PP_ITERATION_FINISH_2 >= 95\n#        define BOOST_PP_ITERATION_2 95\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 96 && BOOST_PP_ITERATION_FINISH_2 >= 96\n#        define BOOST_PP_ITERATION_2 96\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 97 && BOOST_PP_ITERATION_FINISH_2 >= 97\n#        define BOOST_PP_ITERATION_2 97\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 98 && BOOST_PP_ITERATION_FINISH_2 >= 98\n#        define BOOST_PP_ITERATION_2 98\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 99 && BOOST_PP_ITERATION_FINISH_2 >= 99\n#        define BOOST_PP_ITERATION_2 99\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 100 && BOOST_PP_ITERATION_FINISH_2 >= 100\n#        define BOOST_PP_ITERATION_2 100\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 101 && BOOST_PP_ITERATION_FINISH_2 >= 101\n#        define BOOST_PP_ITERATION_2 101\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 102 && BOOST_PP_ITERATION_FINISH_2 >= 102\n#        define BOOST_PP_ITERATION_2 102\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 103 && BOOST_PP_ITERATION_FINISH_2 >= 103\n#        define BOOST_PP_ITERATION_2 103\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 104 && BOOST_PP_ITERATION_FINISH_2 >= 104\n#        define BOOST_PP_ITERATION_2 104\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 105 && BOOST_PP_ITERATION_FINISH_2 >= 105\n#        define BOOST_PP_ITERATION_2 105\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 106 && BOOST_PP_ITERATION_FINISH_2 >= 106\n#        define BOOST_PP_ITERATION_2 106\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 107 && BOOST_PP_ITERATION_FINISH_2 >= 107\n#        define BOOST_PP_ITERATION_2 107\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 108 && BOOST_PP_ITERATION_FINISH_2 >= 108\n#        define BOOST_PP_ITERATION_2 108\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 109 && BOOST_PP_ITERATION_FINISH_2 >= 109\n#        define BOOST_PP_ITERATION_2 109\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 110 && BOOST_PP_ITERATION_FINISH_2 >= 110\n#        define BOOST_PP_ITERATION_2 110\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 111 && BOOST_PP_ITERATION_FINISH_2 >= 111\n#        define BOOST_PP_ITERATION_2 111\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 112 && BOOST_PP_ITERATION_FINISH_2 >= 112\n#        define BOOST_PP_ITERATION_2 112\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 113 && BOOST_PP_ITERATION_FINISH_2 >= 113\n#        define BOOST_PP_ITERATION_2 113\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 114 && BOOST_PP_ITERATION_FINISH_2 >= 114\n#        define BOOST_PP_ITERATION_2 114\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 115 && BOOST_PP_ITERATION_FINISH_2 >= 115\n#        define BOOST_PP_ITERATION_2 115\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 116 && BOOST_PP_ITERATION_FINISH_2 >= 116\n#        define BOOST_PP_ITERATION_2 116\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 117 && BOOST_PP_ITERATION_FINISH_2 >= 117\n#        define BOOST_PP_ITERATION_2 117\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 118 && BOOST_PP_ITERATION_FINISH_2 >= 118\n#        define BOOST_PP_ITERATION_2 118\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 119 && BOOST_PP_ITERATION_FINISH_2 >= 119\n#        define BOOST_PP_ITERATION_2 119\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 120 && BOOST_PP_ITERATION_FINISH_2 >= 120\n#        define BOOST_PP_ITERATION_2 120\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 121 && BOOST_PP_ITERATION_FINISH_2 >= 121\n#        define BOOST_PP_ITERATION_2 121\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 122 && BOOST_PP_ITERATION_FINISH_2 >= 122\n#        define BOOST_PP_ITERATION_2 122\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 123 && BOOST_PP_ITERATION_FINISH_2 >= 123\n#        define BOOST_PP_ITERATION_2 123\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 124 && BOOST_PP_ITERATION_FINISH_2 >= 124\n#        define BOOST_PP_ITERATION_2 124\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 125 && BOOST_PP_ITERATION_FINISH_2 >= 125\n#        define BOOST_PP_ITERATION_2 125\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 126 && BOOST_PP_ITERATION_FINISH_2 >= 126\n#        define BOOST_PP_ITERATION_2 126\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 127 && BOOST_PP_ITERATION_FINISH_2 >= 127\n#        define BOOST_PP_ITERATION_2 127\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 128 && BOOST_PP_ITERATION_FINISH_2 >= 128\n#        define BOOST_PP_ITERATION_2 128\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 129 && BOOST_PP_ITERATION_FINISH_2 >= 129\n#        define BOOST_PP_ITERATION_2 129\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 130 && BOOST_PP_ITERATION_FINISH_2 >= 130\n#        define BOOST_PP_ITERATION_2 130\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 131 && BOOST_PP_ITERATION_FINISH_2 >= 131\n#        define BOOST_PP_ITERATION_2 131\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 132 && BOOST_PP_ITERATION_FINISH_2 >= 132\n#        define BOOST_PP_ITERATION_2 132\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 133 && BOOST_PP_ITERATION_FINISH_2 >= 133\n#        define BOOST_PP_ITERATION_2 133\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 134 && BOOST_PP_ITERATION_FINISH_2 >= 134\n#        define BOOST_PP_ITERATION_2 134\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 135 && BOOST_PP_ITERATION_FINISH_2 >= 135\n#        define BOOST_PP_ITERATION_2 135\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 136 && BOOST_PP_ITERATION_FINISH_2 >= 136\n#        define BOOST_PP_ITERATION_2 136\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 137 && BOOST_PP_ITERATION_FINISH_2 >= 137\n#        define BOOST_PP_ITERATION_2 137\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 138 && BOOST_PP_ITERATION_FINISH_2 >= 138\n#        define BOOST_PP_ITERATION_2 138\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 139 && BOOST_PP_ITERATION_FINISH_2 >= 139\n#        define BOOST_PP_ITERATION_2 139\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 140 && BOOST_PP_ITERATION_FINISH_2 >= 140\n#        define BOOST_PP_ITERATION_2 140\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 141 && BOOST_PP_ITERATION_FINISH_2 >= 141\n#        define BOOST_PP_ITERATION_2 141\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 142 && BOOST_PP_ITERATION_FINISH_2 >= 142\n#        define BOOST_PP_ITERATION_2 142\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 143 && BOOST_PP_ITERATION_FINISH_2 >= 143\n#        define BOOST_PP_ITERATION_2 143\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 144 && BOOST_PP_ITERATION_FINISH_2 >= 144\n#        define BOOST_PP_ITERATION_2 144\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 145 && BOOST_PP_ITERATION_FINISH_2 >= 145\n#        define BOOST_PP_ITERATION_2 145\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 146 && BOOST_PP_ITERATION_FINISH_2 >= 146\n#        define BOOST_PP_ITERATION_2 146\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 147 && BOOST_PP_ITERATION_FINISH_2 >= 147\n#        define BOOST_PP_ITERATION_2 147\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 148 && BOOST_PP_ITERATION_FINISH_2 >= 148\n#        define BOOST_PP_ITERATION_2 148\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 149 && BOOST_PP_ITERATION_FINISH_2 >= 149\n#        define BOOST_PP_ITERATION_2 149\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 150 && BOOST_PP_ITERATION_FINISH_2 >= 150\n#        define BOOST_PP_ITERATION_2 150\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 151 && BOOST_PP_ITERATION_FINISH_2 >= 151\n#        define BOOST_PP_ITERATION_2 151\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 152 && BOOST_PP_ITERATION_FINISH_2 >= 152\n#        define BOOST_PP_ITERATION_2 152\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 153 && BOOST_PP_ITERATION_FINISH_2 >= 153\n#        define BOOST_PP_ITERATION_2 153\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 154 && BOOST_PP_ITERATION_FINISH_2 >= 154\n#        define BOOST_PP_ITERATION_2 154\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 155 && BOOST_PP_ITERATION_FINISH_2 >= 155\n#        define BOOST_PP_ITERATION_2 155\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 156 && BOOST_PP_ITERATION_FINISH_2 >= 156\n#        define BOOST_PP_ITERATION_2 156\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 157 && BOOST_PP_ITERATION_FINISH_2 >= 157\n#        define BOOST_PP_ITERATION_2 157\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 158 && BOOST_PP_ITERATION_FINISH_2 >= 158\n#        define BOOST_PP_ITERATION_2 158\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 159 && BOOST_PP_ITERATION_FINISH_2 >= 159\n#        define BOOST_PP_ITERATION_2 159\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 160 && BOOST_PP_ITERATION_FINISH_2 >= 160\n#        define BOOST_PP_ITERATION_2 160\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 161 && BOOST_PP_ITERATION_FINISH_2 >= 161\n#        define BOOST_PP_ITERATION_2 161\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 162 && BOOST_PP_ITERATION_FINISH_2 >= 162\n#        define BOOST_PP_ITERATION_2 162\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 163 && BOOST_PP_ITERATION_FINISH_2 >= 163\n#        define BOOST_PP_ITERATION_2 163\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 164 && BOOST_PP_ITERATION_FINISH_2 >= 164\n#        define BOOST_PP_ITERATION_2 164\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 165 && BOOST_PP_ITERATION_FINISH_2 >= 165\n#        define BOOST_PP_ITERATION_2 165\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 166 && BOOST_PP_ITERATION_FINISH_2 >= 166\n#        define BOOST_PP_ITERATION_2 166\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 167 && BOOST_PP_ITERATION_FINISH_2 >= 167\n#        define BOOST_PP_ITERATION_2 167\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 168 && BOOST_PP_ITERATION_FINISH_2 >= 168\n#        define BOOST_PP_ITERATION_2 168\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 169 && BOOST_PP_ITERATION_FINISH_2 >= 169\n#        define BOOST_PP_ITERATION_2 169\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 170 && BOOST_PP_ITERATION_FINISH_2 >= 170\n#        define BOOST_PP_ITERATION_2 170\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 171 && BOOST_PP_ITERATION_FINISH_2 >= 171\n#        define BOOST_PP_ITERATION_2 171\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 172 && BOOST_PP_ITERATION_FINISH_2 >= 172\n#        define BOOST_PP_ITERATION_2 172\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 173 && BOOST_PP_ITERATION_FINISH_2 >= 173\n#        define BOOST_PP_ITERATION_2 173\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 174 && BOOST_PP_ITERATION_FINISH_2 >= 174\n#        define BOOST_PP_ITERATION_2 174\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 175 && BOOST_PP_ITERATION_FINISH_2 >= 175\n#        define BOOST_PP_ITERATION_2 175\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 176 && BOOST_PP_ITERATION_FINISH_2 >= 176\n#        define BOOST_PP_ITERATION_2 176\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 177 && BOOST_PP_ITERATION_FINISH_2 >= 177\n#        define BOOST_PP_ITERATION_2 177\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 178 && BOOST_PP_ITERATION_FINISH_2 >= 178\n#        define BOOST_PP_ITERATION_2 178\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 179 && BOOST_PP_ITERATION_FINISH_2 >= 179\n#        define BOOST_PP_ITERATION_2 179\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 180 && BOOST_PP_ITERATION_FINISH_2 >= 180\n#        define BOOST_PP_ITERATION_2 180\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 181 && BOOST_PP_ITERATION_FINISH_2 >= 181\n#        define BOOST_PP_ITERATION_2 181\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 182 && BOOST_PP_ITERATION_FINISH_2 >= 182\n#        define BOOST_PP_ITERATION_2 182\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 183 && BOOST_PP_ITERATION_FINISH_2 >= 183\n#        define BOOST_PP_ITERATION_2 183\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 184 && BOOST_PP_ITERATION_FINISH_2 >= 184\n#        define BOOST_PP_ITERATION_2 184\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 185 && BOOST_PP_ITERATION_FINISH_2 >= 185\n#        define BOOST_PP_ITERATION_2 185\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 186 && BOOST_PP_ITERATION_FINISH_2 >= 186\n#        define BOOST_PP_ITERATION_2 186\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 187 && BOOST_PP_ITERATION_FINISH_2 >= 187\n#        define BOOST_PP_ITERATION_2 187\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 188 && BOOST_PP_ITERATION_FINISH_2 >= 188\n#        define BOOST_PP_ITERATION_2 188\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 189 && BOOST_PP_ITERATION_FINISH_2 >= 189\n#        define BOOST_PP_ITERATION_2 189\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 190 && BOOST_PP_ITERATION_FINISH_2 >= 190\n#        define BOOST_PP_ITERATION_2 190\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 191 && BOOST_PP_ITERATION_FINISH_2 >= 191\n#        define BOOST_PP_ITERATION_2 191\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 192 && BOOST_PP_ITERATION_FINISH_2 >= 192\n#        define BOOST_PP_ITERATION_2 192\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 193 && BOOST_PP_ITERATION_FINISH_2 >= 193\n#        define BOOST_PP_ITERATION_2 193\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 194 && BOOST_PP_ITERATION_FINISH_2 >= 194\n#        define BOOST_PP_ITERATION_2 194\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 195 && BOOST_PP_ITERATION_FINISH_2 >= 195\n#        define BOOST_PP_ITERATION_2 195\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 196 && BOOST_PP_ITERATION_FINISH_2 >= 196\n#        define BOOST_PP_ITERATION_2 196\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 197 && BOOST_PP_ITERATION_FINISH_2 >= 197\n#        define BOOST_PP_ITERATION_2 197\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 198 && BOOST_PP_ITERATION_FINISH_2 >= 198\n#        define BOOST_PP_ITERATION_2 198\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 199 && BOOST_PP_ITERATION_FINISH_2 >= 199\n#        define BOOST_PP_ITERATION_2 199\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 200 && BOOST_PP_ITERATION_FINISH_2 >= 200\n#        define BOOST_PP_ITERATION_2 200\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 201 && BOOST_PP_ITERATION_FINISH_2 >= 201\n#        define BOOST_PP_ITERATION_2 201\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 202 && BOOST_PP_ITERATION_FINISH_2 >= 202\n#        define BOOST_PP_ITERATION_2 202\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 203 && BOOST_PP_ITERATION_FINISH_2 >= 203\n#        define BOOST_PP_ITERATION_2 203\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 204 && BOOST_PP_ITERATION_FINISH_2 >= 204\n#        define BOOST_PP_ITERATION_2 204\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 205 && BOOST_PP_ITERATION_FINISH_2 >= 205\n#        define BOOST_PP_ITERATION_2 205\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 206 && BOOST_PP_ITERATION_FINISH_2 >= 206\n#        define BOOST_PP_ITERATION_2 206\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 207 && BOOST_PP_ITERATION_FINISH_2 >= 207\n#        define BOOST_PP_ITERATION_2 207\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 208 && BOOST_PP_ITERATION_FINISH_2 >= 208\n#        define BOOST_PP_ITERATION_2 208\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 209 && BOOST_PP_ITERATION_FINISH_2 >= 209\n#        define BOOST_PP_ITERATION_2 209\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 210 && BOOST_PP_ITERATION_FINISH_2 >= 210\n#        define BOOST_PP_ITERATION_2 210\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 211 && BOOST_PP_ITERATION_FINISH_2 >= 211\n#        define BOOST_PP_ITERATION_2 211\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 212 && BOOST_PP_ITERATION_FINISH_2 >= 212\n#        define BOOST_PP_ITERATION_2 212\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 213 && BOOST_PP_ITERATION_FINISH_2 >= 213\n#        define BOOST_PP_ITERATION_2 213\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 214 && BOOST_PP_ITERATION_FINISH_2 >= 214\n#        define BOOST_PP_ITERATION_2 214\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 215 && BOOST_PP_ITERATION_FINISH_2 >= 215\n#        define BOOST_PP_ITERATION_2 215\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 216 && BOOST_PP_ITERATION_FINISH_2 >= 216\n#        define BOOST_PP_ITERATION_2 216\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 217 && BOOST_PP_ITERATION_FINISH_2 >= 217\n#        define BOOST_PP_ITERATION_2 217\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 218 && BOOST_PP_ITERATION_FINISH_2 >= 218\n#        define BOOST_PP_ITERATION_2 218\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 219 && BOOST_PP_ITERATION_FINISH_2 >= 219\n#        define BOOST_PP_ITERATION_2 219\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 220 && BOOST_PP_ITERATION_FINISH_2 >= 220\n#        define BOOST_PP_ITERATION_2 220\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 221 && BOOST_PP_ITERATION_FINISH_2 >= 221\n#        define BOOST_PP_ITERATION_2 221\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 222 && BOOST_PP_ITERATION_FINISH_2 >= 222\n#        define BOOST_PP_ITERATION_2 222\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 223 && BOOST_PP_ITERATION_FINISH_2 >= 223\n#        define BOOST_PP_ITERATION_2 223\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 224 && BOOST_PP_ITERATION_FINISH_2 >= 224\n#        define BOOST_PP_ITERATION_2 224\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 225 && BOOST_PP_ITERATION_FINISH_2 >= 225\n#        define BOOST_PP_ITERATION_2 225\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 226 && BOOST_PP_ITERATION_FINISH_2 >= 226\n#        define BOOST_PP_ITERATION_2 226\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 227 && BOOST_PP_ITERATION_FINISH_2 >= 227\n#        define BOOST_PP_ITERATION_2 227\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 228 && BOOST_PP_ITERATION_FINISH_2 >= 228\n#        define BOOST_PP_ITERATION_2 228\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 229 && BOOST_PP_ITERATION_FINISH_2 >= 229\n#        define BOOST_PP_ITERATION_2 229\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 230 && BOOST_PP_ITERATION_FINISH_2 >= 230\n#        define BOOST_PP_ITERATION_2 230\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 231 && BOOST_PP_ITERATION_FINISH_2 >= 231\n#        define BOOST_PP_ITERATION_2 231\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 232 && BOOST_PP_ITERATION_FINISH_2 >= 232\n#        define BOOST_PP_ITERATION_2 232\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 233 && BOOST_PP_ITERATION_FINISH_2 >= 233\n#        define BOOST_PP_ITERATION_2 233\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 234 && BOOST_PP_ITERATION_FINISH_2 >= 234\n#        define BOOST_PP_ITERATION_2 234\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 235 && BOOST_PP_ITERATION_FINISH_2 >= 235\n#        define BOOST_PP_ITERATION_2 235\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 236 && BOOST_PP_ITERATION_FINISH_2 >= 236\n#        define BOOST_PP_ITERATION_2 236\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 237 && BOOST_PP_ITERATION_FINISH_2 >= 237\n#        define BOOST_PP_ITERATION_2 237\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 238 && BOOST_PP_ITERATION_FINISH_2 >= 238\n#        define BOOST_PP_ITERATION_2 238\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 239 && BOOST_PP_ITERATION_FINISH_2 >= 239\n#        define BOOST_PP_ITERATION_2 239\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 240 && BOOST_PP_ITERATION_FINISH_2 >= 240\n#        define BOOST_PP_ITERATION_2 240\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 241 && BOOST_PP_ITERATION_FINISH_2 >= 241\n#        define BOOST_PP_ITERATION_2 241\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 242 && BOOST_PP_ITERATION_FINISH_2 >= 242\n#        define BOOST_PP_ITERATION_2 242\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 243 && BOOST_PP_ITERATION_FINISH_2 >= 243\n#        define BOOST_PP_ITERATION_2 243\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 244 && BOOST_PP_ITERATION_FINISH_2 >= 244\n#        define BOOST_PP_ITERATION_2 244\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 245 && BOOST_PP_ITERATION_FINISH_2 >= 245\n#        define BOOST_PP_ITERATION_2 245\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 246 && BOOST_PP_ITERATION_FINISH_2 >= 246\n#        define BOOST_PP_ITERATION_2 246\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 247 && BOOST_PP_ITERATION_FINISH_2 >= 247\n#        define BOOST_PP_ITERATION_2 247\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 248 && BOOST_PP_ITERATION_FINISH_2 >= 248\n#        define BOOST_PP_ITERATION_2 248\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 249 && BOOST_PP_ITERATION_FINISH_2 >= 249\n#        define BOOST_PP_ITERATION_2 249\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 250 && BOOST_PP_ITERATION_FINISH_2 >= 250\n#        define BOOST_PP_ITERATION_2 250\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 251 && BOOST_PP_ITERATION_FINISH_2 >= 251\n#        define BOOST_PP_ITERATION_2 251\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 252 && BOOST_PP_ITERATION_FINISH_2 >= 252\n#        define BOOST_PP_ITERATION_2 252\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 253 && BOOST_PP_ITERATION_FINISH_2 >= 253\n#        define BOOST_PP_ITERATION_2 253\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 254 && BOOST_PP_ITERATION_FINISH_2 >= 254\n#        define BOOST_PP_ITERATION_2 254\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 255 && BOOST_PP_ITERATION_FINISH_2 >= 255\n#        define BOOST_PP_ITERATION_2 255\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n#    if BOOST_PP_ITERATION_START_2 <= 256 && BOOST_PP_ITERATION_FINISH_2 >= 256\n#        define BOOST_PP_ITERATION_2 256\n#        include BOOST_PP_FILENAME_2\n#        undef BOOST_PP_ITERATION_2\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 1\n#\n# undef BOOST_PP_ITERATION_START_2\n# undef BOOST_PP_ITERATION_FINISH_2\n# undef BOOST_PP_FILENAME_2\n#\n# undef BOOST_PP_ITERATION_FLAGS_2\n# undef BOOST_PP_ITERATION_PARAMS_2\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/forward3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_3)\n#        error BOOST_PP_ERROR:  depth #3 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower3.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper3.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_3() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_3)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_3)\n#    include <boost/preprocessor/iteration/detail/bounds/lower3.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_3)\n#    include <boost/preprocessor/iteration/detail/bounds/upper3.hpp>\n#    define BOOST_PP_FILENAME_3 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_3)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_3) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_3() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_3)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_3() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #3 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 3\n#\n# if (BOOST_PP_ITERATION_START_3) > (BOOST_PP_ITERATION_FINISH_3)\n#    include <boost/preprocessor/iteration/detail/iter/reverse3.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_3 <= 0 && BOOST_PP_ITERATION_FINISH_3 >= 0\n#        define BOOST_PP_ITERATION_3 0\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 1 && BOOST_PP_ITERATION_FINISH_3 >= 1\n#        define BOOST_PP_ITERATION_3 1\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 2 && BOOST_PP_ITERATION_FINISH_3 >= 2\n#        define BOOST_PP_ITERATION_3 2\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 3 && BOOST_PP_ITERATION_FINISH_3 >= 3\n#        define BOOST_PP_ITERATION_3 3\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 4 && BOOST_PP_ITERATION_FINISH_3 >= 4\n#        define BOOST_PP_ITERATION_3 4\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 5 && BOOST_PP_ITERATION_FINISH_3 >= 5\n#        define BOOST_PP_ITERATION_3 5\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 6 && BOOST_PP_ITERATION_FINISH_3 >= 6\n#        define BOOST_PP_ITERATION_3 6\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 7 && BOOST_PP_ITERATION_FINISH_3 >= 7\n#        define BOOST_PP_ITERATION_3 7\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 8 && BOOST_PP_ITERATION_FINISH_3 >= 8\n#        define BOOST_PP_ITERATION_3 8\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 9 && BOOST_PP_ITERATION_FINISH_3 >= 9\n#        define BOOST_PP_ITERATION_3 9\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 10 && BOOST_PP_ITERATION_FINISH_3 >= 10\n#        define BOOST_PP_ITERATION_3 10\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 11 && BOOST_PP_ITERATION_FINISH_3 >= 11\n#        define BOOST_PP_ITERATION_3 11\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 12 && BOOST_PP_ITERATION_FINISH_3 >= 12\n#        define BOOST_PP_ITERATION_3 12\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 13 && BOOST_PP_ITERATION_FINISH_3 >= 13\n#        define BOOST_PP_ITERATION_3 13\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 14 && BOOST_PP_ITERATION_FINISH_3 >= 14\n#        define BOOST_PP_ITERATION_3 14\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 15 && BOOST_PP_ITERATION_FINISH_3 >= 15\n#        define BOOST_PP_ITERATION_3 15\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 16 && BOOST_PP_ITERATION_FINISH_3 >= 16\n#        define BOOST_PP_ITERATION_3 16\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 17 && BOOST_PP_ITERATION_FINISH_3 >= 17\n#        define BOOST_PP_ITERATION_3 17\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 18 && BOOST_PP_ITERATION_FINISH_3 >= 18\n#        define BOOST_PP_ITERATION_3 18\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 19 && BOOST_PP_ITERATION_FINISH_3 >= 19\n#        define BOOST_PP_ITERATION_3 19\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 20 && BOOST_PP_ITERATION_FINISH_3 >= 20\n#        define BOOST_PP_ITERATION_3 20\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 21 && BOOST_PP_ITERATION_FINISH_3 >= 21\n#        define BOOST_PP_ITERATION_3 21\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 22 && BOOST_PP_ITERATION_FINISH_3 >= 22\n#        define BOOST_PP_ITERATION_3 22\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 23 && BOOST_PP_ITERATION_FINISH_3 >= 23\n#        define BOOST_PP_ITERATION_3 23\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 24 && BOOST_PP_ITERATION_FINISH_3 >= 24\n#        define BOOST_PP_ITERATION_3 24\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 25 && BOOST_PP_ITERATION_FINISH_3 >= 25\n#        define BOOST_PP_ITERATION_3 25\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 26 && BOOST_PP_ITERATION_FINISH_3 >= 26\n#        define BOOST_PP_ITERATION_3 26\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 27 && BOOST_PP_ITERATION_FINISH_3 >= 27\n#        define BOOST_PP_ITERATION_3 27\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 28 && BOOST_PP_ITERATION_FINISH_3 >= 28\n#        define BOOST_PP_ITERATION_3 28\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 29 && BOOST_PP_ITERATION_FINISH_3 >= 29\n#        define BOOST_PP_ITERATION_3 29\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 30 && BOOST_PP_ITERATION_FINISH_3 >= 30\n#        define BOOST_PP_ITERATION_3 30\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 31 && BOOST_PP_ITERATION_FINISH_3 >= 31\n#        define BOOST_PP_ITERATION_3 31\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 32 && BOOST_PP_ITERATION_FINISH_3 >= 32\n#        define BOOST_PP_ITERATION_3 32\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 33 && BOOST_PP_ITERATION_FINISH_3 >= 33\n#        define BOOST_PP_ITERATION_3 33\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 34 && BOOST_PP_ITERATION_FINISH_3 >= 34\n#        define BOOST_PP_ITERATION_3 34\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 35 && BOOST_PP_ITERATION_FINISH_3 >= 35\n#        define BOOST_PP_ITERATION_3 35\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 36 && BOOST_PP_ITERATION_FINISH_3 >= 36\n#        define BOOST_PP_ITERATION_3 36\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 37 && BOOST_PP_ITERATION_FINISH_3 >= 37\n#        define BOOST_PP_ITERATION_3 37\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 38 && BOOST_PP_ITERATION_FINISH_3 >= 38\n#        define BOOST_PP_ITERATION_3 38\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 39 && BOOST_PP_ITERATION_FINISH_3 >= 39\n#        define BOOST_PP_ITERATION_3 39\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 40 && BOOST_PP_ITERATION_FINISH_3 >= 40\n#        define BOOST_PP_ITERATION_3 40\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 41 && BOOST_PP_ITERATION_FINISH_3 >= 41\n#        define BOOST_PP_ITERATION_3 41\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 42 && BOOST_PP_ITERATION_FINISH_3 >= 42\n#        define BOOST_PP_ITERATION_3 42\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 43 && BOOST_PP_ITERATION_FINISH_3 >= 43\n#        define BOOST_PP_ITERATION_3 43\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 44 && BOOST_PP_ITERATION_FINISH_3 >= 44\n#        define BOOST_PP_ITERATION_3 44\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 45 && BOOST_PP_ITERATION_FINISH_3 >= 45\n#        define BOOST_PP_ITERATION_3 45\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 46 && BOOST_PP_ITERATION_FINISH_3 >= 46\n#        define BOOST_PP_ITERATION_3 46\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 47 && BOOST_PP_ITERATION_FINISH_3 >= 47\n#        define BOOST_PP_ITERATION_3 47\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 48 && BOOST_PP_ITERATION_FINISH_3 >= 48\n#        define BOOST_PP_ITERATION_3 48\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 49 && BOOST_PP_ITERATION_FINISH_3 >= 49\n#        define BOOST_PP_ITERATION_3 49\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 50 && BOOST_PP_ITERATION_FINISH_3 >= 50\n#        define BOOST_PP_ITERATION_3 50\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 51 && BOOST_PP_ITERATION_FINISH_3 >= 51\n#        define BOOST_PP_ITERATION_3 51\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 52 && BOOST_PP_ITERATION_FINISH_3 >= 52\n#        define BOOST_PP_ITERATION_3 52\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 53 && BOOST_PP_ITERATION_FINISH_3 >= 53\n#        define BOOST_PP_ITERATION_3 53\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 54 && BOOST_PP_ITERATION_FINISH_3 >= 54\n#        define BOOST_PP_ITERATION_3 54\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 55 && BOOST_PP_ITERATION_FINISH_3 >= 55\n#        define BOOST_PP_ITERATION_3 55\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 56 && BOOST_PP_ITERATION_FINISH_3 >= 56\n#        define BOOST_PP_ITERATION_3 56\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 57 && BOOST_PP_ITERATION_FINISH_3 >= 57\n#        define BOOST_PP_ITERATION_3 57\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 58 && BOOST_PP_ITERATION_FINISH_3 >= 58\n#        define BOOST_PP_ITERATION_3 58\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 59 && BOOST_PP_ITERATION_FINISH_3 >= 59\n#        define BOOST_PP_ITERATION_3 59\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 60 && BOOST_PP_ITERATION_FINISH_3 >= 60\n#        define BOOST_PP_ITERATION_3 60\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 61 && BOOST_PP_ITERATION_FINISH_3 >= 61\n#        define BOOST_PP_ITERATION_3 61\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 62 && BOOST_PP_ITERATION_FINISH_3 >= 62\n#        define BOOST_PP_ITERATION_3 62\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 63 && BOOST_PP_ITERATION_FINISH_3 >= 63\n#        define BOOST_PP_ITERATION_3 63\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 64 && BOOST_PP_ITERATION_FINISH_3 >= 64\n#        define BOOST_PP_ITERATION_3 64\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 65 && BOOST_PP_ITERATION_FINISH_3 >= 65\n#        define BOOST_PP_ITERATION_3 65\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 66 && BOOST_PP_ITERATION_FINISH_3 >= 66\n#        define BOOST_PP_ITERATION_3 66\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 67 && BOOST_PP_ITERATION_FINISH_3 >= 67\n#        define BOOST_PP_ITERATION_3 67\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 68 && BOOST_PP_ITERATION_FINISH_3 >= 68\n#        define BOOST_PP_ITERATION_3 68\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 69 && BOOST_PP_ITERATION_FINISH_3 >= 69\n#        define BOOST_PP_ITERATION_3 69\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 70 && BOOST_PP_ITERATION_FINISH_3 >= 70\n#        define BOOST_PP_ITERATION_3 70\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 71 && BOOST_PP_ITERATION_FINISH_3 >= 71\n#        define BOOST_PP_ITERATION_3 71\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 72 && BOOST_PP_ITERATION_FINISH_3 >= 72\n#        define BOOST_PP_ITERATION_3 72\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 73 && BOOST_PP_ITERATION_FINISH_3 >= 73\n#        define BOOST_PP_ITERATION_3 73\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 74 && BOOST_PP_ITERATION_FINISH_3 >= 74\n#        define BOOST_PP_ITERATION_3 74\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 75 && BOOST_PP_ITERATION_FINISH_3 >= 75\n#        define BOOST_PP_ITERATION_3 75\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 76 && BOOST_PP_ITERATION_FINISH_3 >= 76\n#        define BOOST_PP_ITERATION_3 76\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 77 && BOOST_PP_ITERATION_FINISH_3 >= 77\n#        define BOOST_PP_ITERATION_3 77\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 78 && BOOST_PP_ITERATION_FINISH_3 >= 78\n#        define BOOST_PP_ITERATION_3 78\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 79 && BOOST_PP_ITERATION_FINISH_3 >= 79\n#        define BOOST_PP_ITERATION_3 79\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 80 && BOOST_PP_ITERATION_FINISH_3 >= 80\n#        define BOOST_PP_ITERATION_3 80\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 81 && BOOST_PP_ITERATION_FINISH_3 >= 81\n#        define BOOST_PP_ITERATION_3 81\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 82 && BOOST_PP_ITERATION_FINISH_3 >= 82\n#        define BOOST_PP_ITERATION_3 82\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 83 && BOOST_PP_ITERATION_FINISH_3 >= 83\n#        define BOOST_PP_ITERATION_3 83\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 84 && BOOST_PP_ITERATION_FINISH_3 >= 84\n#        define BOOST_PP_ITERATION_3 84\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 85 && BOOST_PP_ITERATION_FINISH_3 >= 85\n#        define BOOST_PP_ITERATION_3 85\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 86 && BOOST_PP_ITERATION_FINISH_3 >= 86\n#        define BOOST_PP_ITERATION_3 86\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 87 && BOOST_PP_ITERATION_FINISH_3 >= 87\n#        define BOOST_PP_ITERATION_3 87\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 88 && BOOST_PP_ITERATION_FINISH_3 >= 88\n#        define BOOST_PP_ITERATION_3 88\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 89 && BOOST_PP_ITERATION_FINISH_3 >= 89\n#        define BOOST_PP_ITERATION_3 89\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 90 && BOOST_PP_ITERATION_FINISH_3 >= 90\n#        define BOOST_PP_ITERATION_3 90\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 91 && BOOST_PP_ITERATION_FINISH_3 >= 91\n#        define BOOST_PP_ITERATION_3 91\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 92 && BOOST_PP_ITERATION_FINISH_3 >= 92\n#        define BOOST_PP_ITERATION_3 92\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 93 && BOOST_PP_ITERATION_FINISH_3 >= 93\n#        define BOOST_PP_ITERATION_3 93\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 94 && BOOST_PP_ITERATION_FINISH_3 >= 94\n#        define BOOST_PP_ITERATION_3 94\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 95 && BOOST_PP_ITERATION_FINISH_3 >= 95\n#        define BOOST_PP_ITERATION_3 95\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 96 && BOOST_PP_ITERATION_FINISH_3 >= 96\n#        define BOOST_PP_ITERATION_3 96\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 97 && BOOST_PP_ITERATION_FINISH_3 >= 97\n#        define BOOST_PP_ITERATION_3 97\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 98 && BOOST_PP_ITERATION_FINISH_3 >= 98\n#        define BOOST_PP_ITERATION_3 98\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 99 && BOOST_PP_ITERATION_FINISH_3 >= 99\n#        define BOOST_PP_ITERATION_3 99\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 100 && BOOST_PP_ITERATION_FINISH_3 >= 100\n#        define BOOST_PP_ITERATION_3 100\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 101 && BOOST_PP_ITERATION_FINISH_3 >= 101\n#        define BOOST_PP_ITERATION_3 101\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 102 && BOOST_PP_ITERATION_FINISH_3 >= 102\n#        define BOOST_PP_ITERATION_3 102\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 103 && BOOST_PP_ITERATION_FINISH_3 >= 103\n#        define BOOST_PP_ITERATION_3 103\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 104 && BOOST_PP_ITERATION_FINISH_3 >= 104\n#        define BOOST_PP_ITERATION_3 104\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 105 && BOOST_PP_ITERATION_FINISH_3 >= 105\n#        define BOOST_PP_ITERATION_3 105\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 106 && BOOST_PP_ITERATION_FINISH_3 >= 106\n#        define BOOST_PP_ITERATION_3 106\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 107 && BOOST_PP_ITERATION_FINISH_3 >= 107\n#        define BOOST_PP_ITERATION_3 107\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 108 && BOOST_PP_ITERATION_FINISH_3 >= 108\n#        define BOOST_PP_ITERATION_3 108\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 109 && BOOST_PP_ITERATION_FINISH_3 >= 109\n#        define BOOST_PP_ITERATION_3 109\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 110 && BOOST_PP_ITERATION_FINISH_3 >= 110\n#        define BOOST_PP_ITERATION_3 110\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 111 && BOOST_PP_ITERATION_FINISH_3 >= 111\n#        define BOOST_PP_ITERATION_3 111\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 112 && BOOST_PP_ITERATION_FINISH_3 >= 112\n#        define BOOST_PP_ITERATION_3 112\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 113 && BOOST_PP_ITERATION_FINISH_3 >= 113\n#        define BOOST_PP_ITERATION_3 113\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 114 && BOOST_PP_ITERATION_FINISH_3 >= 114\n#        define BOOST_PP_ITERATION_3 114\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 115 && BOOST_PP_ITERATION_FINISH_3 >= 115\n#        define BOOST_PP_ITERATION_3 115\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 116 && BOOST_PP_ITERATION_FINISH_3 >= 116\n#        define BOOST_PP_ITERATION_3 116\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 117 && BOOST_PP_ITERATION_FINISH_3 >= 117\n#        define BOOST_PP_ITERATION_3 117\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 118 && BOOST_PP_ITERATION_FINISH_3 >= 118\n#        define BOOST_PP_ITERATION_3 118\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 119 && BOOST_PP_ITERATION_FINISH_3 >= 119\n#        define BOOST_PP_ITERATION_3 119\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 120 && BOOST_PP_ITERATION_FINISH_3 >= 120\n#        define BOOST_PP_ITERATION_3 120\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 121 && BOOST_PP_ITERATION_FINISH_3 >= 121\n#        define BOOST_PP_ITERATION_3 121\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 122 && BOOST_PP_ITERATION_FINISH_3 >= 122\n#        define BOOST_PP_ITERATION_3 122\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 123 && BOOST_PP_ITERATION_FINISH_3 >= 123\n#        define BOOST_PP_ITERATION_3 123\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 124 && BOOST_PP_ITERATION_FINISH_3 >= 124\n#        define BOOST_PP_ITERATION_3 124\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 125 && BOOST_PP_ITERATION_FINISH_3 >= 125\n#        define BOOST_PP_ITERATION_3 125\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 126 && BOOST_PP_ITERATION_FINISH_3 >= 126\n#        define BOOST_PP_ITERATION_3 126\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 127 && BOOST_PP_ITERATION_FINISH_3 >= 127\n#        define BOOST_PP_ITERATION_3 127\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 128 && BOOST_PP_ITERATION_FINISH_3 >= 128\n#        define BOOST_PP_ITERATION_3 128\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 129 && BOOST_PP_ITERATION_FINISH_3 >= 129\n#        define BOOST_PP_ITERATION_3 129\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 130 && BOOST_PP_ITERATION_FINISH_3 >= 130\n#        define BOOST_PP_ITERATION_3 130\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 131 && BOOST_PP_ITERATION_FINISH_3 >= 131\n#        define BOOST_PP_ITERATION_3 131\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 132 && BOOST_PP_ITERATION_FINISH_3 >= 132\n#        define BOOST_PP_ITERATION_3 132\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 133 && BOOST_PP_ITERATION_FINISH_3 >= 133\n#        define BOOST_PP_ITERATION_3 133\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 134 && BOOST_PP_ITERATION_FINISH_3 >= 134\n#        define BOOST_PP_ITERATION_3 134\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 135 && BOOST_PP_ITERATION_FINISH_3 >= 135\n#        define BOOST_PP_ITERATION_3 135\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 136 && BOOST_PP_ITERATION_FINISH_3 >= 136\n#        define BOOST_PP_ITERATION_3 136\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 137 && BOOST_PP_ITERATION_FINISH_3 >= 137\n#        define BOOST_PP_ITERATION_3 137\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 138 && BOOST_PP_ITERATION_FINISH_3 >= 138\n#        define BOOST_PP_ITERATION_3 138\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 139 && BOOST_PP_ITERATION_FINISH_3 >= 139\n#        define BOOST_PP_ITERATION_3 139\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 140 && BOOST_PP_ITERATION_FINISH_3 >= 140\n#        define BOOST_PP_ITERATION_3 140\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 141 && BOOST_PP_ITERATION_FINISH_3 >= 141\n#        define BOOST_PP_ITERATION_3 141\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 142 && BOOST_PP_ITERATION_FINISH_3 >= 142\n#        define BOOST_PP_ITERATION_3 142\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 143 && BOOST_PP_ITERATION_FINISH_3 >= 143\n#        define BOOST_PP_ITERATION_3 143\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 144 && BOOST_PP_ITERATION_FINISH_3 >= 144\n#        define BOOST_PP_ITERATION_3 144\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 145 && BOOST_PP_ITERATION_FINISH_3 >= 145\n#        define BOOST_PP_ITERATION_3 145\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 146 && BOOST_PP_ITERATION_FINISH_3 >= 146\n#        define BOOST_PP_ITERATION_3 146\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 147 && BOOST_PP_ITERATION_FINISH_3 >= 147\n#        define BOOST_PP_ITERATION_3 147\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 148 && BOOST_PP_ITERATION_FINISH_3 >= 148\n#        define BOOST_PP_ITERATION_3 148\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 149 && BOOST_PP_ITERATION_FINISH_3 >= 149\n#        define BOOST_PP_ITERATION_3 149\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 150 && BOOST_PP_ITERATION_FINISH_3 >= 150\n#        define BOOST_PP_ITERATION_3 150\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 151 && BOOST_PP_ITERATION_FINISH_3 >= 151\n#        define BOOST_PP_ITERATION_3 151\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 152 && BOOST_PP_ITERATION_FINISH_3 >= 152\n#        define BOOST_PP_ITERATION_3 152\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 153 && BOOST_PP_ITERATION_FINISH_3 >= 153\n#        define BOOST_PP_ITERATION_3 153\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 154 && BOOST_PP_ITERATION_FINISH_3 >= 154\n#        define BOOST_PP_ITERATION_3 154\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 155 && BOOST_PP_ITERATION_FINISH_3 >= 155\n#        define BOOST_PP_ITERATION_3 155\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 156 && BOOST_PP_ITERATION_FINISH_3 >= 156\n#        define BOOST_PP_ITERATION_3 156\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 157 && BOOST_PP_ITERATION_FINISH_3 >= 157\n#        define BOOST_PP_ITERATION_3 157\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 158 && BOOST_PP_ITERATION_FINISH_3 >= 158\n#        define BOOST_PP_ITERATION_3 158\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 159 && BOOST_PP_ITERATION_FINISH_3 >= 159\n#        define BOOST_PP_ITERATION_3 159\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 160 && BOOST_PP_ITERATION_FINISH_3 >= 160\n#        define BOOST_PP_ITERATION_3 160\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 161 && BOOST_PP_ITERATION_FINISH_3 >= 161\n#        define BOOST_PP_ITERATION_3 161\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 162 && BOOST_PP_ITERATION_FINISH_3 >= 162\n#        define BOOST_PP_ITERATION_3 162\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 163 && BOOST_PP_ITERATION_FINISH_3 >= 163\n#        define BOOST_PP_ITERATION_3 163\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 164 && BOOST_PP_ITERATION_FINISH_3 >= 164\n#        define BOOST_PP_ITERATION_3 164\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 165 && BOOST_PP_ITERATION_FINISH_3 >= 165\n#        define BOOST_PP_ITERATION_3 165\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 166 && BOOST_PP_ITERATION_FINISH_3 >= 166\n#        define BOOST_PP_ITERATION_3 166\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 167 && BOOST_PP_ITERATION_FINISH_3 >= 167\n#        define BOOST_PP_ITERATION_3 167\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 168 && BOOST_PP_ITERATION_FINISH_3 >= 168\n#        define BOOST_PP_ITERATION_3 168\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 169 && BOOST_PP_ITERATION_FINISH_3 >= 169\n#        define BOOST_PP_ITERATION_3 169\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 170 && BOOST_PP_ITERATION_FINISH_3 >= 170\n#        define BOOST_PP_ITERATION_3 170\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 171 && BOOST_PP_ITERATION_FINISH_3 >= 171\n#        define BOOST_PP_ITERATION_3 171\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 172 && BOOST_PP_ITERATION_FINISH_3 >= 172\n#        define BOOST_PP_ITERATION_3 172\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 173 && BOOST_PP_ITERATION_FINISH_3 >= 173\n#        define BOOST_PP_ITERATION_3 173\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 174 && BOOST_PP_ITERATION_FINISH_3 >= 174\n#        define BOOST_PP_ITERATION_3 174\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 175 && BOOST_PP_ITERATION_FINISH_3 >= 175\n#        define BOOST_PP_ITERATION_3 175\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 176 && BOOST_PP_ITERATION_FINISH_3 >= 176\n#        define BOOST_PP_ITERATION_3 176\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 177 && BOOST_PP_ITERATION_FINISH_3 >= 177\n#        define BOOST_PP_ITERATION_3 177\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 178 && BOOST_PP_ITERATION_FINISH_3 >= 178\n#        define BOOST_PP_ITERATION_3 178\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 179 && BOOST_PP_ITERATION_FINISH_3 >= 179\n#        define BOOST_PP_ITERATION_3 179\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 180 && BOOST_PP_ITERATION_FINISH_3 >= 180\n#        define BOOST_PP_ITERATION_3 180\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 181 && BOOST_PP_ITERATION_FINISH_3 >= 181\n#        define BOOST_PP_ITERATION_3 181\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 182 && BOOST_PP_ITERATION_FINISH_3 >= 182\n#        define BOOST_PP_ITERATION_3 182\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 183 && BOOST_PP_ITERATION_FINISH_3 >= 183\n#        define BOOST_PP_ITERATION_3 183\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 184 && BOOST_PP_ITERATION_FINISH_3 >= 184\n#        define BOOST_PP_ITERATION_3 184\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 185 && BOOST_PP_ITERATION_FINISH_3 >= 185\n#        define BOOST_PP_ITERATION_3 185\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 186 && BOOST_PP_ITERATION_FINISH_3 >= 186\n#        define BOOST_PP_ITERATION_3 186\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 187 && BOOST_PP_ITERATION_FINISH_3 >= 187\n#        define BOOST_PP_ITERATION_3 187\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 188 && BOOST_PP_ITERATION_FINISH_3 >= 188\n#        define BOOST_PP_ITERATION_3 188\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 189 && BOOST_PP_ITERATION_FINISH_3 >= 189\n#        define BOOST_PP_ITERATION_3 189\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 190 && BOOST_PP_ITERATION_FINISH_3 >= 190\n#        define BOOST_PP_ITERATION_3 190\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 191 && BOOST_PP_ITERATION_FINISH_3 >= 191\n#        define BOOST_PP_ITERATION_3 191\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 192 && BOOST_PP_ITERATION_FINISH_3 >= 192\n#        define BOOST_PP_ITERATION_3 192\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 193 && BOOST_PP_ITERATION_FINISH_3 >= 193\n#        define BOOST_PP_ITERATION_3 193\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 194 && BOOST_PP_ITERATION_FINISH_3 >= 194\n#        define BOOST_PP_ITERATION_3 194\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 195 && BOOST_PP_ITERATION_FINISH_3 >= 195\n#        define BOOST_PP_ITERATION_3 195\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 196 && BOOST_PP_ITERATION_FINISH_3 >= 196\n#        define BOOST_PP_ITERATION_3 196\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 197 && BOOST_PP_ITERATION_FINISH_3 >= 197\n#        define BOOST_PP_ITERATION_3 197\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 198 && BOOST_PP_ITERATION_FINISH_3 >= 198\n#        define BOOST_PP_ITERATION_3 198\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 199 && BOOST_PP_ITERATION_FINISH_3 >= 199\n#        define BOOST_PP_ITERATION_3 199\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 200 && BOOST_PP_ITERATION_FINISH_3 >= 200\n#        define BOOST_PP_ITERATION_3 200\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 201 && BOOST_PP_ITERATION_FINISH_3 >= 201\n#        define BOOST_PP_ITERATION_3 201\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 202 && BOOST_PP_ITERATION_FINISH_3 >= 202\n#        define BOOST_PP_ITERATION_3 202\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 203 && BOOST_PP_ITERATION_FINISH_3 >= 203\n#        define BOOST_PP_ITERATION_3 203\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 204 && BOOST_PP_ITERATION_FINISH_3 >= 204\n#        define BOOST_PP_ITERATION_3 204\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 205 && BOOST_PP_ITERATION_FINISH_3 >= 205\n#        define BOOST_PP_ITERATION_3 205\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 206 && BOOST_PP_ITERATION_FINISH_3 >= 206\n#        define BOOST_PP_ITERATION_3 206\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 207 && BOOST_PP_ITERATION_FINISH_3 >= 207\n#        define BOOST_PP_ITERATION_3 207\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 208 && BOOST_PP_ITERATION_FINISH_3 >= 208\n#        define BOOST_PP_ITERATION_3 208\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 209 && BOOST_PP_ITERATION_FINISH_3 >= 209\n#        define BOOST_PP_ITERATION_3 209\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 210 && BOOST_PP_ITERATION_FINISH_3 >= 210\n#        define BOOST_PP_ITERATION_3 210\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 211 && BOOST_PP_ITERATION_FINISH_3 >= 211\n#        define BOOST_PP_ITERATION_3 211\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 212 && BOOST_PP_ITERATION_FINISH_3 >= 212\n#        define BOOST_PP_ITERATION_3 212\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 213 && BOOST_PP_ITERATION_FINISH_3 >= 213\n#        define BOOST_PP_ITERATION_3 213\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 214 && BOOST_PP_ITERATION_FINISH_3 >= 214\n#        define BOOST_PP_ITERATION_3 214\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 215 && BOOST_PP_ITERATION_FINISH_3 >= 215\n#        define BOOST_PP_ITERATION_3 215\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 216 && BOOST_PP_ITERATION_FINISH_3 >= 216\n#        define BOOST_PP_ITERATION_3 216\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 217 && BOOST_PP_ITERATION_FINISH_3 >= 217\n#        define BOOST_PP_ITERATION_3 217\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 218 && BOOST_PP_ITERATION_FINISH_3 >= 218\n#        define BOOST_PP_ITERATION_3 218\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 219 && BOOST_PP_ITERATION_FINISH_3 >= 219\n#        define BOOST_PP_ITERATION_3 219\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 220 && BOOST_PP_ITERATION_FINISH_3 >= 220\n#        define BOOST_PP_ITERATION_3 220\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 221 && BOOST_PP_ITERATION_FINISH_3 >= 221\n#        define BOOST_PP_ITERATION_3 221\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 222 && BOOST_PP_ITERATION_FINISH_3 >= 222\n#        define BOOST_PP_ITERATION_3 222\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 223 && BOOST_PP_ITERATION_FINISH_3 >= 223\n#        define BOOST_PP_ITERATION_3 223\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 224 && BOOST_PP_ITERATION_FINISH_3 >= 224\n#        define BOOST_PP_ITERATION_3 224\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 225 && BOOST_PP_ITERATION_FINISH_3 >= 225\n#        define BOOST_PP_ITERATION_3 225\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 226 && BOOST_PP_ITERATION_FINISH_3 >= 226\n#        define BOOST_PP_ITERATION_3 226\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 227 && BOOST_PP_ITERATION_FINISH_3 >= 227\n#        define BOOST_PP_ITERATION_3 227\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 228 && BOOST_PP_ITERATION_FINISH_3 >= 228\n#        define BOOST_PP_ITERATION_3 228\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 229 && BOOST_PP_ITERATION_FINISH_3 >= 229\n#        define BOOST_PP_ITERATION_3 229\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 230 && BOOST_PP_ITERATION_FINISH_3 >= 230\n#        define BOOST_PP_ITERATION_3 230\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 231 && BOOST_PP_ITERATION_FINISH_3 >= 231\n#        define BOOST_PP_ITERATION_3 231\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 232 && BOOST_PP_ITERATION_FINISH_3 >= 232\n#        define BOOST_PP_ITERATION_3 232\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 233 && BOOST_PP_ITERATION_FINISH_3 >= 233\n#        define BOOST_PP_ITERATION_3 233\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 234 && BOOST_PP_ITERATION_FINISH_3 >= 234\n#        define BOOST_PP_ITERATION_3 234\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 235 && BOOST_PP_ITERATION_FINISH_3 >= 235\n#        define BOOST_PP_ITERATION_3 235\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 236 && BOOST_PP_ITERATION_FINISH_3 >= 236\n#        define BOOST_PP_ITERATION_3 236\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 237 && BOOST_PP_ITERATION_FINISH_3 >= 237\n#        define BOOST_PP_ITERATION_3 237\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 238 && BOOST_PP_ITERATION_FINISH_3 >= 238\n#        define BOOST_PP_ITERATION_3 238\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 239 && BOOST_PP_ITERATION_FINISH_3 >= 239\n#        define BOOST_PP_ITERATION_3 239\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 240 && BOOST_PP_ITERATION_FINISH_3 >= 240\n#        define BOOST_PP_ITERATION_3 240\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 241 && BOOST_PP_ITERATION_FINISH_3 >= 241\n#        define BOOST_PP_ITERATION_3 241\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 242 && BOOST_PP_ITERATION_FINISH_3 >= 242\n#        define BOOST_PP_ITERATION_3 242\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 243 && BOOST_PP_ITERATION_FINISH_3 >= 243\n#        define BOOST_PP_ITERATION_3 243\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 244 && BOOST_PP_ITERATION_FINISH_3 >= 244\n#        define BOOST_PP_ITERATION_3 244\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 245 && BOOST_PP_ITERATION_FINISH_3 >= 245\n#        define BOOST_PP_ITERATION_3 245\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 246 && BOOST_PP_ITERATION_FINISH_3 >= 246\n#        define BOOST_PP_ITERATION_3 246\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 247 && BOOST_PP_ITERATION_FINISH_3 >= 247\n#        define BOOST_PP_ITERATION_3 247\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 248 && BOOST_PP_ITERATION_FINISH_3 >= 248\n#        define BOOST_PP_ITERATION_3 248\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 249 && BOOST_PP_ITERATION_FINISH_3 >= 249\n#        define BOOST_PP_ITERATION_3 249\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 250 && BOOST_PP_ITERATION_FINISH_3 >= 250\n#        define BOOST_PP_ITERATION_3 250\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 251 && BOOST_PP_ITERATION_FINISH_3 >= 251\n#        define BOOST_PP_ITERATION_3 251\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 252 && BOOST_PP_ITERATION_FINISH_3 >= 252\n#        define BOOST_PP_ITERATION_3 252\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 253 && BOOST_PP_ITERATION_FINISH_3 >= 253\n#        define BOOST_PP_ITERATION_3 253\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 254 && BOOST_PP_ITERATION_FINISH_3 >= 254\n#        define BOOST_PP_ITERATION_3 254\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 255 && BOOST_PP_ITERATION_FINISH_3 >= 255\n#        define BOOST_PP_ITERATION_3 255\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n#    if BOOST_PP_ITERATION_START_3 <= 256 && BOOST_PP_ITERATION_FINISH_3 >= 256\n#        define BOOST_PP_ITERATION_3 256\n#        include BOOST_PP_FILENAME_3\n#        undef BOOST_PP_ITERATION_3\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 2\n#\n# undef BOOST_PP_ITERATION_START_3\n# undef BOOST_PP_ITERATION_FINISH_3\n# undef BOOST_PP_FILENAME_3\n#\n# undef BOOST_PP_ITERATION_FLAGS_3\n# undef BOOST_PP_ITERATION_PARAMS_3\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/forward4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_4)\n#        error BOOST_PP_ERROR:  depth #4 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower4.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper4.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_4() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_4)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_4)\n#    include <boost/preprocessor/iteration/detail/bounds/lower4.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_4)\n#    include <boost/preprocessor/iteration/detail/bounds/upper4.hpp>\n#    define BOOST_PP_FILENAME_4 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_4)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_4) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_4() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_4)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_4() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #4 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 4\n#\n# if (BOOST_PP_ITERATION_START_4) > (BOOST_PP_ITERATION_FINISH_4)\n#    include <boost/preprocessor/iteration/detail/iter/reverse4.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_4 <= 0 && BOOST_PP_ITERATION_FINISH_4 >= 0\n#        define BOOST_PP_ITERATION_4 0\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 1 && BOOST_PP_ITERATION_FINISH_4 >= 1\n#        define BOOST_PP_ITERATION_4 1\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 2 && BOOST_PP_ITERATION_FINISH_4 >= 2\n#        define BOOST_PP_ITERATION_4 2\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 3 && BOOST_PP_ITERATION_FINISH_4 >= 3\n#        define BOOST_PP_ITERATION_4 3\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 4 && BOOST_PP_ITERATION_FINISH_4 >= 4\n#        define BOOST_PP_ITERATION_4 4\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 5 && BOOST_PP_ITERATION_FINISH_4 >= 5\n#        define BOOST_PP_ITERATION_4 5\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 6 && BOOST_PP_ITERATION_FINISH_4 >= 6\n#        define BOOST_PP_ITERATION_4 6\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 7 && BOOST_PP_ITERATION_FINISH_4 >= 7\n#        define BOOST_PP_ITERATION_4 7\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 8 && BOOST_PP_ITERATION_FINISH_4 >= 8\n#        define BOOST_PP_ITERATION_4 8\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 9 && BOOST_PP_ITERATION_FINISH_4 >= 9\n#        define BOOST_PP_ITERATION_4 9\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 10 && BOOST_PP_ITERATION_FINISH_4 >= 10\n#        define BOOST_PP_ITERATION_4 10\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 11 && BOOST_PP_ITERATION_FINISH_4 >= 11\n#        define BOOST_PP_ITERATION_4 11\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 12 && BOOST_PP_ITERATION_FINISH_4 >= 12\n#        define BOOST_PP_ITERATION_4 12\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 13 && BOOST_PP_ITERATION_FINISH_4 >= 13\n#        define BOOST_PP_ITERATION_4 13\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 14 && BOOST_PP_ITERATION_FINISH_4 >= 14\n#        define BOOST_PP_ITERATION_4 14\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 15 && BOOST_PP_ITERATION_FINISH_4 >= 15\n#        define BOOST_PP_ITERATION_4 15\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 16 && BOOST_PP_ITERATION_FINISH_4 >= 16\n#        define BOOST_PP_ITERATION_4 16\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 17 && BOOST_PP_ITERATION_FINISH_4 >= 17\n#        define BOOST_PP_ITERATION_4 17\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 18 && BOOST_PP_ITERATION_FINISH_4 >= 18\n#        define BOOST_PP_ITERATION_4 18\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 19 && BOOST_PP_ITERATION_FINISH_4 >= 19\n#        define BOOST_PP_ITERATION_4 19\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 20 && BOOST_PP_ITERATION_FINISH_4 >= 20\n#        define BOOST_PP_ITERATION_4 20\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 21 && BOOST_PP_ITERATION_FINISH_4 >= 21\n#        define BOOST_PP_ITERATION_4 21\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 22 && BOOST_PP_ITERATION_FINISH_4 >= 22\n#        define BOOST_PP_ITERATION_4 22\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 23 && BOOST_PP_ITERATION_FINISH_4 >= 23\n#        define BOOST_PP_ITERATION_4 23\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 24 && BOOST_PP_ITERATION_FINISH_4 >= 24\n#        define BOOST_PP_ITERATION_4 24\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 25 && BOOST_PP_ITERATION_FINISH_4 >= 25\n#        define BOOST_PP_ITERATION_4 25\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 26 && BOOST_PP_ITERATION_FINISH_4 >= 26\n#        define BOOST_PP_ITERATION_4 26\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 27 && BOOST_PP_ITERATION_FINISH_4 >= 27\n#        define BOOST_PP_ITERATION_4 27\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 28 && BOOST_PP_ITERATION_FINISH_4 >= 28\n#        define BOOST_PP_ITERATION_4 28\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 29 && BOOST_PP_ITERATION_FINISH_4 >= 29\n#        define BOOST_PP_ITERATION_4 29\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 30 && BOOST_PP_ITERATION_FINISH_4 >= 30\n#        define BOOST_PP_ITERATION_4 30\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 31 && BOOST_PP_ITERATION_FINISH_4 >= 31\n#        define BOOST_PP_ITERATION_4 31\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 32 && BOOST_PP_ITERATION_FINISH_4 >= 32\n#        define BOOST_PP_ITERATION_4 32\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 33 && BOOST_PP_ITERATION_FINISH_4 >= 33\n#        define BOOST_PP_ITERATION_4 33\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 34 && BOOST_PP_ITERATION_FINISH_4 >= 34\n#        define BOOST_PP_ITERATION_4 34\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 35 && BOOST_PP_ITERATION_FINISH_4 >= 35\n#        define BOOST_PP_ITERATION_4 35\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 36 && BOOST_PP_ITERATION_FINISH_4 >= 36\n#        define BOOST_PP_ITERATION_4 36\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 37 && BOOST_PP_ITERATION_FINISH_4 >= 37\n#        define BOOST_PP_ITERATION_4 37\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 38 && BOOST_PP_ITERATION_FINISH_4 >= 38\n#        define BOOST_PP_ITERATION_4 38\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 39 && BOOST_PP_ITERATION_FINISH_4 >= 39\n#        define BOOST_PP_ITERATION_4 39\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 40 && BOOST_PP_ITERATION_FINISH_4 >= 40\n#        define BOOST_PP_ITERATION_4 40\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 41 && BOOST_PP_ITERATION_FINISH_4 >= 41\n#        define BOOST_PP_ITERATION_4 41\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 42 && BOOST_PP_ITERATION_FINISH_4 >= 42\n#        define BOOST_PP_ITERATION_4 42\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 43 && BOOST_PP_ITERATION_FINISH_4 >= 43\n#        define BOOST_PP_ITERATION_4 43\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 44 && BOOST_PP_ITERATION_FINISH_4 >= 44\n#        define BOOST_PP_ITERATION_4 44\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 45 && BOOST_PP_ITERATION_FINISH_4 >= 45\n#        define BOOST_PP_ITERATION_4 45\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 46 && BOOST_PP_ITERATION_FINISH_4 >= 46\n#        define BOOST_PP_ITERATION_4 46\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 47 && BOOST_PP_ITERATION_FINISH_4 >= 47\n#        define BOOST_PP_ITERATION_4 47\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 48 && BOOST_PP_ITERATION_FINISH_4 >= 48\n#        define BOOST_PP_ITERATION_4 48\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 49 && BOOST_PP_ITERATION_FINISH_4 >= 49\n#        define BOOST_PP_ITERATION_4 49\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 50 && BOOST_PP_ITERATION_FINISH_4 >= 50\n#        define BOOST_PP_ITERATION_4 50\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 51 && BOOST_PP_ITERATION_FINISH_4 >= 51\n#        define BOOST_PP_ITERATION_4 51\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 52 && BOOST_PP_ITERATION_FINISH_4 >= 52\n#        define BOOST_PP_ITERATION_4 52\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 53 && BOOST_PP_ITERATION_FINISH_4 >= 53\n#        define BOOST_PP_ITERATION_4 53\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 54 && BOOST_PP_ITERATION_FINISH_4 >= 54\n#        define BOOST_PP_ITERATION_4 54\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 55 && BOOST_PP_ITERATION_FINISH_4 >= 55\n#        define BOOST_PP_ITERATION_4 55\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 56 && BOOST_PP_ITERATION_FINISH_4 >= 56\n#        define BOOST_PP_ITERATION_4 56\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 57 && BOOST_PP_ITERATION_FINISH_4 >= 57\n#        define BOOST_PP_ITERATION_4 57\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 58 && BOOST_PP_ITERATION_FINISH_4 >= 58\n#        define BOOST_PP_ITERATION_4 58\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 59 && BOOST_PP_ITERATION_FINISH_4 >= 59\n#        define BOOST_PP_ITERATION_4 59\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 60 && BOOST_PP_ITERATION_FINISH_4 >= 60\n#        define BOOST_PP_ITERATION_4 60\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 61 && BOOST_PP_ITERATION_FINISH_4 >= 61\n#        define BOOST_PP_ITERATION_4 61\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 62 && BOOST_PP_ITERATION_FINISH_4 >= 62\n#        define BOOST_PP_ITERATION_4 62\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 63 && BOOST_PP_ITERATION_FINISH_4 >= 63\n#        define BOOST_PP_ITERATION_4 63\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 64 && BOOST_PP_ITERATION_FINISH_4 >= 64\n#        define BOOST_PP_ITERATION_4 64\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 65 && BOOST_PP_ITERATION_FINISH_4 >= 65\n#        define BOOST_PP_ITERATION_4 65\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 66 && BOOST_PP_ITERATION_FINISH_4 >= 66\n#        define BOOST_PP_ITERATION_4 66\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 67 && BOOST_PP_ITERATION_FINISH_4 >= 67\n#        define BOOST_PP_ITERATION_4 67\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 68 && BOOST_PP_ITERATION_FINISH_4 >= 68\n#        define BOOST_PP_ITERATION_4 68\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 69 && BOOST_PP_ITERATION_FINISH_4 >= 69\n#        define BOOST_PP_ITERATION_4 69\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 70 && BOOST_PP_ITERATION_FINISH_4 >= 70\n#        define BOOST_PP_ITERATION_4 70\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 71 && BOOST_PP_ITERATION_FINISH_4 >= 71\n#        define BOOST_PP_ITERATION_4 71\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 72 && BOOST_PP_ITERATION_FINISH_4 >= 72\n#        define BOOST_PP_ITERATION_4 72\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 73 && BOOST_PP_ITERATION_FINISH_4 >= 73\n#        define BOOST_PP_ITERATION_4 73\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 74 && BOOST_PP_ITERATION_FINISH_4 >= 74\n#        define BOOST_PP_ITERATION_4 74\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 75 && BOOST_PP_ITERATION_FINISH_4 >= 75\n#        define BOOST_PP_ITERATION_4 75\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 76 && BOOST_PP_ITERATION_FINISH_4 >= 76\n#        define BOOST_PP_ITERATION_4 76\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 77 && BOOST_PP_ITERATION_FINISH_4 >= 77\n#        define BOOST_PP_ITERATION_4 77\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 78 && BOOST_PP_ITERATION_FINISH_4 >= 78\n#        define BOOST_PP_ITERATION_4 78\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 79 && BOOST_PP_ITERATION_FINISH_4 >= 79\n#        define BOOST_PP_ITERATION_4 79\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 80 && BOOST_PP_ITERATION_FINISH_4 >= 80\n#        define BOOST_PP_ITERATION_4 80\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 81 && BOOST_PP_ITERATION_FINISH_4 >= 81\n#        define BOOST_PP_ITERATION_4 81\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 82 && BOOST_PP_ITERATION_FINISH_4 >= 82\n#        define BOOST_PP_ITERATION_4 82\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 83 && BOOST_PP_ITERATION_FINISH_4 >= 83\n#        define BOOST_PP_ITERATION_4 83\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 84 && BOOST_PP_ITERATION_FINISH_4 >= 84\n#        define BOOST_PP_ITERATION_4 84\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 85 && BOOST_PP_ITERATION_FINISH_4 >= 85\n#        define BOOST_PP_ITERATION_4 85\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 86 && BOOST_PP_ITERATION_FINISH_4 >= 86\n#        define BOOST_PP_ITERATION_4 86\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 87 && BOOST_PP_ITERATION_FINISH_4 >= 87\n#        define BOOST_PP_ITERATION_4 87\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 88 && BOOST_PP_ITERATION_FINISH_4 >= 88\n#        define BOOST_PP_ITERATION_4 88\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 89 && BOOST_PP_ITERATION_FINISH_4 >= 89\n#        define BOOST_PP_ITERATION_4 89\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 90 && BOOST_PP_ITERATION_FINISH_4 >= 90\n#        define BOOST_PP_ITERATION_4 90\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 91 && BOOST_PP_ITERATION_FINISH_4 >= 91\n#        define BOOST_PP_ITERATION_4 91\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 92 && BOOST_PP_ITERATION_FINISH_4 >= 92\n#        define BOOST_PP_ITERATION_4 92\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 93 && BOOST_PP_ITERATION_FINISH_4 >= 93\n#        define BOOST_PP_ITERATION_4 93\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 94 && BOOST_PP_ITERATION_FINISH_4 >= 94\n#        define BOOST_PP_ITERATION_4 94\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 95 && BOOST_PP_ITERATION_FINISH_4 >= 95\n#        define BOOST_PP_ITERATION_4 95\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 96 && BOOST_PP_ITERATION_FINISH_4 >= 96\n#        define BOOST_PP_ITERATION_4 96\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 97 && BOOST_PP_ITERATION_FINISH_4 >= 97\n#        define BOOST_PP_ITERATION_4 97\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 98 && BOOST_PP_ITERATION_FINISH_4 >= 98\n#        define BOOST_PP_ITERATION_4 98\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 99 && BOOST_PP_ITERATION_FINISH_4 >= 99\n#        define BOOST_PP_ITERATION_4 99\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 100 && BOOST_PP_ITERATION_FINISH_4 >= 100\n#        define BOOST_PP_ITERATION_4 100\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 101 && BOOST_PP_ITERATION_FINISH_4 >= 101\n#        define BOOST_PP_ITERATION_4 101\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 102 && BOOST_PP_ITERATION_FINISH_4 >= 102\n#        define BOOST_PP_ITERATION_4 102\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 103 && BOOST_PP_ITERATION_FINISH_4 >= 103\n#        define BOOST_PP_ITERATION_4 103\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 104 && BOOST_PP_ITERATION_FINISH_4 >= 104\n#        define BOOST_PP_ITERATION_4 104\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 105 && BOOST_PP_ITERATION_FINISH_4 >= 105\n#        define BOOST_PP_ITERATION_4 105\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 106 && BOOST_PP_ITERATION_FINISH_4 >= 106\n#        define BOOST_PP_ITERATION_4 106\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 107 && BOOST_PP_ITERATION_FINISH_4 >= 107\n#        define BOOST_PP_ITERATION_4 107\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 108 && BOOST_PP_ITERATION_FINISH_4 >= 108\n#        define BOOST_PP_ITERATION_4 108\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 109 && BOOST_PP_ITERATION_FINISH_4 >= 109\n#        define BOOST_PP_ITERATION_4 109\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 110 && BOOST_PP_ITERATION_FINISH_4 >= 110\n#        define BOOST_PP_ITERATION_4 110\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 111 && BOOST_PP_ITERATION_FINISH_4 >= 111\n#        define BOOST_PP_ITERATION_4 111\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 112 && BOOST_PP_ITERATION_FINISH_4 >= 112\n#        define BOOST_PP_ITERATION_4 112\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 113 && BOOST_PP_ITERATION_FINISH_4 >= 113\n#        define BOOST_PP_ITERATION_4 113\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 114 && BOOST_PP_ITERATION_FINISH_4 >= 114\n#        define BOOST_PP_ITERATION_4 114\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 115 && BOOST_PP_ITERATION_FINISH_4 >= 115\n#        define BOOST_PP_ITERATION_4 115\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 116 && BOOST_PP_ITERATION_FINISH_4 >= 116\n#        define BOOST_PP_ITERATION_4 116\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 117 && BOOST_PP_ITERATION_FINISH_4 >= 117\n#        define BOOST_PP_ITERATION_4 117\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 118 && BOOST_PP_ITERATION_FINISH_4 >= 118\n#        define BOOST_PP_ITERATION_4 118\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 119 && BOOST_PP_ITERATION_FINISH_4 >= 119\n#        define BOOST_PP_ITERATION_4 119\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 120 && BOOST_PP_ITERATION_FINISH_4 >= 120\n#        define BOOST_PP_ITERATION_4 120\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 121 && BOOST_PP_ITERATION_FINISH_4 >= 121\n#        define BOOST_PP_ITERATION_4 121\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 122 && BOOST_PP_ITERATION_FINISH_4 >= 122\n#        define BOOST_PP_ITERATION_4 122\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 123 && BOOST_PP_ITERATION_FINISH_4 >= 123\n#        define BOOST_PP_ITERATION_4 123\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 124 && BOOST_PP_ITERATION_FINISH_4 >= 124\n#        define BOOST_PP_ITERATION_4 124\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 125 && BOOST_PP_ITERATION_FINISH_4 >= 125\n#        define BOOST_PP_ITERATION_4 125\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 126 && BOOST_PP_ITERATION_FINISH_4 >= 126\n#        define BOOST_PP_ITERATION_4 126\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 127 && BOOST_PP_ITERATION_FINISH_4 >= 127\n#        define BOOST_PP_ITERATION_4 127\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 128 && BOOST_PP_ITERATION_FINISH_4 >= 128\n#        define BOOST_PP_ITERATION_4 128\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 129 && BOOST_PP_ITERATION_FINISH_4 >= 129\n#        define BOOST_PP_ITERATION_4 129\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 130 && BOOST_PP_ITERATION_FINISH_4 >= 130\n#        define BOOST_PP_ITERATION_4 130\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 131 && BOOST_PP_ITERATION_FINISH_4 >= 131\n#        define BOOST_PP_ITERATION_4 131\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 132 && BOOST_PP_ITERATION_FINISH_4 >= 132\n#        define BOOST_PP_ITERATION_4 132\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 133 && BOOST_PP_ITERATION_FINISH_4 >= 133\n#        define BOOST_PP_ITERATION_4 133\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 134 && BOOST_PP_ITERATION_FINISH_4 >= 134\n#        define BOOST_PP_ITERATION_4 134\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 135 && BOOST_PP_ITERATION_FINISH_4 >= 135\n#        define BOOST_PP_ITERATION_4 135\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 136 && BOOST_PP_ITERATION_FINISH_4 >= 136\n#        define BOOST_PP_ITERATION_4 136\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 137 && BOOST_PP_ITERATION_FINISH_4 >= 137\n#        define BOOST_PP_ITERATION_4 137\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 138 && BOOST_PP_ITERATION_FINISH_4 >= 138\n#        define BOOST_PP_ITERATION_4 138\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 139 && BOOST_PP_ITERATION_FINISH_4 >= 139\n#        define BOOST_PP_ITERATION_4 139\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 140 && BOOST_PP_ITERATION_FINISH_4 >= 140\n#        define BOOST_PP_ITERATION_4 140\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 141 && BOOST_PP_ITERATION_FINISH_4 >= 141\n#        define BOOST_PP_ITERATION_4 141\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 142 && BOOST_PP_ITERATION_FINISH_4 >= 142\n#        define BOOST_PP_ITERATION_4 142\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 143 && BOOST_PP_ITERATION_FINISH_4 >= 143\n#        define BOOST_PP_ITERATION_4 143\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 144 && BOOST_PP_ITERATION_FINISH_4 >= 144\n#        define BOOST_PP_ITERATION_4 144\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 145 && BOOST_PP_ITERATION_FINISH_4 >= 145\n#        define BOOST_PP_ITERATION_4 145\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 146 && BOOST_PP_ITERATION_FINISH_4 >= 146\n#        define BOOST_PP_ITERATION_4 146\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 147 && BOOST_PP_ITERATION_FINISH_4 >= 147\n#        define BOOST_PP_ITERATION_4 147\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 148 && BOOST_PP_ITERATION_FINISH_4 >= 148\n#        define BOOST_PP_ITERATION_4 148\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 149 && BOOST_PP_ITERATION_FINISH_4 >= 149\n#        define BOOST_PP_ITERATION_4 149\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 150 && BOOST_PP_ITERATION_FINISH_4 >= 150\n#        define BOOST_PP_ITERATION_4 150\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 151 && BOOST_PP_ITERATION_FINISH_4 >= 151\n#        define BOOST_PP_ITERATION_4 151\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 152 && BOOST_PP_ITERATION_FINISH_4 >= 152\n#        define BOOST_PP_ITERATION_4 152\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 153 && BOOST_PP_ITERATION_FINISH_4 >= 153\n#        define BOOST_PP_ITERATION_4 153\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 154 && BOOST_PP_ITERATION_FINISH_4 >= 154\n#        define BOOST_PP_ITERATION_4 154\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 155 && BOOST_PP_ITERATION_FINISH_4 >= 155\n#        define BOOST_PP_ITERATION_4 155\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 156 && BOOST_PP_ITERATION_FINISH_4 >= 156\n#        define BOOST_PP_ITERATION_4 156\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 157 && BOOST_PP_ITERATION_FINISH_4 >= 157\n#        define BOOST_PP_ITERATION_4 157\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 158 && BOOST_PP_ITERATION_FINISH_4 >= 158\n#        define BOOST_PP_ITERATION_4 158\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 159 && BOOST_PP_ITERATION_FINISH_4 >= 159\n#        define BOOST_PP_ITERATION_4 159\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 160 && BOOST_PP_ITERATION_FINISH_4 >= 160\n#        define BOOST_PP_ITERATION_4 160\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 161 && BOOST_PP_ITERATION_FINISH_4 >= 161\n#        define BOOST_PP_ITERATION_4 161\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 162 && BOOST_PP_ITERATION_FINISH_4 >= 162\n#        define BOOST_PP_ITERATION_4 162\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 163 && BOOST_PP_ITERATION_FINISH_4 >= 163\n#        define BOOST_PP_ITERATION_4 163\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 164 && BOOST_PP_ITERATION_FINISH_4 >= 164\n#        define BOOST_PP_ITERATION_4 164\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 165 && BOOST_PP_ITERATION_FINISH_4 >= 165\n#        define BOOST_PP_ITERATION_4 165\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 166 && BOOST_PP_ITERATION_FINISH_4 >= 166\n#        define BOOST_PP_ITERATION_4 166\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 167 && BOOST_PP_ITERATION_FINISH_4 >= 167\n#        define BOOST_PP_ITERATION_4 167\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 168 && BOOST_PP_ITERATION_FINISH_4 >= 168\n#        define BOOST_PP_ITERATION_4 168\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 169 && BOOST_PP_ITERATION_FINISH_4 >= 169\n#        define BOOST_PP_ITERATION_4 169\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 170 && BOOST_PP_ITERATION_FINISH_4 >= 170\n#        define BOOST_PP_ITERATION_4 170\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 171 && BOOST_PP_ITERATION_FINISH_4 >= 171\n#        define BOOST_PP_ITERATION_4 171\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 172 && BOOST_PP_ITERATION_FINISH_4 >= 172\n#        define BOOST_PP_ITERATION_4 172\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 173 && BOOST_PP_ITERATION_FINISH_4 >= 173\n#        define BOOST_PP_ITERATION_4 173\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 174 && BOOST_PP_ITERATION_FINISH_4 >= 174\n#        define BOOST_PP_ITERATION_4 174\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 175 && BOOST_PP_ITERATION_FINISH_4 >= 175\n#        define BOOST_PP_ITERATION_4 175\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 176 && BOOST_PP_ITERATION_FINISH_4 >= 176\n#        define BOOST_PP_ITERATION_4 176\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 177 && BOOST_PP_ITERATION_FINISH_4 >= 177\n#        define BOOST_PP_ITERATION_4 177\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 178 && BOOST_PP_ITERATION_FINISH_4 >= 178\n#        define BOOST_PP_ITERATION_4 178\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 179 && BOOST_PP_ITERATION_FINISH_4 >= 179\n#        define BOOST_PP_ITERATION_4 179\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 180 && BOOST_PP_ITERATION_FINISH_4 >= 180\n#        define BOOST_PP_ITERATION_4 180\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 181 && BOOST_PP_ITERATION_FINISH_4 >= 181\n#        define BOOST_PP_ITERATION_4 181\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 182 && BOOST_PP_ITERATION_FINISH_4 >= 182\n#        define BOOST_PP_ITERATION_4 182\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 183 && BOOST_PP_ITERATION_FINISH_4 >= 183\n#        define BOOST_PP_ITERATION_4 183\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 184 && BOOST_PP_ITERATION_FINISH_4 >= 184\n#        define BOOST_PP_ITERATION_4 184\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 185 && BOOST_PP_ITERATION_FINISH_4 >= 185\n#        define BOOST_PP_ITERATION_4 185\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 186 && BOOST_PP_ITERATION_FINISH_4 >= 186\n#        define BOOST_PP_ITERATION_4 186\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 187 && BOOST_PP_ITERATION_FINISH_4 >= 187\n#        define BOOST_PP_ITERATION_4 187\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 188 && BOOST_PP_ITERATION_FINISH_4 >= 188\n#        define BOOST_PP_ITERATION_4 188\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 189 && BOOST_PP_ITERATION_FINISH_4 >= 189\n#        define BOOST_PP_ITERATION_4 189\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 190 && BOOST_PP_ITERATION_FINISH_4 >= 190\n#        define BOOST_PP_ITERATION_4 190\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 191 && BOOST_PP_ITERATION_FINISH_4 >= 191\n#        define BOOST_PP_ITERATION_4 191\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 192 && BOOST_PP_ITERATION_FINISH_4 >= 192\n#        define BOOST_PP_ITERATION_4 192\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 193 && BOOST_PP_ITERATION_FINISH_4 >= 193\n#        define BOOST_PP_ITERATION_4 193\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 194 && BOOST_PP_ITERATION_FINISH_4 >= 194\n#        define BOOST_PP_ITERATION_4 194\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 195 && BOOST_PP_ITERATION_FINISH_4 >= 195\n#        define BOOST_PP_ITERATION_4 195\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 196 && BOOST_PP_ITERATION_FINISH_4 >= 196\n#        define BOOST_PP_ITERATION_4 196\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 197 && BOOST_PP_ITERATION_FINISH_4 >= 197\n#        define BOOST_PP_ITERATION_4 197\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 198 && BOOST_PP_ITERATION_FINISH_4 >= 198\n#        define BOOST_PP_ITERATION_4 198\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 199 && BOOST_PP_ITERATION_FINISH_4 >= 199\n#        define BOOST_PP_ITERATION_4 199\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 200 && BOOST_PP_ITERATION_FINISH_4 >= 200\n#        define BOOST_PP_ITERATION_4 200\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 201 && BOOST_PP_ITERATION_FINISH_4 >= 201\n#        define BOOST_PP_ITERATION_4 201\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 202 && BOOST_PP_ITERATION_FINISH_4 >= 202\n#        define BOOST_PP_ITERATION_4 202\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 203 && BOOST_PP_ITERATION_FINISH_4 >= 203\n#        define BOOST_PP_ITERATION_4 203\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 204 && BOOST_PP_ITERATION_FINISH_4 >= 204\n#        define BOOST_PP_ITERATION_4 204\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 205 && BOOST_PP_ITERATION_FINISH_4 >= 205\n#        define BOOST_PP_ITERATION_4 205\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 206 && BOOST_PP_ITERATION_FINISH_4 >= 206\n#        define BOOST_PP_ITERATION_4 206\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 207 && BOOST_PP_ITERATION_FINISH_4 >= 207\n#        define BOOST_PP_ITERATION_4 207\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 208 && BOOST_PP_ITERATION_FINISH_4 >= 208\n#        define BOOST_PP_ITERATION_4 208\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 209 && BOOST_PP_ITERATION_FINISH_4 >= 209\n#        define BOOST_PP_ITERATION_4 209\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 210 && BOOST_PP_ITERATION_FINISH_4 >= 210\n#        define BOOST_PP_ITERATION_4 210\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 211 && BOOST_PP_ITERATION_FINISH_4 >= 211\n#        define BOOST_PP_ITERATION_4 211\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 212 && BOOST_PP_ITERATION_FINISH_4 >= 212\n#        define BOOST_PP_ITERATION_4 212\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 213 && BOOST_PP_ITERATION_FINISH_4 >= 213\n#        define BOOST_PP_ITERATION_4 213\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 214 && BOOST_PP_ITERATION_FINISH_4 >= 214\n#        define BOOST_PP_ITERATION_4 214\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 215 && BOOST_PP_ITERATION_FINISH_4 >= 215\n#        define BOOST_PP_ITERATION_4 215\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 216 && BOOST_PP_ITERATION_FINISH_4 >= 216\n#        define BOOST_PP_ITERATION_4 216\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 217 && BOOST_PP_ITERATION_FINISH_4 >= 217\n#        define BOOST_PP_ITERATION_4 217\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 218 && BOOST_PP_ITERATION_FINISH_4 >= 218\n#        define BOOST_PP_ITERATION_4 218\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 219 && BOOST_PP_ITERATION_FINISH_4 >= 219\n#        define BOOST_PP_ITERATION_4 219\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 220 && BOOST_PP_ITERATION_FINISH_4 >= 220\n#        define BOOST_PP_ITERATION_4 220\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 221 && BOOST_PP_ITERATION_FINISH_4 >= 221\n#        define BOOST_PP_ITERATION_4 221\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 222 && BOOST_PP_ITERATION_FINISH_4 >= 222\n#        define BOOST_PP_ITERATION_4 222\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 223 && BOOST_PP_ITERATION_FINISH_4 >= 223\n#        define BOOST_PP_ITERATION_4 223\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 224 && BOOST_PP_ITERATION_FINISH_4 >= 224\n#        define BOOST_PP_ITERATION_4 224\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 225 && BOOST_PP_ITERATION_FINISH_4 >= 225\n#        define BOOST_PP_ITERATION_4 225\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 226 && BOOST_PP_ITERATION_FINISH_4 >= 226\n#        define BOOST_PP_ITERATION_4 226\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 227 && BOOST_PP_ITERATION_FINISH_4 >= 227\n#        define BOOST_PP_ITERATION_4 227\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 228 && BOOST_PP_ITERATION_FINISH_4 >= 228\n#        define BOOST_PP_ITERATION_4 228\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 229 && BOOST_PP_ITERATION_FINISH_4 >= 229\n#        define BOOST_PP_ITERATION_4 229\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 230 && BOOST_PP_ITERATION_FINISH_4 >= 230\n#        define BOOST_PP_ITERATION_4 230\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 231 && BOOST_PP_ITERATION_FINISH_4 >= 231\n#        define BOOST_PP_ITERATION_4 231\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 232 && BOOST_PP_ITERATION_FINISH_4 >= 232\n#        define BOOST_PP_ITERATION_4 232\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 233 && BOOST_PP_ITERATION_FINISH_4 >= 233\n#        define BOOST_PP_ITERATION_4 233\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 234 && BOOST_PP_ITERATION_FINISH_4 >= 234\n#        define BOOST_PP_ITERATION_4 234\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 235 && BOOST_PP_ITERATION_FINISH_4 >= 235\n#        define BOOST_PP_ITERATION_4 235\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 236 && BOOST_PP_ITERATION_FINISH_4 >= 236\n#        define BOOST_PP_ITERATION_4 236\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 237 && BOOST_PP_ITERATION_FINISH_4 >= 237\n#        define BOOST_PP_ITERATION_4 237\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 238 && BOOST_PP_ITERATION_FINISH_4 >= 238\n#        define BOOST_PP_ITERATION_4 238\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 239 && BOOST_PP_ITERATION_FINISH_4 >= 239\n#        define BOOST_PP_ITERATION_4 239\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 240 && BOOST_PP_ITERATION_FINISH_4 >= 240\n#        define BOOST_PP_ITERATION_4 240\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 241 && BOOST_PP_ITERATION_FINISH_4 >= 241\n#        define BOOST_PP_ITERATION_4 241\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 242 && BOOST_PP_ITERATION_FINISH_4 >= 242\n#        define BOOST_PP_ITERATION_4 242\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 243 && BOOST_PP_ITERATION_FINISH_4 >= 243\n#        define BOOST_PP_ITERATION_4 243\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 244 && BOOST_PP_ITERATION_FINISH_4 >= 244\n#        define BOOST_PP_ITERATION_4 244\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 245 && BOOST_PP_ITERATION_FINISH_4 >= 245\n#        define BOOST_PP_ITERATION_4 245\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 246 && BOOST_PP_ITERATION_FINISH_4 >= 246\n#        define BOOST_PP_ITERATION_4 246\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 247 && BOOST_PP_ITERATION_FINISH_4 >= 247\n#        define BOOST_PP_ITERATION_4 247\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 248 && BOOST_PP_ITERATION_FINISH_4 >= 248\n#        define BOOST_PP_ITERATION_4 248\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 249 && BOOST_PP_ITERATION_FINISH_4 >= 249\n#        define BOOST_PP_ITERATION_4 249\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 250 && BOOST_PP_ITERATION_FINISH_4 >= 250\n#        define BOOST_PP_ITERATION_4 250\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 251 && BOOST_PP_ITERATION_FINISH_4 >= 251\n#        define BOOST_PP_ITERATION_4 251\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 252 && BOOST_PP_ITERATION_FINISH_4 >= 252\n#        define BOOST_PP_ITERATION_4 252\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 253 && BOOST_PP_ITERATION_FINISH_4 >= 253\n#        define BOOST_PP_ITERATION_4 253\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 254 && BOOST_PP_ITERATION_FINISH_4 >= 254\n#        define BOOST_PP_ITERATION_4 254\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 255 && BOOST_PP_ITERATION_FINISH_4 >= 255\n#        define BOOST_PP_ITERATION_4 255\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n#    if BOOST_PP_ITERATION_START_4 <= 256 && BOOST_PP_ITERATION_FINISH_4 >= 256\n#        define BOOST_PP_ITERATION_4 256\n#        include BOOST_PP_FILENAME_4\n#        undef BOOST_PP_ITERATION_4\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 3\n#\n# undef BOOST_PP_ITERATION_START_4\n# undef BOOST_PP_ITERATION_FINISH_4\n# undef BOOST_PP_FILENAME_4\n#\n# undef BOOST_PP_ITERATION_FLAGS_4\n# undef BOOST_PP_ITERATION_PARAMS_4\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/forward5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if defined(BOOST_PP_ITERATION_LIMITS)\n#    if !defined(BOOST_PP_FILENAME_5)\n#        error BOOST_PP_ERROR:  depth #5 filename is not defined\n#    endif\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/lower5.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_ITERATION_LIMITS)\n#    include <boost/preprocessor/iteration/detail/bounds/upper5.hpp>\n#    define BOOST_PP_ITERATION_FLAGS_5() 0\n#    undef BOOST_PP_ITERATION_LIMITS\n# elif defined(BOOST_PP_ITERATION_PARAMS_5)\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(0, BOOST_PP_ITERATION_PARAMS_5)\n#    include <boost/preprocessor/iteration/detail/bounds/lower5.hpp>\n#    define BOOST_PP_VALUE BOOST_PP_ARRAY_ELEM(1, BOOST_PP_ITERATION_PARAMS_5)\n#    include <boost/preprocessor/iteration/detail/bounds/upper5.hpp>\n#    define BOOST_PP_FILENAME_5 BOOST_PP_ARRAY_ELEM(2, BOOST_PP_ITERATION_PARAMS_5)\n#    if BOOST_PP_ARRAY_SIZE(BOOST_PP_ITERATION_PARAMS_5) >= 4\n#        define BOOST_PP_ITERATION_FLAGS_5() BOOST_PP_ARRAY_ELEM(3, BOOST_PP_ITERATION_PARAMS_5)\n#    else\n#        define BOOST_PP_ITERATION_FLAGS_5() 0\n#    endif\n# else\n#    error BOOST_PP_ERROR:  depth #5 iteration boundaries or filename not defined\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 5\n#\n# if (BOOST_PP_ITERATION_START_5) > (BOOST_PP_ITERATION_FINISH_5)\n#    include <boost/preprocessor/iteration/detail/iter/reverse5.hpp>\n# else\n#    if BOOST_PP_ITERATION_START_5 <= 0 && BOOST_PP_ITERATION_FINISH_5 >= 0\n#        define BOOST_PP_ITERATION_5 0\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 1 && BOOST_PP_ITERATION_FINISH_5 >= 1\n#        define BOOST_PP_ITERATION_5 1\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 2 && BOOST_PP_ITERATION_FINISH_5 >= 2\n#        define BOOST_PP_ITERATION_5 2\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 3 && BOOST_PP_ITERATION_FINISH_5 >= 3\n#        define BOOST_PP_ITERATION_5 3\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 4 && BOOST_PP_ITERATION_FINISH_5 >= 4\n#        define BOOST_PP_ITERATION_5 4\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 5 && BOOST_PP_ITERATION_FINISH_5 >= 5\n#        define BOOST_PP_ITERATION_5 5\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 6 && BOOST_PP_ITERATION_FINISH_5 >= 6\n#        define BOOST_PP_ITERATION_5 6\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 7 && BOOST_PP_ITERATION_FINISH_5 >= 7\n#        define BOOST_PP_ITERATION_5 7\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 8 && BOOST_PP_ITERATION_FINISH_5 >= 8\n#        define BOOST_PP_ITERATION_5 8\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 9 && BOOST_PP_ITERATION_FINISH_5 >= 9\n#        define BOOST_PP_ITERATION_5 9\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 10 && BOOST_PP_ITERATION_FINISH_5 >= 10\n#        define BOOST_PP_ITERATION_5 10\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 11 && BOOST_PP_ITERATION_FINISH_5 >= 11\n#        define BOOST_PP_ITERATION_5 11\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 12 && BOOST_PP_ITERATION_FINISH_5 >= 12\n#        define BOOST_PP_ITERATION_5 12\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 13 && BOOST_PP_ITERATION_FINISH_5 >= 13\n#        define BOOST_PP_ITERATION_5 13\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 14 && BOOST_PP_ITERATION_FINISH_5 >= 14\n#        define BOOST_PP_ITERATION_5 14\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 15 && BOOST_PP_ITERATION_FINISH_5 >= 15\n#        define BOOST_PP_ITERATION_5 15\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 16 && BOOST_PP_ITERATION_FINISH_5 >= 16\n#        define BOOST_PP_ITERATION_5 16\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 17 && BOOST_PP_ITERATION_FINISH_5 >= 17\n#        define BOOST_PP_ITERATION_5 17\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 18 && BOOST_PP_ITERATION_FINISH_5 >= 18\n#        define BOOST_PP_ITERATION_5 18\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 19 && BOOST_PP_ITERATION_FINISH_5 >= 19\n#        define BOOST_PP_ITERATION_5 19\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 20 && BOOST_PP_ITERATION_FINISH_5 >= 20\n#        define BOOST_PP_ITERATION_5 20\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 21 && BOOST_PP_ITERATION_FINISH_5 >= 21\n#        define BOOST_PP_ITERATION_5 21\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 22 && BOOST_PP_ITERATION_FINISH_5 >= 22\n#        define BOOST_PP_ITERATION_5 22\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 23 && BOOST_PP_ITERATION_FINISH_5 >= 23\n#        define BOOST_PP_ITERATION_5 23\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 24 && BOOST_PP_ITERATION_FINISH_5 >= 24\n#        define BOOST_PP_ITERATION_5 24\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 25 && BOOST_PP_ITERATION_FINISH_5 >= 25\n#        define BOOST_PP_ITERATION_5 25\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 26 && BOOST_PP_ITERATION_FINISH_5 >= 26\n#        define BOOST_PP_ITERATION_5 26\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 27 && BOOST_PP_ITERATION_FINISH_5 >= 27\n#        define BOOST_PP_ITERATION_5 27\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 28 && BOOST_PP_ITERATION_FINISH_5 >= 28\n#        define BOOST_PP_ITERATION_5 28\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 29 && BOOST_PP_ITERATION_FINISH_5 >= 29\n#        define BOOST_PP_ITERATION_5 29\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 30 && BOOST_PP_ITERATION_FINISH_5 >= 30\n#        define BOOST_PP_ITERATION_5 30\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 31 && BOOST_PP_ITERATION_FINISH_5 >= 31\n#        define BOOST_PP_ITERATION_5 31\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 32 && BOOST_PP_ITERATION_FINISH_5 >= 32\n#        define BOOST_PP_ITERATION_5 32\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 33 && BOOST_PP_ITERATION_FINISH_5 >= 33\n#        define BOOST_PP_ITERATION_5 33\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 34 && BOOST_PP_ITERATION_FINISH_5 >= 34\n#        define BOOST_PP_ITERATION_5 34\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 35 && BOOST_PP_ITERATION_FINISH_5 >= 35\n#        define BOOST_PP_ITERATION_5 35\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 36 && BOOST_PP_ITERATION_FINISH_5 >= 36\n#        define BOOST_PP_ITERATION_5 36\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 37 && BOOST_PP_ITERATION_FINISH_5 >= 37\n#        define BOOST_PP_ITERATION_5 37\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 38 && BOOST_PP_ITERATION_FINISH_5 >= 38\n#        define BOOST_PP_ITERATION_5 38\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 39 && BOOST_PP_ITERATION_FINISH_5 >= 39\n#        define BOOST_PP_ITERATION_5 39\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 40 && BOOST_PP_ITERATION_FINISH_5 >= 40\n#        define BOOST_PP_ITERATION_5 40\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 41 && BOOST_PP_ITERATION_FINISH_5 >= 41\n#        define BOOST_PP_ITERATION_5 41\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 42 && BOOST_PP_ITERATION_FINISH_5 >= 42\n#        define BOOST_PP_ITERATION_5 42\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 43 && BOOST_PP_ITERATION_FINISH_5 >= 43\n#        define BOOST_PP_ITERATION_5 43\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 44 && BOOST_PP_ITERATION_FINISH_5 >= 44\n#        define BOOST_PP_ITERATION_5 44\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 45 && BOOST_PP_ITERATION_FINISH_5 >= 45\n#        define BOOST_PP_ITERATION_5 45\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 46 && BOOST_PP_ITERATION_FINISH_5 >= 46\n#        define BOOST_PP_ITERATION_5 46\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 47 && BOOST_PP_ITERATION_FINISH_5 >= 47\n#        define BOOST_PP_ITERATION_5 47\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 48 && BOOST_PP_ITERATION_FINISH_5 >= 48\n#        define BOOST_PP_ITERATION_5 48\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 49 && BOOST_PP_ITERATION_FINISH_5 >= 49\n#        define BOOST_PP_ITERATION_5 49\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 50 && BOOST_PP_ITERATION_FINISH_5 >= 50\n#        define BOOST_PP_ITERATION_5 50\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 51 && BOOST_PP_ITERATION_FINISH_5 >= 51\n#        define BOOST_PP_ITERATION_5 51\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 52 && BOOST_PP_ITERATION_FINISH_5 >= 52\n#        define BOOST_PP_ITERATION_5 52\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 53 && BOOST_PP_ITERATION_FINISH_5 >= 53\n#        define BOOST_PP_ITERATION_5 53\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 54 && BOOST_PP_ITERATION_FINISH_5 >= 54\n#        define BOOST_PP_ITERATION_5 54\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 55 && BOOST_PP_ITERATION_FINISH_5 >= 55\n#        define BOOST_PP_ITERATION_5 55\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 56 && BOOST_PP_ITERATION_FINISH_5 >= 56\n#        define BOOST_PP_ITERATION_5 56\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 57 && BOOST_PP_ITERATION_FINISH_5 >= 57\n#        define BOOST_PP_ITERATION_5 57\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 58 && BOOST_PP_ITERATION_FINISH_5 >= 58\n#        define BOOST_PP_ITERATION_5 58\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 59 && BOOST_PP_ITERATION_FINISH_5 >= 59\n#        define BOOST_PP_ITERATION_5 59\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 60 && BOOST_PP_ITERATION_FINISH_5 >= 60\n#        define BOOST_PP_ITERATION_5 60\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 61 && BOOST_PP_ITERATION_FINISH_5 >= 61\n#        define BOOST_PP_ITERATION_5 61\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 62 && BOOST_PP_ITERATION_FINISH_5 >= 62\n#        define BOOST_PP_ITERATION_5 62\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 63 && BOOST_PP_ITERATION_FINISH_5 >= 63\n#        define BOOST_PP_ITERATION_5 63\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 64 && BOOST_PP_ITERATION_FINISH_5 >= 64\n#        define BOOST_PP_ITERATION_5 64\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 65 && BOOST_PP_ITERATION_FINISH_5 >= 65\n#        define BOOST_PP_ITERATION_5 65\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 66 && BOOST_PP_ITERATION_FINISH_5 >= 66\n#        define BOOST_PP_ITERATION_5 66\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 67 && BOOST_PP_ITERATION_FINISH_5 >= 67\n#        define BOOST_PP_ITERATION_5 67\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 68 && BOOST_PP_ITERATION_FINISH_5 >= 68\n#        define BOOST_PP_ITERATION_5 68\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 69 && BOOST_PP_ITERATION_FINISH_5 >= 69\n#        define BOOST_PP_ITERATION_5 69\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 70 && BOOST_PP_ITERATION_FINISH_5 >= 70\n#        define BOOST_PP_ITERATION_5 70\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 71 && BOOST_PP_ITERATION_FINISH_5 >= 71\n#        define BOOST_PP_ITERATION_5 71\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 72 && BOOST_PP_ITERATION_FINISH_5 >= 72\n#        define BOOST_PP_ITERATION_5 72\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 73 && BOOST_PP_ITERATION_FINISH_5 >= 73\n#        define BOOST_PP_ITERATION_5 73\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 74 && BOOST_PP_ITERATION_FINISH_5 >= 74\n#        define BOOST_PP_ITERATION_5 74\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 75 && BOOST_PP_ITERATION_FINISH_5 >= 75\n#        define BOOST_PP_ITERATION_5 75\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 76 && BOOST_PP_ITERATION_FINISH_5 >= 76\n#        define BOOST_PP_ITERATION_5 76\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 77 && BOOST_PP_ITERATION_FINISH_5 >= 77\n#        define BOOST_PP_ITERATION_5 77\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 78 && BOOST_PP_ITERATION_FINISH_5 >= 78\n#        define BOOST_PP_ITERATION_5 78\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 79 && BOOST_PP_ITERATION_FINISH_5 >= 79\n#        define BOOST_PP_ITERATION_5 79\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 80 && BOOST_PP_ITERATION_FINISH_5 >= 80\n#        define BOOST_PP_ITERATION_5 80\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 81 && BOOST_PP_ITERATION_FINISH_5 >= 81\n#        define BOOST_PP_ITERATION_5 81\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 82 && BOOST_PP_ITERATION_FINISH_5 >= 82\n#        define BOOST_PP_ITERATION_5 82\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 83 && BOOST_PP_ITERATION_FINISH_5 >= 83\n#        define BOOST_PP_ITERATION_5 83\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 84 && BOOST_PP_ITERATION_FINISH_5 >= 84\n#        define BOOST_PP_ITERATION_5 84\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 85 && BOOST_PP_ITERATION_FINISH_5 >= 85\n#        define BOOST_PP_ITERATION_5 85\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 86 && BOOST_PP_ITERATION_FINISH_5 >= 86\n#        define BOOST_PP_ITERATION_5 86\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 87 && BOOST_PP_ITERATION_FINISH_5 >= 87\n#        define BOOST_PP_ITERATION_5 87\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 88 && BOOST_PP_ITERATION_FINISH_5 >= 88\n#        define BOOST_PP_ITERATION_5 88\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 89 && BOOST_PP_ITERATION_FINISH_5 >= 89\n#        define BOOST_PP_ITERATION_5 89\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 90 && BOOST_PP_ITERATION_FINISH_5 >= 90\n#        define BOOST_PP_ITERATION_5 90\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 91 && BOOST_PP_ITERATION_FINISH_5 >= 91\n#        define BOOST_PP_ITERATION_5 91\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 92 && BOOST_PP_ITERATION_FINISH_5 >= 92\n#        define BOOST_PP_ITERATION_5 92\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 93 && BOOST_PP_ITERATION_FINISH_5 >= 93\n#        define BOOST_PP_ITERATION_5 93\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 94 && BOOST_PP_ITERATION_FINISH_5 >= 94\n#        define BOOST_PP_ITERATION_5 94\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 95 && BOOST_PP_ITERATION_FINISH_5 >= 95\n#        define BOOST_PP_ITERATION_5 95\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 96 && BOOST_PP_ITERATION_FINISH_5 >= 96\n#        define BOOST_PP_ITERATION_5 96\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 97 && BOOST_PP_ITERATION_FINISH_5 >= 97\n#        define BOOST_PP_ITERATION_5 97\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 98 && BOOST_PP_ITERATION_FINISH_5 >= 98\n#        define BOOST_PP_ITERATION_5 98\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 99 && BOOST_PP_ITERATION_FINISH_5 >= 99\n#        define BOOST_PP_ITERATION_5 99\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 100 && BOOST_PP_ITERATION_FINISH_5 >= 100\n#        define BOOST_PP_ITERATION_5 100\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 101 && BOOST_PP_ITERATION_FINISH_5 >= 101\n#        define BOOST_PP_ITERATION_5 101\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 102 && BOOST_PP_ITERATION_FINISH_5 >= 102\n#        define BOOST_PP_ITERATION_5 102\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 103 && BOOST_PP_ITERATION_FINISH_5 >= 103\n#        define BOOST_PP_ITERATION_5 103\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 104 && BOOST_PP_ITERATION_FINISH_5 >= 104\n#        define BOOST_PP_ITERATION_5 104\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 105 && BOOST_PP_ITERATION_FINISH_5 >= 105\n#        define BOOST_PP_ITERATION_5 105\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 106 && BOOST_PP_ITERATION_FINISH_5 >= 106\n#        define BOOST_PP_ITERATION_5 106\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 107 && BOOST_PP_ITERATION_FINISH_5 >= 107\n#        define BOOST_PP_ITERATION_5 107\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 108 && BOOST_PP_ITERATION_FINISH_5 >= 108\n#        define BOOST_PP_ITERATION_5 108\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 109 && BOOST_PP_ITERATION_FINISH_5 >= 109\n#        define BOOST_PP_ITERATION_5 109\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 110 && BOOST_PP_ITERATION_FINISH_5 >= 110\n#        define BOOST_PP_ITERATION_5 110\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 111 && BOOST_PP_ITERATION_FINISH_5 >= 111\n#        define BOOST_PP_ITERATION_5 111\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 112 && BOOST_PP_ITERATION_FINISH_5 >= 112\n#        define BOOST_PP_ITERATION_5 112\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 113 && BOOST_PP_ITERATION_FINISH_5 >= 113\n#        define BOOST_PP_ITERATION_5 113\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 114 && BOOST_PP_ITERATION_FINISH_5 >= 114\n#        define BOOST_PP_ITERATION_5 114\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 115 && BOOST_PP_ITERATION_FINISH_5 >= 115\n#        define BOOST_PP_ITERATION_5 115\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 116 && BOOST_PP_ITERATION_FINISH_5 >= 116\n#        define BOOST_PP_ITERATION_5 116\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 117 && BOOST_PP_ITERATION_FINISH_5 >= 117\n#        define BOOST_PP_ITERATION_5 117\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 118 && BOOST_PP_ITERATION_FINISH_5 >= 118\n#        define BOOST_PP_ITERATION_5 118\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 119 && BOOST_PP_ITERATION_FINISH_5 >= 119\n#        define BOOST_PP_ITERATION_5 119\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 120 && BOOST_PP_ITERATION_FINISH_5 >= 120\n#        define BOOST_PP_ITERATION_5 120\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 121 && BOOST_PP_ITERATION_FINISH_5 >= 121\n#        define BOOST_PP_ITERATION_5 121\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 122 && BOOST_PP_ITERATION_FINISH_5 >= 122\n#        define BOOST_PP_ITERATION_5 122\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 123 && BOOST_PP_ITERATION_FINISH_5 >= 123\n#        define BOOST_PP_ITERATION_5 123\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 124 && BOOST_PP_ITERATION_FINISH_5 >= 124\n#        define BOOST_PP_ITERATION_5 124\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 125 && BOOST_PP_ITERATION_FINISH_5 >= 125\n#        define BOOST_PP_ITERATION_5 125\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 126 && BOOST_PP_ITERATION_FINISH_5 >= 126\n#        define BOOST_PP_ITERATION_5 126\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 127 && BOOST_PP_ITERATION_FINISH_5 >= 127\n#        define BOOST_PP_ITERATION_5 127\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 128 && BOOST_PP_ITERATION_FINISH_5 >= 128\n#        define BOOST_PP_ITERATION_5 128\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 129 && BOOST_PP_ITERATION_FINISH_5 >= 129\n#        define BOOST_PP_ITERATION_5 129\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 130 && BOOST_PP_ITERATION_FINISH_5 >= 130\n#        define BOOST_PP_ITERATION_5 130\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 131 && BOOST_PP_ITERATION_FINISH_5 >= 131\n#        define BOOST_PP_ITERATION_5 131\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 132 && BOOST_PP_ITERATION_FINISH_5 >= 132\n#        define BOOST_PP_ITERATION_5 132\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 133 && BOOST_PP_ITERATION_FINISH_5 >= 133\n#        define BOOST_PP_ITERATION_5 133\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 134 && BOOST_PP_ITERATION_FINISH_5 >= 134\n#        define BOOST_PP_ITERATION_5 134\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 135 && BOOST_PP_ITERATION_FINISH_5 >= 135\n#        define BOOST_PP_ITERATION_5 135\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 136 && BOOST_PP_ITERATION_FINISH_5 >= 136\n#        define BOOST_PP_ITERATION_5 136\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 137 && BOOST_PP_ITERATION_FINISH_5 >= 137\n#        define BOOST_PP_ITERATION_5 137\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 138 && BOOST_PP_ITERATION_FINISH_5 >= 138\n#        define BOOST_PP_ITERATION_5 138\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 139 && BOOST_PP_ITERATION_FINISH_5 >= 139\n#        define BOOST_PP_ITERATION_5 139\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 140 && BOOST_PP_ITERATION_FINISH_5 >= 140\n#        define BOOST_PP_ITERATION_5 140\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 141 && BOOST_PP_ITERATION_FINISH_5 >= 141\n#        define BOOST_PP_ITERATION_5 141\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 142 && BOOST_PP_ITERATION_FINISH_5 >= 142\n#        define BOOST_PP_ITERATION_5 142\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 143 && BOOST_PP_ITERATION_FINISH_5 >= 143\n#        define BOOST_PP_ITERATION_5 143\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 144 && BOOST_PP_ITERATION_FINISH_5 >= 144\n#        define BOOST_PP_ITERATION_5 144\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 145 && BOOST_PP_ITERATION_FINISH_5 >= 145\n#        define BOOST_PP_ITERATION_5 145\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 146 && BOOST_PP_ITERATION_FINISH_5 >= 146\n#        define BOOST_PP_ITERATION_5 146\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 147 && BOOST_PP_ITERATION_FINISH_5 >= 147\n#        define BOOST_PP_ITERATION_5 147\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 148 && BOOST_PP_ITERATION_FINISH_5 >= 148\n#        define BOOST_PP_ITERATION_5 148\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 149 && BOOST_PP_ITERATION_FINISH_5 >= 149\n#        define BOOST_PP_ITERATION_5 149\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 150 && BOOST_PP_ITERATION_FINISH_5 >= 150\n#        define BOOST_PP_ITERATION_5 150\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 151 && BOOST_PP_ITERATION_FINISH_5 >= 151\n#        define BOOST_PP_ITERATION_5 151\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 152 && BOOST_PP_ITERATION_FINISH_5 >= 152\n#        define BOOST_PP_ITERATION_5 152\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 153 && BOOST_PP_ITERATION_FINISH_5 >= 153\n#        define BOOST_PP_ITERATION_5 153\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 154 && BOOST_PP_ITERATION_FINISH_5 >= 154\n#        define BOOST_PP_ITERATION_5 154\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 155 && BOOST_PP_ITERATION_FINISH_5 >= 155\n#        define BOOST_PP_ITERATION_5 155\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 156 && BOOST_PP_ITERATION_FINISH_5 >= 156\n#        define BOOST_PP_ITERATION_5 156\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 157 && BOOST_PP_ITERATION_FINISH_5 >= 157\n#        define BOOST_PP_ITERATION_5 157\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 158 && BOOST_PP_ITERATION_FINISH_5 >= 158\n#        define BOOST_PP_ITERATION_5 158\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 159 && BOOST_PP_ITERATION_FINISH_5 >= 159\n#        define BOOST_PP_ITERATION_5 159\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 160 && BOOST_PP_ITERATION_FINISH_5 >= 160\n#        define BOOST_PP_ITERATION_5 160\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 161 && BOOST_PP_ITERATION_FINISH_5 >= 161\n#        define BOOST_PP_ITERATION_5 161\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 162 && BOOST_PP_ITERATION_FINISH_5 >= 162\n#        define BOOST_PP_ITERATION_5 162\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 163 && BOOST_PP_ITERATION_FINISH_5 >= 163\n#        define BOOST_PP_ITERATION_5 163\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 164 && BOOST_PP_ITERATION_FINISH_5 >= 164\n#        define BOOST_PP_ITERATION_5 164\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 165 && BOOST_PP_ITERATION_FINISH_5 >= 165\n#        define BOOST_PP_ITERATION_5 165\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 166 && BOOST_PP_ITERATION_FINISH_5 >= 166\n#        define BOOST_PP_ITERATION_5 166\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 167 && BOOST_PP_ITERATION_FINISH_5 >= 167\n#        define BOOST_PP_ITERATION_5 167\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 168 && BOOST_PP_ITERATION_FINISH_5 >= 168\n#        define BOOST_PP_ITERATION_5 168\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 169 && BOOST_PP_ITERATION_FINISH_5 >= 169\n#        define BOOST_PP_ITERATION_5 169\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 170 && BOOST_PP_ITERATION_FINISH_5 >= 170\n#        define BOOST_PP_ITERATION_5 170\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 171 && BOOST_PP_ITERATION_FINISH_5 >= 171\n#        define BOOST_PP_ITERATION_5 171\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 172 && BOOST_PP_ITERATION_FINISH_5 >= 172\n#        define BOOST_PP_ITERATION_5 172\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 173 && BOOST_PP_ITERATION_FINISH_5 >= 173\n#        define BOOST_PP_ITERATION_5 173\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 174 && BOOST_PP_ITERATION_FINISH_5 >= 174\n#        define BOOST_PP_ITERATION_5 174\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 175 && BOOST_PP_ITERATION_FINISH_5 >= 175\n#        define BOOST_PP_ITERATION_5 175\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 176 && BOOST_PP_ITERATION_FINISH_5 >= 176\n#        define BOOST_PP_ITERATION_5 176\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 177 && BOOST_PP_ITERATION_FINISH_5 >= 177\n#        define BOOST_PP_ITERATION_5 177\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 178 && BOOST_PP_ITERATION_FINISH_5 >= 178\n#        define BOOST_PP_ITERATION_5 178\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 179 && BOOST_PP_ITERATION_FINISH_5 >= 179\n#        define BOOST_PP_ITERATION_5 179\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 180 && BOOST_PP_ITERATION_FINISH_5 >= 180\n#        define BOOST_PP_ITERATION_5 180\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 181 && BOOST_PP_ITERATION_FINISH_5 >= 181\n#        define BOOST_PP_ITERATION_5 181\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 182 && BOOST_PP_ITERATION_FINISH_5 >= 182\n#        define BOOST_PP_ITERATION_5 182\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 183 && BOOST_PP_ITERATION_FINISH_5 >= 183\n#        define BOOST_PP_ITERATION_5 183\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 184 && BOOST_PP_ITERATION_FINISH_5 >= 184\n#        define BOOST_PP_ITERATION_5 184\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 185 && BOOST_PP_ITERATION_FINISH_5 >= 185\n#        define BOOST_PP_ITERATION_5 185\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 186 && BOOST_PP_ITERATION_FINISH_5 >= 186\n#        define BOOST_PP_ITERATION_5 186\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 187 && BOOST_PP_ITERATION_FINISH_5 >= 187\n#        define BOOST_PP_ITERATION_5 187\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 188 && BOOST_PP_ITERATION_FINISH_5 >= 188\n#        define BOOST_PP_ITERATION_5 188\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 189 && BOOST_PP_ITERATION_FINISH_5 >= 189\n#        define BOOST_PP_ITERATION_5 189\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 190 && BOOST_PP_ITERATION_FINISH_5 >= 190\n#        define BOOST_PP_ITERATION_5 190\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 191 && BOOST_PP_ITERATION_FINISH_5 >= 191\n#        define BOOST_PP_ITERATION_5 191\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 192 && BOOST_PP_ITERATION_FINISH_5 >= 192\n#        define BOOST_PP_ITERATION_5 192\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 193 && BOOST_PP_ITERATION_FINISH_5 >= 193\n#        define BOOST_PP_ITERATION_5 193\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 194 && BOOST_PP_ITERATION_FINISH_5 >= 194\n#        define BOOST_PP_ITERATION_5 194\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 195 && BOOST_PP_ITERATION_FINISH_5 >= 195\n#        define BOOST_PP_ITERATION_5 195\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 196 && BOOST_PP_ITERATION_FINISH_5 >= 196\n#        define BOOST_PP_ITERATION_5 196\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 197 && BOOST_PP_ITERATION_FINISH_5 >= 197\n#        define BOOST_PP_ITERATION_5 197\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 198 && BOOST_PP_ITERATION_FINISH_5 >= 198\n#        define BOOST_PP_ITERATION_5 198\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 199 && BOOST_PP_ITERATION_FINISH_5 >= 199\n#        define BOOST_PP_ITERATION_5 199\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 200 && BOOST_PP_ITERATION_FINISH_5 >= 200\n#        define BOOST_PP_ITERATION_5 200\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 201 && BOOST_PP_ITERATION_FINISH_5 >= 201\n#        define BOOST_PP_ITERATION_5 201\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 202 && BOOST_PP_ITERATION_FINISH_5 >= 202\n#        define BOOST_PP_ITERATION_5 202\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 203 && BOOST_PP_ITERATION_FINISH_5 >= 203\n#        define BOOST_PP_ITERATION_5 203\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 204 && BOOST_PP_ITERATION_FINISH_5 >= 204\n#        define BOOST_PP_ITERATION_5 204\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 205 && BOOST_PP_ITERATION_FINISH_5 >= 205\n#        define BOOST_PP_ITERATION_5 205\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 206 && BOOST_PP_ITERATION_FINISH_5 >= 206\n#        define BOOST_PP_ITERATION_5 206\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 207 && BOOST_PP_ITERATION_FINISH_5 >= 207\n#        define BOOST_PP_ITERATION_5 207\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 208 && BOOST_PP_ITERATION_FINISH_5 >= 208\n#        define BOOST_PP_ITERATION_5 208\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 209 && BOOST_PP_ITERATION_FINISH_5 >= 209\n#        define BOOST_PP_ITERATION_5 209\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 210 && BOOST_PP_ITERATION_FINISH_5 >= 210\n#        define BOOST_PP_ITERATION_5 210\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 211 && BOOST_PP_ITERATION_FINISH_5 >= 211\n#        define BOOST_PP_ITERATION_5 211\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 212 && BOOST_PP_ITERATION_FINISH_5 >= 212\n#        define BOOST_PP_ITERATION_5 212\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 213 && BOOST_PP_ITERATION_FINISH_5 >= 213\n#        define BOOST_PP_ITERATION_5 213\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 214 && BOOST_PP_ITERATION_FINISH_5 >= 214\n#        define BOOST_PP_ITERATION_5 214\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 215 && BOOST_PP_ITERATION_FINISH_5 >= 215\n#        define BOOST_PP_ITERATION_5 215\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 216 && BOOST_PP_ITERATION_FINISH_5 >= 216\n#        define BOOST_PP_ITERATION_5 216\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 217 && BOOST_PP_ITERATION_FINISH_5 >= 217\n#        define BOOST_PP_ITERATION_5 217\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 218 && BOOST_PP_ITERATION_FINISH_5 >= 218\n#        define BOOST_PP_ITERATION_5 218\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 219 && BOOST_PP_ITERATION_FINISH_5 >= 219\n#        define BOOST_PP_ITERATION_5 219\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 220 && BOOST_PP_ITERATION_FINISH_5 >= 220\n#        define BOOST_PP_ITERATION_5 220\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 221 && BOOST_PP_ITERATION_FINISH_5 >= 221\n#        define BOOST_PP_ITERATION_5 221\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 222 && BOOST_PP_ITERATION_FINISH_5 >= 222\n#        define BOOST_PP_ITERATION_5 222\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 223 && BOOST_PP_ITERATION_FINISH_5 >= 223\n#        define BOOST_PP_ITERATION_5 223\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 224 && BOOST_PP_ITERATION_FINISH_5 >= 224\n#        define BOOST_PP_ITERATION_5 224\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 225 && BOOST_PP_ITERATION_FINISH_5 >= 225\n#        define BOOST_PP_ITERATION_5 225\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 226 && BOOST_PP_ITERATION_FINISH_5 >= 226\n#        define BOOST_PP_ITERATION_5 226\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 227 && BOOST_PP_ITERATION_FINISH_5 >= 227\n#        define BOOST_PP_ITERATION_5 227\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 228 && BOOST_PP_ITERATION_FINISH_5 >= 228\n#        define BOOST_PP_ITERATION_5 228\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 229 && BOOST_PP_ITERATION_FINISH_5 >= 229\n#        define BOOST_PP_ITERATION_5 229\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 230 && BOOST_PP_ITERATION_FINISH_5 >= 230\n#        define BOOST_PP_ITERATION_5 230\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 231 && BOOST_PP_ITERATION_FINISH_5 >= 231\n#        define BOOST_PP_ITERATION_5 231\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 232 && BOOST_PP_ITERATION_FINISH_5 >= 232\n#        define BOOST_PP_ITERATION_5 232\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 233 && BOOST_PP_ITERATION_FINISH_5 >= 233\n#        define BOOST_PP_ITERATION_5 233\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 234 && BOOST_PP_ITERATION_FINISH_5 >= 234\n#        define BOOST_PP_ITERATION_5 234\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 235 && BOOST_PP_ITERATION_FINISH_5 >= 235\n#        define BOOST_PP_ITERATION_5 235\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 236 && BOOST_PP_ITERATION_FINISH_5 >= 236\n#        define BOOST_PP_ITERATION_5 236\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 237 && BOOST_PP_ITERATION_FINISH_5 >= 237\n#        define BOOST_PP_ITERATION_5 237\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 238 && BOOST_PP_ITERATION_FINISH_5 >= 238\n#        define BOOST_PP_ITERATION_5 238\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 239 && BOOST_PP_ITERATION_FINISH_5 >= 239\n#        define BOOST_PP_ITERATION_5 239\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 240 && BOOST_PP_ITERATION_FINISH_5 >= 240\n#        define BOOST_PP_ITERATION_5 240\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 241 && BOOST_PP_ITERATION_FINISH_5 >= 241\n#        define BOOST_PP_ITERATION_5 241\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 242 && BOOST_PP_ITERATION_FINISH_5 >= 242\n#        define BOOST_PP_ITERATION_5 242\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 243 && BOOST_PP_ITERATION_FINISH_5 >= 243\n#        define BOOST_PP_ITERATION_5 243\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 244 && BOOST_PP_ITERATION_FINISH_5 >= 244\n#        define BOOST_PP_ITERATION_5 244\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 245 && BOOST_PP_ITERATION_FINISH_5 >= 245\n#        define BOOST_PP_ITERATION_5 245\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 246 && BOOST_PP_ITERATION_FINISH_5 >= 246\n#        define BOOST_PP_ITERATION_5 246\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 247 && BOOST_PP_ITERATION_FINISH_5 >= 247\n#        define BOOST_PP_ITERATION_5 247\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 248 && BOOST_PP_ITERATION_FINISH_5 >= 248\n#        define BOOST_PP_ITERATION_5 248\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 249 && BOOST_PP_ITERATION_FINISH_5 >= 249\n#        define BOOST_PP_ITERATION_5 249\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 250 && BOOST_PP_ITERATION_FINISH_5 >= 250\n#        define BOOST_PP_ITERATION_5 250\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 251 && BOOST_PP_ITERATION_FINISH_5 >= 251\n#        define BOOST_PP_ITERATION_5 251\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 252 && BOOST_PP_ITERATION_FINISH_5 >= 252\n#        define BOOST_PP_ITERATION_5 252\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 253 && BOOST_PP_ITERATION_FINISH_5 >= 253\n#        define BOOST_PP_ITERATION_5 253\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 254 && BOOST_PP_ITERATION_FINISH_5 >= 254\n#        define BOOST_PP_ITERATION_5 254\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 255 && BOOST_PP_ITERATION_FINISH_5 >= 255\n#        define BOOST_PP_ITERATION_5 255\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n#    if BOOST_PP_ITERATION_START_5 <= 256 && BOOST_PP_ITERATION_FINISH_5 >= 256\n#        define BOOST_PP_ITERATION_5 256\n#        include BOOST_PP_FILENAME_5\n#        undef BOOST_PP_ITERATION_5\n#    endif\n# endif\n#\n# undef BOOST_PP_ITERATION_DEPTH\n# define BOOST_PP_ITERATION_DEPTH() 4\n#\n# undef BOOST_PP_ITERATION_START_5\n# undef BOOST_PP_ITERATION_FINISH_5\n# undef BOOST_PP_FILENAME_5\n#\n# undef BOOST_PP_ITERATION_FLAGS_5\n# undef BOOST_PP_ITERATION_PARAMS_5\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/reverse1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_1 <= 256 && BOOST_PP_ITERATION_START_1 >= 256\n#    define BOOST_PP_ITERATION_1 256\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 255 && BOOST_PP_ITERATION_START_1 >= 255\n#    define BOOST_PP_ITERATION_1 255\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 254 && BOOST_PP_ITERATION_START_1 >= 254\n#    define BOOST_PP_ITERATION_1 254\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 253 && BOOST_PP_ITERATION_START_1 >= 253\n#    define BOOST_PP_ITERATION_1 253\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 252 && BOOST_PP_ITERATION_START_1 >= 252\n#    define BOOST_PP_ITERATION_1 252\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 251 && BOOST_PP_ITERATION_START_1 >= 251\n#    define BOOST_PP_ITERATION_1 251\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 250 && BOOST_PP_ITERATION_START_1 >= 250\n#    define BOOST_PP_ITERATION_1 250\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 249 && BOOST_PP_ITERATION_START_1 >= 249\n#    define BOOST_PP_ITERATION_1 249\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 248 && BOOST_PP_ITERATION_START_1 >= 248\n#    define BOOST_PP_ITERATION_1 248\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 247 && BOOST_PP_ITERATION_START_1 >= 247\n#    define BOOST_PP_ITERATION_1 247\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 246 && BOOST_PP_ITERATION_START_1 >= 246\n#    define BOOST_PP_ITERATION_1 246\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 245 && BOOST_PP_ITERATION_START_1 >= 245\n#    define BOOST_PP_ITERATION_1 245\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 244 && BOOST_PP_ITERATION_START_1 >= 244\n#    define BOOST_PP_ITERATION_1 244\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 243 && BOOST_PP_ITERATION_START_1 >= 243\n#    define BOOST_PP_ITERATION_1 243\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 242 && BOOST_PP_ITERATION_START_1 >= 242\n#    define BOOST_PP_ITERATION_1 242\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 241 && BOOST_PP_ITERATION_START_1 >= 241\n#    define BOOST_PP_ITERATION_1 241\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 240 && BOOST_PP_ITERATION_START_1 >= 240\n#    define BOOST_PP_ITERATION_1 240\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 239 && BOOST_PP_ITERATION_START_1 >= 239\n#    define BOOST_PP_ITERATION_1 239\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 238 && BOOST_PP_ITERATION_START_1 >= 238\n#    define BOOST_PP_ITERATION_1 238\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 237 && BOOST_PP_ITERATION_START_1 >= 237\n#    define BOOST_PP_ITERATION_1 237\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 236 && BOOST_PP_ITERATION_START_1 >= 236\n#    define BOOST_PP_ITERATION_1 236\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 235 && BOOST_PP_ITERATION_START_1 >= 235\n#    define BOOST_PP_ITERATION_1 235\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 234 && BOOST_PP_ITERATION_START_1 >= 234\n#    define BOOST_PP_ITERATION_1 234\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 233 && BOOST_PP_ITERATION_START_1 >= 233\n#    define BOOST_PP_ITERATION_1 233\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 232 && BOOST_PP_ITERATION_START_1 >= 232\n#    define BOOST_PP_ITERATION_1 232\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 231 && BOOST_PP_ITERATION_START_1 >= 231\n#    define BOOST_PP_ITERATION_1 231\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 230 && BOOST_PP_ITERATION_START_1 >= 230\n#    define BOOST_PP_ITERATION_1 230\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 229 && BOOST_PP_ITERATION_START_1 >= 229\n#    define BOOST_PP_ITERATION_1 229\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 228 && BOOST_PP_ITERATION_START_1 >= 228\n#    define BOOST_PP_ITERATION_1 228\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 227 && BOOST_PP_ITERATION_START_1 >= 227\n#    define BOOST_PP_ITERATION_1 227\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 226 && BOOST_PP_ITERATION_START_1 >= 226\n#    define BOOST_PP_ITERATION_1 226\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 225 && BOOST_PP_ITERATION_START_1 >= 225\n#    define BOOST_PP_ITERATION_1 225\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 224 && BOOST_PP_ITERATION_START_1 >= 224\n#    define BOOST_PP_ITERATION_1 224\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 223 && BOOST_PP_ITERATION_START_1 >= 223\n#    define BOOST_PP_ITERATION_1 223\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 222 && BOOST_PP_ITERATION_START_1 >= 222\n#    define BOOST_PP_ITERATION_1 222\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 221 && BOOST_PP_ITERATION_START_1 >= 221\n#    define BOOST_PP_ITERATION_1 221\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 220 && BOOST_PP_ITERATION_START_1 >= 220\n#    define BOOST_PP_ITERATION_1 220\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 219 && BOOST_PP_ITERATION_START_1 >= 219\n#    define BOOST_PP_ITERATION_1 219\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 218 && BOOST_PP_ITERATION_START_1 >= 218\n#    define BOOST_PP_ITERATION_1 218\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 217 && BOOST_PP_ITERATION_START_1 >= 217\n#    define BOOST_PP_ITERATION_1 217\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 216 && BOOST_PP_ITERATION_START_1 >= 216\n#    define BOOST_PP_ITERATION_1 216\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 215 && BOOST_PP_ITERATION_START_1 >= 215\n#    define BOOST_PP_ITERATION_1 215\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 214 && BOOST_PP_ITERATION_START_1 >= 214\n#    define BOOST_PP_ITERATION_1 214\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 213 && BOOST_PP_ITERATION_START_1 >= 213\n#    define BOOST_PP_ITERATION_1 213\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 212 && BOOST_PP_ITERATION_START_1 >= 212\n#    define BOOST_PP_ITERATION_1 212\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 211 && BOOST_PP_ITERATION_START_1 >= 211\n#    define BOOST_PP_ITERATION_1 211\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 210 && BOOST_PP_ITERATION_START_1 >= 210\n#    define BOOST_PP_ITERATION_1 210\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 209 && BOOST_PP_ITERATION_START_1 >= 209\n#    define BOOST_PP_ITERATION_1 209\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 208 && BOOST_PP_ITERATION_START_1 >= 208\n#    define BOOST_PP_ITERATION_1 208\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 207 && BOOST_PP_ITERATION_START_1 >= 207\n#    define BOOST_PP_ITERATION_1 207\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 206 && BOOST_PP_ITERATION_START_1 >= 206\n#    define BOOST_PP_ITERATION_1 206\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 205 && BOOST_PP_ITERATION_START_1 >= 205\n#    define BOOST_PP_ITERATION_1 205\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 204 && BOOST_PP_ITERATION_START_1 >= 204\n#    define BOOST_PP_ITERATION_1 204\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 203 && BOOST_PP_ITERATION_START_1 >= 203\n#    define BOOST_PP_ITERATION_1 203\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 202 && BOOST_PP_ITERATION_START_1 >= 202\n#    define BOOST_PP_ITERATION_1 202\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 201 && BOOST_PP_ITERATION_START_1 >= 201\n#    define BOOST_PP_ITERATION_1 201\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 200 && BOOST_PP_ITERATION_START_1 >= 200\n#    define BOOST_PP_ITERATION_1 200\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 199 && BOOST_PP_ITERATION_START_1 >= 199\n#    define BOOST_PP_ITERATION_1 199\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 198 && BOOST_PP_ITERATION_START_1 >= 198\n#    define BOOST_PP_ITERATION_1 198\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 197 && BOOST_PP_ITERATION_START_1 >= 197\n#    define BOOST_PP_ITERATION_1 197\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 196 && BOOST_PP_ITERATION_START_1 >= 196\n#    define BOOST_PP_ITERATION_1 196\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 195 && BOOST_PP_ITERATION_START_1 >= 195\n#    define BOOST_PP_ITERATION_1 195\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 194 && BOOST_PP_ITERATION_START_1 >= 194\n#    define BOOST_PP_ITERATION_1 194\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 193 && BOOST_PP_ITERATION_START_1 >= 193\n#    define BOOST_PP_ITERATION_1 193\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 192 && BOOST_PP_ITERATION_START_1 >= 192\n#    define BOOST_PP_ITERATION_1 192\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 191 && BOOST_PP_ITERATION_START_1 >= 191\n#    define BOOST_PP_ITERATION_1 191\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 190 && BOOST_PP_ITERATION_START_1 >= 190\n#    define BOOST_PP_ITERATION_1 190\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 189 && BOOST_PP_ITERATION_START_1 >= 189\n#    define BOOST_PP_ITERATION_1 189\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 188 && BOOST_PP_ITERATION_START_1 >= 188\n#    define BOOST_PP_ITERATION_1 188\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 187 && BOOST_PP_ITERATION_START_1 >= 187\n#    define BOOST_PP_ITERATION_1 187\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 186 && BOOST_PP_ITERATION_START_1 >= 186\n#    define BOOST_PP_ITERATION_1 186\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 185 && BOOST_PP_ITERATION_START_1 >= 185\n#    define BOOST_PP_ITERATION_1 185\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 184 && BOOST_PP_ITERATION_START_1 >= 184\n#    define BOOST_PP_ITERATION_1 184\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 183 && BOOST_PP_ITERATION_START_1 >= 183\n#    define BOOST_PP_ITERATION_1 183\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 182 && BOOST_PP_ITERATION_START_1 >= 182\n#    define BOOST_PP_ITERATION_1 182\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 181 && BOOST_PP_ITERATION_START_1 >= 181\n#    define BOOST_PP_ITERATION_1 181\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 180 && BOOST_PP_ITERATION_START_1 >= 180\n#    define BOOST_PP_ITERATION_1 180\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 179 && BOOST_PP_ITERATION_START_1 >= 179\n#    define BOOST_PP_ITERATION_1 179\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 178 && BOOST_PP_ITERATION_START_1 >= 178\n#    define BOOST_PP_ITERATION_1 178\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 177 && BOOST_PP_ITERATION_START_1 >= 177\n#    define BOOST_PP_ITERATION_1 177\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 176 && BOOST_PP_ITERATION_START_1 >= 176\n#    define BOOST_PP_ITERATION_1 176\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 175 && BOOST_PP_ITERATION_START_1 >= 175\n#    define BOOST_PP_ITERATION_1 175\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 174 && BOOST_PP_ITERATION_START_1 >= 174\n#    define BOOST_PP_ITERATION_1 174\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 173 && BOOST_PP_ITERATION_START_1 >= 173\n#    define BOOST_PP_ITERATION_1 173\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 172 && BOOST_PP_ITERATION_START_1 >= 172\n#    define BOOST_PP_ITERATION_1 172\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 171 && BOOST_PP_ITERATION_START_1 >= 171\n#    define BOOST_PP_ITERATION_1 171\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 170 && BOOST_PP_ITERATION_START_1 >= 170\n#    define BOOST_PP_ITERATION_1 170\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 169 && BOOST_PP_ITERATION_START_1 >= 169\n#    define BOOST_PP_ITERATION_1 169\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 168 && BOOST_PP_ITERATION_START_1 >= 168\n#    define BOOST_PP_ITERATION_1 168\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 167 && BOOST_PP_ITERATION_START_1 >= 167\n#    define BOOST_PP_ITERATION_1 167\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 166 && BOOST_PP_ITERATION_START_1 >= 166\n#    define BOOST_PP_ITERATION_1 166\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 165 && BOOST_PP_ITERATION_START_1 >= 165\n#    define BOOST_PP_ITERATION_1 165\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 164 && BOOST_PP_ITERATION_START_1 >= 164\n#    define BOOST_PP_ITERATION_1 164\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 163 && BOOST_PP_ITERATION_START_1 >= 163\n#    define BOOST_PP_ITERATION_1 163\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 162 && BOOST_PP_ITERATION_START_1 >= 162\n#    define BOOST_PP_ITERATION_1 162\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 161 && BOOST_PP_ITERATION_START_1 >= 161\n#    define BOOST_PP_ITERATION_1 161\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 160 && BOOST_PP_ITERATION_START_1 >= 160\n#    define BOOST_PP_ITERATION_1 160\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 159 && BOOST_PP_ITERATION_START_1 >= 159\n#    define BOOST_PP_ITERATION_1 159\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 158 && BOOST_PP_ITERATION_START_1 >= 158\n#    define BOOST_PP_ITERATION_1 158\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 157 && BOOST_PP_ITERATION_START_1 >= 157\n#    define BOOST_PP_ITERATION_1 157\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 156 && BOOST_PP_ITERATION_START_1 >= 156\n#    define BOOST_PP_ITERATION_1 156\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 155 && BOOST_PP_ITERATION_START_1 >= 155\n#    define BOOST_PP_ITERATION_1 155\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 154 && BOOST_PP_ITERATION_START_1 >= 154\n#    define BOOST_PP_ITERATION_1 154\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 153 && BOOST_PP_ITERATION_START_1 >= 153\n#    define BOOST_PP_ITERATION_1 153\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 152 && BOOST_PP_ITERATION_START_1 >= 152\n#    define BOOST_PP_ITERATION_1 152\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 151 && BOOST_PP_ITERATION_START_1 >= 151\n#    define BOOST_PP_ITERATION_1 151\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 150 && BOOST_PP_ITERATION_START_1 >= 150\n#    define BOOST_PP_ITERATION_1 150\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 149 && BOOST_PP_ITERATION_START_1 >= 149\n#    define BOOST_PP_ITERATION_1 149\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 148 && BOOST_PP_ITERATION_START_1 >= 148\n#    define BOOST_PP_ITERATION_1 148\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 147 && BOOST_PP_ITERATION_START_1 >= 147\n#    define BOOST_PP_ITERATION_1 147\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 146 && BOOST_PP_ITERATION_START_1 >= 146\n#    define BOOST_PP_ITERATION_1 146\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 145 && BOOST_PP_ITERATION_START_1 >= 145\n#    define BOOST_PP_ITERATION_1 145\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 144 && BOOST_PP_ITERATION_START_1 >= 144\n#    define BOOST_PP_ITERATION_1 144\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 143 && BOOST_PP_ITERATION_START_1 >= 143\n#    define BOOST_PP_ITERATION_1 143\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 142 && BOOST_PP_ITERATION_START_1 >= 142\n#    define BOOST_PP_ITERATION_1 142\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 141 && BOOST_PP_ITERATION_START_1 >= 141\n#    define BOOST_PP_ITERATION_1 141\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 140 && BOOST_PP_ITERATION_START_1 >= 140\n#    define BOOST_PP_ITERATION_1 140\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 139 && BOOST_PP_ITERATION_START_1 >= 139\n#    define BOOST_PP_ITERATION_1 139\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 138 && BOOST_PP_ITERATION_START_1 >= 138\n#    define BOOST_PP_ITERATION_1 138\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 137 && BOOST_PP_ITERATION_START_1 >= 137\n#    define BOOST_PP_ITERATION_1 137\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 136 && BOOST_PP_ITERATION_START_1 >= 136\n#    define BOOST_PP_ITERATION_1 136\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 135 && BOOST_PP_ITERATION_START_1 >= 135\n#    define BOOST_PP_ITERATION_1 135\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 134 && BOOST_PP_ITERATION_START_1 >= 134\n#    define BOOST_PP_ITERATION_1 134\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 133 && BOOST_PP_ITERATION_START_1 >= 133\n#    define BOOST_PP_ITERATION_1 133\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 132 && BOOST_PP_ITERATION_START_1 >= 132\n#    define BOOST_PP_ITERATION_1 132\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 131 && BOOST_PP_ITERATION_START_1 >= 131\n#    define BOOST_PP_ITERATION_1 131\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 130 && BOOST_PP_ITERATION_START_1 >= 130\n#    define BOOST_PP_ITERATION_1 130\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 129 && BOOST_PP_ITERATION_START_1 >= 129\n#    define BOOST_PP_ITERATION_1 129\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 128 && BOOST_PP_ITERATION_START_1 >= 128\n#    define BOOST_PP_ITERATION_1 128\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 127 && BOOST_PP_ITERATION_START_1 >= 127\n#    define BOOST_PP_ITERATION_1 127\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 126 && BOOST_PP_ITERATION_START_1 >= 126\n#    define BOOST_PP_ITERATION_1 126\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 125 && BOOST_PP_ITERATION_START_1 >= 125\n#    define BOOST_PP_ITERATION_1 125\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 124 && BOOST_PP_ITERATION_START_1 >= 124\n#    define BOOST_PP_ITERATION_1 124\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 123 && BOOST_PP_ITERATION_START_1 >= 123\n#    define BOOST_PP_ITERATION_1 123\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 122 && BOOST_PP_ITERATION_START_1 >= 122\n#    define BOOST_PP_ITERATION_1 122\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 121 && BOOST_PP_ITERATION_START_1 >= 121\n#    define BOOST_PP_ITERATION_1 121\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 120 && BOOST_PP_ITERATION_START_1 >= 120\n#    define BOOST_PP_ITERATION_1 120\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 119 && BOOST_PP_ITERATION_START_1 >= 119\n#    define BOOST_PP_ITERATION_1 119\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 118 && BOOST_PP_ITERATION_START_1 >= 118\n#    define BOOST_PP_ITERATION_1 118\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 117 && BOOST_PP_ITERATION_START_1 >= 117\n#    define BOOST_PP_ITERATION_1 117\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 116 && BOOST_PP_ITERATION_START_1 >= 116\n#    define BOOST_PP_ITERATION_1 116\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 115 && BOOST_PP_ITERATION_START_1 >= 115\n#    define BOOST_PP_ITERATION_1 115\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 114 && BOOST_PP_ITERATION_START_1 >= 114\n#    define BOOST_PP_ITERATION_1 114\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 113 && BOOST_PP_ITERATION_START_1 >= 113\n#    define BOOST_PP_ITERATION_1 113\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 112 && BOOST_PP_ITERATION_START_1 >= 112\n#    define BOOST_PP_ITERATION_1 112\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 111 && BOOST_PP_ITERATION_START_1 >= 111\n#    define BOOST_PP_ITERATION_1 111\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 110 && BOOST_PP_ITERATION_START_1 >= 110\n#    define BOOST_PP_ITERATION_1 110\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 109 && BOOST_PP_ITERATION_START_1 >= 109\n#    define BOOST_PP_ITERATION_1 109\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 108 && BOOST_PP_ITERATION_START_1 >= 108\n#    define BOOST_PP_ITERATION_1 108\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 107 && BOOST_PP_ITERATION_START_1 >= 107\n#    define BOOST_PP_ITERATION_1 107\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 106 && BOOST_PP_ITERATION_START_1 >= 106\n#    define BOOST_PP_ITERATION_1 106\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 105 && BOOST_PP_ITERATION_START_1 >= 105\n#    define BOOST_PP_ITERATION_1 105\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 104 && BOOST_PP_ITERATION_START_1 >= 104\n#    define BOOST_PP_ITERATION_1 104\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 103 && BOOST_PP_ITERATION_START_1 >= 103\n#    define BOOST_PP_ITERATION_1 103\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 102 && BOOST_PP_ITERATION_START_1 >= 102\n#    define BOOST_PP_ITERATION_1 102\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 101 && BOOST_PP_ITERATION_START_1 >= 101\n#    define BOOST_PP_ITERATION_1 101\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 100 && BOOST_PP_ITERATION_START_1 >= 100\n#    define BOOST_PP_ITERATION_1 100\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 99 && BOOST_PP_ITERATION_START_1 >= 99\n#    define BOOST_PP_ITERATION_1 99\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 98 && BOOST_PP_ITERATION_START_1 >= 98\n#    define BOOST_PP_ITERATION_1 98\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 97 && BOOST_PP_ITERATION_START_1 >= 97\n#    define BOOST_PP_ITERATION_1 97\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 96 && BOOST_PP_ITERATION_START_1 >= 96\n#    define BOOST_PP_ITERATION_1 96\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 95 && BOOST_PP_ITERATION_START_1 >= 95\n#    define BOOST_PP_ITERATION_1 95\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 94 && BOOST_PP_ITERATION_START_1 >= 94\n#    define BOOST_PP_ITERATION_1 94\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 93 && BOOST_PP_ITERATION_START_1 >= 93\n#    define BOOST_PP_ITERATION_1 93\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 92 && BOOST_PP_ITERATION_START_1 >= 92\n#    define BOOST_PP_ITERATION_1 92\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 91 && BOOST_PP_ITERATION_START_1 >= 91\n#    define BOOST_PP_ITERATION_1 91\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 90 && BOOST_PP_ITERATION_START_1 >= 90\n#    define BOOST_PP_ITERATION_1 90\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 89 && BOOST_PP_ITERATION_START_1 >= 89\n#    define BOOST_PP_ITERATION_1 89\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 88 && BOOST_PP_ITERATION_START_1 >= 88\n#    define BOOST_PP_ITERATION_1 88\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 87 && BOOST_PP_ITERATION_START_1 >= 87\n#    define BOOST_PP_ITERATION_1 87\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 86 && BOOST_PP_ITERATION_START_1 >= 86\n#    define BOOST_PP_ITERATION_1 86\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 85 && BOOST_PP_ITERATION_START_1 >= 85\n#    define BOOST_PP_ITERATION_1 85\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 84 && BOOST_PP_ITERATION_START_1 >= 84\n#    define BOOST_PP_ITERATION_1 84\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 83 && BOOST_PP_ITERATION_START_1 >= 83\n#    define BOOST_PP_ITERATION_1 83\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 82 && BOOST_PP_ITERATION_START_1 >= 82\n#    define BOOST_PP_ITERATION_1 82\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 81 && BOOST_PP_ITERATION_START_1 >= 81\n#    define BOOST_PP_ITERATION_1 81\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 80 && BOOST_PP_ITERATION_START_1 >= 80\n#    define BOOST_PP_ITERATION_1 80\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 79 && BOOST_PP_ITERATION_START_1 >= 79\n#    define BOOST_PP_ITERATION_1 79\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 78 && BOOST_PP_ITERATION_START_1 >= 78\n#    define BOOST_PP_ITERATION_1 78\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 77 && BOOST_PP_ITERATION_START_1 >= 77\n#    define BOOST_PP_ITERATION_1 77\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 76 && BOOST_PP_ITERATION_START_1 >= 76\n#    define BOOST_PP_ITERATION_1 76\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 75 && BOOST_PP_ITERATION_START_1 >= 75\n#    define BOOST_PP_ITERATION_1 75\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 74 && BOOST_PP_ITERATION_START_1 >= 74\n#    define BOOST_PP_ITERATION_1 74\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 73 && BOOST_PP_ITERATION_START_1 >= 73\n#    define BOOST_PP_ITERATION_1 73\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 72 && BOOST_PP_ITERATION_START_1 >= 72\n#    define BOOST_PP_ITERATION_1 72\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 71 && BOOST_PP_ITERATION_START_1 >= 71\n#    define BOOST_PP_ITERATION_1 71\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 70 && BOOST_PP_ITERATION_START_1 >= 70\n#    define BOOST_PP_ITERATION_1 70\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 69 && BOOST_PP_ITERATION_START_1 >= 69\n#    define BOOST_PP_ITERATION_1 69\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 68 && BOOST_PP_ITERATION_START_1 >= 68\n#    define BOOST_PP_ITERATION_1 68\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 67 && BOOST_PP_ITERATION_START_1 >= 67\n#    define BOOST_PP_ITERATION_1 67\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 66 && BOOST_PP_ITERATION_START_1 >= 66\n#    define BOOST_PP_ITERATION_1 66\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 65 && BOOST_PP_ITERATION_START_1 >= 65\n#    define BOOST_PP_ITERATION_1 65\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 64 && BOOST_PP_ITERATION_START_1 >= 64\n#    define BOOST_PP_ITERATION_1 64\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 63 && BOOST_PP_ITERATION_START_1 >= 63\n#    define BOOST_PP_ITERATION_1 63\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 62 && BOOST_PP_ITERATION_START_1 >= 62\n#    define BOOST_PP_ITERATION_1 62\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 61 && BOOST_PP_ITERATION_START_1 >= 61\n#    define BOOST_PP_ITERATION_1 61\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 60 && BOOST_PP_ITERATION_START_1 >= 60\n#    define BOOST_PP_ITERATION_1 60\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 59 && BOOST_PP_ITERATION_START_1 >= 59\n#    define BOOST_PP_ITERATION_1 59\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 58 && BOOST_PP_ITERATION_START_1 >= 58\n#    define BOOST_PP_ITERATION_1 58\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 57 && BOOST_PP_ITERATION_START_1 >= 57\n#    define BOOST_PP_ITERATION_1 57\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 56 && BOOST_PP_ITERATION_START_1 >= 56\n#    define BOOST_PP_ITERATION_1 56\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 55 && BOOST_PP_ITERATION_START_1 >= 55\n#    define BOOST_PP_ITERATION_1 55\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 54 && BOOST_PP_ITERATION_START_1 >= 54\n#    define BOOST_PP_ITERATION_1 54\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 53 && BOOST_PP_ITERATION_START_1 >= 53\n#    define BOOST_PP_ITERATION_1 53\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 52 && BOOST_PP_ITERATION_START_1 >= 52\n#    define BOOST_PP_ITERATION_1 52\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 51 && BOOST_PP_ITERATION_START_1 >= 51\n#    define BOOST_PP_ITERATION_1 51\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 50 && BOOST_PP_ITERATION_START_1 >= 50\n#    define BOOST_PP_ITERATION_1 50\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 49 && BOOST_PP_ITERATION_START_1 >= 49\n#    define BOOST_PP_ITERATION_1 49\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 48 && BOOST_PP_ITERATION_START_1 >= 48\n#    define BOOST_PP_ITERATION_1 48\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 47 && BOOST_PP_ITERATION_START_1 >= 47\n#    define BOOST_PP_ITERATION_1 47\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 46 && BOOST_PP_ITERATION_START_1 >= 46\n#    define BOOST_PP_ITERATION_1 46\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 45 && BOOST_PP_ITERATION_START_1 >= 45\n#    define BOOST_PP_ITERATION_1 45\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 44 && BOOST_PP_ITERATION_START_1 >= 44\n#    define BOOST_PP_ITERATION_1 44\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 43 && BOOST_PP_ITERATION_START_1 >= 43\n#    define BOOST_PP_ITERATION_1 43\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 42 && BOOST_PP_ITERATION_START_1 >= 42\n#    define BOOST_PP_ITERATION_1 42\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 41 && BOOST_PP_ITERATION_START_1 >= 41\n#    define BOOST_PP_ITERATION_1 41\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 40 && BOOST_PP_ITERATION_START_1 >= 40\n#    define BOOST_PP_ITERATION_1 40\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 39 && BOOST_PP_ITERATION_START_1 >= 39\n#    define BOOST_PP_ITERATION_1 39\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 38 && BOOST_PP_ITERATION_START_1 >= 38\n#    define BOOST_PP_ITERATION_1 38\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 37 && BOOST_PP_ITERATION_START_1 >= 37\n#    define BOOST_PP_ITERATION_1 37\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 36 && BOOST_PP_ITERATION_START_1 >= 36\n#    define BOOST_PP_ITERATION_1 36\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 35 && BOOST_PP_ITERATION_START_1 >= 35\n#    define BOOST_PP_ITERATION_1 35\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 34 && BOOST_PP_ITERATION_START_1 >= 34\n#    define BOOST_PP_ITERATION_1 34\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 33 && BOOST_PP_ITERATION_START_1 >= 33\n#    define BOOST_PP_ITERATION_1 33\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 32 && BOOST_PP_ITERATION_START_1 >= 32\n#    define BOOST_PP_ITERATION_1 32\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 31 && BOOST_PP_ITERATION_START_1 >= 31\n#    define BOOST_PP_ITERATION_1 31\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 30 && BOOST_PP_ITERATION_START_1 >= 30\n#    define BOOST_PP_ITERATION_1 30\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 29 && BOOST_PP_ITERATION_START_1 >= 29\n#    define BOOST_PP_ITERATION_1 29\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 28 && BOOST_PP_ITERATION_START_1 >= 28\n#    define BOOST_PP_ITERATION_1 28\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 27 && BOOST_PP_ITERATION_START_1 >= 27\n#    define BOOST_PP_ITERATION_1 27\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 26 && BOOST_PP_ITERATION_START_1 >= 26\n#    define BOOST_PP_ITERATION_1 26\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 25 && BOOST_PP_ITERATION_START_1 >= 25\n#    define BOOST_PP_ITERATION_1 25\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 24 && BOOST_PP_ITERATION_START_1 >= 24\n#    define BOOST_PP_ITERATION_1 24\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 23 && BOOST_PP_ITERATION_START_1 >= 23\n#    define BOOST_PP_ITERATION_1 23\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 22 && BOOST_PP_ITERATION_START_1 >= 22\n#    define BOOST_PP_ITERATION_1 22\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 21 && BOOST_PP_ITERATION_START_1 >= 21\n#    define BOOST_PP_ITERATION_1 21\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 20 && BOOST_PP_ITERATION_START_1 >= 20\n#    define BOOST_PP_ITERATION_1 20\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 19 && BOOST_PP_ITERATION_START_1 >= 19\n#    define BOOST_PP_ITERATION_1 19\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 18 && BOOST_PP_ITERATION_START_1 >= 18\n#    define BOOST_PP_ITERATION_1 18\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 17 && BOOST_PP_ITERATION_START_1 >= 17\n#    define BOOST_PP_ITERATION_1 17\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 16 && BOOST_PP_ITERATION_START_1 >= 16\n#    define BOOST_PP_ITERATION_1 16\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 15 && BOOST_PP_ITERATION_START_1 >= 15\n#    define BOOST_PP_ITERATION_1 15\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 14 && BOOST_PP_ITERATION_START_1 >= 14\n#    define BOOST_PP_ITERATION_1 14\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 13 && BOOST_PP_ITERATION_START_1 >= 13\n#    define BOOST_PP_ITERATION_1 13\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 12 && BOOST_PP_ITERATION_START_1 >= 12\n#    define BOOST_PP_ITERATION_1 12\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 11 && BOOST_PP_ITERATION_START_1 >= 11\n#    define BOOST_PP_ITERATION_1 11\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 10 && BOOST_PP_ITERATION_START_1 >= 10\n#    define BOOST_PP_ITERATION_1 10\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 9 && BOOST_PP_ITERATION_START_1 >= 9\n#    define BOOST_PP_ITERATION_1 9\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 8 && BOOST_PP_ITERATION_START_1 >= 8\n#    define BOOST_PP_ITERATION_1 8\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 7 && BOOST_PP_ITERATION_START_1 >= 7\n#    define BOOST_PP_ITERATION_1 7\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 6 && BOOST_PP_ITERATION_START_1 >= 6\n#    define BOOST_PP_ITERATION_1 6\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 5 && BOOST_PP_ITERATION_START_1 >= 5\n#    define BOOST_PP_ITERATION_1 5\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 4 && BOOST_PP_ITERATION_START_1 >= 4\n#    define BOOST_PP_ITERATION_1 4\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 3 && BOOST_PP_ITERATION_START_1 >= 3\n#    define BOOST_PP_ITERATION_1 3\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 2 && BOOST_PP_ITERATION_START_1 >= 2\n#    define BOOST_PP_ITERATION_1 2\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 1 && BOOST_PP_ITERATION_START_1 >= 1\n#    define BOOST_PP_ITERATION_1 1\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n# if BOOST_PP_ITERATION_FINISH_1 <= 0 && BOOST_PP_ITERATION_START_1 >= 0\n#    define BOOST_PP_ITERATION_1 0\n#    include BOOST_PP_FILENAME_1\n#    undef BOOST_PP_ITERATION_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/reverse2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_2 <= 256 && BOOST_PP_ITERATION_START_2 >= 256\n#    define BOOST_PP_ITERATION_2 256\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 255 && BOOST_PP_ITERATION_START_2 >= 255\n#    define BOOST_PP_ITERATION_2 255\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 254 && BOOST_PP_ITERATION_START_2 >= 254\n#    define BOOST_PP_ITERATION_2 254\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 253 && BOOST_PP_ITERATION_START_2 >= 253\n#    define BOOST_PP_ITERATION_2 253\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 252 && BOOST_PP_ITERATION_START_2 >= 252\n#    define BOOST_PP_ITERATION_2 252\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 251 && BOOST_PP_ITERATION_START_2 >= 251\n#    define BOOST_PP_ITERATION_2 251\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 250 && BOOST_PP_ITERATION_START_2 >= 250\n#    define BOOST_PP_ITERATION_2 250\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 249 && BOOST_PP_ITERATION_START_2 >= 249\n#    define BOOST_PP_ITERATION_2 249\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 248 && BOOST_PP_ITERATION_START_2 >= 248\n#    define BOOST_PP_ITERATION_2 248\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 247 && BOOST_PP_ITERATION_START_2 >= 247\n#    define BOOST_PP_ITERATION_2 247\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 246 && BOOST_PP_ITERATION_START_2 >= 246\n#    define BOOST_PP_ITERATION_2 246\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 245 && BOOST_PP_ITERATION_START_2 >= 245\n#    define BOOST_PP_ITERATION_2 245\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 244 && BOOST_PP_ITERATION_START_2 >= 244\n#    define BOOST_PP_ITERATION_2 244\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 243 && BOOST_PP_ITERATION_START_2 >= 243\n#    define BOOST_PP_ITERATION_2 243\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 242 && BOOST_PP_ITERATION_START_2 >= 242\n#    define BOOST_PP_ITERATION_2 242\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 241 && BOOST_PP_ITERATION_START_2 >= 241\n#    define BOOST_PP_ITERATION_2 241\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 240 && BOOST_PP_ITERATION_START_2 >= 240\n#    define BOOST_PP_ITERATION_2 240\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 239 && BOOST_PP_ITERATION_START_2 >= 239\n#    define BOOST_PP_ITERATION_2 239\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 238 && BOOST_PP_ITERATION_START_2 >= 238\n#    define BOOST_PP_ITERATION_2 238\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 237 && BOOST_PP_ITERATION_START_2 >= 237\n#    define BOOST_PP_ITERATION_2 237\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 236 && BOOST_PP_ITERATION_START_2 >= 236\n#    define BOOST_PP_ITERATION_2 236\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 235 && BOOST_PP_ITERATION_START_2 >= 235\n#    define BOOST_PP_ITERATION_2 235\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 234 && BOOST_PP_ITERATION_START_2 >= 234\n#    define BOOST_PP_ITERATION_2 234\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 233 && BOOST_PP_ITERATION_START_2 >= 233\n#    define BOOST_PP_ITERATION_2 233\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 232 && BOOST_PP_ITERATION_START_2 >= 232\n#    define BOOST_PP_ITERATION_2 232\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 231 && BOOST_PP_ITERATION_START_2 >= 231\n#    define BOOST_PP_ITERATION_2 231\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 230 && BOOST_PP_ITERATION_START_2 >= 230\n#    define BOOST_PP_ITERATION_2 230\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 229 && BOOST_PP_ITERATION_START_2 >= 229\n#    define BOOST_PP_ITERATION_2 229\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 228 && BOOST_PP_ITERATION_START_2 >= 228\n#    define BOOST_PP_ITERATION_2 228\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 227 && BOOST_PP_ITERATION_START_2 >= 227\n#    define BOOST_PP_ITERATION_2 227\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 226 && BOOST_PP_ITERATION_START_2 >= 226\n#    define BOOST_PP_ITERATION_2 226\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 225 && BOOST_PP_ITERATION_START_2 >= 225\n#    define BOOST_PP_ITERATION_2 225\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 224 && BOOST_PP_ITERATION_START_2 >= 224\n#    define BOOST_PP_ITERATION_2 224\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 223 && BOOST_PP_ITERATION_START_2 >= 223\n#    define BOOST_PP_ITERATION_2 223\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 222 && BOOST_PP_ITERATION_START_2 >= 222\n#    define BOOST_PP_ITERATION_2 222\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 221 && BOOST_PP_ITERATION_START_2 >= 221\n#    define BOOST_PP_ITERATION_2 221\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 220 && BOOST_PP_ITERATION_START_2 >= 220\n#    define BOOST_PP_ITERATION_2 220\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 219 && BOOST_PP_ITERATION_START_2 >= 219\n#    define BOOST_PP_ITERATION_2 219\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 218 && BOOST_PP_ITERATION_START_2 >= 218\n#    define BOOST_PP_ITERATION_2 218\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 217 && BOOST_PP_ITERATION_START_2 >= 217\n#    define BOOST_PP_ITERATION_2 217\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 216 && BOOST_PP_ITERATION_START_2 >= 216\n#    define BOOST_PP_ITERATION_2 216\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 215 && BOOST_PP_ITERATION_START_2 >= 215\n#    define BOOST_PP_ITERATION_2 215\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 214 && BOOST_PP_ITERATION_START_2 >= 214\n#    define BOOST_PP_ITERATION_2 214\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 213 && BOOST_PP_ITERATION_START_2 >= 213\n#    define BOOST_PP_ITERATION_2 213\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 212 && BOOST_PP_ITERATION_START_2 >= 212\n#    define BOOST_PP_ITERATION_2 212\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 211 && BOOST_PP_ITERATION_START_2 >= 211\n#    define BOOST_PP_ITERATION_2 211\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 210 && BOOST_PP_ITERATION_START_2 >= 210\n#    define BOOST_PP_ITERATION_2 210\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 209 && BOOST_PP_ITERATION_START_2 >= 209\n#    define BOOST_PP_ITERATION_2 209\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 208 && BOOST_PP_ITERATION_START_2 >= 208\n#    define BOOST_PP_ITERATION_2 208\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 207 && BOOST_PP_ITERATION_START_2 >= 207\n#    define BOOST_PP_ITERATION_2 207\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 206 && BOOST_PP_ITERATION_START_2 >= 206\n#    define BOOST_PP_ITERATION_2 206\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 205 && BOOST_PP_ITERATION_START_2 >= 205\n#    define BOOST_PP_ITERATION_2 205\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 204 && BOOST_PP_ITERATION_START_2 >= 204\n#    define BOOST_PP_ITERATION_2 204\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 203 && BOOST_PP_ITERATION_START_2 >= 203\n#    define BOOST_PP_ITERATION_2 203\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 202 && BOOST_PP_ITERATION_START_2 >= 202\n#    define BOOST_PP_ITERATION_2 202\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 201 && BOOST_PP_ITERATION_START_2 >= 201\n#    define BOOST_PP_ITERATION_2 201\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 200 && BOOST_PP_ITERATION_START_2 >= 200\n#    define BOOST_PP_ITERATION_2 200\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 199 && BOOST_PP_ITERATION_START_2 >= 199\n#    define BOOST_PP_ITERATION_2 199\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 198 && BOOST_PP_ITERATION_START_2 >= 198\n#    define BOOST_PP_ITERATION_2 198\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 197 && BOOST_PP_ITERATION_START_2 >= 197\n#    define BOOST_PP_ITERATION_2 197\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 196 && BOOST_PP_ITERATION_START_2 >= 196\n#    define BOOST_PP_ITERATION_2 196\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 195 && BOOST_PP_ITERATION_START_2 >= 195\n#    define BOOST_PP_ITERATION_2 195\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 194 && BOOST_PP_ITERATION_START_2 >= 194\n#    define BOOST_PP_ITERATION_2 194\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 193 && BOOST_PP_ITERATION_START_2 >= 193\n#    define BOOST_PP_ITERATION_2 193\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 192 && BOOST_PP_ITERATION_START_2 >= 192\n#    define BOOST_PP_ITERATION_2 192\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 191 && BOOST_PP_ITERATION_START_2 >= 191\n#    define BOOST_PP_ITERATION_2 191\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 190 && BOOST_PP_ITERATION_START_2 >= 190\n#    define BOOST_PP_ITERATION_2 190\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 189 && BOOST_PP_ITERATION_START_2 >= 189\n#    define BOOST_PP_ITERATION_2 189\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 188 && BOOST_PP_ITERATION_START_2 >= 188\n#    define BOOST_PP_ITERATION_2 188\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 187 && BOOST_PP_ITERATION_START_2 >= 187\n#    define BOOST_PP_ITERATION_2 187\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 186 && BOOST_PP_ITERATION_START_2 >= 186\n#    define BOOST_PP_ITERATION_2 186\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 185 && BOOST_PP_ITERATION_START_2 >= 185\n#    define BOOST_PP_ITERATION_2 185\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 184 && BOOST_PP_ITERATION_START_2 >= 184\n#    define BOOST_PP_ITERATION_2 184\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 183 && BOOST_PP_ITERATION_START_2 >= 183\n#    define BOOST_PP_ITERATION_2 183\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 182 && BOOST_PP_ITERATION_START_2 >= 182\n#    define BOOST_PP_ITERATION_2 182\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 181 && BOOST_PP_ITERATION_START_2 >= 181\n#    define BOOST_PP_ITERATION_2 181\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 180 && BOOST_PP_ITERATION_START_2 >= 180\n#    define BOOST_PP_ITERATION_2 180\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 179 && BOOST_PP_ITERATION_START_2 >= 179\n#    define BOOST_PP_ITERATION_2 179\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 178 && BOOST_PP_ITERATION_START_2 >= 178\n#    define BOOST_PP_ITERATION_2 178\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 177 && BOOST_PP_ITERATION_START_2 >= 177\n#    define BOOST_PP_ITERATION_2 177\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 176 && BOOST_PP_ITERATION_START_2 >= 176\n#    define BOOST_PP_ITERATION_2 176\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 175 && BOOST_PP_ITERATION_START_2 >= 175\n#    define BOOST_PP_ITERATION_2 175\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 174 && BOOST_PP_ITERATION_START_2 >= 174\n#    define BOOST_PP_ITERATION_2 174\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 173 && BOOST_PP_ITERATION_START_2 >= 173\n#    define BOOST_PP_ITERATION_2 173\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 172 && BOOST_PP_ITERATION_START_2 >= 172\n#    define BOOST_PP_ITERATION_2 172\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 171 && BOOST_PP_ITERATION_START_2 >= 171\n#    define BOOST_PP_ITERATION_2 171\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 170 && BOOST_PP_ITERATION_START_2 >= 170\n#    define BOOST_PP_ITERATION_2 170\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 169 && BOOST_PP_ITERATION_START_2 >= 169\n#    define BOOST_PP_ITERATION_2 169\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 168 && BOOST_PP_ITERATION_START_2 >= 168\n#    define BOOST_PP_ITERATION_2 168\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 167 && BOOST_PP_ITERATION_START_2 >= 167\n#    define BOOST_PP_ITERATION_2 167\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 166 && BOOST_PP_ITERATION_START_2 >= 166\n#    define BOOST_PP_ITERATION_2 166\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 165 && BOOST_PP_ITERATION_START_2 >= 165\n#    define BOOST_PP_ITERATION_2 165\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 164 && BOOST_PP_ITERATION_START_2 >= 164\n#    define BOOST_PP_ITERATION_2 164\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 163 && BOOST_PP_ITERATION_START_2 >= 163\n#    define BOOST_PP_ITERATION_2 163\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 162 && BOOST_PP_ITERATION_START_2 >= 162\n#    define BOOST_PP_ITERATION_2 162\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 161 && BOOST_PP_ITERATION_START_2 >= 161\n#    define BOOST_PP_ITERATION_2 161\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 160 && BOOST_PP_ITERATION_START_2 >= 160\n#    define BOOST_PP_ITERATION_2 160\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 159 && BOOST_PP_ITERATION_START_2 >= 159\n#    define BOOST_PP_ITERATION_2 159\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 158 && BOOST_PP_ITERATION_START_2 >= 158\n#    define BOOST_PP_ITERATION_2 158\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 157 && BOOST_PP_ITERATION_START_2 >= 157\n#    define BOOST_PP_ITERATION_2 157\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 156 && BOOST_PP_ITERATION_START_2 >= 156\n#    define BOOST_PP_ITERATION_2 156\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 155 && BOOST_PP_ITERATION_START_2 >= 155\n#    define BOOST_PP_ITERATION_2 155\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 154 && BOOST_PP_ITERATION_START_2 >= 154\n#    define BOOST_PP_ITERATION_2 154\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 153 && BOOST_PP_ITERATION_START_2 >= 153\n#    define BOOST_PP_ITERATION_2 153\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 152 && BOOST_PP_ITERATION_START_2 >= 152\n#    define BOOST_PP_ITERATION_2 152\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 151 && BOOST_PP_ITERATION_START_2 >= 151\n#    define BOOST_PP_ITERATION_2 151\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 150 && BOOST_PP_ITERATION_START_2 >= 150\n#    define BOOST_PP_ITERATION_2 150\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 149 && BOOST_PP_ITERATION_START_2 >= 149\n#    define BOOST_PP_ITERATION_2 149\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 148 && BOOST_PP_ITERATION_START_2 >= 148\n#    define BOOST_PP_ITERATION_2 148\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 147 && BOOST_PP_ITERATION_START_2 >= 147\n#    define BOOST_PP_ITERATION_2 147\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 146 && BOOST_PP_ITERATION_START_2 >= 146\n#    define BOOST_PP_ITERATION_2 146\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 145 && BOOST_PP_ITERATION_START_2 >= 145\n#    define BOOST_PP_ITERATION_2 145\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 144 && BOOST_PP_ITERATION_START_2 >= 144\n#    define BOOST_PP_ITERATION_2 144\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 143 && BOOST_PP_ITERATION_START_2 >= 143\n#    define BOOST_PP_ITERATION_2 143\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 142 && BOOST_PP_ITERATION_START_2 >= 142\n#    define BOOST_PP_ITERATION_2 142\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 141 && BOOST_PP_ITERATION_START_2 >= 141\n#    define BOOST_PP_ITERATION_2 141\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 140 && BOOST_PP_ITERATION_START_2 >= 140\n#    define BOOST_PP_ITERATION_2 140\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 139 && BOOST_PP_ITERATION_START_2 >= 139\n#    define BOOST_PP_ITERATION_2 139\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 138 && BOOST_PP_ITERATION_START_2 >= 138\n#    define BOOST_PP_ITERATION_2 138\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 137 && BOOST_PP_ITERATION_START_2 >= 137\n#    define BOOST_PP_ITERATION_2 137\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 136 && BOOST_PP_ITERATION_START_2 >= 136\n#    define BOOST_PP_ITERATION_2 136\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 135 && BOOST_PP_ITERATION_START_2 >= 135\n#    define BOOST_PP_ITERATION_2 135\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 134 && BOOST_PP_ITERATION_START_2 >= 134\n#    define BOOST_PP_ITERATION_2 134\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 133 && BOOST_PP_ITERATION_START_2 >= 133\n#    define BOOST_PP_ITERATION_2 133\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 132 && BOOST_PP_ITERATION_START_2 >= 132\n#    define BOOST_PP_ITERATION_2 132\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 131 && BOOST_PP_ITERATION_START_2 >= 131\n#    define BOOST_PP_ITERATION_2 131\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 130 && BOOST_PP_ITERATION_START_2 >= 130\n#    define BOOST_PP_ITERATION_2 130\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 129 && BOOST_PP_ITERATION_START_2 >= 129\n#    define BOOST_PP_ITERATION_2 129\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 128 && BOOST_PP_ITERATION_START_2 >= 128\n#    define BOOST_PP_ITERATION_2 128\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 127 && BOOST_PP_ITERATION_START_2 >= 127\n#    define BOOST_PP_ITERATION_2 127\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 126 && BOOST_PP_ITERATION_START_2 >= 126\n#    define BOOST_PP_ITERATION_2 126\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 125 && BOOST_PP_ITERATION_START_2 >= 125\n#    define BOOST_PP_ITERATION_2 125\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 124 && BOOST_PP_ITERATION_START_2 >= 124\n#    define BOOST_PP_ITERATION_2 124\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 123 && BOOST_PP_ITERATION_START_2 >= 123\n#    define BOOST_PP_ITERATION_2 123\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 122 && BOOST_PP_ITERATION_START_2 >= 122\n#    define BOOST_PP_ITERATION_2 122\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 121 && BOOST_PP_ITERATION_START_2 >= 121\n#    define BOOST_PP_ITERATION_2 121\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 120 && BOOST_PP_ITERATION_START_2 >= 120\n#    define BOOST_PP_ITERATION_2 120\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 119 && BOOST_PP_ITERATION_START_2 >= 119\n#    define BOOST_PP_ITERATION_2 119\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 118 && BOOST_PP_ITERATION_START_2 >= 118\n#    define BOOST_PP_ITERATION_2 118\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 117 && BOOST_PP_ITERATION_START_2 >= 117\n#    define BOOST_PP_ITERATION_2 117\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 116 && BOOST_PP_ITERATION_START_2 >= 116\n#    define BOOST_PP_ITERATION_2 116\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 115 && BOOST_PP_ITERATION_START_2 >= 115\n#    define BOOST_PP_ITERATION_2 115\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 114 && BOOST_PP_ITERATION_START_2 >= 114\n#    define BOOST_PP_ITERATION_2 114\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 113 && BOOST_PP_ITERATION_START_2 >= 113\n#    define BOOST_PP_ITERATION_2 113\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 112 && BOOST_PP_ITERATION_START_2 >= 112\n#    define BOOST_PP_ITERATION_2 112\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 111 && BOOST_PP_ITERATION_START_2 >= 111\n#    define BOOST_PP_ITERATION_2 111\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 110 && BOOST_PP_ITERATION_START_2 >= 110\n#    define BOOST_PP_ITERATION_2 110\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 109 && BOOST_PP_ITERATION_START_2 >= 109\n#    define BOOST_PP_ITERATION_2 109\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 108 && BOOST_PP_ITERATION_START_2 >= 108\n#    define BOOST_PP_ITERATION_2 108\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 107 && BOOST_PP_ITERATION_START_2 >= 107\n#    define BOOST_PP_ITERATION_2 107\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 106 && BOOST_PP_ITERATION_START_2 >= 106\n#    define BOOST_PP_ITERATION_2 106\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 105 && BOOST_PP_ITERATION_START_2 >= 105\n#    define BOOST_PP_ITERATION_2 105\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 104 && BOOST_PP_ITERATION_START_2 >= 104\n#    define BOOST_PP_ITERATION_2 104\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 103 && BOOST_PP_ITERATION_START_2 >= 103\n#    define BOOST_PP_ITERATION_2 103\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 102 && BOOST_PP_ITERATION_START_2 >= 102\n#    define BOOST_PP_ITERATION_2 102\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 101 && BOOST_PP_ITERATION_START_2 >= 101\n#    define BOOST_PP_ITERATION_2 101\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 100 && BOOST_PP_ITERATION_START_2 >= 100\n#    define BOOST_PP_ITERATION_2 100\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 99 && BOOST_PP_ITERATION_START_2 >= 99\n#    define BOOST_PP_ITERATION_2 99\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 98 && BOOST_PP_ITERATION_START_2 >= 98\n#    define BOOST_PP_ITERATION_2 98\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 97 && BOOST_PP_ITERATION_START_2 >= 97\n#    define BOOST_PP_ITERATION_2 97\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 96 && BOOST_PP_ITERATION_START_2 >= 96\n#    define BOOST_PP_ITERATION_2 96\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 95 && BOOST_PP_ITERATION_START_2 >= 95\n#    define BOOST_PP_ITERATION_2 95\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 94 && BOOST_PP_ITERATION_START_2 >= 94\n#    define BOOST_PP_ITERATION_2 94\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 93 && BOOST_PP_ITERATION_START_2 >= 93\n#    define BOOST_PP_ITERATION_2 93\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 92 && BOOST_PP_ITERATION_START_2 >= 92\n#    define BOOST_PP_ITERATION_2 92\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 91 && BOOST_PP_ITERATION_START_2 >= 91\n#    define BOOST_PP_ITERATION_2 91\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 90 && BOOST_PP_ITERATION_START_2 >= 90\n#    define BOOST_PP_ITERATION_2 90\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 89 && BOOST_PP_ITERATION_START_2 >= 89\n#    define BOOST_PP_ITERATION_2 89\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 88 && BOOST_PP_ITERATION_START_2 >= 88\n#    define BOOST_PP_ITERATION_2 88\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 87 && BOOST_PP_ITERATION_START_2 >= 87\n#    define BOOST_PP_ITERATION_2 87\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 86 && BOOST_PP_ITERATION_START_2 >= 86\n#    define BOOST_PP_ITERATION_2 86\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 85 && BOOST_PP_ITERATION_START_2 >= 85\n#    define BOOST_PP_ITERATION_2 85\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 84 && BOOST_PP_ITERATION_START_2 >= 84\n#    define BOOST_PP_ITERATION_2 84\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 83 && BOOST_PP_ITERATION_START_2 >= 83\n#    define BOOST_PP_ITERATION_2 83\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 82 && BOOST_PP_ITERATION_START_2 >= 82\n#    define BOOST_PP_ITERATION_2 82\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 81 && BOOST_PP_ITERATION_START_2 >= 81\n#    define BOOST_PP_ITERATION_2 81\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 80 && BOOST_PP_ITERATION_START_2 >= 80\n#    define BOOST_PP_ITERATION_2 80\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 79 && BOOST_PP_ITERATION_START_2 >= 79\n#    define BOOST_PP_ITERATION_2 79\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 78 && BOOST_PP_ITERATION_START_2 >= 78\n#    define BOOST_PP_ITERATION_2 78\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 77 && BOOST_PP_ITERATION_START_2 >= 77\n#    define BOOST_PP_ITERATION_2 77\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 76 && BOOST_PP_ITERATION_START_2 >= 76\n#    define BOOST_PP_ITERATION_2 76\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 75 && BOOST_PP_ITERATION_START_2 >= 75\n#    define BOOST_PP_ITERATION_2 75\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 74 && BOOST_PP_ITERATION_START_2 >= 74\n#    define BOOST_PP_ITERATION_2 74\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 73 && BOOST_PP_ITERATION_START_2 >= 73\n#    define BOOST_PP_ITERATION_2 73\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 72 && BOOST_PP_ITERATION_START_2 >= 72\n#    define BOOST_PP_ITERATION_2 72\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 71 && BOOST_PP_ITERATION_START_2 >= 71\n#    define BOOST_PP_ITERATION_2 71\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 70 && BOOST_PP_ITERATION_START_2 >= 70\n#    define BOOST_PP_ITERATION_2 70\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 69 && BOOST_PP_ITERATION_START_2 >= 69\n#    define BOOST_PP_ITERATION_2 69\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 68 && BOOST_PP_ITERATION_START_2 >= 68\n#    define BOOST_PP_ITERATION_2 68\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 67 && BOOST_PP_ITERATION_START_2 >= 67\n#    define BOOST_PP_ITERATION_2 67\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 66 && BOOST_PP_ITERATION_START_2 >= 66\n#    define BOOST_PP_ITERATION_2 66\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 65 && BOOST_PP_ITERATION_START_2 >= 65\n#    define BOOST_PP_ITERATION_2 65\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 64 && BOOST_PP_ITERATION_START_2 >= 64\n#    define BOOST_PP_ITERATION_2 64\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 63 && BOOST_PP_ITERATION_START_2 >= 63\n#    define BOOST_PP_ITERATION_2 63\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 62 && BOOST_PP_ITERATION_START_2 >= 62\n#    define BOOST_PP_ITERATION_2 62\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 61 && BOOST_PP_ITERATION_START_2 >= 61\n#    define BOOST_PP_ITERATION_2 61\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 60 && BOOST_PP_ITERATION_START_2 >= 60\n#    define BOOST_PP_ITERATION_2 60\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 59 && BOOST_PP_ITERATION_START_2 >= 59\n#    define BOOST_PP_ITERATION_2 59\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 58 && BOOST_PP_ITERATION_START_2 >= 58\n#    define BOOST_PP_ITERATION_2 58\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 57 && BOOST_PP_ITERATION_START_2 >= 57\n#    define BOOST_PP_ITERATION_2 57\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 56 && BOOST_PP_ITERATION_START_2 >= 56\n#    define BOOST_PP_ITERATION_2 56\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 55 && BOOST_PP_ITERATION_START_2 >= 55\n#    define BOOST_PP_ITERATION_2 55\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 54 && BOOST_PP_ITERATION_START_2 >= 54\n#    define BOOST_PP_ITERATION_2 54\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 53 && BOOST_PP_ITERATION_START_2 >= 53\n#    define BOOST_PP_ITERATION_2 53\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 52 && BOOST_PP_ITERATION_START_2 >= 52\n#    define BOOST_PP_ITERATION_2 52\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 51 && BOOST_PP_ITERATION_START_2 >= 51\n#    define BOOST_PP_ITERATION_2 51\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 50 && BOOST_PP_ITERATION_START_2 >= 50\n#    define BOOST_PP_ITERATION_2 50\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 49 && BOOST_PP_ITERATION_START_2 >= 49\n#    define BOOST_PP_ITERATION_2 49\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 48 && BOOST_PP_ITERATION_START_2 >= 48\n#    define BOOST_PP_ITERATION_2 48\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 47 && BOOST_PP_ITERATION_START_2 >= 47\n#    define BOOST_PP_ITERATION_2 47\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 46 && BOOST_PP_ITERATION_START_2 >= 46\n#    define BOOST_PP_ITERATION_2 46\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 45 && BOOST_PP_ITERATION_START_2 >= 45\n#    define BOOST_PP_ITERATION_2 45\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 44 && BOOST_PP_ITERATION_START_2 >= 44\n#    define BOOST_PP_ITERATION_2 44\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 43 && BOOST_PP_ITERATION_START_2 >= 43\n#    define BOOST_PP_ITERATION_2 43\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 42 && BOOST_PP_ITERATION_START_2 >= 42\n#    define BOOST_PP_ITERATION_2 42\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 41 && BOOST_PP_ITERATION_START_2 >= 41\n#    define BOOST_PP_ITERATION_2 41\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 40 && BOOST_PP_ITERATION_START_2 >= 40\n#    define BOOST_PP_ITERATION_2 40\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 39 && BOOST_PP_ITERATION_START_2 >= 39\n#    define BOOST_PP_ITERATION_2 39\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 38 && BOOST_PP_ITERATION_START_2 >= 38\n#    define BOOST_PP_ITERATION_2 38\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 37 && BOOST_PP_ITERATION_START_2 >= 37\n#    define BOOST_PP_ITERATION_2 37\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 36 && BOOST_PP_ITERATION_START_2 >= 36\n#    define BOOST_PP_ITERATION_2 36\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 35 && BOOST_PP_ITERATION_START_2 >= 35\n#    define BOOST_PP_ITERATION_2 35\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 34 && BOOST_PP_ITERATION_START_2 >= 34\n#    define BOOST_PP_ITERATION_2 34\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 33 && BOOST_PP_ITERATION_START_2 >= 33\n#    define BOOST_PP_ITERATION_2 33\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 32 && BOOST_PP_ITERATION_START_2 >= 32\n#    define BOOST_PP_ITERATION_2 32\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 31 && BOOST_PP_ITERATION_START_2 >= 31\n#    define BOOST_PP_ITERATION_2 31\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 30 && BOOST_PP_ITERATION_START_2 >= 30\n#    define BOOST_PP_ITERATION_2 30\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 29 && BOOST_PP_ITERATION_START_2 >= 29\n#    define BOOST_PP_ITERATION_2 29\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 28 && BOOST_PP_ITERATION_START_2 >= 28\n#    define BOOST_PP_ITERATION_2 28\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 27 && BOOST_PP_ITERATION_START_2 >= 27\n#    define BOOST_PP_ITERATION_2 27\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 26 && BOOST_PP_ITERATION_START_2 >= 26\n#    define BOOST_PP_ITERATION_2 26\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 25 && BOOST_PP_ITERATION_START_2 >= 25\n#    define BOOST_PP_ITERATION_2 25\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 24 && BOOST_PP_ITERATION_START_2 >= 24\n#    define BOOST_PP_ITERATION_2 24\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 23 && BOOST_PP_ITERATION_START_2 >= 23\n#    define BOOST_PP_ITERATION_2 23\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 22 && BOOST_PP_ITERATION_START_2 >= 22\n#    define BOOST_PP_ITERATION_2 22\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 21 && BOOST_PP_ITERATION_START_2 >= 21\n#    define BOOST_PP_ITERATION_2 21\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 20 && BOOST_PP_ITERATION_START_2 >= 20\n#    define BOOST_PP_ITERATION_2 20\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 19 && BOOST_PP_ITERATION_START_2 >= 19\n#    define BOOST_PP_ITERATION_2 19\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 18 && BOOST_PP_ITERATION_START_2 >= 18\n#    define BOOST_PP_ITERATION_2 18\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 17 && BOOST_PP_ITERATION_START_2 >= 17\n#    define BOOST_PP_ITERATION_2 17\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 16 && BOOST_PP_ITERATION_START_2 >= 16\n#    define BOOST_PP_ITERATION_2 16\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 15 && BOOST_PP_ITERATION_START_2 >= 15\n#    define BOOST_PP_ITERATION_2 15\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 14 && BOOST_PP_ITERATION_START_2 >= 14\n#    define BOOST_PP_ITERATION_2 14\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 13 && BOOST_PP_ITERATION_START_2 >= 13\n#    define BOOST_PP_ITERATION_2 13\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 12 && BOOST_PP_ITERATION_START_2 >= 12\n#    define BOOST_PP_ITERATION_2 12\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 11 && BOOST_PP_ITERATION_START_2 >= 11\n#    define BOOST_PP_ITERATION_2 11\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 10 && BOOST_PP_ITERATION_START_2 >= 10\n#    define BOOST_PP_ITERATION_2 10\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 9 && BOOST_PP_ITERATION_START_2 >= 9\n#    define BOOST_PP_ITERATION_2 9\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 8 && BOOST_PP_ITERATION_START_2 >= 8\n#    define BOOST_PP_ITERATION_2 8\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 7 && BOOST_PP_ITERATION_START_2 >= 7\n#    define BOOST_PP_ITERATION_2 7\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 6 && BOOST_PP_ITERATION_START_2 >= 6\n#    define BOOST_PP_ITERATION_2 6\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 5 && BOOST_PP_ITERATION_START_2 >= 5\n#    define BOOST_PP_ITERATION_2 5\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 4 && BOOST_PP_ITERATION_START_2 >= 4\n#    define BOOST_PP_ITERATION_2 4\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 3 && BOOST_PP_ITERATION_START_2 >= 3\n#    define BOOST_PP_ITERATION_2 3\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 2 && BOOST_PP_ITERATION_START_2 >= 2\n#    define BOOST_PP_ITERATION_2 2\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 1 && BOOST_PP_ITERATION_START_2 >= 1\n#    define BOOST_PP_ITERATION_2 1\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n# if BOOST_PP_ITERATION_FINISH_2 <= 0 && BOOST_PP_ITERATION_START_2 >= 0\n#    define BOOST_PP_ITERATION_2 0\n#    include BOOST_PP_FILENAME_2\n#    undef BOOST_PP_ITERATION_2\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/reverse3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_3 <= 256 && BOOST_PP_ITERATION_START_3 >= 256\n#    define BOOST_PP_ITERATION_3 256\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 255 && BOOST_PP_ITERATION_START_3 >= 255\n#    define BOOST_PP_ITERATION_3 255\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 254 && BOOST_PP_ITERATION_START_3 >= 254\n#    define BOOST_PP_ITERATION_3 254\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 253 && BOOST_PP_ITERATION_START_3 >= 253\n#    define BOOST_PP_ITERATION_3 253\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 252 && BOOST_PP_ITERATION_START_3 >= 252\n#    define BOOST_PP_ITERATION_3 252\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 251 && BOOST_PP_ITERATION_START_3 >= 251\n#    define BOOST_PP_ITERATION_3 251\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 250 && BOOST_PP_ITERATION_START_3 >= 250\n#    define BOOST_PP_ITERATION_3 250\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 249 && BOOST_PP_ITERATION_START_3 >= 249\n#    define BOOST_PP_ITERATION_3 249\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 248 && BOOST_PP_ITERATION_START_3 >= 248\n#    define BOOST_PP_ITERATION_3 248\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 247 && BOOST_PP_ITERATION_START_3 >= 247\n#    define BOOST_PP_ITERATION_3 247\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 246 && BOOST_PP_ITERATION_START_3 >= 246\n#    define BOOST_PP_ITERATION_3 246\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 245 && BOOST_PP_ITERATION_START_3 >= 245\n#    define BOOST_PP_ITERATION_3 245\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 244 && BOOST_PP_ITERATION_START_3 >= 244\n#    define BOOST_PP_ITERATION_3 244\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 243 && BOOST_PP_ITERATION_START_3 >= 243\n#    define BOOST_PP_ITERATION_3 243\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 242 && BOOST_PP_ITERATION_START_3 >= 242\n#    define BOOST_PP_ITERATION_3 242\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 241 && BOOST_PP_ITERATION_START_3 >= 241\n#    define BOOST_PP_ITERATION_3 241\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 240 && BOOST_PP_ITERATION_START_3 >= 240\n#    define BOOST_PP_ITERATION_3 240\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 239 && BOOST_PP_ITERATION_START_3 >= 239\n#    define BOOST_PP_ITERATION_3 239\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 238 && BOOST_PP_ITERATION_START_3 >= 238\n#    define BOOST_PP_ITERATION_3 238\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 237 && BOOST_PP_ITERATION_START_3 >= 237\n#    define BOOST_PP_ITERATION_3 237\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 236 && BOOST_PP_ITERATION_START_3 >= 236\n#    define BOOST_PP_ITERATION_3 236\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 235 && BOOST_PP_ITERATION_START_3 >= 235\n#    define BOOST_PP_ITERATION_3 235\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 234 && BOOST_PP_ITERATION_START_3 >= 234\n#    define BOOST_PP_ITERATION_3 234\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 233 && BOOST_PP_ITERATION_START_3 >= 233\n#    define BOOST_PP_ITERATION_3 233\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 232 && BOOST_PP_ITERATION_START_3 >= 232\n#    define BOOST_PP_ITERATION_3 232\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 231 && BOOST_PP_ITERATION_START_3 >= 231\n#    define BOOST_PP_ITERATION_3 231\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 230 && BOOST_PP_ITERATION_START_3 >= 230\n#    define BOOST_PP_ITERATION_3 230\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 229 && BOOST_PP_ITERATION_START_3 >= 229\n#    define BOOST_PP_ITERATION_3 229\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 228 && BOOST_PP_ITERATION_START_3 >= 228\n#    define BOOST_PP_ITERATION_3 228\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 227 && BOOST_PP_ITERATION_START_3 >= 227\n#    define BOOST_PP_ITERATION_3 227\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 226 && BOOST_PP_ITERATION_START_3 >= 226\n#    define BOOST_PP_ITERATION_3 226\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 225 && BOOST_PP_ITERATION_START_3 >= 225\n#    define BOOST_PP_ITERATION_3 225\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 224 && BOOST_PP_ITERATION_START_3 >= 224\n#    define BOOST_PP_ITERATION_3 224\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 223 && BOOST_PP_ITERATION_START_3 >= 223\n#    define BOOST_PP_ITERATION_3 223\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 222 && BOOST_PP_ITERATION_START_3 >= 222\n#    define BOOST_PP_ITERATION_3 222\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 221 && BOOST_PP_ITERATION_START_3 >= 221\n#    define BOOST_PP_ITERATION_3 221\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 220 && BOOST_PP_ITERATION_START_3 >= 220\n#    define BOOST_PP_ITERATION_3 220\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 219 && BOOST_PP_ITERATION_START_3 >= 219\n#    define BOOST_PP_ITERATION_3 219\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 218 && BOOST_PP_ITERATION_START_3 >= 218\n#    define BOOST_PP_ITERATION_3 218\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 217 && BOOST_PP_ITERATION_START_3 >= 217\n#    define BOOST_PP_ITERATION_3 217\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 216 && BOOST_PP_ITERATION_START_3 >= 216\n#    define BOOST_PP_ITERATION_3 216\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 215 && BOOST_PP_ITERATION_START_3 >= 215\n#    define BOOST_PP_ITERATION_3 215\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 214 && BOOST_PP_ITERATION_START_3 >= 214\n#    define BOOST_PP_ITERATION_3 214\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 213 && BOOST_PP_ITERATION_START_3 >= 213\n#    define BOOST_PP_ITERATION_3 213\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 212 && BOOST_PP_ITERATION_START_3 >= 212\n#    define BOOST_PP_ITERATION_3 212\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 211 && BOOST_PP_ITERATION_START_3 >= 211\n#    define BOOST_PP_ITERATION_3 211\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 210 && BOOST_PP_ITERATION_START_3 >= 210\n#    define BOOST_PP_ITERATION_3 210\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 209 && BOOST_PP_ITERATION_START_3 >= 209\n#    define BOOST_PP_ITERATION_3 209\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 208 && BOOST_PP_ITERATION_START_3 >= 208\n#    define BOOST_PP_ITERATION_3 208\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 207 && BOOST_PP_ITERATION_START_3 >= 207\n#    define BOOST_PP_ITERATION_3 207\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 206 && BOOST_PP_ITERATION_START_3 >= 206\n#    define BOOST_PP_ITERATION_3 206\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 205 && BOOST_PP_ITERATION_START_3 >= 205\n#    define BOOST_PP_ITERATION_3 205\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 204 && BOOST_PP_ITERATION_START_3 >= 204\n#    define BOOST_PP_ITERATION_3 204\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 203 && BOOST_PP_ITERATION_START_3 >= 203\n#    define BOOST_PP_ITERATION_3 203\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 202 && BOOST_PP_ITERATION_START_3 >= 202\n#    define BOOST_PP_ITERATION_3 202\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 201 && BOOST_PP_ITERATION_START_3 >= 201\n#    define BOOST_PP_ITERATION_3 201\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 200 && BOOST_PP_ITERATION_START_3 >= 200\n#    define BOOST_PP_ITERATION_3 200\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 199 && BOOST_PP_ITERATION_START_3 >= 199\n#    define BOOST_PP_ITERATION_3 199\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 198 && BOOST_PP_ITERATION_START_3 >= 198\n#    define BOOST_PP_ITERATION_3 198\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 197 && BOOST_PP_ITERATION_START_3 >= 197\n#    define BOOST_PP_ITERATION_3 197\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 196 && BOOST_PP_ITERATION_START_3 >= 196\n#    define BOOST_PP_ITERATION_3 196\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 195 && BOOST_PP_ITERATION_START_3 >= 195\n#    define BOOST_PP_ITERATION_3 195\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 194 && BOOST_PP_ITERATION_START_3 >= 194\n#    define BOOST_PP_ITERATION_3 194\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 193 && BOOST_PP_ITERATION_START_3 >= 193\n#    define BOOST_PP_ITERATION_3 193\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 192 && BOOST_PP_ITERATION_START_3 >= 192\n#    define BOOST_PP_ITERATION_3 192\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 191 && BOOST_PP_ITERATION_START_3 >= 191\n#    define BOOST_PP_ITERATION_3 191\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 190 && BOOST_PP_ITERATION_START_3 >= 190\n#    define BOOST_PP_ITERATION_3 190\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 189 && BOOST_PP_ITERATION_START_3 >= 189\n#    define BOOST_PP_ITERATION_3 189\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 188 && BOOST_PP_ITERATION_START_3 >= 188\n#    define BOOST_PP_ITERATION_3 188\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 187 && BOOST_PP_ITERATION_START_3 >= 187\n#    define BOOST_PP_ITERATION_3 187\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 186 && BOOST_PP_ITERATION_START_3 >= 186\n#    define BOOST_PP_ITERATION_3 186\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 185 && BOOST_PP_ITERATION_START_3 >= 185\n#    define BOOST_PP_ITERATION_3 185\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 184 && BOOST_PP_ITERATION_START_3 >= 184\n#    define BOOST_PP_ITERATION_3 184\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 183 && BOOST_PP_ITERATION_START_3 >= 183\n#    define BOOST_PP_ITERATION_3 183\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 182 && BOOST_PP_ITERATION_START_3 >= 182\n#    define BOOST_PP_ITERATION_3 182\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 181 && BOOST_PP_ITERATION_START_3 >= 181\n#    define BOOST_PP_ITERATION_3 181\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 180 && BOOST_PP_ITERATION_START_3 >= 180\n#    define BOOST_PP_ITERATION_3 180\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 179 && BOOST_PP_ITERATION_START_3 >= 179\n#    define BOOST_PP_ITERATION_3 179\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 178 && BOOST_PP_ITERATION_START_3 >= 178\n#    define BOOST_PP_ITERATION_3 178\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 177 && BOOST_PP_ITERATION_START_3 >= 177\n#    define BOOST_PP_ITERATION_3 177\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 176 && BOOST_PP_ITERATION_START_3 >= 176\n#    define BOOST_PP_ITERATION_3 176\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 175 && BOOST_PP_ITERATION_START_3 >= 175\n#    define BOOST_PP_ITERATION_3 175\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 174 && BOOST_PP_ITERATION_START_3 >= 174\n#    define BOOST_PP_ITERATION_3 174\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 173 && BOOST_PP_ITERATION_START_3 >= 173\n#    define BOOST_PP_ITERATION_3 173\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 172 && BOOST_PP_ITERATION_START_3 >= 172\n#    define BOOST_PP_ITERATION_3 172\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 171 && BOOST_PP_ITERATION_START_3 >= 171\n#    define BOOST_PP_ITERATION_3 171\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 170 && BOOST_PP_ITERATION_START_3 >= 170\n#    define BOOST_PP_ITERATION_3 170\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 169 && BOOST_PP_ITERATION_START_3 >= 169\n#    define BOOST_PP_ITERATION_3 169\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 168 && BOOST_PP_ITERATION_START_3 >= 168\n#    define BOOST_PP_ITERATION_3 168\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 167 && BOOST_PP_ITERATION_START_3 >= 167\n#    define BOOST_PP_ITERATION_3 167\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 166 && BOOST_PP_ITERATION_START_3 >= 166\n#    define BOOST_PP_ITERATION_3 166\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 165 && BOOST_PP_ITERATION_START_3 >= 165\n#    define BOOST_PP_ITERATION_3 165\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 164 && BOOST_PP_ITERATION_START_3 >= 164\n#    define BOOST_PP_ITERATION_3 164\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 163 && BOOST_PP_ITERATION_START_3 >= 163\n#    define BOOST_PP_ITERATION_3 163\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 162 && BOOST_PP_ITERATION_START_3 >= 162\n#    define BOOST_PP_ITERATION_3 162\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 161 && BOOST_PP_ITERATION_START_3 >= 161\n#    define BOOST_PP_ITERATION_3 161\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 160 && BOOST_PP_ITERATION_START_3 >= 160\n#    define BOOST_PP_ITERATION_3 160\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 159 && BOOST_PP_ITERATION_START_3 >= 159\n#    define BOOST_PP_ITERATION_3 159\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 158 && BOOST_PP_ITERATION_START_3 >= 158\n#    define BOOST_PP_ITERATION_3 158\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 157 && BOOST_PP_ITERATION_START_3 >= 157\n#    define BOOST_PP_ITERATION_3 157\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 156 && BOOST_PP_ITERATION_START_3 >= 156\n#    define BOOST_PP_ITERATION_3 156\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 155 && BOOST_PP_ITERATION_START_3 >= 155\n#    define BOOST_PP_ITERATION_3 155\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 154 && BOOST_PP_ITERATION_START_3 >= 154\n#    define BOOST_PP_ITERATION_3 154\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 153 && BOOST_PP_ITERATION_START_3 >= 153\n#    define BOOST_PP_ITERATION_3 153\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 152 && BOOST_PP_ITERATION_START_3 >= 152\n#    define BOOST_PP_ITERATION_3 152\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 151 && BOOST_PP_ITERATION_START_3 >= 151\n#    define BOOST_PP_ITERATION_3 151\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 150 && BOOST_PP_ITERATION_START_3 >= 150\n#    define BOOST_PP_ITERATION_3 150\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 149 && BOOST_PP_ITERATION_START_3 >= 149\n#    define BOOST_PP_ITERATION_3 149\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 148 && BOOST_PP_ITERATION_START_3 >= 148\n#    define BOOST_PP_ITERATION_3 148\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 147 && BOOST_PP_ITERATION_START_3 >= 147\n#    define BOOST_PP_ITERATION_3 147\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 146 && BOOST_PP_ITERATION_START_3 >= 146\n#    define BOOST_PP_ITERATION_3 146\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 145 && BOOST_PP_ITERATION_START_3 >= 145\n#    define BOOST_PP_ITERATION_3 145\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 144 && BOOST_PP_ITERATION_START_3 >= 144\n#    define BOOST_PP_ITERATION_3 144\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 143 && BOOST_PP_ITERATION_START_3 >= 143\n#    define BOOST_PP_ITERATION_3 143\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 142 && BOOST_PP_ITERATION_START_3 >= 142\n#    define BOOST_PP_ITERATION_3 142\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 141 && BOOST_PP_ITERATION_START_3 >= 141\n#    define BOOST_PP_ITERATION_3 141\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 140 && BOOST_PP_ITERATION_START_3 >= 140\n#    define BOOST_PP_ITERATION_3 140\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 139 && BOOST_PP_ITERATION_START_3 >= 139\n#    define BOOST_PP_ITERATION_3 139\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 138 && BOOST_PP_ITERATION_START_3 >= 138\n#    define BOOST_PP_ITERATION_3 138\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 137 && BOOST_PP_ITERATION_START_3 >= 137\n#    define BOOST_PP_ITERATION_3 137\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 136 && BOOST_PP_ITERATION_START_3 >= 136\n#    define BOOST_PP_ITERATION_3 136\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 135 && BOOST_PP_ITERATION_START_3 >= 135\n#    define BOOST_PP_ITERATION_3 135\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 134 && BOOST_PP_ITERATION_START_3 >= 134\n#    define BOOST_PP_ITERATION_3 134\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 133 && BOOST_PP_ITERATION_START_3 >= 133\n#    define BOOST_PP_ITERATION_3 133\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 132 && BOOST_PP_ITERATION_START_3 >= 132\n#    define BOOST_PP_ITERATION_3 132\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 131 && BOOST_PP_ITERATION_START_3 >= 131\n#    define BOOST_PP_ITERATION_3 131\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 130 && BOOST_PP_ITERATION_START_3 >= 130\n#    define BOOST_PP_ITERATION_3 130\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 129 && BOOST_PP_ITERATION_START_3 >= 129\n#    define BOOST_PP_ITERATION_3 129\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 128 && BOOST_PP_ITERATION_START_3 >= 128\n#    define BOOST_PP_ITERATION_3 128\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 127 && BOOST_PP_ITERATION_START_3 >= 127\n#    define BOOST_PP_ITERATION_3 127\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 126 && BOOST_PP_ITERATION_START_3 >= 126\n#    define BOOST_PP_ITERATION_3 126\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 125 && BOOST_PP_ITERATION_START_3 >= 125\n#    define BOOST_PP_ITERATION_3 125\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 124 && BOOST_PP_ITERATION_START_3 >= 124\n#    define BOOST_PP_ITERATION_3 124\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 123 && BOOST_PP_ITERATION_START_3 >= 123\n#    define BOOST_PP_ITERATION_3 123\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 122 && BOOST_PP_ITERATION_START_3 >= 122\n#    define BOOST_PP_ITERATION_3 122\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 121 && BOOST_PP_ITERATION_START_3 >= 121\n#    define BOOST_PP_ITERATION_3 121\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 120 && BOOST_PP_ITERATION_START_3 >= 120\n#    define BOOST_PP_ITERATION_3 120\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 119 && BOOST_PP_ITERATION_START_3 >= 119\n#    define BOOST_PP_ITERATION_3 119\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 118 && BOOST_PP_ITERATION_START_3 >= 118\n#    define BOOST_PP_ITERATION_3 118\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 117 && BOOST_PP_ITERATION_START_3 >= 117\n#    define BOOST_PP_ITERATION_3 117\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 116 && BOOST_PP_ITERATION_START_3 >= 116\n#    define BOOST_PP_ITERATION_3 116\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 115 && BOOST_PP_ITERATION_START_3 >= 115\n#    define BOOST_PP_ITERATION_3 115\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 114 && BOOST_PP_ITERATION_START_3 >= 114\n#    define BOOST_PP_ITERATION_3 114\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 113 && BOOST_PP_ITERATION_START_3 >= 113\n#    define BOOST_PP_ITERATION_3 113\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 112 && BOOST_PP_ITERATION_START_3 >= 112\n#    define BOOST_PP_ITERATION_3 112\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 111 && BOOST_PP_ITERATION_START_3 >= 111\n#    define BOOST_PP_ITERATION_3 111\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 110 && BOOST_PP_ITERATION_START_3 >= 110\n#    define BOOST_PP_ITERATION_3 110\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 109 && BOOST_PP_ITERATION_START_3 >= 109\n#    define BOOST_PP_ITERATION_3 109\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 108 && BOOST_PP_ITERATION_START_3 >= 108\n#    define BOOST_PP_ITERATION_3 108\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 107 && BOOST_PP_ITERATION_START_3 >= 107\n#    define BOOST_PP_ITERATION_3 107\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 106 && BOOST_PP_ITERATION_START_3 >= 106\n#    define BOOST_PP_ITERATION_3 106\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 105 && BOOST_PP_ITERATION_START_3 >= 105\n#    define BOOST_PP_ITERATION_3 105\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 104 && BOOST_PP_ITERATION_START_3 >= 104\n#    define BOOST_PP_ITERATION_3 104\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 103 && BOOST_PP_ITERATION_START_3 >= 103\n#    define BOOST_PP_ITERATION_3 103\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 102 && BOOST_PP_ITERATION_START_3 >= 102\n#    define BOOST_PP_ITERATION_3 102\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 101 && BOOST_PP_ITERATION_START_3 >= 101\n#    define BOOST_PP_ITERATION_3 101\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 100 && BOOST_PP_ITERATION_START_3 >= 100\n#    define BOOST_PP_ITERATION_3 100\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 99 && BOOST_PP_ITERATION_START_3 >= 99\n#    define BOOST_PP_ITERATION_3 99\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 98 && BOOST_PP_ITERATION_START_3 >= 98\n#    define BOOST_PP_ITERATION_3 98\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 97 && BOOST_PP_ITERATION_START_3 >= 97\n#    define BOOST_PP_ITERATION_3 97\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 96 && BOOST_PP_ITERATION_START_3 >= 96\n#    define BOOST_PP_ITERATION_3 96\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 95 && BOOST_PP_ITERATION_START_3 >= 95\n#    define BOOST_PP_ITERATION_3 95\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 94 && BOOST_PP_ITERATION_START_3 >= 94\n#    define BOOST_PP_ITERATION_3 94\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 93 && BOOST_PP_ITERATION_START_3 >= 93\n#    define BOOST_PP_ITERATION_3 93\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 92 && BOOST_PP_ITERATION_START_3 >= 92\n#    define BOOST_PP_ITERATION_3 92\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 91 && BOOST_PP_ITERATION_START_3 >= 91\n#    define BOOST_PP_ITERATION_3 91\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 90 && BOOST_PP_ITERATION_START_3 >= 90\n#    define BOOST_PP_ITERATION_3 90\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 89 && BOOST_PP_ITERATION_START_3 >= 89\n#    define BOOST_PP_ITERATION_3 89\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 88 && BOOST_PP_ITERATION_START_3 >= 88\n#    define BOOST_PP_ITERATION_3 88\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 87 && BOOST_PP_ITERATION_START_3 >= 87\n#    define BOOST_PP_ITERATION_3 87\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 86 && BOOST_PP_ITERATION_START_3 >= 86\n#    define BOOST_PP_ITERATION_3 86\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 85 && BOOST_PP_ITERATION_START_3 >= 85\n#    define BOOST_PP_ITERATION_3 85\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 84 && BOOST_PP_ITERATION_START_3 >= 84\n#    define BOOST_PP_ITERATION_3 84\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 83 && BOOST_PP_ITERATION_START_3 >= 83\n#    define BOOST_PP_ITERATION_3 83\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 82 && BOOST_PP_ITERATION_START_3 >= 82\n#    define BOOST_PP_ITERATION_3 82\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 81 && BOOST_PP_ITERATION_START_3 >= 81\n#    define BOOST_PP_ITERATION_3 81\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 80 && BOOST_PP_ITERATION_START_3 >= 80\n#    define BOOST_PP_ITERATION_3 80\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 79 && BOOST_PP_ITERATION_START_3 >= 79\n#    define BOOST_PP_ITERATION_3 79\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 78 && BOOST_PP_ITERATION_START_3 >= 78\n#    define BOOST_PP_ITERATION_3 78\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 77 && BOOST_PP_ITERATION_START_3 >= 77\n#    define BOOST_PP_ITERATION_3 77\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 76 && BOOST_PP_ITERATION_START_3 >= 76\n#    define BOOST_PP_ITERATION_3 76\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 75 && BOOST_PP_ITERATION_START_3 >= 75\n#    define BOOST_PP_ITERATION_3 75\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 74 && BOOST_PP_ITERATION_START_3 >= 74\n#    define BOOST_PP_ITERATION_3 74\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 73 && BOOST_PP_ITERATION_START_3 >= 73\n#    define BOOST_PP_ITERATION_3 73\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 72 && BOOST_PP_ITERATION_START_3 >= 72\n#    define BOOST_PP_ITERATION_3 72\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 71 && BOOST_PP_ITERATION_START_3 >= 71\n#    define BOOST_PP_ITERATION_3 71\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 70 && BOOST_PP_ITERATION_START_3 >= 70\n#    define BOOST_PP_ITERATION_3 70\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 69 && BOOST_PP_ITERATION_START_3 >= 69\n#    define BOOST_PP_ITERATION_3 69\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 68 && BOOST_PP_ITERATION_START_3 >= 68\n#    define BOOST_PP_ITERATION_3 68\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 67 && BOOST_PP_ITERATION_START_3 >= 67\n#    define BOOST_PP_ITERATION_3 67\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 66 && BOOST_PP_ITERATION_START_3 >= 66\n#    define BOOST_PP_ITERATION_3 66\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 65 && BOOST_PP_ITERATION_START_3 >= 65\n#    define BOOST_PP_ITERATION_3 65\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 64 && BOOST_PP_ITERATION_START_3 >= 64\n#    define BOOST_PP_ITERATION_3 64\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 63 && BOOST_PP_ITERATION_START_3 >= 63\n#    define BOOST_PP_ITERATION_3 63\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 62 && BOOST_PP_ITERATION_START_3 >= 62\n#    define BOOST_PP_ITERATION_3 62\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 61 && BOOST_PP_ITERATION_START_3 >= 61\n#    define BOOST_PP_ITERATION_3 61\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 60 && BOOST_PP_ITERATION_START_3 >= 60\n#    define BOOST_PP_ITERATION_3 60\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 59 && BOOST_PP_ITERATION_START_3 >= 59\n#    define BOOST_PP_ITERATION_3 59\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 58 && BOOST_PP_ITERATION_START_3 >= 58\n#    define BOOST_PP_ITERATION_3 58\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 57 && BOOST_PP_ITERATION_START_3 >= 57\n#    define BOOST_PP_ITERATION_3 57\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 56 && BOOST_PP_ITERATION_START_3 >= 56\n#    define BOOST_PP_ITERATION_3 56\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 55 && BOOST_PP_ITERATION_START_3 >= 55\n#    define BOOST_PP_ITERATION_3 55\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 54 && BOOST_PP_ITERATION_START_3 >= 54\n#    define BOOST_PP_ITERATION_3 54\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 53 && BOOST_PP_ITERATION_START_3 >= 53\n#    define BOOST_PP_ITERATION_3 53\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 52 && BOOST_PP_ITERATION_START_3 >= 52\n#    define BOOST_PP_ITERATION_3 52\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 51 && BOOST_PP_ITERATION_START_3 >= 51\n#    define BOOST_PP_ITERATION_3 51\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 50 && BOOST_PP_ITERATION_START_3 >= 50\n#    define BOOST_PP_ITERATION_3 50\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 49 && BOOST_PP_ITERATION_START_3 >= 49\n#    define BOOST_PP_ITERATION_3 49\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 48 && BOOST_PP_ITERATION_START_3 >= 48\n#    define BOOST_PP_ITERATION_3 48\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 47 && BOOST_PP_ITERATION_START_3 >= 47\n#    define BOOST_PP_ITERATION_3 47\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 46 && BOOST_PP_ITERATION_START_3 >= 46\n#    define BOOST_PP_ITERATION_3 46\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 45 && BOOST_PP_ITERATION_START_3 >= 45\n#    define BOOST_PP_ITERATION_3 45\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 44 && BOOST_PP_ITERATION_START_3 >= 44\n#    define BOOST_PP_ITERATION_3 44\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 43 && BOOST_PP_ITERATION_START_3 >= 43\n#    define BOOST_PP_ITERATION_3 43\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 42 && BOOST_PP_ITERATION_START_3 >= 42\n#    define BOOST_PP_ITERATION_3 42\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 41 && BOOST_PP_ITERATION_START_3 >= 41\n#    define BOOST_PP_ITERATION_3 41\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 40 && BOOST_PP_ITERATION_START_3 >= 40\n#    define BOOST_PP_ITERATION_3 40\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 39 && BOOST_PP_ITERATION_START_3 >= 39\n#    define BOOST_PP_ITERATION_3 39\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 38 && BOOST_PP_ITERATION_START_3 >= 38\n#    define BOOST_PP_ITERATION_3 38\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 37 && BOOST_PP_ITERATION_START_3 >= 37\n#    define BOOST_PP_ITERATION_3 37\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 36 && BOOST_PP_ITERATION_START_3 >= 36\n#    define BOOST_PP_ITERATION_3 36\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 35 && BOOST_PP_ITERATION_START_3 >= 35\n#    define BOOST_PP_ITERATION_3 35\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 34 && BOOST_PP_ITERATION_START_3 >= 34\n#    define BOOST_PP_ITERATION_3 34\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 33 && BOOST_PP_ITERATION_START_3 >= 33\n#    define BOOST_PP_ITERATION_3 33\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 32 && BOOST_PP_ITERATION_START_3 >= 32\n#    define BOOST_PP_ITERATION_3 32\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 31 && BOOST_PP_ITERATION_START_3 >= 31\n#    define BOOST_PP_ITERATION_3 31\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 30 && BOOST_PP_ITERATION_START_3 >= 30\n#    define BOOST_PP_ITERATION_3 30\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 29 && BOOST_PP_ITERATION_START_3 >= 29\n#    define BOOST_PP_ITERATION_3 29\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 28 && BOOST_PP_ITERATION_START_3 >= 28\n#    define BOOST_PP_ITERATION_3 28\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 27 && BOOST_PP_ITERATION_START_3 >= 27\n#    define BOOST_PP_ITERATION_3 27\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 26 && BOOST_PP_ITERATION_START_3 >= 26\n#    define BOOST_PP_ITERATION_3 26\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 25 && BOOST_PP_ITERATION_START_3 >= 25\n#    define BOOST_PP_ITERATION_3 25\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 24 && BOOST_PP_ITERATION_START_3 >= 24\n#    define BOOST_PP_ITERATION_3 24\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 23 && BOOST_PP_ITERATION_START_3 >= 23\n#    define BOOST_PP_ITERATION_3 23\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 22 && BOOST_PP_ITERATION_START_3 >= 22\n#    define BOOST_PP_ITERATION_3 22\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 21 && BOOST_PP_ITERATION_START_3 >= 21\n#    define BOOST_PP_ITERATION_3 21\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 20 && BOOST_PP_ITERATION_START_3 >= 20\n#    define BOOST_PP_ITERATION_3 20\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 19 && BOOST_PP_ITERATION_START_3 >= 19\n#    define BOOST_PP_ITERATION_3 19\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 18 && BOOST_PP_ITERATION_START_3 >= 18\n#    define BOOST_PP_ITERATION_3 18\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 17 && BOOST_PP_ITERATION_START_3 >= 17\n#    define BOOST_PP_ITERATION_3 17\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 16 && BOOST_PP_ITERATION_START_3 >= 16\n#    define BOOST_PP_ITERATION_3 16\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 15 && BOOST_PP_ITERATION_START_3 >= 15\n#    define BOOST_PP_ITERATION_3 15\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 14 && BOOST_PP_ITERATION_START_3 >= 14\n#    define BOOST_PP_ITERATION_3 14\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 13 && BOOST_PP_ITERATION_START_3 >= 13\n#    define BOOST_PP_ITERATION_3 13\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 12 && BOOST_PP_ITERATION_START_3 >= 12\n#    define BOOST_PP_ITERATION_3 12\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 11 && BOOST_PP_ITERATION_START_3 >= 11\n#    define BOOST_PP_ITERATION_3 11\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 10 && BOOST_PP_ITERATION_START_3 >= 10\n#    define BOOST_PP_ITERATION_3 10\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 9 && BOOST_PP_ITERATION_START_3 >= 9\n#    define BOOST_PP_ITERATION_3 9\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 8 && BOOST_PP_ITERATION_START_3 >= 8\n#    define BOOST_PP_ITERATION_3 8\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 7 && BOOST_PP_ITERATION_START_3 >= 7\n#    define BOOST_PP_ITERATION_3 7\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 6 && BOOST_PP_ITERATION_START_3 >= 6\n#    define BOOST_PP_ITERATION_3 6\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 5 && BOOST_PP_ITERATION_START_3 >= 5\n#    define BOOST_PP_ITERATION_3 5\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 4 && BOOST_PP_ITERATION_START_3 >= 4\n#    define BOOST_PP_ITERATION_3 4\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 3 && BOOST_PP_ITERATION_START_3 >= 3\n#    define BOOST_PP_ITERATION_3 3\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 2 && BOOST_PP_ITERATION_START_3 >= 2\n#    define BOOST_PP_ITERATION_3 2\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 1 && BOOST_PP_ITERATION_START_3 >= 1\n#    define BOOST_PP_ITERATION_3 1\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n# if BOOST_PP_ITERATION_FINISH_3 <= 0 && BOOST_PP_ITERATION_START_3 >= 0\n#    define BOOST_PP_ITERATION_3 0\n#    include BOOST_PP_FILENAME_3\n#    undef BOOST_PP_ITERATION_3\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/reverse4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_4 <= 256 && BOOST_PP_ITERATION_START_4 >= 256\n#    define BOOST_PP_ITERATION_4 256\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 255 && BOOST_PP_ITERATION_START_4 >= 255\n#    define BOOST_PP_ITERATION_4 255\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 254 && BOOST_PP_ITERATION_START_4 >= 254\n#    define BOOST_PP_ITERATION_4 254\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 253 && BOOST_PP_ITERATION_START_4 >= 253\n#    define BOOST_PP_ITERATION_4 253\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 252 && BOOST_PP_ITERATION_START_4 >= 252\n#    define BOOST_PP_ITERATION_4 252\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 251 && BOOST_PP_ITERATION_START_4 >= 251\n#    define BOOST_PP_ITERATION_4 251\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 250 && BOOST_PP_ITERATION_START_4 >= 250\n#    define BOOST_PP_ITERATION_4 250\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 249 && BOOST_PP_ITERATION_START_4 >= 249\n#    define BOOST_PP_ITERATION_4 249\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 248 && BOOST_PP_ITERATION_START_4 >= 248\n#    define BOOST_PP_ITERATION_4 248\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 247 && BOOST_PP_ITERATION_START_4 >= 247\n#    define BOOST_PP_ITERATION_4 247\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 246 && BOOST_PP_ITERATION_START_4 >= 246\n#    define BOOST_PP_ITERATION_4 246\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 245 && BOOST_PP_ITERATION_START_4 >= 245\n#    define BOOST_PP_ITERATION_4 245\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 244 && BOOST_PP_ITERATION_START_4 >= 244\n#    define BOOST_PP_ITERATION_4 244\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 243 && BOOST_PP_ITERATION_START_4 >= 243\n#    define BOOST_PP_ITERATION_4 243\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 242 && BOOST_PP_ITERATION_START_4 >= 242\n#    define BOOST_PP_ITERATION_4 242\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 241 && BOOST_PP_ITERATION_START_4 >= 241\n#    define BOOST_PP_ITERATION_4 241\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 240 && BOOST_PP_ITERATION_START_4 >= 240\n#    define BOOST_PP_ITERATION_4 240\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 239 && BOOST_PP_ITERATION_START_4 >= 239\n#    define BOOST_PP_ITERATION_4 239\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 238 && BOOST_PP_ITERATION_START_4 >= 238\n#    define BOOST_PP_ITERATION_4 238\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 237 && BOOST_PP_ITERATION_START_4 >= 237\n#    define BOOST_PP_ITERATION_4 237\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 236 && BOOST_PP_ITERATION_START_4 >= 236\n#    define BOOST_PP_ITERATION_4 236\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 235 && BOOST_PP_ITERATION_START_4 >= 235\n#    define BOOST_PP_ITERATION_4 235\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 234 && BOOST_PP_ITERATION_START_4 >= 234\n#    define BOOST_PP_ITERATION_4 234\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 233 && BOOST_PP_ITERATION_START_4 >= 233\n#    define BOOST_PP_ITERATION_4 233\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 232 && BOOST_PP_ITERATION_START_4 >= 232\n#    define BOOST_PP_ITERATION_4 232\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 231 && BOOST_PP_ITERATION_START_4 >= 231\n#    define BOOST_PP_ITERATION_4 231\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 230 && BOOST_PP_ITERATION_START_4 >= 230\n#    define BOOST_PP_ITERATION_4 230\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 229 && BOOST_PP_ITERATION_START_4 >= 229\n#    define BOOST_PP_ITERATION_4 229\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 228 && BOOST_PP_ITERATION_START_4 >= 228\n#    define BOOST_PP_ITERATION_4 228\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 227 && BOOST_PP_ITERATION_START_4 >= 227\n#    define BOOST_PP_ITERATION_4 227\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 226 && BOOST_PP_ITERATION_START_4 >= 226\n#    define BOOST_PP_ITERATION_4 226\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 225 && BOOST_PP_ITERATION_START_4 >= 225\n#    define BOOST_PP_ITERATION_4 225\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 224 && BOOST_PP_ITERATION_START_4 >= 224\n#    define BOOST_PP_ITERATION_4 224\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 223 && BOOST_PP_ITERATION_START_4 >= 223\n#    define BOOST_PP_ITERATION_4 223\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 222 && BOOST_PP_ITERATION_START_4 >= 222\n#    define BOOST_PP_ITERATION_4 222\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 221 && BOOST_PP_ITERATION_START_4 >= 221\n#    define BOOST_PP_ITERATION_4 221\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 220 && BOOST_PP_ITERATION_START_4 >= 220\n#    define BOOST_PP_ITERATION_4 220\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 219 && BOOST_PP_ITERATION_START_4 >= 219\n#    define BOOST_PP_ITERATION_4 219\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 218 && BOOST_PP_ITERATION_START_4 >= 218\n#    define BOOST_PP_ITERATION_4 218\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 217 && BOOST_PP_ITERATION_START_4 >= 217\n#    define BOOST_PP_ITERATION_4 217\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 216 && BOOST_PP_ITERATION_START_4 >= 216\n#    define BOOST_PP_ITERATION_4 216\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 215 && BOOST_PP_ITERATION_START_4 >= 215\n#    define BOOST_PP_ITERATION_4 215\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 214 && BOOST_PP_ITERATION_START_4 >= 214\n#    define BOOST_PP_ITERATION_4 214\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 213 && BOOST_PP_ITERATION_START_4 >= 213\n#    define BOOST_PP_ITERATION_4 213\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 212 && BOOST_PP_ITERATION_START_4 >= 212\n#    define BOOST_PP_ITERATION_4 212\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 211 && BOOST_PP_ITERATION_START_4 >= 211\n#    define BOOST_PP_ITERATION_4 211\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 210 && BOOST_PP_ITERATION_START_4 >= 210\n#    define BOOST_PP_ITERATION_4 210\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 209 && BOOST_PP_ITERATION_START_4 >= 209\n#    define BOOST_PP_ITERATION_4 209\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 208 && BOOST_PP_ITERATION_START_4 >= 208\n#    define BOOST_PP_ITERATION_4 208\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 207 && BOOST_PP_ITERATION_START_4 >= 207\n#    define BOOST_PP_ITERATION_4 207\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 206 && BOOST_PP_ITERATION_START_4 >= 206\n#    define BOOST_PP_ITERATION_4 206\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 205 && BOOST_PP_ITERATION_START_4 >= 205\n#    define BOOST_PP_ITERATION_4 205\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 204 && BOOST_PP_ITERATION_START_4 >= 204\n#    define BOOST_PP_ITERATION_4 204\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 203 && BOOST_PP_ITERATION_START_4 >= 203\n#    define BOOST_PP_ITERATION_4 203\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 202 && BOOST_PP_ITERATION_START_4 >= 202\n#    define BOOST_PP_ITERATION_4 202\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 201 && BOOST_PP_ITERATION_START_4 >= 201\n#    define BOOST_PP_ITERATION_4 201\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 200 && BOOST_PP_ITERATION_START_4 >= 200\n#    define BOOST_PP_ITERATION_4 200\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 199 && BOOST_PP_ITERATION_START_4 >= 199\n#    define BOOST_PP_ITERATION_4 199\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 198 && BOOST_PP_ITERATION_START_4 >= 198\n#    define BOOST_PP_ITERATION_4 198\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 197 && BOOST_PP_ITERATION_START_4 >= 197\n#    define BOOST_PP_ITERATION_4 197\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 196 && BOOST_PP_ITERATION_START_4 >= 196\n#    define BOOST_PP_ITERATION_4 196\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 195 && BOOST_PP_ITERATION_START_4 >= 195\n#    define BOOST_PP_ITERATION_4 195\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 194 && BOOST_PP_ITERATION_START_4 >= 194\n#    define BOOST_PP_ITERATION_4 194\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 193 && BOOST_PP_ITERATION_START_4 >= 193\n#    define BOOST_PP_ITERATION_4 193\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 192 && BOOST_PP_ITERATION_START_4 >= 192\n#    define BOOST_PP_ITERATION_4 192\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 191 && BOOST_PP_ITERATION_START_4 >= 191\n#    define BOOST_PP_ITERATION_4 191\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 190 && BOOST_PP_ITERATION_START_4 >= 190\n#    define BOOST_PP_ITERATION_4 190\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 189 && BOOST_PP_ITERATION_START_4 >= 189\n#    define BOOST_PP_ITERATION_4 189\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 188 && BOOST_PP_ITERATION_START_4 >= 188\n#    define BOOST_PP_ITERATION_4 188\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 187 && BOOST_PP_ITERATION_START_4 >= 187\n#    define BOOST_PP_ITERATION_4 187\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 186 && BOOST_PP_ITERATION_START_4 >= 186\n#    define BOOST_PP_ITERATION_4 186\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 185 && BOOST_PP_ITERATION_START_4 >= 185\n#    define BOOST_PP_ITERATION_4 185\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 184 && BOOST_PP_ITERATION_START_4 >= 184\n#    define BOOST_PP_ITERATION_4 184\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 183 && BOOST_PP_ITERATION_START_4 >= 183\n#    define BOOST_PP_ITERATION_4 183\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 182 && BOOST_PP_ITERATION_START_4 >= 182\n#    define BOOST_PP_ITERATION_4 182\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 181 && BOOST_PP_ITERATION_START_4 >= 181\n#    define BOOST_PP_ITERATION_4 181\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 180 && BOOST_PP_ITERATION_START_4 >= 180\n#    define BOOST_PP_ITERATION_4 180\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 179 && BOOST_PP_ITERATION_START_4 >= 179\n#    define BOOST_PP_ITERATION_4 179\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 178 && BOOST_PP_ITERATION_START_4 >= 178\n#    define BOOST_PP_ITERATION_4 178\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 177 && BOOST_PP_ITERATION_START_4 >= 177\n#    define BOOST_PP_ITERATION_4 177\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 176 && BOOST_PP_ITERATION_START_4 >= 176\n#    define BOOST_PP_ITERATION_4 176\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 175 && BOOST_PP_ITERATION_START_4 >= 175\n#    define BOOST_PP_ITERATION_4 175\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 174 && BOOST_PP_ITERATION_START_4 >= 174\n#    define BOOST_PP_ITERATION_4 174\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 173 && BOOST_PP_ITERATION_START_4 >= 173\n#    define BOOST_PP_ITERATION_4 173\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 172 && BOOST_PP_ITERATION_START_4 >= 172\n#    define BOOST_PP_ITERATION_4 172\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 171 && BOOST_PP_ITERATION_START_4 >= 171\n#    define BOOST_PP_ITERATION_4 171\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 170 && BOOST_PP_ITERATION_START_4 >= 170\n#    define BOOST_PP_ITERATION_4 170\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 169 && BOOST_PP_ITERATION_START_4 >= 169\n#    define BOOST_PP_ITERATION_4 169\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 168 && BOOST_PP_ITERATION_START_4 >= 168\n#    define BOOST_PP_ITERATION_4 168\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 167 && BOOST_PP_ITERATION_START_4 >= 167\n#    define BOOST_PP_ITERATION_4 167\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 166 && BOOST_PP_ITERATION_START_4 >= 166\n#    define BOOST_PP_ITERATION_4 166\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 165 && BOOST_PP_ITERATION_START_4 >= 165\n#    define BOOST_PP_ITERATION_4 165\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 164 && BOOST_PP_ITERATION_START_4 >= 164\n#    define BOOST_PP_ITERATION_4 164\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 163 && BOOST_PP_ITERATION_START_4 >= 163\n#    define BOOST_PP_ITERATION_4 163\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 162 && BOOST_PP_ITERATION_START_4 >= 162\n#    define BOOST_PP_ITERATION_4 162\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 161 && BOOST_PP_ITERATION_START_4 >= 161\n#    define BOOST_PP_ITERATION_4 161\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 160 && BOOST_PP_ITERATION_START_4 >= 160\n#    define BOOST_PP_ITERATION_4 160\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 159 && BOOST_PP_ITERATION_START_4 >= 159\n#    define BOOST_PP_ITERATION_4 159\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 158 && BOOST_PP_ITERATION_START_4 >= 158\n#    define BOOST_PP_ITERATION_4 158\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 157 && BOOST_PP_ITERATION_START_4 >= 157\n#    define BOOST_PP_ITERATION_4 157\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 156 && BOOST_PP_ITERATION_START_4 >= 156\n#    define BOOST_PP_ITERATION_4 156\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 155 && BOOST_PP_ITERATION_START_4 >= 155\n#    define BOOST_PP_ITERATION_4 155\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 154 && BOOST_PP_ITERATION_START_4 >= 154\n#    define BOOST_PP_ITERATION_4 154\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 153 && BOOST_PP_ITERATION_START_4 >= 153\n#    define BOOST_PP_ITERATION_4 153\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 152 && BOOST_PP_ITERATION_START_4 >= 152\n#    define BOOST_PP_ITERATION_4 152\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 151 && BOOST_PP_ITERATION_START_4 >= 151\n#    define BOOST_PP_ITERATION_4 151\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 150 && BOOST_PP_ITERATION_START_4 >= 150\n#    define BOOST_PP_ITERATION_4 150\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 149 && BOOST_PP_ITERATION_START_4 >= 149\n#    define BOOST_PP_ITERATION_4 149\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 148 && BOOST_PP_ITERATION_START_4 >= 148\n#    define BOOST_PP_ITERATION_4 148\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 147 && BOOST_PP_ITERATION_START_4 >= 147\n#    define BOOST_PP_ITERATION_4 147\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 146 && BOOST_PP_ITERATION_START_4 >= 146\n#    define BOOST_PP_ITERATION_4 146\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 145 && BOOST_PP_ITERATION_START_4 >= 145\n#    define BOOST_PP_ITERATION_4 145\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 144 && BOOST_PP_ITERATION_START_4 >= 144\n#    define BOOST_PP_ITERATION_4 144\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 143 && BOOST_PP_ITERATION_START_4 >= 143\n#    define BOOST_PP_ITERATION_4 143\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 142 && BOOST_PP_ITERATION_START_4 >= 142\n#    define BOOST_PP_ITERATION_4 142\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 141 && BOOST_PP_ITERATION_START_4 >= 141\n#    define BOOST_PP_ITERATION_4 141\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 140 && BOOST_PP_ITERATION_START_4 >= 140\n#    define BOOST_PP_ITERATION_4 140\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 139 && BOOST_PP_ITERATION_START_4 >= 139\n#    define BOOST_PP_ITERATION_4 139\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 138 && BOOST_PP_ITERATION_START_4 >= 138\n#    define BOOST_PP_ITERATION_4 138\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 137 && BOOST_PP_ITERATION_START_4 >= 137\n#    define BOOST_PP_ITERATION_4 137\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 136 && BOOST_PP_ITERATION_START_4 >= 136\n#    define BOOST_PP_ITERATION_4 136\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 135 && BOOST_PP_ITERATION_START_4 >= 135\n#    define BOOST_PP_ITERATION_4 135\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 134 && BOOST_PP_ITERATION_START_4 >= 134\n#    define BOOST_PP_ITERATION_4 134\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 133 && BOOST_PP_ITERATION_START_4 >= 133\n#    define BOOST_PP_ITERATION_4 133\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 132 && BOOST_PP_ITERATION_START_4 >= 132\n#    define BOOST_PP_ITERATION_4 132\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 131 && BOOST_PP_ITERATION_START_4 >= 131\n#    define BOOST_PP_ITERATION_4 131\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 130 && BOOST_PP_ITERATION_START_4 >= 130\n#    define BOOST_PP_ITERATION_4 130\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 129 && BOOST_PP_ITERATION_START_4 >= 129\n#    define BOOST_PP_ITERATION_4 129\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 128 && BOOST_PP_ITERATION_START_4 >= 128\n#    define BOOST_PP_ITERATION_4 128\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 127 && BOOST_PP_ITERATION_START_4 >= 127\n#    define BOOST_PP_ITERATION_4 127\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 126 && BOOST_PP_ITERATION_START_4 >= 126\n#    define BOOST_PP_ITERATION_4 126\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 125 && BOOST_PP_ITERATION_START_4 >= 125\n#    define BOOST_PP_ITERATION_4 125\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 124 && BOOST_PP_ITERATION_START_4 >= 124\n#    define BOOST_PP_ITERATION_4 124\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 123 && BOOST_PP_ITERATION_START_4 >= 123\n#    define BOOST_PP_ITERATION_4 123\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 122 && BOOST_PP_ITERATION_START_4 >= 122\n#    define BOOST_PP_ITERATION_4 122\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 121 && BOOST_PP_ITERATION_START_4 >= 121\n#    define BOOST_PP_ITERATION_4 121\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 120 && BOOST_PP_ITERATION_START_4 >= 120\n#    define BOOST_PP_ITERATION_4 120\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 119 && BOOST_PP_ITERATION_START_4 >= 119\n#    define BOOST_PP_ITERATION_4 119\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 118 && BOOST_PP_ITERATION_START_4 >= 118\n#    define BOOST_PP_ITERATION_4 118\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 117 && BOOST_PP_ITERATION_START_4 >= 117\n#    define BOOST_PP_ITERATION_4 117\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 116 && BOOST_PP_ITERATION_START_4 >= 116\n#    define BOOST_PP_ITERATION_4 116\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 115 && BOOST_PP_ITERATION_START_4 >= 115\n#    define BOOST_PP_ITERATION_4 115\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 114 && BOOST_PP_ITERATION_START_4 >= 114\n#    define BOOST_PP_ITERATION_4 114\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 113 && BOOST_PP_ITERATION_START_4 >= 113\n#    define BOOST_PP_ITERATION_4 113\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 112 && BOOST_PP_ITERATION_START_4 >= 112\n#    define BOOST_PP_ITERATION_4 112\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 111 && BOOST_PP_ITERATION_START_4 >= 111\n#    define BOOST_PP_ITERATION_4 111\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 110 && BOOST_PP_ITERATION_START_4 >= 110\n#    define BOOST_PP_ITERATION_4 110\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 109 && BOOST_PP_ITERATION_START_4 >= 109\n#    define BOOST_PP_ITERATION_4 109\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 108 && BOOST_PP_ITERATION_START_4 >= 108\n#    define BOOST_PP_ITERATION_4 108\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 107 && BOOST_PP_ITERATION_START_4 >= 107\n#    define BOOST_PP_ITERATION_4 107\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 106 && BOOST_PP_ITERATION_START_4 >= 106\n#    define BOOST_PP_ITERATION_4 106\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 105 && BOOST_PP_ITERATION_START_4 >= 105\n#    define BOOST_PP_ITERATION_4 105\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 104 && BOOST_PP_ITERATION_START_4 >= 104\n#    define BOOST_PP_ITERATION_4 104\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 103 && BOOST_PP_ITERATION_START_4 >= 103\n#    define BOOST_PP_ITERATION_4 103\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 102 && BOOST_PP_ITERATION_START_4 >= 102\n#    define BOOST_PP_ITERATION_4 102\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 101 && BOOST_PP_ITERATION_START_4 >= 101\n#    define BOOST_PP_ITERATION_4 101\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 100 && BOOST_PP_ITERATION_START_4 >= 100\n#    define BOOST_PP_ITERATION_4 100\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 99 && BOOST_PP_ITERATION_START_4 >= 99\n#    define BOOST_PP_ITERATION_4 99\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 98 && BOOST_PP_ITERATION_START_4 >= 98\n#    define BOOST_PP_ITERATION_4 98\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 97 && BOOST_PP_ITERATION_START_4 >= 97\n#    define BOOST_PP_ITERATION_4 97\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 96 && BOOST_PP_ITERATION_START_4 >= 96\n#    define BOOST_PP_ITERATION_4 96\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 95 && BOOST_PP_ITERATION_START_4 >= 95\n#    define BOOST_PP_ITERATION_4 95\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 94 && BOOST_PP_ITERATION_START_4 >= 94\n#    define BOOST_PP_ITERATION_4 94\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 93 && BOOST_PP_ITERATION_START_4 >= 93\n#    define BOOST_PP_ITERATION_4 93\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 92 && BOOST_PP_ITERATION_START_4 >= 92\n#    define BOOST_PP_ITERATION_4 92\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 91 && BOOST_PP_ITERATION_START_4 >= 91\n#    define BOOST_PP_ITERATION_4 91\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 90 && BOOST_PP_ITERATION_START_4 >= 90\n#    define BOOST_PP_ITERATION_4 90\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 89 && BOOST_PP_ITERATION_START_4 >= 89\n#    define BOOST_PP_ITERATION_4 89\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 88 && BOOST_PP_ITERATION_START_4 >= 88\n#    define BOOST_PP_ITERATION_4 88\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 87 && BOOST_PP_ITERATION_START_4 >= 87\n#    define BOOST_PP_ITERATION_4 87\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 86 && BOOST_PP_ITERATION_START_4 >= 86\n#    define BOOST_PP_ITERATION_4 86\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 85 && BOOST_PP_ITERATION_START_4 >= 85\n#    define BOOST_PP_ITERATION_4 85\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 84 && BOOST_PP_ITERATION_START_4 >= 84\n#    define BOOST_PP_ITERATION_4 84\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 83 && BOOST_PP_ITERATION_START_4 >= 83\n#    define BOOST_PP_ITERATION_4 83\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 82 && BOOST_PP_ITERATION_START_4 >= 82\n#    define BOOST_PP_ITERATION_4 82\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 81 && BOOST_PP_ITERATION_START_4 >= 81\n#    define BOOST_PP_ITERATION_4 81\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 80 && BOOST_PP_ITERATION_START_4 >= 80\n#    define BOOST_PP_ITERATION_4 80\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 79 && BOOST_PP_ITERATION_START_4 >= 79\n#    define BOOST_PP_ITERATION_4 79\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 78 && BOOST_PP_ITERATION_START_4 >= 78\n#    define BOOST_PP_ITERATION_4 78\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 77 && BOOST_PP_ITERATION_START_4 >= 77\n#    define BOOST_PP_ITERATION_4 77\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 76 && BOOST_PP_ITERATION_START_4 >= 76\n#    define BOOST_PP_ITERATION_4 76\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 75 && BOOST_PP_ITERATION_START_4 >= 75\n#    define BOOST_PP_ITERATION_4 75\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 74 && BOOST_PP_ITERATION_START_4 >= 74\n#    define BOOST_PP_ITERATION_4 74\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 73 && BOOST_PP_ITERATION_START_4 >= 73\n#    define BOOST_PP_ITERATION_4 73\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 72 && BOOST_PP_ITERATION_START_4 >= 72\n#    define BOOST_PP_ITERATION_4 72\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 71 && BOOST_PP_ITERATION_START_4 >= 71\n#    define BOOST_PP_ITERATION_4 71\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 70 && BOOST_PP_ITERATION_START_4 >= 70\n#    define BOOST_PP_ITERATION_4 70\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 69 && BOOST_PP_ITERATION_START_4 >= 69\n#    define BOOST_PP_ITERATION_4 69\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 68 && BOOST_PP_ITERATION_START_4 >= 68\n#    define BOOST_PP_ITERATION_4 68\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 67 && BOOST_PP_ITERATION_START_4 >= 67\n#    define BOOST_PP_ITERATION_4 67\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 66 && BOOST_PP_ITERATION_START_4 >= 66\n#    define BOOST_PP_ITERATION_4 66\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 65 && BOOST_PP_ITERATION_START_4 >= 65\n#    define BOOST_PP_ITERATION_4 65\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 64 && BOOST_PP_ITERATION_START_4 >= 64\n#    define BOOST_PP_ITERATION_4 64\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 63 && BOOST_PP_ITERATION_START_4 >= 63\n#    define BOOST_PP_ITERATION_4 63\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 62 && BOOST_PP_ITERATION_START_4 >= 62\n#    define BOOST_PP_ITERATION_4 62\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 61 && BOOST_PP_ITERATION_START_4 >= 61\n#    define BOOST_PP_ITERATION_4 61\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 60 && BOOST_PP_ITERATION_START_4 >= 60\n#    define BOOST_PP_ITERATION_4 60\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 59 && BOOST_PP_ITERATION_START_4 >= 59\n#    define BOOST_PP_ITERATION_4 59\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 58 && BOOST_PP_ITERATION_START_4 >= 58\n#    define BOOST_PP_ITERATION_4 58\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 57 && BOOST_PP_ITERATION_START_4 >= 57\n#    define BOOST_PP_ITERATION_4 57\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 56 && BOOST_PP_ITERATION_START_4 >= 56\n#    define BOOST_PP_ITERATION_4 56\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 55 && BOOST_PP_ITERATION_START_4 >= 55\n#    define BOOST_PP_ITERATION_4 55\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 54 && BOOST_PP_ITERATION_START_4 >= 54\n#    define BOOST_PP_ITERATION_4 54\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 53 && BOOST_PP_ITERATION_START_4 >= 53\n#    define BOOST_PP_ITERATION_4 53\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 52 && BOOST_PP_ITERATION_START_4 >= 52\n#    define BOOST_PP_ITERATION_4 52\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 51 && BOOST_PP_ITERATION_START_4 >= 51\n#    define BOOST_PP_ITERATION_4 51\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 50 && BOOST_PP_ITERATION_START_4 >= 50\n#    define BOOST_PP_ITERATION_4 50\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 49 && BOOST_PP_ITERATION_START_4 >= 49\n#    define BOOST_PP_ITERATION_4 49\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 48 && BOOST_PP_ITERATION_START_4 >= 48\n#    define BOOST_PP_ITERATION_4 48\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 47 && BOOST_PP_ITERATION_START_4 >= 47\n#    define BOOST_PP_ITERATION_4 47\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 46 && BOOST_PP_ITERATION_START_4 >= 46\n#    define BOOST_PP_ITERATION_4 46\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 45 && BOOST_PP_ITERATION_START_4 >= 45\n#    define BOOST_PP_ITERATION_4 45\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 44 && BOOST_PP_ITERATION_START_4 >= 44\n#    define BOOST_PP_ITERATION_4 44\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 43 && BOOST_PP_ITERATION_START_4 >= 43\n#    define BOOST_PP_ITERATION_4 43\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 42 && BOOST_PP_ITERATION_START_4 >= 42\n#    define BOOST_PP_ITERATION_4 42\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 41 && BOOST_PP_ITERATION_START_4 >= 41\n#    define BOOST_PP_ITERATION_4 41\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 40 && BOOST_PP_ITERATION_START_4 >= 40\n#    define BOOST_PP_ITERATION_4 40\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 39 && BOOST_PP_ITERATION_START_4 >= 39\n#    define BOOST_PP_ITERATION_4 39\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 38 && BOOST_PP_ITERATION_START_4 >= 38\n#    define BOOST_PP_ITERATION_4 38\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 37 && BOOST_PP_ITERATION_START_4 >= 37\n#    define BOOST_PP_ITERATION_4 37\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 36 && BOOST_PP_ITERATION_START_4 >= 36\n#    define BOOST_PP_ITERATION_4 36\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 35 && BOOST_PP_ITERATION_START_4 >= 35\n#    define BOOST_PP_ITERATION_4 35\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 34 && BOOST_PP_ITERATION_START_4 >= 34\n#    define BOOST_PP_ITERATION_4 34\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 33 && BOOST_PP_ITERATION_START_4 >= 33\n#    define BOOST_PP_ITERATION_4 33\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 32 && BOOST_PP_ITERATION_START_4 >= 32\n#    define BOOST_PP_ITERATION_4 32\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 31 && BOOST_PP_ITERATION_START_4 >= 31\n#    define BOOST_PP_ITERATION_4 31\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 30 && BOOST_PP_ITERATION_START_4 >= 30\n#    define BOOST_PP_ITERATION_4 30\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 29 && BOOST_PP_ITERATION_START_4 >= 29\n#    define BOOST_PP_ITERATION_4 29\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 28 && BOOST_PP_ITERATION_START_4 >= 28\n#    define BOOST_PP_ITERATION_4 28\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 27 && BOOST_PP_ITERATION_START_4 >= 27\n#    define BOOST_PP_ITERATION_4 27\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 26 && BOOST_PP_ITERATION_START_4 >= 26\n#    define BOOST_PP_ITERATION_4 26\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 25 && BOOST_PP_ITERATION_START_4 >= 25\n#    define BOOST_PP_ITERATION_4 25\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 24 && BOOST_PP_ITERATION_START_4 >= 24\n#    define BOOST_PP_ITERATION_4 24\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 23 && BOOST_PP_ITERATION_START_4 >= 23\n#    define BOOST_PP_ITERATION_4 23\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 22 && BOOST_PP_ITERATION_START_4 >= 22\n#    define BOOST_PP_ITERATION_4 22\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 21 && BOOST_PP_ITERATION_START_4 >= 21\n#    define BOOST_PP_ITERATION_4 21\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 20 && BOOST_PP_ITERATION_START_4 >= 20\n#    define BOOST_PP_ITERATION_4 20\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 19 && BOOST_PP_ITERATION_START_4 >= 19\n#    define BOOST_PP_ITERATION_4 19\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 18 && BOOST_PP_ITERATION_START_4 >= 18\n#    define BOOST_PP_ITERATION_4 18\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 17 && BOOST_PP_ITERATION_START_4 >= 17\n#    define BOOST_PP_ITERATION_4 17\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 16 && BOOST_PP_ITERATION_START_4 >= 16\n#    define BOOST_PP_ITERATION_4 16\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 15 && BOOST_PP_ITERATION_START_4 >= 15\n#    define BOOST_PP_ITERATION_4 15\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 14 && BOOST_PP_ITERATION_START_4 >= 14\n#    define BOOST_PP_ITERATION_4 14\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 13 && BOOST_PP_ITERATION_START_4 >= 13\n#    define BOOST_PP_ITERATION_4 13\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 12 && BOOST_PP_ITERATION_START_4 >= 12\n#    define BOOST_PP_ITERATION_4 12\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 11 && BOOST_PP_ITERATION_START_4 >= 11\n#    define BOOST_PP_ITERATION_4 11\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 10 && BOOST_PP_ITERATION_START_4 >= 10\n#    define BOOST_PP_ITERATION_4 10\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 9 && BOOST_PP_ITERATION_START_4 >= 9\n#    define BOOST_PP_ITERATION_4 9\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 8 && BOOST_PP_ITERATION_START_4 >= 8\n#    define BOOST_PP_ITERATION_4 8\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 7 && BOOST_PP_ITERATION_START_4 >= 7\n#    define BOOST_PP_ITERATION_4 7\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 6 && BOOST_PP_ITERATION_START_4 >= 6\n#    define BOOST_PP_ITERATION_4 6\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 5 && BOOST_PP_ITERATION_START_4 >= 5\n#    define BOOST_PP_ITERATION_4 5\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 4 && BOOST_PP_ITERATION_START_4 >= 4\n#    define BOOST_PP_ITERATION_4 4\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 3 && BOOST_PP_ITERATION_START_4 >= 3\n#    define BOOST_PP_ITERATION_4 3\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 2 && BOOST_PP_ITERATION_START_4 >= 2\n#    define BOOST_PP_ITERATION_4 2\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 1 && BOOST_PP_ITERATION_START_4 >= 1\n#    define BOOST_PP_ITERATION_4 1\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n# if BOOST_PP_ITERATION_FINISH_4 <= 0 && BOOST_PP_ITERATION_START_4 >= 0\n#    define BOOST_PP_ITERATION_4 0\n#    include BOOST_PP_FILENAME_4\n#    undef BOOST_PP_ITERATION_4\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/iter/reverse5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_ITERATION_FINISH_5 <= 256 && BOOST_PP_ITERATION_START_5 >= 256\n#    define BOOST_PP_ITERATION_5 256\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 255 && BOOST_PP_ITERATION_START_5 >= 255\n#    define BOOST_PP_ITERATION_5 255\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 254 && BOOST_PP_ITERATION_START_5 >= 254\n#    define BOOST_PP_ITERATION_5 254\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 253 && BOOST_PP_ITERATION_START_5 >= 253\n#    define BOOST_PP_ITERATION_5 253\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 252 && BOOST_PP_ITERATION_START_5 >= 252\n#    define BOOST_PP_ITERATION_5 252\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 251 && BOOST_PP_ITERATION_START_5 >= 251\n#    define BOOST_PP_ITERATION_5 251\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 250 && BOOST_PP_ITERATION_START_5 >= 250\n#    define BOOST_PP_ITERATION_5 250\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 249 && BOOST_PP_ITERATION_START_5 >= 249\n#    define BOOST_PP_ITERATION_5 249\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 248 && BOOST_PP_ITERATION_START_5 >= 248\n#    define BOOST_PP_ITERATION_5 248\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 247 && BOOST_PP_ITERATION_START_5 >= 247\n#    define BOOST_PP_ITERATION_5 247\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 246 && BOOST_PP_ITERATION_START_5 >= 246\n#    define BOOST_PP_ITERATION_5 246\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 245 && BOOST_PP_ITERATION_START_5 >= 245\n#    define BOOST_PP_ITERATION_5 245\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 244 && BOOST_PP_ITERATION_START_5 >= 244\n#    define BOOST_PP_ITERATION_5 244\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 243 && BOOST_PP_ITERATION_START_5 >= 243\n#    define BOOST_PP_ITERATION_5 243\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 242 && BOOST_PP_ITERATION_START_5 >= 242\n#    define BOOST_PP_ITERATION_5 242\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 241 && BOOST_PP_ITERATION_START_5 >= 241\n#    define BOOST_PP_ITERATION_5 241\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 240 && BOOST_PP_ITERATION_START_5 >= 240\n#    define BOOST_PP_ITERATION_5 240\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 239 && BOOST_PP_ITERATION_START_5 >= 239\n#    define BOOST_PP_ITERATION_5 239\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 238 && BOOST_PP_ITERATION_START_5 >= 238\n#    define BOOST_PP_ITERATION_5 238\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 237 && BOOST_PP_ITERATION_START_5 >= 237\n#    define BOOST_PP_ITERATION_5 237\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 236 && BOOST_PP_ITERATION_START_5 >= 236\n#    define BOOST_PP_ITERATION_5 236\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 235 && BOOST_PP_ITERATION_START_5 >= 235\n#    define BOOST_PP_ITERATION_5 235\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 234 && BOOST_PP_ITERATION_START_5 >= 234\n#    define BOOST_PP_ITERATION_5 234\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 233 && BOOST_PP_ITERATION_START_5 >= 233\n#    define BOOST_PP_ITERATION_5 233\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 232 && BOOST_PP_ITERATION_START_5 >= 232\n#    define BOOST_PP_ITERATION_5 232\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 231 && BOOST_PP_ITERATION_START_5 >= 231\n#    define BOOST_PP_ITERATION_5 231\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 230 && BOOST_PP_ITERATION_START_5 >= 230\n#    define BOOST_PP_ITERATION_5 230\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 229 && BOOST_PP_ITERATION_START_5 >= 229\n#    define BOOST_PP_ITERATION_5 229\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 228 && BOOST_PP_ITERATION_START_5 >= 228\n#    define BOOST_PP_ITERATION_5 228\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 227 && BOOST_PP_ITERATION_START_5 >= 227\n#    define BOOST_PP_ITERATION_5 227\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 226 && BOOST_PP_ITERATION_START_5 >= 226\n#    define BOOST_PP_ITERATION_5 226\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 225 && BOOST_PP_ITERATION_START_5 >= 225\n#    define BOOST_PP_ITERATION_5 225\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 224 && BOOST_PP_ITERATION_START_5 >= 224\n#    define BOOST_PP_ITERATION_5 224\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 223 && BOOST_PP_ITERATION_START_5 >= 223\n#    define BOOST_PP_ITERATION_5 223\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 222 && BOOST_PP_ITERATION_START_5 >= 222\n#    define BOOST_PP_ITERATION_5 222\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 221 && BOOST_PP_ITERATION_START_5 >= 221\n#    define BOOST_PP_ITERATION_5 221\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 220 && BOOST_PP_ITERATION_START_5 >= 220\n#    define BOOST_PP_ITERATION_5 220\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 219 && BOOST_PP_ITERATION_START_5 >= 219\n#    define BOOST_PP_ITERATION_5 219\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 218 && BOOST_PP_ITERATION_START_5 >= 218\n#    define BOOST_PP_ITERATION_5 218\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 217 && BOOST_PP_ITERATION_START_5 >= 217\n#    define BOOST_PP_ITERATION_5 217\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 216 && BOOST_PP_ITERATION_START_5 >= 216\n#    define BOOST_PP_ITERATION_5 216\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 215 && BOOST_PP_ITERATION_START_5 >= 215\n#    define BOOST_PP_ITERATION_5 215\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 214 && BOOST_PP_ITERATION_START_5 >= 214\n#    define BOOST_PP_ITERATION_5 214\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 213 && BOOST_PP_ITERATION_START_5 >= 213\n#    define BOOST_PP_ITERATION_5 213\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 212 && BOOST_PP_ITERATION_START_5 >= 212\n#    define BOOST_PP_ITERATION_5 212\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 211 && BOOST_PP_ITERATION_START_5 >= 211\n#    define BOOST_PP_ITERATION_5 211\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 210 && BOOST_PP_ITERATION_START_5 >= 210\n#    define BOOST_PP_ITERATION_5 210\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 209 && BOOST_PP_ITERATION_START_5 >= 209\n#    define BOOST_PP_ITERATION_5 209\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 208 && BOOST_PP_ITERATION_START_5 >= 208\n#    define BOOST_PP_ITERATION_5 208\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 207 && BOOST_PP_ITERATION_START_5 >= 207\n#    define BOOST_PP_ITERATION_5 207\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 206 && BOOST_PP_ITERATION_START_5 >= 206\n#    define BOOST_PP_ITERATION_5 206\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 205 && BOOST_PP_ITERATION_START_5 >= 205\n#    define BOOST_PP_ITERATION_5 205\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 204 && BOOST_PP_ITERATION_START_5 >= 204\n#    define BOOST_PP_ITERATION_5 204\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 203 && BOOST_PP_ITERATION_START_5 >= 203\n#    define BOOST_PP_ITERATION_5 203\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 202 && BOOST_PP_ITERATION_START_5 >= 202\n#    define BOOST_PP_ITERATION_5 202\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 201 && BOOST_PP_ITERATION_START_5 >= 201\n#    define BOOST_PP_ITERATION_5 201\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 200 && BOOST_PP_ITERATION_START_5 >= 200\n#    define BOOST_PP_ITERATION_5 200\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 199 && BOOST_PP_ITERATION_START_5 >= 199\n#    define BOOST_PP_ITERATION_5 199\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 198 && BOOST_PP_ITERATION_START_5 >= 198\n#    define BOOST_PP_ITERATION_5 198\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 197 && BOOST_PP_ITERATION_START_5 >= 197\n#    define BOOST_PP_ITERATION_5 197\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 196 && BOOST_PP_ITERATION_START_5 >= 196\n#    define BOOST_PP_ITERATION_5 196\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 195 && BOOST_PP_ITERATION_START_5 >= 195\n#    define BOOST_PP_ITERATION_5 195\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 194 && BOOST_PP_ITERATION_START_5 >= 194\n#    define BOOST_PP_ITERATION_5 194\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 193 && BOOST_PP_ITERATION_START_5 >= 193\n#    define BOOST_PP_ITERATION_5 193\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 192 && BOOST_PP_ITERATION_START_5 >= 192\n#    define BOOST_PP_ITERATION_5 192\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 191 && BOOST_PP_ITERATION_START_5 >= 191\n#    define BOOST_PP_ITERATION_5 191\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 190 && BOOST_PP_ITERATION_START_5 >= 190\n#    define BOOST_PP_ITERATION_5 190\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 189 && BOOST_PP_ITERATION_START_5 >= 189\n#    define BOOST_PP_ITERATION_5 189\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 188 && BOOST_PP_ITERATION_START_5 >= 188\n#    define BOOST_PP_ITERATION_5 188\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 187 && BOOST_PP_ITERATION_START_5 >= 187\n#    define BOOST_PP_ITERATION_5 187\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 186 && BOOST_PP_ITERATION_START_5 >= 186\n#    define BOOST_PP_ITERATION_5 186\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 185 && BOOST_PP_ITERATION_START_5 >= 185\n#    define BOOST_PP_ITERATION_5 185\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 184 && BOOST_PP_ITERATION_START_5 >= 184\n#    define BOOST_PP_ITERATION_5 184\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 183 && BOOST_PP_ITERATION_START_5 >= 183\n#    define BOOST_PP_ITERATION_5 183\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 182 && BOOST_PP_ITERATION_START_5 >= 182\n#    define BOOST_PP_ITERATION_5 182\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 181 && BOOST_PP_ITERATION_START_5 >= 181\n#    define BOOST_PP_ITERATION_5 181\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 180 && BOOST_PP_ITERATION_START_5 >= 180\n#    define BOOST_PP_ITERATION_5 180\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 179 && BOOST_PP_ITERATION_START_5 >= 179\n#    define BOOST_PP_ITERATION_5 179\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 178 && BOOST_PP_ITERATION_START_5 >= 178\n#    define BOOST_PP_ITERATION_5 178\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 177 && BOOST_PP_ITERATION_START_5 >= 177\n#    define BOOST_PP_ITERATION_5 177\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 176 && BOOST_PP_ITERATION_START_5 >= 176\n#    define BOOST_PP_ITERATION_5 176\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 175 && BOOST_PP_ITERATION_START_5 >= 175\n#    define BOOST_PP_ITERATION_5 175\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 174 && BOOST_PP_ITERATION_START_5 >= 174\n#    define BOOST_PP_ITERATION_5 174\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 173 && BOOST_PP_ITERATION_START_5 >= 173\n#    define BOOST_PP_ITERATION_5 173\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 172 && BOOST_PP_ITERATION_START_5 >= 172\n#    define BOOST_PP_ITERATION_5 172\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 171 && BOOST_PP_ITERATION_START_5 >= 171\n#    define BOOST_PP_ITERATION_5 171\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 170 && BOOST_PP_ITERATION_START_5 >= 170\n#    define BOOST_PP_ITERATION_5 170\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 169 && BOOST_PP_ITERATION_START_5 >= 169\n#    define BOOST_PP_ITERATION_5 169\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 168 && BOOST_PP_ITERATION_START_5 >= 168\n#    define BOOST_PP_ITERATION_5 168\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 167 && BOOST_PP_ITERATION_START_5 >= 167\n#    define BOOST_PP_ITERATION_5 167\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 166 && BOOST_PP_ITERATION_START_5 >= 166\n#    define BOOST_PP_ITERATION_5 166\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 165 && BOOST_PP_ITERATION_START_5 >= 165\n#    define BOOST_PP_ITERATION_5 165\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 164 && BOOST_PP_ITERATION_START_5 >= 164\n#    define BOOST_PP_ITERATION_5 164\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 163 && BOOST_PP_ITERATION_START_5 >= 163\n#    define BOOST_PP_ITERATION_5 163\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 162 && BOOST_PP_ITERATION_START_5 >= 162\n#    define BOOST_PP_ITERATION_5 162\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 161 && BOOST_PP_ITERATION_START_5 >= 161\n#    define BOOST_PP_ITERATION_5 161\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 160 && BOOST_PP_ITERATION_START_5 >= 160\n#    define BOOST_PP_ITERATION_5 160\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 159 && BOOST_PP_ITERATION_START_5 >= 159\n#    define BOOST_PP_ITERATION_5 159\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 158 && BOOST_PP_ITERATION_START_5 >= 158\n#    define BOOST_PP_ITERATION_5 158\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 157 && BOOST_PP_ITERATION_START_5 >= 157\n#    define BOOST_PP_ITERATION_5 157\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 156 && BOOST_PP_ITERATION_START_5 >= 156\n#    define BOOST_PP_ITERATION_5 156\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 155 && BOOST_PP_ITERATION_START_5 >= 155\n#    define BOOST_PP_ITERATION_5 155\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 154 && BOOST_PP_ITERATION_START_5 >= 154\n#    define BOOST_PP_ITERATION_5 154\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 153 && BOOST_PP_ITERATION_START_5 >= 153\n#    define BOOST_PP_ITERATION_5 153\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 152 && BOOST_PP_ITERATION_START_5 >= 152\n#    define BOOST_PP_ITERATION_5 152\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 151 && BOOST_PP_ITERATION_START_5 >= 151\n#    define BOOST_PP_ITERATION_5 151\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 150 && BOOST_PP_ITERATION_START_5 >= 150\n#    define BOOST_PP_ITERATION_5 150\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 149 && BOOST_PP_ITERATION_START_5 >= 149\n#    define BOOST_PP_ITERATION_5 149\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 148 && BOOST_PP_ITERATION_START_5 >= 148\n#    define BOOST_PP_ITERATION_5 148\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 147 && BOOST_PP_ITERATION_START_5 >= 147\n#    define BOOST_PP_ITERATION_5 147\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 146 && BOOST_PP_ITERATION_START_5 >= 146\n#    define BOOST_PP_ITERATION_5 146\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 145 && BOOST_PP_ITERATION_START_5 >= 145\n#    define BOOST_PP_ITERATION_5 145\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 144 && BOOST_PP_ITERATION_START_5 >= 144\n#    define BOOST_PP_ITERATION_5 144\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 143 && BOOST_PP_ITERATION_START_5 >= 143\n#    define BOOST_PP_ITERATION_5 143\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 142 && BOOST_PP_ITERATION_START_5 >= 142\n#    define BOOST_PP_ITERATION_5 142\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 141 && BOOST_PP_ITERATION_START_5 >= 141\n#    define BOOST_PP_ITERATION_5 141\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 140 && BOOST_PP_ITERATION_START_5 >= 140\n#    define BOOST_PP_ITERATION_5 140\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 139 && BOOST_PP_ITERATION_START_5 >= 139\n#    define BOOST_PP_ITERATION_5 139\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 138 && BOOST_PP_ITERATION_START_5 >= 138\n#    define BOOST_PP_ITERATION_5 138\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 137 && BOOST_PP_ITERATION_START_5 >= 137\n#    define BOOST_PP_ITERATION_5 137\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 136 && BOOST_PP_ITERATION_START_5 >= 136\n#    define BOOST_PP_ITERATION_5 136\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 135 && BOOST_PP_ITERATION_START_5 >= 135\n#    define BOOST_PP_ITERATION_5 135\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 134 && BOOST_PP_ITERATION_START_5 >= 134\n#    define BOOST_PP_ITERATION_5 134\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 133 && BOOST_PP_ITERATION_START_5 >= 133\n#    define BOOST_PP_ITERATION_5 133\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 132 && BOOST_PP_ITERATION_START_5 >= 132\n#    define BOOST_PP_ITERATION_5 132\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 131 && BOOST_PP_ITERATION_START_5 >= 131\n#    define BOOST_PP_ITERATION_5 131\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 130 && BOOST_PP_ITERATION_START_5 >= 130\n#    define BOOST_PP_ITERATION_5 130\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 129 && BOOST_PP_ITERATION_START_5 >= 129\n#    define BOOST_PP_ITERATION_5 129\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 128 && BOOST_PP_ITERATION_START_5 >= 128\n#    define BOOST_PP_ITERATION_5 128\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 127 && BOOST_PP_ITERATION_START_5 >= 127\n#    define BOOST_PP_ITERATION_5 127\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 126 && BOOST_PP_ITERATION_START_5 >= 126\n#    define BOOST_PP_ITERATION_5 126\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 125 && BOOST_PP_ITERATION_START_5 >= 125\n#    define BOOST_PP_ITERATION_5 125\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 124 && BOOST_PP_ITERATION_START_5 >= 124\n#    define BOOST_PP_ITERATION_5 124\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 123 && BOOST_PP_ITERATION_START_5 >= 123\n#    define BOOST_PP_ITERATION_5 123\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 122 && BOOST_PP_ITERATION_START_5 >= 122\n#    define BOOST_PP_ITERATION_5 122\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 121 && BOOST_PP_ITERATION_START_5 >= 121\n#    define BOOST_PP_ITERATION_5 121\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 120 && BOOST_PP_ITERATION_START_5 >= 120\n#    define BOOST_PP_ITERATION_5 120\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 119 && BOOST_PP_ITERATION_START_5 >= 119\n#    define BOOST_PP_ITERATION_5 119\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 118 && BOOST_PP_ITERATION_START_5 >= 118\n#    define BOOST_PP_ITERATION_5 118\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 117 && BOOST_PP_ITERATION_START_5 >= 117\n#    define BOOST_PP_ITERATION_5 117\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 116 && BOOST_PP_ITERATION_START_5 >= 116\n#    define BOOST_PP_ITERATION_5 116\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 115 && BOOST_PP_ITERATION_START_5 >= 115\n#    define BOOST_PP_ITERATION_5 115\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 114 && BOOST_PP_ITERATION_START_5 >= 114\n#    define BOOST_PP_ITERATION_5 114\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 113 && BOOST_PP_ITERATION_START_5 >= 113\n#    define BOOST_PP_ITERATION_5 113\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 112 && BOOST_PP_ITERATION_START_5 >= 112\n#    define BOOST_PP_ITERATION_5 112\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 111 && BOOST_PP_ITERATION_START_5 >= 111\n#    define BOOST_PP_ITERATION_5 111\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 110 && BOOST_PP_ITERATION_START_5 >= 110\n#    define BOOST_PP_ITERATION_5 110\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 109 && BOOST_PP_ITERATION_START_5 >= 109\n#    define BOOST_PP_ITERATION_5 109\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 108 && BOOST_PP_ITERATION_START_5 >= 108\n#    define BOOST_PP_ITERATION_5 108\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 107 && BOOST_PP_ITERATION_START_5 >= 107\n#    define BOOST_PP_ITERATION_5 107\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 106 && BOOST_PP_ITERATION_START_5 >= 106\n#    define BOOST_PP_ITERATION_5 106\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 105 && BOOST_PP_ITERATION_START_5 >= 105\n#    define BOOST_PP_ITERATION_5 105\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 104 && BOOST_PP_ITERATION_START_5 >= 104\n#    define BOOST_PP_ITERATION_5 104\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 103 && BOOST_PP_ITERATION_START_5 >= 103\n#    define BOOST_PP_ITERATION_5 103\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 102 && BOOST_PP_ITERATION_START_5 >= 102\n#    define BOOST_PP_ITERATION_5 102\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 101 && BOOST_PP_ITERATION_START_5 >= 101\n#    define BOOST_PP_ITERATION_5 101\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 100 && BOOST_PP_ITERATION_START_5 >= 100\n#    define BOOST_PP_ITERATION_5 100\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 99 && BOOST_PP_ITERATION_START_5 >= 99\n#    define BOOST_PP_ITERATION_5 99\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 98 && BOOST_PP_ITERATION_START_5 >= 98\n#    define BOOST_PP_ITERATION_5 98\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 97 && BOOST_PP_ITERATION_START_5 >= 97\n#    define BOOST_PP_ITERATION_5 97\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 96 && BOOST_PP_ITERATION_START_5 >= 96\n#    define BOOST_PP_ITERATION_5 96\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 95 && BOOST_PP_ITERATION_START_5 >= 95\n#    define BOOST_PP_ITERATION_5 95\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 94 && BOOST_PP_ITERATION_START_5 >= 94\n#    define BOOST_PP_ITERATION_5 94\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 93 && BOOST_PP_ITERATION_START_5 >= 93\n#    define BOOST_PP_ITERATION_5 93\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 92 && BOOST_PP_ITERATION_START_5 >= 92\n#    define BOOST_PP_ITERATION_5 92\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 91 && BOOST_PP_ITERATION_START_5 >= 91\n#    define BOOST_PP_ITERATION_5 91\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 90 && BOOST_PP_ITERATION_START_5 >= 90\n#    define BOOST_PP_ITERATION_5 90\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 89 && BOOST_PP_ITERATION_START_5 >= 89\n#    define BOOST_PP_ITERATION_5 89\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 88 && BOOST_PP_ITERATION_START_5 >= 88\n#    define BOOST_PP_ITERATION_5 88\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 87 && BOOST_PP_ITERATION_START_5 >= 87\n#    define BOOST_PP_ITERATION_5 87\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 86 && BOOST_PP_ITERATION_START_5 >= 86\n#    define BOOST_PP_ITERATION_5 86\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 85 && BOOST_PP_ITERATION_START_5 >= 85\n#    define BOOST_PP_ITERATION_5 85\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 84 && BOOST_PP_ITERATION_START_5 >= 84\n#    define BOOST_PP_ITERATION_5 84\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 83 && BOOST_PP_ITERATION_START_5 >= 83\n#    define BOOST_PP_ITERATION_5 83\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 82 && BOOST_PP_ITERATION_START_5 >= 82\n#    define BOOST_PP_ITERATION_5 82\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 81 && BOOST_PP_ITERATION_START_5 >= 81\n#    define BOOST_PP_ITERATION_5 81\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 80 && BOOST_PP_ITERATION_START_5 >= 80\n#    define BOOST_PP_ITERATION_5 80\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 79 && BOOST_PP_ITERATION_START_5 >= 79\n#    define BOOST_PP_ITERATION_5 79\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 78 && BOOST_PP_ITERATION_START_5 >= 78\n#    define BOOST_PP_ITERATION_5 78\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 77 && BOOST_PP_ITERATION_START_5 >= 77\n#    define BOOST_PP_ITERATION_5 77\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 76 && BOOST_PP_ITERATION_START_5 >= 76\n#    define BOOST_PP_ITERATION_5 76\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 75 && BOOST_PP_ITERATION_START_5 >= 75\n#    define BOOST_PP_ITERATION_5 75\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 74 && BOOST_PP_ITERATION_START_5 >= 74\n#    define BOOST_PP_ITERATION_5 74\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 73 && BOOST_PP_ITERATION_START_5 >= 73\n#    define BOOST_PP_ITERATION_5 73\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 72 && BOOST_PP_ITERATION_START_5 >= 72\n#    define BOOST_PP_ITERATION_5 72\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 71 && BOOST_PP_ITERATION_START_5 >= 71\n#    define BOOST_PP_ITERATION_5 71\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 70 && BOOST_PP_ITERATION_START_5 >= 70\n#    define BOOST_PP_ITERATION_5 70\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 69 && BOOST_PP_ITERATION_START_5 >= 69\n#    define BOOST_PP_ITERATION_5 69\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 68 && BOOST_PP_ITERATION_START_5 >= 68\n#    define BOOST_PP_ITERATION_5 68\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 67 && BOOST_PP_ITERATION_START_5 >= 67\n#    define BOOST_PP_ITERATION_5 67\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 66 && BOOST_PP_ITERATION_START_5 >= 66\n#    define BOOST_PP_ITERATION_5 66\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 65 && BOOST_PP_ITERATION_START_5 >= 65\n#    define BOOST_PP_ITERATION_5 65\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 64 && BOOST_PP_ITERATION_START_5 >= 64\n#    define BOOST_PP_ITERATION_5 64\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 63 && BOOST_PP_ITERATION_START_5 >= 63\n#    define BOOST_PP_ITERATION_5 63\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 62 && BOOST_PP_ITERATION_START_5 >= 62\n#    define BOOST_PP_ITERATION_5 62\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 61 && BOOST_PP_ITERATION_START_5 >= 61\n#    define BOOST_PP_ITERATION_5 61\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 60 && BOOST_PP_ITERATION_START_5 >= 60\n#    define BOOST_PP_ITERATION_5 60\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 59 && BOOST_PP_ITERATION_START_5 >= 59\n#    define BOOST_PP_ITERATION_5 59\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 58 && BOOST_PP_ITERATION_START_5 >= 58\n#    define BOOST_PP_ITERATION_5 58\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 57 && BOOST_PP_ITERATION_START_5 >= 57\n#    define BOOST_PP_ITERATION_5 57\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 56 && BOOST_PP_ITERATION_START_5 >= 56\n#    define BOOST_PP_ITERATION_5 56\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 55 && BOOST_PP_ITERATION_START_5 >= 55\n#    define BOOST_PP_ITERATION_5 55\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 54 && BOOST_PP_ITERATION_START_5 >= 54\n#    define BOOST_PP_ITERATION_5 54\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 53 && BOOST_PP_ITERATION_START_5 >= 53\n#    define BOOST_PP_ITERATION_5 53\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 52 && BOOST_PP_ITERATION_START_5 >= 52\n#    define BOOST_PP_ITERATION_5 52\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 51 && BOOST_PP_ITERATION_START_5 >= 51\n#    define BOOST_PP_ITERATION_5 51\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 50 && BOOST_PP_ITERATION_START_5 >= 50\n#    define BOOST_PP_ITERATION_5 50\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 49 && BOOST_PP_ITERATION_START_5 >= 49\n#    define BOOST_PP_ITERATION_5 49\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 48 && BOOST_PP_ITERATION_START_5 >= 48\n#    define BOOST_PP_ITERATION_5 48\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 47 && BOOST_PP_ITERATION_START_5 >= 47\n#    define BOOST_PP_ITERATION_5 47\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 46 && BOOST_PP_ITERATION_START_5 >= 46\n#    define BOOST_PP_ITERATION_5 46\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 45 && BOOST_PP_ITERATION_START_5 >= 45\n#    define BOOST_PP_ITERATION_5 45\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 44 && BOOST_PP_ITERATION_START_5 >= 44\n#    define BOOST_PP_ITERATION_5 44\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 43 && BOOST_PP_ITERATION_START_5 >= 43\n#    define BOOST_PP_ITERATION_5 43\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 42 && BOOST_PP_ITERATION_START_5 >= 42\n#    define BOOST_PP_ITERATION_5 42\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 41 && BOOST_PP_ITERATION_START_5 >= 41\n#    define BOOST_PP_ITERATION_5 41\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 40 && BOOST_PP_ITERATION_START_5 >= 40\n#    define BOOST_PP_ITERATION_5 40\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 39 && BOOST_PP_ITERATION_START_5 >= 39\n#    define BOOST_PP_ITERATION_5 39\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 38 && BOOST_PP_ITERATION_START_5 >= 38\n#    define BOOST_PP_ITERATION_5 38\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 37 && BOOST_PP_ITERATION_START_5 >= 37\n#    define BOOST_PP_ITERATION_5 37\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 36 && BOOST_PP_ITERATION_START_5 >= 36\n#    define BOOST_PP_ITERATION_5 36\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 35 && BOOST_PP_ITERATION_START_5 >= 35\n#    define BOOST_PP_ITERATION_5 35\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 34 && BOOST_PP_ITERATION_START_5 >= 34\n#    define BOOST_PP_ITERATION_5 34\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 33 && BOOST_PP_ITERATION_START_5 >= 33\n#    define BOOST_PP_ITERATION_5 33\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 32 && BOOST_PP_ITERATION_START_5 >= 32\n#    define BOOST_PP_ITERATION_5 32\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 31 && BOOST_PP_ITERATION_START_5 >= 31\n#    define BOOST_PP_ITERATION_5 31\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 30 && BOOST_PP_ITERATION_START_5 >= 30\n#    define BOOST_PP_ITERATION_5 30\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 29 && BOOST_PP_ITERATION_START_5 >= 29\n#    define BOOST_PP_ITERATION_5 29\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 28 && BOOST_PP_ITERATION_START_5 >= 28\n#    define BOOST_PP_ITERATION_5 28\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 27 && BOOST_PP_ITERATION_START_5 >= 27\n#    define BOOST_PP_ITERATION_5 27\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 26 && BOOST_PP_ITERATION_START_5 >= 26\n#    define BOOST_PP_ITERATION_5 26\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 25 && BOOST_PP_ITERATION_START_5 >= 25\n#    define BOOST_PP_ITERATION_5 25\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 24 && BOOST_PP_ITERATION_START_5 >= 24\n#    define BOOST_PP_ITERATION_5 24\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 23 && BOOST_PP_ITERATION_START_5 >= 23\n#    define BOOST_PP_ITERATION_5 23\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 22 && BOOST_PP_ITERATION_START_5 >= 22\n#    define BOOST_PP_ITERATION_5 22\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 21 && BOOST_PP_ITERATION_START_5 >= 21\n#    define BOOST_PP_ITERATION_5 21\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 20 && BOOST_PP_ITERATION_START_5 >= 20\n#    define BOOST_PP_ITERATION_5 20\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 19 && BOOST_PP_ITERATION_START_5 >= 19\n#    define BOOST_PP_ITERATION_5 19\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 18 && BOOST_PP_ITERATION_START_5 >= 18\n#    define BOOST_PP_ITERATION_5 18\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 17 && BOOST_PP_ITERATION_START_5 >= 17\n#    define BOOST_PP_ITERATION_5 17\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 16 && BOOST_PP_ITERATION_START_5 >= 16\n#    define BOOST_PP_ITERATION_5 16\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 15 && BOOST_PP_ITERATION_START_5 >= 15\n#    define BOOST_PP_ITERATION_5 15\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 14 && BOOST_PP_ITERATION_START_5 >= 14\n#    define BOOST_PP_ITERATION_5 14\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 13 && BOOST_PP_ITERATION_START_5 >= 13\n#    define BOOST_PP_ITERATION_5 13\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 12 && BOOST_PP_ITERATION_START_5 >= 12\n#    define BOOST_PP_ITERATION_5 12\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 11 && BOOST_PP_ITERATION_START_5 >= 11\n#    define BOOST_PP_ITERATION_5 11\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 10 && BOOST_PP_ITERATION_START_5 >= 10\n#    define BOOST_PP_ITERATION_5 10\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 9 && BOOST_PP_ITERATION_START_5 >= 9\n#    define BOOST_PP_ITERATION_5 9\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 8 && BOOST_PP_ITERATION_START_5 >= 8\n#    define BOOST_PP_ITERATION_5 8\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 7 && BOOST_PP_ITERATION_START_5 >= 7\n#    define BOOST_PP_ITERATION_5 7\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 6 && BOOST_PP_ITERATION_START_5 >= 6\n#    define BOOST_PP_ITERATION_5 6\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 5 && BOOST_PP_ITERATION_START_5 >= 5\n#    define BOOST_PP_ITERATION_5 5\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 4 && BOOST_PP_ITERATION_START_5 >= 4\n#    define BOOST_PP_ITERATION_5 4\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 3 && BOOST_PP_ITERATION_START_5 >= 3\n#    define BOOST_PP_ITERATION_5 3\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 2 && BOOST_PP_ITERATION_START_5 >= 2\n#    define BOOST_PP_ITERATION_5 2\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 1 && BOOST_PP_ITERATION_START_5 >= 1\n#    define BOOST_PP_ITERATION_5 1\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n# if BOOST_PP_ITERATION_FINISH_5 <= 0 && BOOST_PP_ITERATION_START_5 >= 0\n#    define BOOST_PP_ITERATION_5 0\n#    include BOOST_PP_FILENAME_5\n#    undef BOOST_PP_ITERATION_5\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/local.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if !defined(BOOST_PP_LOCAL_LIMITS)\n#    error BOOST_PP_ERROR:  local iteration boundaries are not defined\n# elif !defined(BOOST_PP_LOCAL_MACRO)\n#    error BOOST_PP_ERROR:  local iteration target macro is not defined\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#        define BOOST_PP_LOCAL_S BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)\n#        define BOOST_PP_LOCAL_F BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)\n#    else\n#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_LOCAL_LIMITS)\n#        include <boost/preprocessor/iteration/detail/start.hpp>\n#        define BOOST_PP_VALUE BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_LOCAL_LIMITS)\n#        include <boost/preprocessor/iteration/detail/finish.hpp>\n#        define BOOST_PP_LOCAL_S BOOST_PP_LOCAL_SE()\n#        define BOOST_PP_LOCAL_F BOOST_PP_LOCAL_FE()\n#    endif\n# endif\n#\n# if (BOOST_PP_LOCAL_S) > (BOOST_PP_LOCAL_F)\n#    include <boost/preprocessor/iteration/detail/rlocal.hpp>\n# else\n#    if BOOST_PP_LOCAL_C(0)\n        BOOST_PP_LOCAL_MACRO(0)\n#    endif\n#    if BOOST_PP_LOCAL_C(1)\n        BOOST_PP_LOCAL_MACRO(1)\n#    endif\n#    if BOOST_PP_LOCAL_C(2)\n        BOOST_PP_LOCAL_MACRO(2)\n#    endif\n#    if BOOST_PP_LOCAL_C(3)\n        BOOST_PP_LOCAL_MACRO(3)\n#    endif\n#    if BOOST_PP_LOCAL_C(4)\n        BOOST_PP_LOCAL_MACRO(4)\n#    endif\n#    if BOOST_PP_LOCAL_C(5)\n        BOOST_PP_LOCAL_MACRO(5)\n#    endif\n#    if BOOST_PP_LOCAL_C(6)\n        BOOST_PP_LOCAL_MACRO(6)\n#    endif\n#    if BOOST_PP_LOCAL_C(7)\n        BOOST_PP_LOCAL_MACRO(7)\n#    endif\n#    if BOOST_PP_LOCAL_C(8)\n        BOOST_PP_LOCAL_MACRO(8)\n#    endif\n#    if BOOST_PP_LOCAL_C(9)\n        BOOST_PP_LOCAL_MACRO(9)\n#    endif\n#    if BOOST_PP_LOCAL_C(10)\n        BOOST_PP_LOCAL_MACRO(10)\n#    endif\n#    if BOOST_PP_LOCAL_C(11)\n        BOOST_PP_LOCAL_MACRO(11)\n#    endif\n#    if BOOST_PP_LOCAL_C(12)\n        BOOST_PP_LOCAL_MACRO(12)\n#    endif\n#    if BOOST_PP_LOCAL_C(13)\n        BOOST_PP_LOCAL_MACRO(13)\n#    endif\n#    if BOOST_PP_LOCAL_C(14)\n        BOOST_PP_LOCAL_MACRO(14)\n#    endif\n#    if BOOST_PP_LOCAL_C(15)\n        BOOST_PP_LOCAL_MACRO(15)\n#    endif\n#    if BOOST_PP_LOCAL_C(16)\n        BOOST_PP_LOCAL_MACRO(16)\n#    endif\n#    if BOOST_PP_LOCAL_C(17)\n        BOOST_PP_LOCAL_MACRO(17)\n#    endif\n#    if BOOST_PP_LOCAL_C(18)\n        BOOST_PP_LOCAL_MACRO(18)\n#    endif\n#    if BOOST_PP_LOCAL_C(19)\n        BOOST_PP_LOCAL_MACRO(19)\n#    endif\n#    if BOOST_PP_LOCAL_C(20)\n        BOOST_PP_LOCAL_MACRO(20)\n#    endif\n#    if BOOST_PP_LOCAL_C(21)\n        BOOST_PP_LOCAL_MACRO(21)\n#    endif\n#    if BOOST_PP_LOCAL_C(22)\n        BOOST_PP_LOCAL_MACRO(22)\n#    endif\n#    if BOOST_PP_LOCAL_C(23)\n        BOOST_PP_LOCAL_MACRO(23)\n#    endif\n#    if BOOST_PP_LOCAL_C(24)\n        BOOST_PP_LOCAL_MACRO(24)\n#    endif\n#    if BOOST_PP_LOCAL_C(25)\n        BOOST_PP_LOCAL_MACRO(25)\n#    endif\n#    if BOOST_PP_LOCAL_C(26)\n        BOOST_PP_LOCAL_MACRO(26)\n#    endif\n#    if BOOST_PP_LOCAL_C(27)\n        BOOST_PP_LOCAL_MACRO(27)\n#    endif\n#    if BOOST_PP_LOCAL_C(28)\n        BOOST_PP_LOCAL_MACRO(28)\n#    endif\n#    if BOOST_PP_LOCAL_C(29)\n        BOOST_PP_LOCAL_MACRO(29)\n#    endif\n#    if BOOST_PP_LOCAL_C(30)\n        BOOST_PP_LOCAL_MACRO(30)\n#    endif\n#    if BOOST_PP_LOCAL_C(31)\n        BOOST_PP_LOCAL_MACRO(31)\n#    endif\n#    if BOOST_PP_LOCAL_C(32)\n        BOOST_PP_LOCAL_MACRO(32)\n#    endif\n#    if BOOST_PP_LOCAL_C(33)\n        BOOST_PP_LOCAL_MACRO(33)\n#    endif\n#    if BOOST_PP_LOCAL_C(34)\n        BOOST_PP_LOCAL_MACRO(34)\n#    endif\n#    if BOOST_PP_LOCAL_C(35)\n        BOOST_PP_LOCAL_MACRO(35)\n#    endif\n#    if BOOST_PP_LOCAL_C(36)\n        BOOST_PP_LOCAL_MACRO(36)\n#    endif\n#    if BOOST_PP_LOCAL_C(37)\n        BOOST_PP_LOCAL_MACRO(37)\n#    endif\n#    if BOOST_PP_LOCAL_C(38)\n        BOOST_PP_LOCAL_MACRO(38)\n#    endif\n#    if BOOST_PP_LOCAL_C(39)\n        BOOST_PP_LOCAL_MACRO(39)\n#    endif\n#    if BOOST_PP_LOCAL_C(40)\n        BOOST_PP_LOCAL_MACRO(40)\n#    endif\n#    if BOOST_PP_LOCAL_C(41)\n        BOOST_PP_LOCAL_MACRO(41)\n#    endif\n#    if BOOST_PP_LOCAL_C(42)\n        BOOST_PP_LOCAL_MACRO(42)\n#    endif\n#    if BOOST_PP_LOCAL_C(43)\n        BOOST_PP_LOCAL_MACRO(43)\n#    endif\n#    if BOOST_PP_LOCAL_C(44)\n        BOOST_PP_LOCAL_MACRO(44)\n#    endif\n#    if BOOST_PP_LOCAL_C(45)\n        BOOST_PP_LOCAL_MACRO(45)\n#    endif\n#    if BOOST_PP_LOCAL_C(46)\n        BOOST_PP_LOCAL_MACRO(46)\n#    endif\n#    if BOOST_PP_LOCAL_C(47)\n        BOOST_PP_LOCAL_MACRO(47)\n#    endif\n#    if BOOST_PP_LOCAL_C(48)\n        BOOST_PP_LOCAL_MACRO(48)\n#    endif\n#    if BOOST_PP_LOCAL_C(49)\n        BOOST_PP_LOCAL_MACRO(49)\n#    endif\n#    if BOOST_PP_LOCAL_C(50)\n        BOOST_PP_LOCAL_MACRO(50)\n#    endif\n#    if BOOST_PP_LOCAL_C(51)\n        BOOST_PP_LOCAL_MACRO(51)\n#    endif\n#    if BOOST_PP_LOCAL_C(52)\n        BOOST_PP_LOCAL_MACRO(52)\n#    endif\n#    if BOOST_PP_LOCAL_C(53)\n        BOOST_PP_LOCAL_MACRO(53)\n#    endif\n#    if BOOST_PP_LOCAL_C(54)\n        BOOST_PP_LOCAL_MACRO(54)\n#    endif\n#    if BOOST_PP_LOCAL_C(55)\n        BOOST_PP_LOCAL_MACRO(55)\n#    endif\n#    if BOOST_PP_LOCAL_C(56)\n        BOOST_PP_LOCAL_MACRO(56)\n#    endif\n#    if BOOST_PP_LOCAL_C(57)\n        BOOST_PP_LOCAL_MACRO(57)\n#    endif\n#    if BOOST_PP_LOCAL_C(58)\n        BOOST_PP_LOCAL_MACRO(58)\n#    endif\n#    if BOOST_PP_LOCAL_C(59)\n        BOOST_PP_LOCAL_MACRO(59)\n#    endif\n#    if BOOST_PP_LOCAL_C(60)\n        BOOST_PP_LOCAL_MACRO(60)\n#    endif\n#    if BOOST_PP_LOCAL_C(61)\n        BOOST_PP_LOCAL_MACRO(61)\n#    endif\n#    if BOOST_PP_LOCAL_C(62)\n        BOOST_PP_LOCAL_MACRO(62)\n#    endif\n#    if BOOST_PP_LOCAL_C(63)\n        BOOST_PP_LOCAL_MACRO(63)\n#    endif\n#    if BOOST_PP_LOCAL_C(64)\n        BOOST_PP_LOCAL_MACRO(64)\n#    endif\n#    if BOOST_PP_LOCAL_C(65)\n        BOOST_PP_LOCAL_MACRO(65)\n#    endif\n#    if BOOST_PP_LOCAL_C(66)\n        BOOST_PP_LOCAL_MACRO(66)\n#    endif\n#    if BOOST_PP_LOCAL_C(67)\n        BOOST_PP_LOCAL_MACRO(67)\n#    endif\n#    if BOOST_PP_LOCAL_C(68)\n        BOOST_PP_LOCAL_MACRO(68)\n#    endif\n#    if BOOST_PP_LOCAL_C(69)\n        BOOST_PP_LOCAL_MACRO(69)\n#    endif\n#    if BOOST_PP_LOCAL_C(70)\n        BOOST_PP_LOCAL_MACRO(70)\n#    endif\n#    if BOOST_PP_LOCAL_C(71)\n        BOOST_PP_LOCAL_MACRO(71)\n#    endif\n#    if BOOST_PP_LOCAL_C(72)\n        BOOST_PP_LOCAL_MACRO(72)\n#    endif\n#    if BOOST_PP_LOCAL_C(73)\n        BOOST_PP_LOCAL_MACRO(73)\n#    endif\n#    if BOOST_PP_LOCAL_C(74)\n        BOOST_PP_LOCAL_MACRO(74)\n#    endif\n#    if BOOST_PP_LOCAL_C(75)\n        BOOST_PP_LOCAL_MACRO(75)\n#    endif\n#    if BOOST_PP_LOCAL_C(76)\n        BOOST_PP_LOCAL_MACRO(76)\n#    endif\n#    if BOOST_PP_LOCAL_C(77)\n        BOOST_PP_LOCAL_MACRO(77)\n#    endif\n#    if BOOST_PP_LOCAL_C(78)\n        BOOST_PP_LOCAL_MACRO(78)\n#    endif\n#    if BOOST_PP_LOCAL_C(79)\n        BOOST_PP_LOCAL_MACRO(79)\n#    endif\n#    if BOOST_PP_LOCAL_C(80)\n        BOOST_PP_LOCAL_MACRO(80)\n#    endif\n#    if BOOST_PP_LOCAL_C(81)\n        BOOST_PP_LOCAL_MACRO(81)\n#    endif\n#    if BOOST_PP_LOCAL_C(82)\n        BOOST_PP_LOCAL_MACRO(82)\n#    endif\n#    if BOOST_PP_LOCAL_C(83)\n        BOOST_PP_LOCAL_MACRO(83)\n#    endif\n#    if BOOST_PP_LOCAL_C(84)\n        BOOST_PP_LOCAL_MACRO(84)\n#    endif\n#    if BOOST_PP_LOCAL_C(85)\n        BOOST_PP_LOCAL_MACRO(85)\n#    endif\n#    if BOOST_PP_LOCAL_C(86)\n        BOOST_PP_LOCAL_MACRO(86)\n#    endif\n#    if BOOST_PP_LOCAL_C(87)\n        BOOST_PP_LOCAL_MACRO(87)\n#    endif\n#    if BOOST_PP_LOCAL_C(88)\n        BOOST_PP_LOCAL_MACRO(88)\n#    endif\n#    if BOOST_PP_LOCAL_C(89)\n        BOOST_PP_LOCAL_MACRO(89)\n#    endif\n#    if BOOST_PP_LOCAL_C(90)\n        BOOST_PP_LOCAL_MACRO(90)\n#    endif\n#    if BOOST_PP_LOCAL_C(91)\n        BOOST_PP_LOCAL_MACRO(91)\n#    endif\n#    if BOOST_PP_LOCAL_C(92)\n        BOOST_PP_LOCAL_MACRO(92)\n#    endif\n#    if BOOST_PP_LOCAL_C(93)\n        BOOST_PP_LOCAL_MACRO(93)\n#    endif\n#    if BOOST_PP_LOCAL_C(94)\n        BOOST_PP_LOCAL_MACRO(94)\n#    endif\n#    if BOOST_PP_LOCAL_C(95)\n        BOOST_PP_LOCAL_MACRO(95)\n#    endif\n#    if BOOST_PP_LOCAL_C(96)\n        BOOST_PP_LOCAL_MACRO(96)\n#    endif\n#    if BOOST_PP_LOCAL_C(97)\n        BOOST_PP_LOCAL_MACRO(97)\n#    endif\n#    if BOOST_PP_LOCAL_C(98)\n        BOOST_PP_LOCAL_MACRO(98)\n#    endif\n#    if BOOST_PP_LOCAL_C(99)\n        BOOST_PP_LOCAL_MACRO(99)\n#    endif\n#    if BOOST_PP_LOCAL_C(100)\n        BOOST_PP_LOCAL_MACRO(100)\n#    endif\n#    if BOOST_PP_LOCAL_C(101)\n        BOOST_PP_LOCAL_MACRO(101)\n#    endif\n#    if BOOST_PP_LOCAL_C(102)\n        BOOST_PP_LOCAL_MACRO(102)\n#    endif\n#    if BOOST_PP_LOCAL_C(103)\n        BOOST_PP_LOCAL_MACRO(103)\n#    endif\n#    if BOOST_PP_LOCAL_C(104)\n        BOOST_PP_LOCAL_MACRO(104)\n#    endif\n#    if BOOST_PP_LOCAL_C(105)\n        BOOST_PP_LOCAL_MACRO(105)\n#    endif\n#    if BOOST_PP_LOCAL_C(106)\n        BOOST_PP_LOCAL_MACRO(106)\n#    endif\n#    if BOOST_PP_LOCAL_C(107)\n        BOOST_PP_LOCAL_MACRO(107)\n#    endif\n#    if BOOST_PP_LOCAL_C(108)\n        BOOST_PP_LOCAL_MACRO(108)\n#    endif\n#    if BOOST_PP_LOCAL_C(109)\n        BOOST_PP_LOCAL_MACRO(109)\n#    endif\n#    if BOOST_PP_LOCAL_C(110)\n        BOOST_PP_LOCAL_MACRO(110)\n#    endif\n#    if BOOST_PP_LOCAL_C(111)\n        BOOST_PP_LOCAL_MACRO(111)\n#    endif\n#    if BOOST_PP_LOCAL_C(112)\n        BOOST_PP_LOCAL_MACRO(112)\n#    endif\n#    if BOOST_PP_LOCAL_C(113)\n        BOOST_PP_LOCAL_MACRO(113)\n#    endif\n#    if BOOST_PP_LOCAL_C(114)\n        BOOST_PP_LOCAL_MACRO(114)\n#    endif\n#    if BOOST_PP_LOCAL_C(115)\n        BOOST_PP_LOCAL_MACRO(115)\n#    endif\n#    if BOOST_PP_LOCAL_C(116)\n        BOOST_PP_LOCAL_MACRO(116)\n#    endif\n#    if BOOST_PP_LOCAL_C(117)\n        BOOST_PP_LOCAL_MACRO(117)\n#    endif\n#    if BOOST_PP_LOCAL_C(118)\n        BOOST_PP_LOCAL_MACRO(118)\n#    endif\n#    if BOOST_PP_LOCAL_C(119)\n        BOOST_PP_LOCAL_MACRO(119)\n#    endif\n#    if BOOST_PP_LOCAL_C(120)\n        BOOST_PP_LOCAL_MACRO(120)\n#    endif\n#    if BOOST_PP_LOCAL_C(121)\n        BOOST_PP_LOCAL_MACRO(121)\n#    endif\n#    if BOOST_PP_LOCAL_C(122)\n        BOOST_PP_LOCAL_MACRO(122)\n#    endif\n#    if BOOST_PP_LOCAL_C(123)\n        BOOST_PP_LOCAL_MACRO(123)\n#    endif\n#    if BOOST_PP_LOCAL_C(124)\n        BOOST_PP_LOCAL_MACRO(124)\n#    endif\n#    if BOOST_PP_LOCAL_C(125)\n        BOOST_PP_LOCAL_MACRO(125)\n#    endif\n#    if BOOST_PP_LOCAL_C(126)\n        BOOST_PP_LOCAL_MACRO(126)\n#    endif\n#    if BOOST_PP_LOCAL_C(127)\n        BOOST_PP_LOCAL_MACRO(127)\n#    endif\n#    if BOOST_PP_LOCAL_C(128)\n        BOOST_PP_LOCAL_MACRO(128)\n#    endif\n#    if BOOST_PP_LOCAL_C(129)\n        BOOST_PP_LOCAL_MACRO(129)\n#    endif\n#    if BOOST_PP_LOCAL_C(130)\n        BOOST_PP_LOCAL_MACRO(130)\n#    endif\n#    if BOOST_PP_LOCAL_C(131)\n        BOOST_PP_LOCAL_MACRO(131)\n#    endif\n#    if BOOST_PP_LOCAL_C(132)\n        BOOST_PP_LOCAL_MACRO(132)\n#    endif\n#    if BOOST_PP_LOCAL_C(133)\n        BOOST_PP_LOCAL_MACRO(133)\n#    endif\n#    if BOOST_PP_LOCAL_C(134)\n        BOOST_PP_LOCAL_MACRO(134)\n#    endif\n#    if BOOST_PP_LOCAL_C(135)\n        BOOST_PP_LOCAL_MACRO(135)\n#    endif\n#    if BOOST_PP_LOCAL_C(136)\n        BOOST_PP_LOCAL_MACRO(136)\n#    endif\n#    if BOOST_PP_LOCAL_C(137)\n        BOOST_PP_LOCAL_MACRO(137)\n#    endif\n#    if BOOST_PP_LOCAL_C(138)\n        BOOST_PP_LOCAL_MACRO(138)\n#    endif\n#    if BOOST_PP_LOCAL_C(139)\n        BOOST_PP_LOCAL_MACRO(139)\n#    endif\n#    if BOOST_PP_LOCAL_C(140)\n        BOOST_PP_LOCAL_MACRO(140)\n#    endif\n#    if BOOST_PP_LOCAL_C(141)\n        BOOST_PP_LOCAL_MACRO(141)\n#    endif\n#    if BOOST_PP_LOCAL_C(142)\n        BOOST_PP_LOCAL_MACRO(142)\n#    endif\n#    if BOOST_PP_LOCAL_C(143)\n        BOOST_PP_LOCAL_MACRO(143)\n#    endif\n#    if BOOST_PP_LOCAL_C(144)\n        BOOST_PP_LOCAL_MACRO(144)\n#    endif\n#    if BOOST_PP_LOCAL_C(145)\n        BOOST_PP_LOCAL_MACRO(145)\n#    endif\n#    if BOOST_PP_LOCAL_C(146)\n        BOOST_PP_LOCAL_MACRO(146)\n#    endif\n#    if BOOST_PP_LOCAL_C(147)\n        BOOST_PP_LOCAL_MACRO(147)\n#    endif\n#    if BOOST_PP_LOCAL_C(148)\n        BOOST_PP_LOCAL_MACRO(148)\n#    endif\n#    if BOOST_PP_LOCAL_C(149)\n        BOOST_PP_LOCAL_MACRO(149)\n#    endif\n#    if BOOST_PP_LOCAL_C(150)\n        BOOST_PP_LOCAL_MACRO(150)\n#    endif\n#    if BOOST_PP_LOCAL_C(151)\n        BOOST_PP_LOCAL_MACRO(151)\n#    endif\n#    if BOOST_PP_LOCAL_C(152)\n        BOOST_PP_LOCAL_MACRO(152)\n#    endif\n#    if BOOST_PP_LOCAL_C(153)\n        BOOST_PP_LOCAL_MACRO(153)\n#    endif\n#    if BOOST_PP_LOCAL_C(154)\n        BOOST_PP_LOCAL_MACRO(154)\n#    endif\n#    if BOOST_PP_LOCAL_C(155)\n        BOOST_PP_LOCAL_MACRO(155)\n#    endif\n#    if BOOST_PP_LOCAL_C(156)\n        BOOST_PP_LOCAL_MACRO(156)\n#    endif\n#    if BOOST_PP_LOCAL_C(157)\n        BOOST_PP_LOCAL_MACRO(157)\n#    endif\n#    if BOOST_PP_LOCAL_C(158)\n        BOOST_PP_LOCAL_MACRO(158)\n#    endif\n#    if BOOST_PP_LOCAL_C(159)\n        BOOST_PP_LOCAL_MACRO(159)\n#    endif\n#    if BOOST_PP_LOCAL_C(160)\n        BOOST_PP_LOCAL_MACRO(160)\n#    endif\n#    if BOOST_PP_LOCAL_C(161)\n        BOOST_PP_LOCAL_MACRO(161)\n#    endif\n#    if BOOST_PP_LOCAL_C(162)\n        BOOST_PP_LOCAL_MACRO(162)\n#    endif\n#    if BOOST_PP_LOCAL_C(163)\n        BOOST_PP_LOCAL_MACRO(163)\n#    endif\n#    if BOOST_PP_LOCAL_C(164)\n        BOOST_PP_LOCAL_MACRO(164)\n#    endif\n#    if BOOST_PP_LOCAL_C(165)\n        BOOST_PP_LOCAL_MACRO(165)\n#    endif\n#    if BOOST_PP_LOCAL_C(166)\n        BOOST_PP_LOCAL_MACRO(166)\n#    endif\n#    if BOOST_PP_LOCAL_C(167)\n        BOOST_PP_LOCAL_MACRO(167)\n#    endif\n#    if BOOST_PP_LOCAL_C(168)\n        BOOST_PP_LOCAL_MACRO(168)\n#    endif\n#    if BOOST_PP_LOCAL_C(169)\n        BOOST_PP_LOCAL_MACRO(169)\n#    endif\n#    if BOOST_PP_LOCAL_C(170)\n        BOOST_PP_LOCAL_MACRO(170)\n#    endif\n#    if BOOST_PP_LOCAL_C(171)\n        BOOST_PP_LOCAL_MACRO(171)\n#    endif\n#    if BOOST_PP_LOCAL_C(172)\n        BOOST_PP_LOCAL_MACRO(172)\n#    endif\n#    if BOOST_PP_LOCAL_C(173)\n        BOOST_PP_LOCAL_MACRO(173)\n#    endif\n#    if BOOST_PP_LOCAL_C(174)\n        BOOST_PP_LOCAL_MACRO(174)\n#    endif\n#    if BOOST_PP_LOCAL_C(175)\n        BOOST_PP_LOCAL_MACRO(175)\n#    endif\n#    if BOOST_PP_LOCAL_C(176)\n        BOOST_PP_LOCAL_MACRO(176)\n#    endif\n#    if BOOST_PP_LOCAL_C(177)\n        BOOST_PP_LOCAL_MACRO(177)\n#    endif\n#    if BOOST_PP_LOCAL_C(178)\n        BOOST_PP_LOCAL_MACRO(178)\n#    endif\n#    if BOOST_PP_LOCAL_C(179)\n        BOOST_PP_LOCAL_MACRO(179)\n#    endif\n#    if BOOST_PP_LOCAL_C(180)\n        BOOST_PP_LOCAL_MACRO(180)\n#    endif\n#    if BOOST_PP_LOCAL_C(181)\n        BOOST_PP_LOCAL_MACRO(181)\n#    endif\n#    if BOOST_PP_LOCAL_C(182)\n        BOOST_PP_LOCAL_MACRO(182)\n#    endif\n#    if BOOST_PP_LOCAL_C(183)\n        BOOST_PP_LOCAL_MACRO(183)\n#    endif\n#    if BOOST_PP_LOCAL_C(184)\n        BOOST_PP_LOCAL_MACRO(184)\n#    endif\n#    if BOOST_PP_LOCAL_C(185)\n        BOOST_PP_LOCAL_MACRO(185)\n#    endif\n#    if BOOST_PP_LOCAL_C(186)\n        BOOST_PP_LOCAL_MACRO(186)\n#    endif\n#    if BOOST_PP_LOCAL_C(187)\n        BOOST_PP_LOCAL_MACRO(187)\n#    endif\n#    if BOOST_PP_LOCAL_C(188)\n        BOOST_PP_LOCAL_MACRO(188)\n#    endif\n#    if BOOST_PP_LOCAL_C(189)\n        BOOST_PP_LOCAL_MACRO(189)\n#    endif\n#    if BOOST_PP_LOCAL_C(190)\n        BOOST_PP_LOCAL_MACRO(190)\n#    endif\n#    if BOOST_PP_LOCAL_C(191)\n        BOOST_PP_LOCAL_MACRO(191)\n#    endif\n#    if BOOST_PP_LOCAL_C(192)\n        BOOST_PP_LOCAL_MACRO(192)\n#    endif\n#    if BOOST_PP_LOCAL_C(193)\n        BOOST_PP_LOCAL_MACRO(193)\n#    endif\n#    if BOOST_PP_LOCAL_C(194)\n        BOOST_PP_LOCAL_MACRO(194)\n#    endif\n#    if BOOST_PP_LOCAL_C(195)\n        BOOST_PP_LOCAL_MACRO(195)\n#    endif\n#    if BOOST_PP_LOCAL_C(196)\n        BOOST_PP_LOCAL_MACRO(196)\n#    endif\n#    if BOOST_PP_LOCAL_C(197)\n        BOOST_PP_LOCAL_MACRO(197)\n#    endif\n#    if BOOST_PP_LOCAL_C(198)\n        BOOST_PP_LOCAL_MACRO(198)\n#    endif\n#    if BOOST_PP_LOCAL_C(199)\n        BOOST_PP_LOCAL_MACRO(199)\n#    endif\n#    if BOOST_PP_LOCAL_C(200)\n        BOOST_PP_LOCAL_MACRO(200)\n#    endif\n#    if BOOST_PP_LOCAL_C(201)\n        BOOST_PP_LOCAL_MACRO(201)\n#    endif\n#    if BOOST_PP_LOCAL_C(202)\n        BOOST_PP_LOCAL_MACRO(202)\n#    endif\n#    if BOOST_PP_LOCAL_C(203)\n        BOOST_PP_LOCAL_MACRO(203)\n#    endif\n#    if BOOST_PP_LOCAL_C(204)\n        BOOST_PP_LOCAL_MACRO(204)\n#    endif\n#    if BOOST_PP_LOCAL_C(205)\n        BOOST_PP_LOCAL_MACRO(205)\n#    endif\n#    if BOOST_PP_LOCAL_C(206)\n        BOOST_PP_LOCAL_MACRO(206)\n#    endif\n#    if BOOST_PP_LOCAL_C(207)\n        BOOST_PP_LOCAL_MACRO(207)\n#    endif\n#    if BOOST_PP_LOCAL_C(208)\n        BOOST_PP_LOCAL_MACRO(208)\n#    endif\n#    if BOOST_PP_LOCAL_C(209)\n        BOOST_PP_LOCAL_MACRO(209)\n#    endif\n#    if BOOST_PP_LOCAL_C(210)\n        BOOST_PP_LOCAL_MACRO(210)\n#    endif\n#    if BOOST_PP_LOCAL_C(211)\n        BOOST_PP_LOCAL_MACRO(211)\n#    endif\n#    if BOOST_PP_LOCAL_C(212)\n        BOOST_PP_LOCAL_MACRO(212)\n#    endif\n#    if BOOST_PP_LOCAL_C(213)\n        BOOST_PP_LOCAL_MACRO(213)\n#    endif\n#    if BOOST_PP_LOCAL_C(214)\n        BOOST_PP_LOCAL_MACRO(214)\n#    endif\n#    if BOOST_PP_LOCAL_C(215)\n        BOOST_PP_LOCAL_MACRO(215)\n#    endif\n#    if BOOST_PP_LOCAL_C(216)\n        BOOST_PP_LOCAL_MACRO(216)\n#    endif\n#    if BOOST_PP_LOCAL_C(217)\n        BOOST_PP_LOCAL_MACRO(217)\n#    endif\n#    if BOOST_PP_LOCAL_C(218)\n        BOOST_PP_LOCAL_MACRO(218)\n#    endif\n#    if BOOST_PP_LOCAL_C(219)\n        BOOST_PP_LOCAL_MACRO(219)\n#    endif\n#    if BOOST_PP_LOCAL_C(220)\n        BOOST_PP_LOCAL_MACRO(220)\n#    endif\n#    if BOOST_PP_LOCAL_C(221)\n        BOOST_PP_LOCAL_MACRO(221)\n#    endif\n#    if BOOST_PP_LOCAL_C(222)\n        BOOST_PP_LOCAL_MACRO(222)\n#    endif\n#    if BOOST_PP_LOCAL_C(223)\n        BOOST_PP_LOCAL_MACRO(223)\n#    endif\n#    if BOOST_PP_LOCAL_C(224)\n        BOOST_PP_LOCAL_MACRO(224)\n#    endif\n#    if BOOST_PP_LOCAL_C(225)\n        BOOST_PP_LOCAL_MACRO(225)\n#    endif\n#    if BOOST_PP_LOCAL_C(226)\n        BOOST_PP_LOCAL_MACRO(226)\n#    endif\n#    if BOOST_PP_LOCAL_C(227)\n        BOOST_PP_LOCAL_MACRO(227)\n#    endif\n#    if BOOST_PP_LOCAL_C(228)\n        BOOST_PP_LOCAL_MACRO(228)\n#    endif\n#    if BOOST_PP_LOCAL_C(229)\n        BOOST_PP_LOCAL_MACRO(229)\n#    endif\n#    if BOOST_PP_LOCAL_C(230)\n        BOOST_PP_LOCAL_MACRO(230)\n#    endif\n#    if BOOST_PP_LOCAL_C(231)\n        BOOST_PP_LOCAL_MACRO(231)\n#    endif\n#    if BOOST_PP_LOCAL_C(232)\n        BOOST_PP_LOCAL_MACRO(232)\n#    endif\n#    if BOOST_PP_LOCAL_C(233)\n        BOOST_PP_LOCAL_MACRO(233)\n#    endif\n#    if BOOST_PP_LOCAL_C(234)\n        BOOST_PP_LOCAL_MACRO(234)\n#    endif\n#    if BOOST_PP_LOCAL_C(235)\n        BOOST_PP_LOCAL_MACRO(235)\n#    endif\n#    if BOOST_PP_LOCAL_C(236)\n        BOOST_PP_LOCAL_MACRO(236)\n#    endif\n\n#    if BOOST_PP_LOCAL_C(237)\n        BOOST_PP_LOCAL_MACRO(237)\n#    endif\n#    if BOOST_PP_LOCAL_C(238)\n        BOOST_PP_LOCAL_MACRO(238)\n#    endif\n#    if BOOST_PP_LOCAL_C(239)\n        BOOST_PP_LOCAL_MACRO(239)\n#    endif\n#    if BOOST_PP_LOCAL_C(240)\n        BOOST_PP_LOCAL_MACRO(240)\n#    endif\n#    if BOOST_PP_LOCAL_C(241)\n        BOOST_PP_LOCAL_MACRO(241)\n#    endif\n#    if BOOST_PP_LOCAL_C(242)\n        BOOST_PP_LOCAL_MACRO(242)\n#    endif\n#    if BOOST_PP_LOCAL_C(243)\n        BOOST_PP_LOCAL_MACRO(243)\n#    endif\n#    if BOOST_PP_LOCAL_C(244)\n        BOOST_PP_LOCAL_MACRO(244)\n#    endif\n#    if BOOST_PP_LOCAL_C(245)\n        BOOST_PP_LOCAL_MACRO(245)\n#    endif\n#    if BOOST_PP_LOCAL_C(246)\n        BOOST_PP_LOCAL_MACRO(246)\n#    endif\n#    if BOOST_PP_LOCAL_C(247)\n        BOOST_PP_LOCAL_MACRO(247)\n#    endif\n#    if BOOST_PP_LOCAL_C(248)\n        BOOST_PP_LOCAL_MACRO(248)\n#    endif\n#    if BOOST_PP_LOCAL_C(249)\n        BOOST_PP_LOCAL_MACRO(249)\n#    endif\n#    if BOOST_PP_LOCAL_C(250)\n        BOOST_PP_LOCAL_MACRO(250)\n#    endif\n#    if BOOST_PP_LOCAL_C(251)\n        BOOST_PP_LOCAL_MACRO(251)\n#    endif\n#    if BOOST_PP_LOCAL_C(252)\n        BOOST_PP_LOCAL_MACRO(252)\n#    endif\n#    if BOOST_PP_LOCAL_C(253)\n        BOOST_PP_LOCAL_MACRO(253)\n#    endif\n#    if BOOST_PP_LOCAL_C(254)\n        BOOST_PP_LOCAL_MACRO(254)\n#    endif\n#    if BOOST_PP_LOCAL_C(255)\n        BOOST_PP_LOCAL_MACRO(255)\n#    endif\n#    if BOOST_PP_LOCAL_C(256)\n        BOOST_PP_LOCAL_MACRO(256)\n#    endif\n# endif\n#\n# undef BOOST_PP_LOCAL_LIMITS\n#\n# undef BOOST_PP_LOCAL_S\n# undef BOOST_PP_LOCAL_F\n#\n# undef BOOST_PP_LOCAL_MACRO\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/rlocal.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if BOOST_PP_LOCAL_R(256)\n    BOOST_PP_LOCAL_MACRO(256)\n# endif\n# if BOOST_PP_LOCAL_R(255)\n    BOOST_PP_LOCAL_MACRO(255)\n# endif\n# if BOOST_PP_LOCAL_R(254)\n    BOOST_PP_LOCAL_MACRO(254)\n# endif\n# if BOOST_PP_LOCAL_R(253)\n    BOOST_PP_LOCAL_MACRO(253)\n# endif\n# if BOOST_PP_LOCAL_R(252)\n    BOOST_PP_LOCAL_MACRO(252)\n# endif\n# if BOOST_PP_LOCAL_R(251)\n    BOOST_PP_LOCAL_MACRO(251)\n# endif\n# if BOOST_PP_LOCAL_R(250)\n    BOOST_PP_LOCAL_MACRO(250)\n# endif\n# if BOOST_PP_LOCAL_R(249)\n    BOOST_PP_LOCAL_MACRO(249)\n# endif\n# if BOOST_PP_LOCAL_R(248)\n    BOOST_PP_LOCAL_MACRO(248)\n# endif\n# if BOOST_PP_LOCAL_R(247)\n    BOOST_PP_LOCAL_MACRO(247)\n# endif\n# if BOOST_PP_LOCAL_R(246)\n    BOOST_PP_LOCAL_MACRO(246)\n# endif\n# if BOOST_PP_LOCAL_R(245)\n    BOOST_PP_LOCAL_MACRO(245)\n# endif\n# if BOOST_PP_LOCAL_R(244)\n    BOOST_PP_LOCAL_MACRO(244)\n# endif\n# if BOOST_PP_LOCAL_R(243)\n    BOOST_PP_LOCAL_MACRO(243)\n# endif\n# if BOOST_PP_LOCAL_R(242)\n    BOOST_PP_LOCAL_MACRO(242)\n# endif\n# if BOOST_PP_LOCAL_R(241)\n    BOOST_PP_LOCAL_MACRO(241)\n# endif\n# if BOOST_PP_LOCAL_R(240)\n    BOOST_PP_LOCAL_MACRO(240)\n# endif\n# if BOOST_PP_LOCAL_R(239)\n    BOOST_PP_LOCAL_MACRO(239)\n# endif\n# if BOOST_PP_LOCAL_R(238)\n    BOOST_PP_LOCAL_MACRO(238)\n# endif\n# if BOOST_PP_LOCAL_R(237)\n    BOOST_PP_LOCAL_MACRO(237)\n# endif\n# if BOOST_PP_LOCAL_R(236)\n    BOOST_PP_LOCAL_MACRO(236)\n# endif\n# if BOOST_PP_LOCAL_R(235)\n    BOOST_PP_LOCAL_MACRO(235)\n# endif\n# if BOOST_PP_LOCAL_R(234)\n    BOOST_PP_LOCAL_MACRO(234)\n# endif\n# if BOOST_PP_LOCAL_R(233)\n    BOOST_PP_LOCAL_MACRO(233)\n# endif\n# if BOOST_PP_LOCAL_R(232)\n    BOOST_PP_LOCAL_MACRO(232)\n# endif\n# if BOOST_PP_LOCAL_R(231)\n    BOOST_PP_LOCAL_MACRO(231)\n# endif\n# if BOOST_PP_LOCAL_R(230)\n    BOOST_PP_LOCAL_MACRO(230)\n# endif\n# if BOOST_PP_LOCAL_R(229)\n    BOOST_PP_LOCAL_MACRO(229)\n# endif\n# if BOOST_PP_LOCAL_R(228)\n    BOOST_PP_LOCAL_MACRO(228)\n# endif\n# if BOOST_PP_LOCAL_R(227)\n    BOOST_PP_LOCAL_MACRO(227)\n# endif\n# if BOOST_PP_LOCAL_R(226)\n    BOOST_PP_LOCAL_MACRO(226)\n# endif\n# if BOOST_PP_LOCAL_R(225)\n    BOOST_PP_LOCAL_MACRO(225)\n# endif\n# if BOOST_PP_LOCAL_R(224)\n    BOOST_PP_LOCAL_MACRO(224)\n# endif\n# if BOOST_PP_LOCAL_R(223)\n    BOOST_PP_LOCAL_MACRO(223)\n# endif\n# if BOOST_PP_LOCAL_R(222)\n    BOOST_PP_LOCAL_MACRO(222)\n# endif\n# if BOOST_PP_LOCAL_R(221)\n    BOOST_PP_LOCAL_MACRO(221)\n# endif\n# if BOOST_PP_LOCAL_R(220)\n    BOOST_PP_LOCAL_MACRO(220)\n# endif\n# if BOOST_PP_LOCAL_R(219)\n    BOOST_PP_LOCAL_MACRO(219)\n# endif\n# if BOOST_PP_LOCAL_R(218)\n    BOOST_PP_LOCAL_MACRO(218)\n# endif\n# if BOOST_PP_LOCAL_R(217)\n    BOOST_PP_LOCAL_MACRO(217)\n# endif\n# if BOOST_PP_LOCAL_R(216)\n    BOOST_PP_LOCAL_MACRO(216)\n# endif\n# if BOOST_PP_LOCAL_R(215)\n    BOOST_PP_LOCAL_MACRO(215)\n# endif\n# if BOOST_PP_LOCAL_R(214)\n    BOOST_PP_LOCAL_MACRO(214)\n# endif\n# if BOOST_PP_LOCAL_R(213)\n    BOOST_PP_LOCAL_MACRO(213)\n# endif\n# if BOOST_PP_LOCAL_R(212)\n    BOOST_PP_LOCAL_MACRO(212)\n# endif\n# if BOOST_PP_LOCAL_R(211)\n    BOOST_PP_LOCAL_MACRO(211)\n# endif\n# if BOOST_PP_LOCAL_R(210)\n    BOOST_PP_LOCAL_MACRO(210)\n# endif\n# if BOOST_PP_LOCAL_R(209)\n    BOOST_PP_LOCAL_MACRO(209)\n# endif\n# if BOOST_PP_LOCAL_R(208)\n    BOOST_PP_LOCAL_MACRO(208)\n# endif\n# if BOOST_PP_LOCAL_R(207)\n    BOOST_PP_LOCAL_MACRO(207)\n# endif\n# if BOOST_PP_LOCAL_R(206)\n    BOOST_PP_LOCAL_MACRO(206)\n# endif\n# if BOOST_PP_LOCAL_R(205)\n    BOOST_PP_LOCAL_MACRO(205)\n# endif\n# if BOOST_PP_LOCAL_R(204)\n    BOOST_PP_LOCAL_MACRO(204)\n# endif\n# if BOOST_PP_LOCAL_R(203)\n    BOOST_PP_LOCAL_MACRO(203)\n# endif\n# if BOOST_PP_LOCAL_R(202)\n    BOOST_PP_LOCAL_MACRO(202)\n# endif\n# if BOOST_PP_LOCAL_R(201)\n    BOOST_PP_LOCAL_MACRO(201)\n# endif\n# if BOOST_PP_LOCAL_R(200)\n    BOOST_PP_LOCAL_MACRO(200)\n# endif\n# if BOOST_PP_LOCAL_R(199)\n    BOOST_PP_LOCAL_MACRO(199)\n# endif\n# if BOOST_PP_LOCAL_R(198)\n    BOOST_PP_LOCAL_MACRO(198)\n# endif\n# if BOOST_PP_LOCAL_R(197)\n    BOOST_PP_LOCAL_MACRO(197)\n# endif\n# if BOOST_PP_LOCAL_R(196)\n    BOOST_PP_LOCAL_MACRO(196)\n# endif\n# if BOOST_PP_LOCAL_R(195)\n    BOOST_PP_LOCAL_MACRO(195)\n# endif\n# if BOOST_PP_LOCAL_R(194)\n    BOOST_PP_LOCAL_MACRO(194)\n# endif\n# if BOOST_PP_LOCAL_R(193)\n    BOOST_PP_LOCAL_MACRO(193)\n# endif\n# if BOOST_PP_LOCAL_R(192)\n    BOOST_PP_LOCAL_MACRO(192)\n# endif\n# if BOOST_PP_LOCAL_R(191)\n    BOOST_PP_LOCAL_MACRO(191)\n# endif\n# if BOOST_PP_LOCAL_R(190)\n    BOOST_PP_LOCAL_MACRO(190)\n# endif\n# if BOOST_PP_LOCAL_R(189)\n    BOOST_PP_LOCAL_MACRO(189)\n# endif\n# if BOOST_PP_LOCAL_R(188)\n    BOOST_PP_LOCAL_MACRO(188)\n# endif\n# if BOOST_PP_LOCAL_R(187)\n    BOOST_PP_LOCAL_MACRO(187)\n# endif\n# if BOOST_PP_LOCAL_R(186)\n    BOOST_PP_LOCAL_MACRO(186)\n# endif\n# if BOOST_PP_LOCAL_R(185)\n    BOOST_PP_LOCAL_MACRO(185)\n# endif\n# if BOOST_PP_LOCAL_R(184)\n    BOOST_PP_LOCAL_MACRO(184)\n# endif\n# if BOOST_PP_LOCAL_R(183)\n    BOOST_PP_LOCAL_MACRO(183)\n# endif\n# if BOOST_PP_LOCAL_R(182)\n    BOOST_PP_LOCAL_MACRO(182)\n# endif\n# if BOOST_PP_LOCAL_R(181)\n    BOOST_PP_LOCAL_MACRO(181)\n# endif\n# if BOOST_PP_LOCAL_R(180)\n    BOOST_PP_LOCAL_MACRO(180)\n# endif\n# if BOOST_PP_LOCAL_R(179)\n    BOOST_PP_LOCAL_MACRO(179)\n# endif\n# if BOOST_PP_LOCAL_R(178)\n    BOOST_PP_LOCAL_MACRO(178)\n# endif\n# if BOOST_PP_LOCAL_R(177)\n    BOOST_PP_LOCAL_MACRO(177)\n# endif\n# if BOOST_PP_LOCAL_R(176)\n    BOOST_PP_LOCAL_MACRO(176)\n# endif\n# if BOOST_PP_LOCAL_R(175)\n    BOOST_PP_LOCAL_MACRO(175)\n# endif\n# if BOOST_PP_LOCAL_R(174)\n    BOOST_PP_LOCAL_MACRO(174)\n# endif\n# if BOOST_PP_LOCAL_R(173)\n    BOOST_PP_LOCAL_MACRO(173)\n# endif\n# if BOOST_PP_LOCAL_R(172)\n    BOOST_PP_LOCAL_MACRO(172)\n# endif\n# if BOOST_PP_LOCAL_R(171)\n    BOOST_PP_LOCAL_MACRO(171)\n# endif\n# if BOOST_PP_LOCAL_R(170)\n    BOOST_PP_LOCAL_MACRO(170)\n# endif\n# if BOOST_PP_LOCAL_R(169)\n    BOOST_PP_LOCAL_MACRO(169)\n# endif\n# if BOOST_PP_LOCAL_R(168)\n    BOOST_PP_LOCAL_MACRO(168)\n# endif\n# if BOOST_PP_LOCAL_R(167)\n    BOOST_PP_LOCAL_MACRO(167)\n# endif\n# if BOOST_PP_LOCAL_R(166)\n    BOOST_PP_LOCAL_MACRO(166)\n# endif\n# if BOOST_PP_LOCAL_R(165)\n    BOOST_PP_LOCAL_MACRO(165)\n# endif\n# if BOOST_PP_LOCAL_R(164)\n    BOOST_PP_LOCAL_MACRO(164)\n# endif\n# if BOOST_PP_LOCAL_R(163)\n    BOOST_PP_LOCAL_MACRO(163)\n# endif\n# if BOOST_PP_LOCAL_R(162)\n    BOOST_PP_LOCAL_MACRO(162)\n# endif\n# if BOOST_PP_LOCAL_R(161)\n    BOOST_PP_LOCAL_MACRO(161)\n# endif\n# if BOOST_PP_LOCAL_R(160)\n    BOOST_PP_LOCAL_MACRO(160)\n# endif\n# if BOOST_PP_LOCAL_R(159)\n    BOOST_PP_LOCAL_MACRO(159)\n# endif\n# if BOOST_PP_LOCAL_R(158)\n    BOOST_PP_LOCAL_MACRO(158)\n# endif\n# if BOOST_PP_LOCAL_R(157)\n    BOOST_PP_LOCAL_MACRO(157)\n# endif\n# if BOOST_PP_LOCAL_R(156)\n    BOOST_PP_LOCAL_MACRO(156)\n# endif\n# if BOOST_PP_LOCAL_R(155)\n    BOOST_PP_LOCAL_MACRO(155)\n# endif\n# if BOOST_PP_LOCAL_R(154)\n    BOOST_PP_LOCAL_MACRO(154)\n# endif\n# if BOOST_PP_LOCAL_R(153)\n    BOOST_PP_LOCAL_MACRO(153)\n# endif\n# if BOOST_PP_LOCAL_R(152)\n    BOOST_PP_LOCAL_MACRO(152)\n# endif\n# if BOOST_PP_LOCAL_R(151)\n    BOOST_PP_LOCAL_MACRO(151)\n# endif\n# if BOOST_PP_LOCAL_R(150)\n    BOOST_PP_LOCAL_MACRO(150)\n# endif\n# if BOOST_PP_LOCAL_R(149)\n    BOOST_PP_LOCAL_MACRO(149)\n# endif\n# if BOOST_PP_LOCAL_R(148)\n    BOOST_PP_LOCAL_MACRO(148)\n# endif\n# if BOOST_PP_LOCAL_R(147)\n    BOOST_PP_LOCAL_MACRO(147)\n# endif\n# if BOOST_PP_LOCAL_R(146)\n    BOOST_PP_LOCAL_MACRO(146)\n# endif\n# if BOOST_PP_LOCAL_R(145)\n    BOOST_PP_LOCAL_MACRO(145)\n# endif\n# if BOOST_PP_LOCAL_R(144)\n    BOOST_PP_LOCAL_MACRO(144)\n# endif\n# if BOOST_PP_LOCAL_R(143)\n    BOOST_PP_LOCAL_MACRO(143)\n# endif\n# if BOOST_PP_LOCAL_R(142)\n    BOOST_PP_LOCAL_MACRO(142)\n# endif\n# if BOOST_PP_LOCAL_R(141)\n    BOOST_PP_LOCAL_MACRO(141)\n# endif\n# if BOOST_PP_LOCAL_R(140)\n    BOOST_PP_LOCAL_MACRO(140)\n# endif\n# if BOOST_PP_LOCAL_R(139)\n    BOOST_PP_LOCAL_MACRO(139)\n# endif\n# if BOOST_PP_LOCAL_R(138)\n    BOOST_PP_LOCAL_MACRO(138)\n# endif\n# if BOOST_PP_LOCAL_R(137)\n    BOOST_PP_LOCAL_MACRO(137)\n# endif\n# if BOOST_PP_LOCAL_R(136)\n    BOOST_PP_LOCAL_MACRO(136)\n# endif\n# if BOOST_PP_LOCAL_R(135)\n    BOOST_PP_LOCAL_MACRO(135)\n# endif\n# if BOOST_PP_LOCAL_R(134)\n    BOOST_PP_LOCAL_MACRO(134)\n# endif\n# if BOOST_PP_LOCAL_R(133)\n    BOOST_PP_LOCAL_MACRO(133)\n# endif\n# if BOOST_PP_LOCAL_R(132)\n    BOOST_PP_LOCAL_MACRO(132)\n# endif\n# if BOOST_PP_LOCAL_R(131)\n    BOOST_PP_LOCAL_MACRO(131)\n# endif\n# if BOOST_PP_LOCAL_R(130)\n    BOOST_PP_LOCAL_MACRO(130)\n# endif\n# if BOOST_PP_LOCAL_R(129)\n    BOOST_PP_LOCAL_MACRO(129)\n# endif\n# if BOOST_PP_LOCAL_R(128)\n    BOOST_PP_LOCAL_MACRO(128)\n# endif\n# if BOOST_PP_LOCAL_R(127)\n    BOOST_PP_LOCAL_MACRO(127)\n# endif\n# if BOOST_PP_LOCAL_R(126)\n    BOOST_PP_LOCAL_MACRO(126)\n# endif\n# if BOOST_PP_LOCAL_R(125)\n    BOOST_PP_LOCAL_MACRO(125)\n# endif\n# if BOOST_PP_LOCAL_R(124)\n    BOOST_PP_LOCAL_MACRO(124)\n# endif\n# if BOOST_PP_LOCAL_R(123)\n    BOOST_PP_LOCAL_MACRO(123)\n# endif\n# if BOOST_PP_LOCAL_R(122)\n    BOOST_PP_LOCAL_MACRO(122)\n# endif\n# if BOOST_PP_LOCAL_R(121)\n    BOOST_PP_LOCAL_MACRO(121)\n# endif\n# if BOOST_PP_LOCAL_R(120)\n    BOOST_PP_LOCAL_MACRO(120)\n# endif\n# if BOOST_PP_LOCAL_R(119)\n    BOOST_PP_LOCAL_MACRO(119)\n# endif\n# if BOOST_PP_LOCAL_R(118)\n    BOOST_PP_LOCAL_MACRO(118)\n# endif\n# if BOOST_PP_LOCAL_R(117)\n    BOOST_PP_LOCAL_MACRO(117)\n# endif\n# if BOOST_PP_LOCAL_R(116)\n    BOOST_PP_LOCAL_MACRO(116)\n# endif\n# if BOOST_PP_LOCAL_R(115)\n    BOOST_PP_LOCAL_MACRO(115)\n# endif\n# if BOOST_PP_LOCAL_R(114)\n    BOOST_PP_LOCAL_MACRO(114)\n# endif\n# if BOOST_PP_LOCAL_R(113)\n    BOOST_PP_LOCAL_MACRO(113)\n# endif\n# if BOOST_PP_LOCAL_R(112)\n    BOOST_PP_LOCAL_MACRO(112)\n# endif\n# if BOOST_PP_LOCAL_R(111)\n    BOOST_PP_LOCAL_MACRO(111)\n# endif\n# if BOOST_PP_LOCAL_R(110)\n    BOOST_PP_LOCAL_MACRO(110)\n# endif\n# if BOOST_PP_LOCAL_R(109)\n    BOOST_PP_LOCAL_MACRO(109)\n# endif\n# if BOOST_PP_LOCAL_R(108)\n    BOOST_PP_LOCAL_MACRO(108)\n# endif\n# if BOOST_PP_LOCAL_R(107)\n    BOOST_PP_LOCAL_MACRO(107)\n# endif\n# if BOOST_PP_LOCAL_R(106)\n    BOOST_PP_LOCAL_MACRO(106)\n# endif\n# if BOOST_PP_LOCAL_R(105)\n    BOOST_PP_LOCAL_MACRO(105)\n# endif\n# if BOOST_PP_LOCAL_R(104)\n    BOOST_PP_LOCAL_MACRO(104)\n# endif\n# if BOOST_PP_LOCAL_R(103)\n    BOOST_PP_LOCAL_MACRO(103)\n# endif\n# if BOOST_PP_LOCAL_R(102)\n    BOOST_PP_LOCAL_MACRO(102)\n# endif\n# if BOOST_PP_LOCAL_R(101)\n    BOOST_PP_LOCAL_MACRO(101)\n# endif\n# if BOOST_PP_LOCAL_R(100)\n    BOOST_PP_LOCAL_MACRO(100)\n# endif\n# if BOOST_PP_LOCAL_R(99)\n    BOOST_PP_LOCAL_MACRO(99)\n# endif\n# if BOOST_PP_LOCAL_R(98)\n    BOOST_PP_LOCAL_MACRO(98)\n# endif\n# if BOOST_PP_LOCAL_R(97)\n    BOOST_PP_LOCAL_MACRO(97)\n# endif\n# if BOOST_PP_LOCAL_R(96)\n    BOOST_PP_LOCAL_MACRO(96)\n# endif\n# if BOOST_PP_LOCAL_R(95)\n    BOOST_PP_LOCAL_MACRO(95)\n# endif\n# if BOOST_PP_LOCAL_R(94)\n    BOOST_PP_LOCAL_MACRO(94)\n# endif\n# if BOOST_PP_LOCAL_R(93)\n    BOOST_PP_LOCAL_MACRO(93)\n# endif\n# if BOOST_PP_LOCAL_R(92)\n    BOOST_PP_LOCAL_MACRO(92)\n# endif\n# if BOOST_PP_LOCAL_R(91)\n    BOOST_PP_LOCAL_MACRO(91)\n# endif\n# if BOOST_PP_LOCAL_R(90)\n    BOOST_PP_LOCAL_MACRO(90)\n# endif\n# if BOOST_PP_LOCAL_R(89)\n    BOOST_PP_LOCAL_MACRO(89)\n# endif\n# if BOOST_PP_LOCAL_R(88)\n    BOOST_PP_LOCAL_MACRO(88)\n# endif\n# if BOOST_PP_LOCAL_R(87)\n    BOOST_PP_LOCAL_MACRO(87)\n# endif\n# if BOOST_PP_LOCAL_R(86)\n    BOOST_PP_LOCAL_MACRO(86)\n# endif\n# if BOOST_PP_LOCAL_R(85)\n    BOOST_PP_LOCAL_MACRO(85)\n# endif\n# if BOOST_PP_LOCAL_R(84)\n    BOOST_PP_LOCAL_MACRO(84)\n# endif\n# if BOOST_PP_LOCAL_R(83)\n    BOOST_PP_LOCAL_MACRO(83)\n# endif\n# if BOOST_PP_LOCAL_R(82)\n    BOOST_PP_LOCAL_MACRO(82)\n# endif\n# if BOOST_PP_LOCAL_R(81)\n    BOOST_PP_LOCAL_MACRO(81)\n# endif\n# if BOOST_PP_LOCAL_R(80)\n    BOOST_PP_LOCAL_MACRO(80)\n# endif\n# if BOOST_PP_LOCAL_R(79)\n    BOOST_PP_LOCAL_MACRO(79)\n# endif\n# if BOOST_PP_LOCAL_R(78)\n    BOOST_PP_LOCAL_MACRO(78)\n# endif\n# if BOOST_PP_LOCAL_R(77)\n    BOOST_PP_LOCAL_MACRO(77)\n# endif\n# if BOOST_PP_LOCAL_R(76)\n    BOOST_PP_LOCAL_MACRO(76)\n# endif\n# if BOOST_PP_LOCAL_R(75)\n    BOOST_PP_LOCAL_MACRO(75)\n# endif\n# if BOOST_PP_LOCAL_R(74)\n    BOOST_PP_LOCAL_MACRO(74)\n# endif\n# if BOOST_PP_LOCAL_R(73)\n    BOOST_PP_LOCAL_MACRO(73)\n# endif\n# if BOOST_PP_LOCAL_R(72)\n    BOOST_PP_LOCAL_MACRO(72)\n# endif\n# if BOOST_PP_LOCAL_R(71)\n    BOOST_PP_LOCAL_MACRO(71)\n# endif\n# if BOOST_PP_LOCAL_R(70)\n    BOOST_PP_LOCAL_MACRO(70)\n# endif\n# if BOOST_PP_LOCAL_R(69)\n    BOOST_PP_LOCAL_MACRO(69)\n# endif\n# if BOOST_PP_LOCAL_R(68)\n    BOOST_PP_LOCAL_MACRO(68)\n# endif\n# if BOOST_PP_LOCAL_R(67)\n    BOOST_PP_LOCAL_MACRO(67)\n# endif\n# if BOOST_PP_LOCAL_R(66)\n    BOOST_PP_LOCAL_MACRO(66)\n# endif\n# if BOOST_PP_LOCAL_R(65)\n    BOOST_PP_LOCAL_MACRO(65)\n# endif\n# if BOOST_PP_LOCAL_R(64)\n    BOOST_PP_LOCAL_MACRO(64)\n# endif\n# if BOOST_PP_LOCAL_R(63)\n    BOOST_PP_LOCAL_MACRO(63)\n# endif\n# if BOOST_PP_LOCAL_R(62)\n    BOOST_PP_LOCAL_MACRO(62)\n# endif\n# if BOOST_PP_LOCAL_R(61)\n    BOOST_PP_LOCAL_MACRO(61)\n# endif\n# if BOOST_PP_LOCAL_R(60)\n    BOOST_PP_LOCAL_MACRO(60)\n# endif\n# if BOOST_PP_LOCAL_R(59)\n    BOOST_PP_LOCAL_MACRO(59)\n# endif\n# if BOOST_PP_LOCAL_R(58)\n    BOOST_PP_LOCAL_MACRO(58)\n# endif\n# if BOOST_PP_LOCAL_R(57)\n    BOOST_PP_LOCAL_MACRO(57)\n# endif\n# if BOOST_PP_LOCAL_R(56)\n    BOOST_PP_LOCAL_MACRO(56)\n# endif\n# if BOOST_PP_LOCAL_R(55)\n    BOOST_PP_LOCAL_MACRO(55)\n# endif\n# if BOOST_PP_LOCAL_R(54)\n    BOOST_PP_LOCAL_MACRO(54)\n# endif\n# if BOOST_PP_LOCAL_R(53)\n    BOOST_PP_LOCAL_MACRO(53)\n# endif\n# if BOOST_PP_LOCAL_R(52)\n    BOOST_PP_LOCAL_MACRO(52)\n# endif\n# if BOOST_PP_LOCAL_R(51)\n    BOOST_PP_LOCAL_MACRO(51)\n# endif\n# if BOOST_PP_LOCAL_R(50)\n    BOOST_PP_LOCAL_MACRO(50)\n# endif\n# if BOOST_PP_LOCAL_R(49)\n    BOOST_PP_LOCAL_MACRO(49)\n# endif\n# if BOOST_PP_LOCAL_R(48)\n    BOOST_PP_LOCAL_MACRO(48)\n# endif\n# if BOOST_PP_LOCAL_R(47)\n    BOOST_PP_LOCAL_MACRO(47)\n# endif\n# if BOOST_PP_LOCAL_R(46)\n    BOOST_PP_LOCAL_MACRO(46)\n# endif\n# if BOOST_PP_LOCAL_R(45)\n    BOOST_PP_LOCAL_MACRO(45)\n# endif\n# if BOOST_PP_LOCAL_R(44)\n    BOOST_PP_LOCAL_MACRO(44)\n# endif\n# if BOOST_PP_LOCAL_R(43)\n    BOOST_PP_LOCAL_MACRO(43)\n# endif\n# if BOOST_PP_LOCAL_R(42)\n    BOOST_PP_LOCAL_MACRO(42)\n# endif\n# if BOOST_PP_LOCAL_R(41)\n    BOOST_PP_LOCAL_MACRO(41)\n# endif\n# if BOOST_PP_LOCAL_R(40)\n    BOOST_PP_LOCAL_MACRO(40)\n# endif\n# if BOOST_PP_LOCAL_R(39)\n    BOOST_PP_LOCAL_MACRO(39)\n# endif\n# if BOOST_PP_LOCAL_R(38)\n    BOOST_PP_LOCAL_MACRO(38)\n# endif\n# if BOOST_PP_LOCAL_R(37)\n    BOOST_PP_LOCAL_MACRO(37)\n# endif\n# if BOOST_PP_LOCAL_R(36)\n    BOOST_PP_LOCAL_MACRO(36)\n# endif\n# if BOOST_PP_LOCAL_R(35)\n    BOOST_PP_LOCAL_MACRO(35)\n# endif\n# if BOOST_PP_LOCAL_R(34)\n    BOOST_PP_LOCAL_MACRO(34)\n# endif\n# if BOOST_PP_LOCAL_R(33)\n    BOOST_PP_LOCAL_MACRO(33)\n# endif\n# if BOOST_PP_LOCAL_R(32)\n    BOOST_PP_LOCAL_MACRO(32)\n# endif\n# if BOOST_PP_LOCAL_R(31)\n    BOOST_PP_LOCAL_MACRO(31)\n# endif\n# if BOOST_PP_LOCAL_R(30)\n    BOOST_PP_LOCAL_MACRO(30)\n# endif\n# if BOOST_PP_LOCAL_R(29)\n    BOOST_PP_LOCAL_MACRO(29)\n# endif\n# if BOOST_PP_LOCAL_R(28)\n    BOOST_PP_LOCAL_MACRO(28)\n# endif\n# if BOOST_PP_LOCAL_R(27)\n    BOOST_PP_LOCAL_MACRO(27)\n# endif\n# if BOOST_PP_LOCAL_R(26)\n    BOOST_PP_LOCAL_MACRO(26)\n# endif\n# if BOOST_PP_LOCAL_R(25)\n    BOOST_PP_LOCAL_MACRO(25)\n# endif\n# if BOOST_PP_LOCAL_R(24)\n    BOOST_PP_LOCAL_MACRO(24)\n# endif\n# if BOOST_PP_LOCAL_R(23)\n    BOOST_PP_LOCAL_MACRO(23)\n# endif\n# if BOOST_PP_LOCAL_R(22)\n    BOOST_PP_LOCAL_MACRO(22)\n# endif\n# if BOOST_PP_LOCAL_R(21)\n    BOOST_PP_LOCAL_MACRO(21)\n# endif\n# if BOOST_PP_LOCAL_R(20)\n    BOOST_PP_LOCAL_MACRO(20)\n# endif\n# if BOOST_PP_LOCAL_R(19)\n    BOOST_PP_LOCAL_MACRO(19)\n# endif\n# if BOOST_PP_LOCAL_R(18)\n    BOOST_PP_LOCAL_MACRO(18)\n# endif\n# if BOOST_PP_LOCAL_R(17)\n    BOOST_PP_LOCAL_MACRO(17)\n# endif\n# if BOOST_PP_LOCAL_R(16)\n    BOOST_PP_LOCAL_MACRO(16)\n# endif\n# if BOOST_PP_LOCAL_R(15)\n    BOOST_PP_LOCAL_MACRO(15)\n# endif\n# if BOOST_PP_LOCAL_R(14)\n    BOOST_PP_LOCAL_MACRO(14)\n# endif\n# if BOOST_PP_LOCAL_R(13)\n    BOOST_PP_LOCAL_MACRO(13)\n# endif\n# if BOOST_PP_LOCAL_R(12)\n    BOOST_PP_LOCAL_MACRO(12)\n# endif\n# if BOOST_PP_LOCAL_R(11)\n    BOOST_PP_LOCAL_MACRO(11)\n# endif\n# if BOOST_PP_LOCAL_R(10)\n    BOOST_PP_LOCAL_MACRO(10)\n# endif\n# if BOOST_PP_LOCAL_R(9)\n    BOOST_PP_LOCAL_MACRO(9)\n# endif\n# if BOOST_PP_LOCAL_R(8)\n    BOOST_PP_LOCAL_MACRO(8)\n# endif\n# if BOOST_PP_LOCAL_R(7)\n    BOOST_PP_LOCAL_MACRO(7)\n# endif\n# if BOOST_PP_LOCAL_R(6)\n    BOOST_PP_LOCAL_MACRO(6)\n# endif\n# if BOOST_PP_LOCAL_R(5)\n    BOOST_PP_LOCAL_MACRO(5)\n# endif\n# if BOOST_PP_LOCAL_R(4)\n    BOOST_PP_LOCAL_MACRO(4)\n# endif\n# if BOOST_PP_LOCAL_R(3)\n    BOOST_PP_LOCAL_MACRO(3)\n# endif\n# if BOOST_PP_LOCAL_R(2)\n    BOOST_PP_LOCAL_MACRO(2)\n# endif\n# if BOOST_PP_LOCAL_R(1)\n    BOOST_PP_LOCAL_MACRO(1)\n# endif\n# if BOOST_PP_LOCAL_R(0)\n    BOOST_PP_LOCAL_MACRO(0)\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/self.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# if !defined(BOOST_PP_INDIRECT_SELF)\n#    error BOOST_PP_ERROR:  no indirect file to include\n# endif\n#\n# define BOOST_PP_IS_SELFISH 1\n#\n# include BOOST_PP_INDIRECT_SELF\n#\n# undef BOOST_PP_IS_SELFISH\n# undef BOOST_PP_INDIRECT_SELF\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/detail/start.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_LOCAL_SE\n#\n# undef BOOST_PP_LOCAL_SE_DIGIT_1\n# undef BOOST_PP_LOCAL_SE_DIGIT_2\n# undef BOOST_PP_LOCAL_SE_DIGIT_3\n# undef BOOST_PP_LOCAL_SE_DIGIT_4\n# undef BOOST_PP_LOCAL_SE_DIGIT_5\n# undef BOOST_PP_LOCAL_SE_DIGIT_6\n# undef BOOST_PP_LOCAL_SE_DIGIT_7\n# undef BOOST_PP_LOCAL_SE_DIGIT_8\n# undef BOOST_PP_LOCAL_SE_DIGIT_9\n# undef BOOST_PP_LOCAL_SE_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_LOCAL_SE_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_LOCAL_SE_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_LOCAL_SE_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_LOCAL_SE_DIGIT_3\n#    define BOOST_PP_LOCAL_SE() BOOST_PP_SLOT_CC_3(BOOST_PP_LOCAL_SE_DIGIT_3, BOOST_PP_LOCAL_SE_DIGIT_2, BOOST_PP_LOCAL_SE_DIGIT_1)\n# elif BOOST_PP_LOCAL_SE_DIGIT_2\n#    define BOOST_PP_LOCAL_SE() BOOST_PP_SLOT_CC_2(BOOST_PP_LOCAL_SE_DIGIT_2, BOOST_PP_LOCAL_SE_DIGIT_1)\n# else\n#    define BOOST_PP_LOCAL_SE() BOOST_PP_LOCAL_SE_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/iterate.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_ITERATE_HPP\n# define BOOST_PREPROCESSOR_ITERATION_ITERATE_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/array/elem.hpp>\n# include <boost/preprocessor/array/size.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/slot/slot.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_ITERATION_DEPTH */\n#\n# define BOOST_PP_ITERATION_DEPTH() 0\n#\n# /* BOOST_PP_ITERATION */\n#\n# define BOOST_PP_ITERATION() BOOST_PP_CAT(BOOST_PP_ITERATION_, BOOST_PP_ITERATION_DEPTH())\n#\n# /* BOOST_PP_ITERATION_START && BOOST_PP_ITERATION_FINISH */\n#\n# define BOOST_PP_ITERATION_START() BOOST_PP_CAT(BOOST_PP_ITERATION_START_, BOOST_PP_ITERATION_DEPTH())\n# define BOOST_PP_ITERATION_FINISH() BOOST_PP_CAT(BOOST_PP_ITERATION_FINISH_, BOOST_PP_ITERATION_DEPTH())\n#\n# /* BOOST_PP_ITERATION_FLAGS */\n#\n# define BOOST_PP_ITERATION_FLAGS() (BOOST_PP_CAT(BOOST_PP_ITERATION_FLAGS_, BOOST_PP_ITERATION_DEPTH())())\n#\n# /* BOOST_PP_FRAME_ITERATION */\n#\n# define BOOST_PP_FRAME_ITERATION(i) BOOST_PP_CAT(BOOST_PP_ITERATION_, i)\n#\n# /* BOOST_PP_FRAME_START && BOOST_PP_FRAME_FINISH */\n#\n# define BOOST_PP_FRAME_START(i) BOOST_PP_CAT(BOOST_PP_ITERATION_START_, i)\n# define BOOST_PP_FRAME_FINISH(i) BOOST_PP_CAT(BOOST_PP_ITERATION_FINISH_, i)\n#\n# /* BOOST_PP_FRAME_FLAGS */\n#\n# define BOOST_PP_FRAME_FLAGS(i) (BOOST_PP_CAT(BOOST_PP_ITERATION_FLAGS_, i)())\n#\n# /* BOOST_PP_RELATIVE_ITERATION */\n#\n# define BOOST_PP_RELATIVE_ITERATION(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_)\n#\n# define BOOST_PP_RELATIVE_0(m) BOOST_PP_CAT(m, BOOST_PP_ITERATION_DEPTH())\n# define BOOST_PP_RELATIVE_1(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH()))\n# define BOOST_PP_RELATIVE_2(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH())))\n# define BOOST_PP_RELATIVE_3(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH()))))\n# define BOOST_PP_RELATIVE_4(m) BOOST_PP_CAT(m, BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_DEC(BOOST_PP_ITERATION_DEPTH())))))\n#\n# /* BOOST_PP_RELATIVE_START && BOOST_PP_RELATIVE_FINISH */\n#\n# define BOOST_PP_RELATIVE_START(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_START_)\n# define BOOST_PP_RELATIVE_FINISH(i) BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_FINISH_)\n#\n# /* BOOST_PP_RELATIVE_FLAGS */\n#\n# define BOOST_PP_RELATIVE_FLAGS(i) (BOOST_PP_CAT(BOOST_PP_RELATIVE_, i)(BOOST_PP_ITERATION_FLAGS_)())\n#\n# /* BOOST_PP_ITERATE */\n#\n# define BOOST_PP_ITERATE() BOOST_PP_CAT(BOOST_PP_ITERATE_, BOOST_PP_INC(BOOST_PP_ITERATION_DEPTH()))\n#\n# define BOOST_PP_ITERATE_1 <boost/preprocessor/iteration/detail/iter/forward1.hpp>\n# define BOOST_PP_ITERATE_2 <boost/preprocessor/iteration/detail/iter/forward2.hpp>\n# define BOOST_PP_ITERATE_3 <boost/preprocessor/iteration/detail/iter/forward3.hpp>\n# define BOOST_PP_ITERATE_4 <boost/preprocessor/iteration/detail/iter/forward4.hpp>\n# define BOOST_PP_ITERATE_5 <boost/preprocessor/iteration/detail/iter/forward5.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/local.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_LOCAL_HPP\n# define BOOST_PREPROCESSOR_ITERATION_LOCAL_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/slot/slot.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_LOCAL_ITERATE */\n#\n# define BOOST_PP_LOCAL_ITERATE() <boost/preprocessor/iteration/detail/local.hpp>\n#\n# define BOOST_PP_LOCAL_C(n) (BOOST_PP_LOCAL_S) <= n && (BOOST_PP_LOCAL_F) >= n\n# define BOOST_PP_LOCAL_R(n) (BOOST_PP_LOCAL_F) <= n && (BOOST_PP_LOCAL_S) >= n\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration/self.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_SELF_HPP\n# define BOOST_PREPROCESSOR_ITERATION_SELF_HPP\n#\n# /* BOOST_PP_INCLUDE_SELF */\n#\n# define BOOST_PP_INCLUDE_SELF() <boost/preprocessor/iteration/detail/self.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/iteration.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_ITERATION_HPP\n# define BOOST_PREPROCESSOR_ITERATION_HPP\n#\n# include <boost/preprocessor/iteration/iterate.hpp>\n# include <boost/preprocessor/iteration/local.hpp>\n# include <boost/preprocessor/iteration/self.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/library.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIBRARY_HPP\n# define BOOST_PREPROCESSOR_LIBRARY_HPP\n#\n# include <boost/preprocessor/arithmetic.hpp>\n# include <boost/preprocessor/array.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/comparison.hpp>\n# include <boost/preprocessor/config/limits.hpp>\n# include <boost/preprocessor/control.hpp>\n# include <boost/preprocessor/debug.hpp>\n# include <boost/preprocessor/facilities.hpp>\n# include <boost/preprocessor/iteration.hpp>\n# include <boost/preprocessor/list.hpp>\n# include <boost/preprocessor/logical.hpp>\n# include <boost/preprocessor/punctuation.hpp>\n# include <boost/preprocessor/repetition.hpp>\n# include <boost/preprocessor/selection.hpp>\n# include <boost/preprocessor/seq.hpp>\n# include <boost/preprocessor/slot.hpp>\n# include <boost/preprocessor/stringize.hpp>\n# include <boost/preprocessor/tuple.hpp>\n# include <boost/preprocessor/variadic.hpp>\n# include <boost/preprocessor/wstringize.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/limits.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIMITS_HPP\n# define BOOST_PREPROCESSOR_LIMITS_HPP\n#\n# include <boost/preprocessor/config/limits.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/adt.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  *\n#  * See http://www.boost.org for most recent version.\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_ADT_HPP\n# define BOOST_PREPROCESSOR_LIST_ADT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/detail/is_binary.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_LIST_CONS */\n#\n# define BOOST_PP_LIST_CONS(head, tail) (head, tail)\n#\n# /* BOOST_PP_LIST_NIL */\n#\n# define BOOST_PP_LIST_NIL BOOST_PP_NIL\n#\n# /* BOOST_PP_LIST_FIRST */\n#\n# define BOOST_PP_LIST_FIRST(list) BOOST_PP_LIST_FIRST_D(list)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FIRST_D(list) BOOST_PP_LIST_FIRST_I list\n# else\n#    define BOOST_PP_LIST_FIRST_D(list) BOOST_PP_LIST_FIRST_I ## list\n# endif\n#\n# define BOOST_PP_LIST_FIRST_I(head, tail) head\n#\n# /* BOOST_PP_LIST_REST */\n#\n# define BOOST_PP_LIST_REST(list) BOOST_PP_LIST_REST_D(list)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_REST_D(list) BOOST_PP_LIST_REST_I list\n# else\n#    define BOOST_PP_LIST_REST_D(list) BOOST_PP_LIST_REST_I ## list\n# endif\n#\n# define BOOST_PP_LIST_REST_I(head, tail) tail\n#\n# /* BOOST_PP_LIST_IS_CONS */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()\n#    define BOOST_PP_LIST_IS_CONS(list) BOOST_PP_LIST_IS_CONS_D(list)\n#    define BOOST_PP_LIST_IS_CONS_D(list) BOOST_PP_LIST_IS_CONS_ ## list\n#    define BOOST_PP_LIST_IS_CONS_(head, tail) 1\n#    define BOOST_PP_LIST_IS_CONS_BOOST_PP_NIL 0\n# else\n#    define BOOST_PP_LIST_IS_CONS(list) BOOST_PP_IS_BINARY(list)\n# endif\n#\n# /* BOOST_PP_LIST_IS_NIL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_BCC()\n#    define BOOST_PP_LIST_IS_NIL(list) BOOST_PP_COMPL(BOOST_PP_IS_BINARY(list))\n# else\n#    define BOOST_PP_LIST_IS_NIL(list) BOOST_PP_COMPL(BOOST_PP_LIST_IS_CONS(list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/append.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_APPEND_HPP\n# define BOOST_PREPROCESSOR_LIST_APPEND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/fold_right.hpp>\n#\n# /* BOOST_PP_LIST_APPEND */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_APPEND(a, b) BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_APPEND_O, b, a)\n# else\n#    define BOOST_PP_LIST_APPEND(a, b) BOOST_PP_LIST_APPEND_I(a, b)\n#    define BOOST_PP_LIST_APPEND_I(a, b) BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_APPEND_O, b, a)\n# endif\n#\n# define BOOST_PP_LIST_APPEND_O(d, s, x) (x, s)\n#\n# /* BOOST_PP_LIST_APPEND_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_APPEND_D(d, a, b) BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_APPEND_O, b, a)\n# else\n#    define BOOST_PP_LIST_APPEND_D(d, a, b) BOOST_PP_LIST_APPEND_D_I(d, a, b)\n#    define BOOST_PP_LIST_APPEND_D_I(d, a, b) BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_APPEND_O, b, a)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/at.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_AT_HPP\n# define BOOST_PREPROCESSOR_LIST_AT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/list/rest_n.hpp>\n#\n# /* BOOST_PP_LIST_AT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_AT(list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N(index, list))\n# else\n#    define BOOST_PP_LIST_AT(list, index) BOOST_PP_LIST_AT_I(list, index)\n#    define BOOST_PP_LIST_AT_I(list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N(index, list))\n# endif\n#\n# /* BOOST_PP_LIST_AT_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_AT_D(d, list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N_D(d, index, list))\n# else\n#    define BOOST_PP_LIST_AT_D(d, list, index) BOOST_PP_LIST_AT_D_I(d, list, index)\n#    define BOOST_PP_LIST_AT_D_I(d, list, index) BOOST_PP_LIST_FIRST(BOOST_PP_LIST_REST_N_D(d, index, list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/cat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_CAT_HPP\n# define BOOST_PREPROCESSOR_LIST_CAT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/list/fold_left.hpp>\n#\n# /* BOOST_PP_LIST_CAT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_CAT(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))\n# else\n#    define BOOST_PP_LIST_CAT(list) BOOST_PP_LIST_CAT_I(list)\n#    define BOOST_PP_LIST_CAT_I(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))\n# endif\n#\n# define BOOST_PP_LIST_CAT_O(d, s, x) BOOST_PP_CAT(s, x)\n#\n# /* BOOST_PP_LIST_CAT_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_CAT_D(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))\n# else\n#    define BOOST_PP_LIST_CAT_D(d, list) BOOST_PP_LIST_CAT_D_I(d, list)\n#    define BOOST_PP_LIST_CAT_D_I(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_CAT_O, BOOST_PP_LIST_FIRST(list), BOOST_PP_LIST_REST(list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/detail/dmc/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, BOOST_PP_TUPLE_ELEM_3_1)(o, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, BOOST_PP_TUPLE_ELEM_3_1)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/detail/edg/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_LIST_FOLD_LEFT_1_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_LIST_FOLD_LEFT_2_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_LIST_FOLD_LEFT_3_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_LIST_FOLD_LEFT_4_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_LIST_FOLD_LEFT_5_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_LIST_FOLD_LEFT_6_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_LIST_FOLD_LEFT_7_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_LIST_FOLD_LEFT_8_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_LIST_FOLD_LEFT_9_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_LIST_FOLD_LEFT_10_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_LIST_FOLD_LEFT_11_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_LIST_FOLD_LEFT_12_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_LIST_FOLD_LEFT_13_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_LIST_FOLD_LEFT_14_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_LIST_FOLD_LEFT_15_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_LIST_FOLD_LEFT_16_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_LIST_FOLD_LEFT_17_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_LIST_FOLD_LEFT_18_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_LIST_FOLD_LEFT_19_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_LIST_FOLD_LEFT_20_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_LIST_FOLD_LEFT_21_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_LIST_FOLD_LEFT_22_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_LIST_FOLD_LEFT_23_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_LIST_FOLD_LEFT_24_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_LIST_FOLD_LEFT_25_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_LIST_FOLD_LEFT_26_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_LIST_FOLD_LEFT_27_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_LIST_FOLD_LEFT_28_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_LIST_FOLD_LEFT_29_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_LIST_FOLD_LEFT_30_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_LIST_FOLD_LEFT_31_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_LIST_FOLD_LEFT_32_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_LIST_FOLD_LEFT_33_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_LIST_FOLD_LEFT_34_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_LIST_FOLD_LEFT_35_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_LIST_FOLD_LEFT_36_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_LIST_FOLD_LEFT_37_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_LIST_FOLD_LEFT_38_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_LIST_FOLD_LEFT_39_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_LIST_FOLD_LEFT_40_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_LIST_FOLD_LEFT_41_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_LIST_FOLD_LEFT_42_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_LIST_FOLD_LEFT_43_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_LIST_FOLD_LEFT_44_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_LIST_FOLD_LEFT_45_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_LIST_FOLD_LEFT_46_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_LIST_FOLD_LEFT_47_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_LIST_FOLD_LEFT_48_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_LIST_FOLD_LEFT_49_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_LIST_FOLD_LEFT_50_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_LIST_FOLD_LEFT_51_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_LIST_FOLD_LEFT_52_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_LIST_FOLD_LEFT_53_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_LIST_FOLD_LEFT_54_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_LIST_FOLD_LEFT_55_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_LIST_FOLD_LEFT_56_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_LIST_FOLD_LEFT_57_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_LIST_FOLD_LEFT_58_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_LIST_FOLD_LEFT_59_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_LIST_FOLD_LEFT_60_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_LIST_FOLD_LEFT_61_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_LIST_FOLD_LEFT_62_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_LIST_FOLD_LEFT_63_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_LIST_FOLD_LEFT_64_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_LIST_FOLD_LEFT_65_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_LIST_FOLD_LEFT_66_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_LIST_FOLD_LEFT_67_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_LIST_FOLD_LEFT_68_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_LIST_FOLD_LEFT_69_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_LIST_FOLD_LEFT_70_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_LIST_FOLD_LEFT_71_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_LIST_FOLD_LEFT_72_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_LIST_FOLD_LEFT_73_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_LIST_FOLD_LEFT_74_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_LIST_FOLD_LEFT_75_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_LIST_FOLD_LEFT_76_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_LIST_FOLD_LEFT_77_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_LIST_FOLD_LEFT_78_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_LIST_FOLD_LEFT_79_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_LIST_FOLD_LEFT_80_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_LIST_FOLD_LEFT_81_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_LIST_FOLD_LEFT_82_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_LIST_FOLD_LEFT_83_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_LIST_FOLD_LEFT_84_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_LIST_FOLD_LEFT_85_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_LIST_FOLD_LEFT_86_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_LIST_FOLD_LEFT_87_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_LIST_FOLD_LEFT_88_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_LIST_FOLD_LEFT_89_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_LIST_FOLD_LEFT_90_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_LIST_FOLD_LEFT_91_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_LIST_FOLD_LEFT_92_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_LIST_FOLD_LEFT_93_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_LIST_FOLD_LEFT_94_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_LIST_FOLD_LEFT_95_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_LIST_FOLD_LEFT_96_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_LIST_FOLD_LEFT_97_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_LIST_FOLD_LEFT_98_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_LIST_FOLD_LEFT_99_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_LIST_FOLD_LEFT_100_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_LIST_FOLD_LEFT_101_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_LIST_FOLD_LEFT_102_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_LIST_FOLD_LEFT_103_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_LIST_FOLD_LEFT_104_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_LIST_FOLD_LEFT_105_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_LIST_FOLD_LEFT_106_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_LIST_FOLD_LEFT_107_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_LIST_FOLD_LEFT_108_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_LIST_FOLD_LEFT_109_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_LIST_FOLD_LEFT_110_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_LIST_FOLD_LEFT_111_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_LIST_FOLD_LEFT_112_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_LIST_FOLD_LEFT_113_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_LIST_FOLD_LEFT_114_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_LIST_FOLD_LEFT_115_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_LIST_FOLD_LEFT_116_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_LIST_FOLD_LEFT_117_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_LIST_FOLD_LEFT_118_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_LIST_FOLD_LEFT_119_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_LIST_FOLD_LEFT_120_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_LIST_FOLD_LEFT_121_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_LIST_FOLD_LEFT_122_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_LIST_FOLD_LEFT_123_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_LIST_FOLD_LEFT_124_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_LIST_FOLD_LEFT_125_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_LIST_FOLD_LEFT_126_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_LIST_FOLD_LEFT_127_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_LIST_FOLD_LEFT_128_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_LIST_FOLD_LEFT_129_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_LIST_FOLD_LEFT_130_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_LIST_FOLD_LEFT_131_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_LIST_FOLD_LEFT_132_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_LIST_FOLD_LEFT_133_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_LIST_FOLD_LEFT_134_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_LIST_FOLD_LEFT_135_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_LIST_FOLD_LEFT_136_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_LIST_FOLD_LEFT_137_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_LIST_FOLD_LEFT_138_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_LIST_FOLD_LEFT_139_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_LIST_FOLD_LEFT_140_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_LIST_FOLD_LEFT_141_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_LIST_FOLD_LEFT_142_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_LIST_FOLD_LEFT_143_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_LIST_FOLD_LEFT_144_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_LIST_FOLD_LEFT_145_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_LIST_FOLD_LEFT_146_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_LIST_FOLD_LEFT_147_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_LIST_FOLD_LEFT_148_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_LIST_FOLD_LEFT_149_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_LIST_FOLD_LEFT_150_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_LIST_FOLD_LEFT_151_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_LIST_FOLD_LEFT_152_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_LIST_FOLD_LEFT_153_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_LIST_FOLD_LEFT_154_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_LIST_FOLD_LEFT_155_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_LIST_FOLD_LEFT_156_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_LIST_FOLD_LEFT_157_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_LIST_FOLD_LEFT_158_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_LIST_FOLD_LEFT_159_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_LIST_FOLD_LEFT_160_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_LIST_FOLD_LEFT_161_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_LIST_FOLD_LEFT_162_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_LIST_FOLD_LEFT_163_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_LIST_FOLD_LEFT_164_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_LIST_FOLD_LEFT_165_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_LIST_FOLD_LEFT_166_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_LIST_FOLD_LEFT_167_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_LIST_FOLD_LEFT_168_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_LIST_FOLD_LEFT_169_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_LIST_FOLD_LEFT_170_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_LIST_FOLD_LEFT_171_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_LIST_FOLD_LEFT_172_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_LIST_FOLD_LEFT_173_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_LIST_FOLD_LEFT_174_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_LIST_FOLD_LEFT_175_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_LIST_FOLD_LEFT_176_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_LIST_FOLD_LEFT_177_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_LIST_FOLD_LEFT_178_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_LIST_FOLD_LEFT_179_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_LIST_FOLD_LEFT_180_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_LIST_FOLD_LEFT_181_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_LIST_FOLD_LEFT_182_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_LIST_FOLD_LEFT_183_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_LIST_FOLD_LEFT_184_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_LIST_FOLD_LEFT_185_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_LIST_FOLD_LEFT_186_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_LIST_FOLD_LEFT_187_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_LIST_FOLD_LEFT_188_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_LIST_FOLD_LEFT_189_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_LIST_FOLD_LEFT_190_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_LIST_FOLD_LEFT_191_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_LIST_FOLD_LEFT_192_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_LIST_FOLD_LEFT_193_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_LIST_FOLD_LEFT_194_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_LIST_FOLD_LEFT_195_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_LIST_FOLD_LEFT_196_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_LIST_FOLD_LEFT_197_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_LIST_FOLD_LEFT_198_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_LIST_FOLD_LEFT_199_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_LIST_FOLD_LEFT_200_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_LIST_FOLD_LEFT_201_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_LIST_FOLD_LEFT_202_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_LIST_FOLD_LEFT_203_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_LIST_FOLD_LEFT_204_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_LIST_FOLD_LEFT_205_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_LIST_FOLD_LEFT_206_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_LIST_FOLD_LEFT_207_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_LIST_FOLD_LEFT_208_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_LIST_FOLD_LEFT_209_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_LIST_FOLD_LEFT_210_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_LIST_FOLD_LEFT_211_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_LIST_FOLD_LEFT_212_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_LIST_FOLD_LEFT_213_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_LIST_FOLD_LEFT_214_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_LIST_FOLD_LEFT_215_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_LIST_FOLD_LEFT_216_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_LIST_FOLD_LEFT_217_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_LIST_FOLD_LEFT_218_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_LIST_FOLD_LEFT_219_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_LIST_FOLD_LEFT_220_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_LIST_FOLD_LEFT_221_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_LIST_FOLD_LEFT_222_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_LIST_FOLD_LEFT_223_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_LIST_FOLD_LEFT_224_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_LIST_FOLD_LEFT_225_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_LIST_FOLD_LEFT_226_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_LIST_FOLD_LEFT_227_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_LIST_FOLD_LEFT_228_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_LIST_FOLD_LEFT_229_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_LIST_FOLD_LEFT_230_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_LIST_FOLD_LEFT_231_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_LIST_FOLD_LEFT_232_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_LIST_FOLD_LEFT_233_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_LIST_FOLD_LEFT_234_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_LIST_FOLD_LEFT_235_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_LIST_FOLD_LEFT_236_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_LIST_FOLD_LEFT_237_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_LIST_FOLD_LEFT_238_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_LIST_FOLD_LEFT_239_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_LIST_FOLD_LEFT_240_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_LIST_FOLD_LEFT_241_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_LIST_FOLD_LEFT_242_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_LIST_FOLD_LEFT_243_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_LIST_FOLD_LEFT_244_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_LIST_FOLD_LEFT_245_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_LIST_FOLD_LEFT_246_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_LIST_FOLD_LEFT_247_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_LIST_FOLD_LEFT_248_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_LIST_FOLD_LEFT_249_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_LIST_FOLD_LEFT_250_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_LIST_FOLD_LEFT_251_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_LIST_FOLD_LEFT_252_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_LIST_FOLD_LEFT_253_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_LIST_FOLD_LEFT_254_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_LIST_FOLD_LEFT_255_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_LIST_FOLD_LEFT_256_D(o, s, l)\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_2_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_3_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_4_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_5_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_6_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_7_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_8_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_9_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_10_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_11_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_12_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_13_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_14_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_15_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_16_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_17_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_18_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_19_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_20_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_21_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_22_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_23_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_24_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_25_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_26_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_27_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_28_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_29_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_30_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_31_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_32_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_33_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_34_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_35_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_36_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_37_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_38_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_39_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_40_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_41_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_42_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_43_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_44_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_45_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_46_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_47_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_48_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_49_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_50_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_51_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_52_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_53_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_54_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_55_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_56_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_57_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_58_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_59_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_60_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_61_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_62_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_63_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_64_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_65_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_66_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_67_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_68_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_69_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_70_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_71_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_72_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_73_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_74_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_75_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_76_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_77_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_78_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_79_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_80_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_81_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_82_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_83_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_84_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_85_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_86_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_87_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_88_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_89_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_90_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_91_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_92_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_93_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_94_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_95_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_96_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_97_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_98_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_99_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_100_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_101_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_102_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_103_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_104_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_105_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_106_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_107_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_108_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_109_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_110_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_111_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_112_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_113_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_114_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_115_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_116_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_117_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_118_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_119_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_120_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_121_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_122_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_123_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_124_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_125_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_126_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_127_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_128_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_129_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_130_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_131_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_132_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_133_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_134_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_135_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_136_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_137_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_138_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_139_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_140_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_141_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_142_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_143_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_144_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_145_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_146_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_147_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_148_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_149_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_150_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_151_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_152_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_153_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_154_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_155_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_156_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_157_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_158_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_159_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_160_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_161_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_162_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_163_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_164_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_165_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_166_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_167_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_168_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_169_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_170_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_171_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_172_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_173_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_174_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_175_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_176_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_177_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_178_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_179_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_180_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_181_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_182_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_183_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_184_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_185_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_186_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_187_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_188_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_189_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_190_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_191_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_192_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_193_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_194_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_195_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_196_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_197_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_198_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_199_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_200_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_201_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_202_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_203_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_204_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_205_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_206_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_207_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_208_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_209_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_210_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_211_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_212_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_213_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_214_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_215_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_216_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_217_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_218_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_219_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_220_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_221_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_222_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_223_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_224_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_225_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_226_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_227_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_228_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_229_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_230_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_231_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_232_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_233_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_234_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_235_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_236_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_237_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_238_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_239_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_240_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_241_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_242_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_243_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_244_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_245_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_246_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_247_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_248_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_249_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_250_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_251_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_252_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_253_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_254_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_255_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_256_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/detail/edg/fold_right.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_EDG_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_1_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_2_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_3_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_4_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_5_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_6_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_7_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_8_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_9_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_10_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_11_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_12_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_13_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_14_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_15_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_16_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_17_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_18_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_19_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_20_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_21_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_22_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_23_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_24_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_25_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_26_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_27_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_28_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_29_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_30_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_31_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_32_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_33_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_34_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_35_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_36_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_37_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_38_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_39_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_40_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_41_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_42_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_43_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_44_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_45_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_46_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_47_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_48_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_49_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_50_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_51_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_52_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_53_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_54_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_55_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_56_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_57_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_58_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_59_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_60_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_61_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_62_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_63_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_64_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_65_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_66_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_67_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_68_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_69_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_70_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_71_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_72_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_73_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_74_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_75_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_76_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_77_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_78_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_79_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_80_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_81_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_82_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_83_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_84_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_85_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_86_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_87_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_88_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_89_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_90_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_91_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_92_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_93_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_94_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_95_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_96_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_97_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_98_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_99_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_100_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_101_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_102_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_103_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_104_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_105_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_106_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_107_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_108_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_109_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_110_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_111_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_112_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_113_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_114_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_115_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_116_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_117_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_118_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_119_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_120_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_121_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_122_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_123_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_124_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_125_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_126_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_127_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_128_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_129_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_130_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_131_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_132_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_133_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_134_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_135_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_136_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_137_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_138_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_139_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_140_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_141_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_142_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_143_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_144_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_145_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_146_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_147_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_148_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_149_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_150_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_151_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_152_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_153_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_154_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_155_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_156_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_157_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_158_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_159_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_160_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_161_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_162_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_163_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_164_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_165_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_166_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_167_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_168_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_169_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_170_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_171_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_172_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_173_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_174_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_175_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_176_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_177_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_178_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_179_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_180_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_181_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_182_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_183_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_184_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_185_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_186_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_187_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_188_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_189_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_190_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_191_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_192_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_193_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_194_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_195_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_196_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_197_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_198_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_199_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_200_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_201_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_202_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_203_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_204_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_205_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_206_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_207_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_208_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_209_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_210_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_211_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_212_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_213_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_214_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_215_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_216_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_217_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_218_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_219_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_220_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_221_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_222_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_223_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_224_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_225_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_226_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_227_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_228_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_229_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_230_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_231_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_232_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_233_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_234_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_235_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_236_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_237_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_238_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_239_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_240_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_241_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_242_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_243_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_244_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_245_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_246_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_247_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_248_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_249_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_250_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_251_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_252_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_253_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_254_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_255_D(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) BOOST_PP_LIST_FOLD_RIGHT_256_D(o, s, l)\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_1_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(2, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_2, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_2_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(3, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_3, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_3_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(4, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_4, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_4_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(5, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_5, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_5_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(6, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_6, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_6_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(7, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_7, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_7_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(8, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_8, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_8_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(9, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_9, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_9_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(10, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_10, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_10_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(11, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_11, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_11_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(12, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_12, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_12_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(13, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_13, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_13_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(14, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_14, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_14_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(15, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_15, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_15_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(16, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_16, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_16_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(17, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_17, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_17_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(18, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_18, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_18_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(19, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_19, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_19_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(20, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_20, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_20_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(21, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_21, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_21_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(22, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_22, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_22_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(23, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_23, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_23_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(24, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_24, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_24_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(25, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_25, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_25_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(26, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_26, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_26_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(27, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_27, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_27_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(28, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_28, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_28_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(29, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_29, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_29_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(30, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_30, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_30_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(31, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_31, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_31_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(32, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_32, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_32_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(33, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_33, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_33_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(34, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_34, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_34_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(35, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_35, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_35_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(36, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_36, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_36_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(37, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_37, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_37_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(38, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_38, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_38_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(39, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_39, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_39_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(40, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_40, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_40_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(41, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_41, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_41_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(42, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_42, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_42_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(43, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_43, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_43_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(44, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_44, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_44_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(45, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_45, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_45_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(46, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_46, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_46_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(47, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_47, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_47_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(48, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_48, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_48_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(49, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_49, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_49_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(50, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_50, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_50_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(51, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_51, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_51_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(52, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_52, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_52_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(53, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_53, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_53_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(54, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_54, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_54_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(55, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_55, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_55_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(56, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_56, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_56_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(57, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_57, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_57_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(58, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_58, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_58_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(59, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_59, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_59_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(60, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_60, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_60_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(61, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_61, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_61_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(62, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_62, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_62_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(63, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_63, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_63_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(64, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_64, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_64_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(65, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_65, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_65_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(66, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_66, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_66_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(67, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_67, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_67_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(68, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_68, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_68_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(69, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_69, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_69_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(70, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_70, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_70_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(71, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_71, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_71_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(72, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_72, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_72_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(73, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_73, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_73_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(74, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_74, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_74_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(75, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_75, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_75_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(76, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_76, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_76_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(77, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_77, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_77_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(78, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_78, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_78_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(79, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_79, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_79_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(80, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_80, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_80_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(81, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_81, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_81_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(82, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_82, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_82_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(83, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_83, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_83_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(84, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_84, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_84_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(85, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_85, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_85_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(86, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_86, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_86_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(87, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_87, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_87_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(88, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_88, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_88_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(89, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_89, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_89_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(90, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_90, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_90_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(91, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_91, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_91_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(92, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_92, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_92_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(93, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_93, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_93_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(94, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_94, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_94_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(95, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_95, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_95_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(96, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_96, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_96_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(97, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_97, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_97_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(98, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_98, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_98_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(99, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_99, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_99_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(100, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_100, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_100_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(101, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_101, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_101_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(102, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_102, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_102_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(103, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_103, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_103_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(104, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_104, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_104_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(105, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_105, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_105_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(106, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_106, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_106_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(107, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_107, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_107_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(108, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_108, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_108_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(109, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_109, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_109_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(110, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_110, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_110_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(111, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_111, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_111_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(112, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_112, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_112_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(113, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_113, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_113_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(114, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_114, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_114_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(115, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_115, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_115_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(116, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_116, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_116_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(117, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_117, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_117_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(118, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_118, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_118_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(119, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_119, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_119_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(120, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_120, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_120_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(121, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_121, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_121_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(122, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_122, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_122_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(123, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_123, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_123_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(124, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_124, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_124_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(125, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_125, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_125_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(126, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_126, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_126_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(127, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_127, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_127_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(128, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_128, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_128_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(129, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_129, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_129_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(130, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_130, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_130_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(131, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_131, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_131_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(132, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_132, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_132_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(133, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_133, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_133_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(134, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_134, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_134_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(135, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_135, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_135_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(136, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_136, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_136_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(137, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_137, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_137_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(138, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_138, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_138_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(139, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_139, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_139_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(140, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_140, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_140_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(141, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_141, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_141_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(142, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_142, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_142_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(143, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_143, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_143_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(144, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_144, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_144_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(145, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_145, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_145_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(146, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_146, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_146_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(147, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_147, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_147_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(148, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_148, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_148_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(149, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_149, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_149_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(150, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_150, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_150_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(151, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_151, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_151_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(152, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_152, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_152_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(153, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_153, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_153_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(154, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_154, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_154_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(155, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_155, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_155_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(156, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_156, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_156_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(157, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_157, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_157_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(158, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_158, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_158_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(159, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_159, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_159_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(160, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_160, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_160_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(161, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_161, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_161_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(162, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_162, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_162_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(163, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_163, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_163_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(164, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_164, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_164_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(165, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_165, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_165_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(166, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_166, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_166_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(167, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_167, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_167_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(168, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_168, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_168_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(169, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_169, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_169_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(170, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_170, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_170_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(171, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_171, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_171_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(172, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_172, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_172_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(173, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_173, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_173_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(174, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_174, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_174_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(175, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_175, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_175_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(176, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_176, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_176_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(177, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_177, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_177_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(178, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_178, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_178_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(179, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_179, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_179_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(180, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_180, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_180_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(181, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_181, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_181_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(182, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_182, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_182_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(183, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_183, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_183_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(184, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_184, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_184_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(185, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_185, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_185_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(186, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_186, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_186_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(187, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_187, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_187_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(188, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_188, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_188_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(189, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_189, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_189_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(190, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_190, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_190_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(191, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_191, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_191_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(192, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_192, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_192_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(193, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_193, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_193_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(194, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_194, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_194_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(195, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_195, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_195_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(196, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_196, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_196_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(197, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_197, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_197_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(198, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_198, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_198_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(199, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_199, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_199_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(200, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_200, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_200_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(201, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_201, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_201_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(202, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_202, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_202_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(203, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_203, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_203_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(204, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_204, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_204_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(205, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_205, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_205_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(206, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_206, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_206_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(207, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_207, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_207_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(208, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_208, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_208_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(209, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_209, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_209_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(210, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_210, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_210_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(211, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_211, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_211_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(212, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_212, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_212_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(213, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_213, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_213_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(214, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_214, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_214_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(215, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_215, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_215_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(216, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_216, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_216_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(217, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_217, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_217_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(218, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_218, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_218_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(219, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_219, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_219_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(220, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_220, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_220_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(221, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_221, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_221_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(222, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_222, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_222_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(223, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_223, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_223_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(224, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_224, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_224_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(225, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_225, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_225_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(226, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_226, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_226_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(227, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_227, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_227_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(228, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_228, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_228_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(229, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_229, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_229_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(230, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_230, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_230_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(231, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_231, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_231_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(232, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_232, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_232_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(233, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_233, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_233_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(234, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_234, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_234_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(235, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_235, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_235_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(236, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_236, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_236_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(237, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_237, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_237_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(238, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_238, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_238_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(239, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_239, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_239_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(240, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_240, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_240_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(241, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_241, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_241_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(242, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_242, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_242_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(243, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_243, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_243_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(244, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_244, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_244_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(245, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_245, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_245_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(246, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_246, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_246_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(247, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_247, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_247_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(248, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_248, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_248_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(249, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_249, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_249_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(250, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_250, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_250_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(251, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_251, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_251_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(252, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_252, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_252_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(253, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_253, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_253_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(254, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_254, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_254_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(255, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_255, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_255_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(256, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_256, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n# define BOOST_PP_LIST_FOLD_RIGHT_256_D(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), o, s BOOST_PP_TUPLE_EAT_3)(257, BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_RIGHT_257, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3)(o, s, BOOST_PP_LIST_REST(l)), BOOST_PP_LIST_FIRST(l))\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_RIGHT_CHECK_BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/detail/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_2, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(2, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_3, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(3, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_4, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(4, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_5, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(5, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_6, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(6, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_7, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(7, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_8, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(8, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_9, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(9, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_10, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(10, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_11, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(11, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_12, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(12, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_13, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(13, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_14, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(14, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_15, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(15, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_16, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(16, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_17, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(17, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_18, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(18, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_19, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(19, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_20, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(20, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_21, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(21, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_22, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(22, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_23, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(23, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_24, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(24, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_25, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(25, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_26, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(26, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_27, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(27, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_28, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(28, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_29, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(29, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_30, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(30, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_31, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(31, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_32, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(32, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_33, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(33, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_34, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(34, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_35, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(35, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_36, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(36, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_37, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(37, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_38, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(38, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_39, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(39, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_40, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(40, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_41, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(41, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_42, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(42, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_43, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(43, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_44, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(44, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_45, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(45, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_46, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(46, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_47, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(47, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_48, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(48, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_49, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(49, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_50, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(50, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_51, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(51, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_52, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(52, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_53, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(53, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_54, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(54, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_55, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(55, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_56, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(56, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_57, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(57, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_58, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(58, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_59, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(59, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_60, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(60, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_61, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(61, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_62, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(62, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_63, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(63, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_64, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(64, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_65, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(65, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_66, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(66, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_67, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(67, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_68, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(68, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_69, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(69, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_70, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(70, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_71, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(71, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_72, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(72, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_73, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(73, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_74, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(74, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_75, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(75, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_76, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(76, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_77, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(77, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_78, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(78, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_79, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(79, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_80, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(80, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_81, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(81, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_82, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(82, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_83, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(83, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_84, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(84, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_85, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(85, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_86, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(86, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_87, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(87, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_88, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(88, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_89, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(89, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_90, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(90, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_91, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(91, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_92, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(92, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_93, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(93, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_94, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(94, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_95, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(95, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_96, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(96, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_97, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(97, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_98, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(98, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_99, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(99, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_100, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(100, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_101, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(101, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_102, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(102, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_103, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(103, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_104, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(104, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_105, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(105, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_106, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(106, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_107, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(107, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_108, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(108, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_109, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(109, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_110, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(110, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_111, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(111, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_112, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(112, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_113, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(113, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_114, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(114, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_115, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(115, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_116, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(116, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_117, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(117, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_118, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(118, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_119, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(119, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_120, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(120, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_121, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(121, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_122, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(122, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_123, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(123, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_124, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(124, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_125, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(125, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_126, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(126, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_127, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(127, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_128, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(128, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_129, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(129, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_130, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(130, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_131, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(131, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_132, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(132, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_133, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(133, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_134, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(134, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_135, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(135, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_136, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(136, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_137, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(137, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_138, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(138, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_139, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(139, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_140, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(140, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_141, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(141, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_142, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(142, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_143, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(143, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_144, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(144, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_145, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(145, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_146, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(146, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_147, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(147, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_148, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(148, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_149, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(149, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_150, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(150, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_151, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(151, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_152, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(152, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_153, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(153, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_154, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(154, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_155, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(155, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_156, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(156, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_157, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(157, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_158, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(158, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_159, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(159, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_160, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(160, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_161, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(161, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_162, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(162, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_163, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(163, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_164, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(164, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_165, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(165, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_166, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(166, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_167, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(167, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_168, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(168, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_169, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(169, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_170, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(170, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_171, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(171, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_172, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(172, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_173, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(173, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_174, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(174, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_175, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(175, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_176, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(176, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_177, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(177, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_178, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(178, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_179, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(179, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_180, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(180, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_181, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(181, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_182, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(182, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_183, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(183, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_184, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(184, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_185, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(185, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_186, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(186, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_187, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(187, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_188, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(188, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_189, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(189, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_190, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(190, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_191, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(191, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_192, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(192, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_193, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(193, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_194, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(194, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_195, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(195, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_196, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(196, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_197, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(197, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_198, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(198, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_199, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(199, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_200, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(200, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_201, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(201, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_202, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(202, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_203, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(203, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_204, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(204, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_205, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(205, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_206, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(206, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_207, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(207, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_208, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(208, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_209, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(209, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_210, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(210, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_211, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(211, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_212, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(212, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_213, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(213, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_214, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(214, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_215, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(215, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_216, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(216, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_217, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(217, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_218, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(218, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_219, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(219, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_220, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(220, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_221, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(221, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_222, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(222, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_223, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(223, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_224, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(224, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_225, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(225, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_226, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(226, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_227, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(227, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_228, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(228, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_229, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(229, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_230, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(230, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_231, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(231, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_232, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(232, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_233, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(233, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_234, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(234, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_235, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(235, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_236, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(236, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_237, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(237, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_238, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(238, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_239, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(239, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_240, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(240, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_241, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(241, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_242, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(242, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_243, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(243, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_244, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(244, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_245, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(245, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_246, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(246, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_247, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(247, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_248, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(248, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_249, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(249, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_250, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(250, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_251, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(251, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_252, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(252, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_253, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(253, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_254, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(254, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_255, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(255, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_256, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(256, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n# define BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS(l), BOOST_PP_LIST_FOLD_LEFT_257, s BOOST_PP_TUPLE_EAT_3)(o, BOOST_PP_EXPR_IIF(BOOST_PP_LIST_IS_CONS(l), o)(257, s, BOOST_PP_LIST_FIRST(l)), BOOST_PP_LIST_REST(l))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/detail/fold_right.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_LIST_DETAIL_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/list/fold_left.hpp>\n# include <boost/preprocessor/list/reverse.hpp>\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_1(o, s, l) BOOST_PP_LIST_FOLD_LEFT_1(o, s, BOOST_PP_LIST_REVERSE_D(1, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_2(o, s, l) BOOST_PP_LIST_FOLD_LEFT_2(o, s, BOOST_PP_LIST_REVERSE_D(2, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_3(o, s, l) BOOST_PP_LIST_FOLD_LEFT_3(o, s, BOOST_PP_LIST_REVERSE_D(3, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_4(o, s, l) BOOST_PP_LIST_FOLD_LEFT_4(o, s, BOOST_PP_LIST_REVERSE_D(4, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_5(o, s, l) BOOST_PP_LIST_FOLD_LEFT_5(o, s, BOOST_PP_LIST_REVERSE_D(5, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_6(o, s, l) BOOST_PP_LIST_FOLD_LEFT_6(o, s, BOOST_PP_LIST_REVERSE_D(6, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_7(o, s, l) BOOST_PP_LIST_FOLD_LEFT_7(o, s, BOOST_PP_LIST_REVERSE_D(7, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_8(o, s, l) BOOST_PP_LIST_FOLD_LEFT_8(o, s, BOOST_PP_LIST_REVERSE_D(8, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_9(o, s, l) BOOST_PP_LIST_FOLD_LEFT_9(o, s, BOOST_PP_LIST_REVERSE_D(9, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_10(o, s, l) BOOST_PP_LIST_FOLD_LEFT_10(o, s, BOOST_PP_LIST_REVERSE_D(10, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_11(o, s, l) BOOST_PP_LIST_FOLD_LEFT_11(o, s, BOOST_PP_LIST_REVERSE_D(11, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_12(o, s, l) BOOST_PP_LIST_FOLD_LEFT_12(o, s, BOOST_PP_LIST_REVERSE_D(12, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_13(o, s, l) BOOST_PP_LIST_FOLD_LEFT_13(o, s, BOOST_PP_LIST_REVERSE_D(13, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_14(o, s, l) BOOST_PP_LIST_FOLD_LEFT_14(o, s, BOOST_PP_LIST_REVERSE_D(14, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_15(o, s, l) BOOST_PP_LIST_FOLD_LEFT_15(o, s, BOOST_PP_LIST_REVERSE_D(15, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_16(o, s, l) BOOST_PP_LIST_FOLD_LEFT_16(o, s, BOOST_PP_LIST_REVERSE_D(16, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_17(o, s, l) BOOST_PP_LIST_FOLD_LEFT_17(o, s, BOOST_PP_LIST_REVERSE_D(17, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_18(o, s, l) BOOST_PP_LIST_FOLD_LEFT_18(o, s, BOOST_PP_LIST_REVERSE_D(18, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_19(o, s, l) BOOST_PP_LIST_FOLD_LEFT_19(o, s, BOOST_PP_LIST_REVERSE_D(19, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_20(o, s, l) BOOST_PP_LIST_FOLD_LEFT_20(o, s, BOOST_PP_LIST_REVERSE_D(20, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_21(o, s, l) BOOST_PP_LIST_FOLD_LEFT_21(o, s, BOOST_PP_LIST_REVERSE_D(21, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_22(o, s, l) BOOST_PP_LIST_FOLD_LEFT_22(o, s, BOOST_PP_LIST_REVERSE_D(22, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_23(o, s, l) BOOST_PP_LIST_FOLD_LEFT_23(o, s, BOOST_PP_LIST_REVERSE_D(23, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_24(o, s, l) BOOST_PP_LIST_FOLD_LEFT_24(o, s, BOOST_PP_LIST_REVERSE_D(24, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_25(o, s, l) BOOST_PP_LIST_FOLD_LEFT_25(o, s, BOOST_PP_LIST_REVERSE_D(25, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_26(o, s, l) BOOST_PP_LIST_FOLD_LEFT_26(o, s, BOOST_PP_LIST_REVERSE_D(26, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_27(o, s, l) BOOST_PP_LIST_FOLD_LEFT_27(o, s, BOOST_PP_LIST_REVERSE_D(27, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_28(o, s, l) BOOST_PP_LIST_FOLD_LEFT_28(o, s, BOOST_PP_LIST_REVERSE_D(28, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_29(o, s, l) BOOST_PP_LIST_FOLD_LEFT_29(o, s, BOOST_PP_LIST_REVERSE_D(29, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_30(o, s, l) BOOST_PP_LIST_FOLD_LEFT_30(o, s, BOOST_PP_LIST_REVERSE_D(30, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_31(o, s, l) BOOST_PP_LIST_FOLD_LEFT_31(o, s, BOOST_PP_LIST_REVERSE_D(31, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_32(o, s, l) BOOST_PP_LIST_FOLD_LEFT_32(o, s, BOOST_PP_LIST_REVERSE_D(32, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_33(o, s, l) BOOST_PP_LIST_FOLD_LEFT_33(o, s, BOOST_PP_LIST_REVERSE_D(33, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_34(o, s, l) BOOST_PP_LIST_FOLD_LEFT_34(o, s, BOOST_PP_LIST_REVERSE_D(34, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_35(o, s, l) BOOST_PP_LIST_FOLD_LEFT_35(o, s, BOOST_PP_LIST_REVERSE_D(35, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_36(o, s, l) BOOST_PP_LIST_FOLD_LEFT_36(o, s, BOOST_PP_LIST_REVERSE_D(36, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_37(o, s, l) BOOST_PP_LIST_FOLD_LEFT_37(o, s, BOOST_PP_LIST_REVERSE_D(37, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_38(o, s, l) BOOST_PP_LIST_FOLD_LEFT_38(o, s, BOOST_PP_LIST_REVERSE_D(38, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_39(o, s, l) BOOST_PP_LIST_FOLD_LEFT_39(o, s, BOOST_PP_LIST_REVERSE_D(39, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_40(o, s, l) BOOST_PP_LIST_FOLD_LEFT_40(o, s, BOOST_PP_LIST_REVERSE_D(40, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_41(o, s, l) BOOST_PP_LIST_FOLD_LEFT_41(o, s, BOOST_PP_LIST_REVERSE_D(41, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_42(o, s, l) BOOST_PP_LIST_FOLD_LEFT_42(o, s, BOOST_PP_LIST_REVERSE_D(42, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_43(o, s, l) BOOST_PP_LIST_FOLD_LEFT_43(o, s, BOOST_PP_LIST_REVERSE_D(43, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_44(o, s, l) BOOST_PP_LIST_FOLD_LEFT_44(o, s, BOOST_PP_LIST_REVERSE_D(44, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_45(o, s, l) BOOST_PP_LIST_FOLD_LEFT_45(o, s, BOOST_PP_LIST_REVERSE_D(45, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_46(o, s, l) BOOST_PP_LIST_FOLD_LEFT_46(o, s, BOOST_PP_LIST_REVERSE_D(46, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_47(o, s, l) BOOST_PP_LIST_FOLD_LEFT_47(o, s, BOOST_PP_LIST_REVERSE_D(47, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_48(o, s, l) BOOST_PP_LIST_FOLD_LEFT_48(o, s, BOOST_PP_LIST_REVERSE_D(48, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_49(o, s, l) BOOST_PP_LIST_FOLD_LEFT_49(o, s, BOOST_PP_LIST_REVERSE_D(49, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_50(o, s, l) BOOST_PP_LIST_FOLD_LEFT_50(o, s, BOOST_PP_LIST_REVERSE_D(50, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_51(o, s, l) BOOST_PP_LIST_FOLD_LEFT_51(o, s, BOOST_PP_LIST_REVERSE_D(51, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_52(o, s, l) BOOST_PP_LIST_FOLD_LEFT_52(o, s, BOOST_PP_LIST_REVERSE_D(52, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_53(o, s, l) BOOST_PP_LIST_FOLD_LEFT_53(o, s, BOOST_PP_LIST_REVERSE_D(53, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_54(o, s, l) BOOST_PP_LIST_FOLD_LEFT_54(o, s, BOOST_PP_LIST_REVERSE_D(54, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_55(o, s, l) BOOST_PP_LIST_FOLD_LEFT_55(o, s, BOOST_PP_LIST_REVERSE_D(55, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_56(o, s, l) BOOST_PP_LIST_FOLD_LEFT_56(o, s, BOOST_PP_LIST_REVERSE_D(56, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_57(o, s, l) BOOST_PP_LIST_FOLD_LEFT_57(o, s, BOOST_PP_LIST_REVERSE_D(57, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_58(o, s, l) BOOST_PP_LIST_FOLD_LEFT_58(o, s, BOOST_PP_LIST_REVERSE_D(58, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_59(o, s, l) BOOST_PP_LIST_FOLD_LEFT_59(o, s, BOOST_PP_LIST_REVERSE_D(59, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_60(o, s, l) BOOST_PP_LIST_FOLD_LEFT_60(o, s, BOOST_PP_LIST_REVERSE_D(60, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_61(o, s, l) BOOST_PP_LIST_FOLD_LEFT_61(o, s, BOOST_PP_LIST_REVERSE_D(61, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_62(o, s, l) BOOST_PP_LIST_FOLD_LEFT_62(o, s, BOOST_PP_LIST_REVERSE_D(62, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_63(o, s, l) BOOST_PP_LIST_FOLD_LEFT_63(o, s, BOOST_PP_LIST_REVERSE_D(63, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_64(o, s, l) BOOST_PP_LIST_FOLD_LEFT_64(o, s, BOOST_PP_LIST_REVERSE_D(64, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_65(o, s, l) BOOST_PP_LIST_FOLD_LEFT_65(o, s, BOOST_PP_LIST_REVERSE_D(65, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_66(o, s, l) BOOST_PP_LIST_FOLD_LEFT_66(o, s, BOOST_PP_LIST_REVERSE_D(66, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_67(o, s, l) BOOST_PP_LIST_FOLD_LEFT_67(o, s, BOOST_PP_LIST_REVERSE_D(67, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_68(o, s, l) BOOST_PP_LIST_FOLD_LEFT_68(o, s, BOOST_PP_LIST_REVERSE_D(68, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_69(o, s, l) BOOST_PP_LIST_FOLD_LEFT_69(o, s, BOOST_PP_LIST_REVERSE_D(69, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_70(o, s, l) BOOST_PP_LIST_FOLD_LEFT_70(o, s, BOOST_PP_LIST_REVERSE_D(70, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_71(o, s, l) BOOST_PP_LIST_FOLD_LEFT_71(o, s, BOOST_PP_LIST_REVERSE_D(71, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_72(o, s, l) BOOST_PP_LIST_FOLD_LEFT_72(o, s, BOOST_PP_LIST_REVERSE_D(72, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_73(o, s, l) BOOST_PP_LIST_FOLD_LEFT_73(o, s, BOOST_PP_LIST_REVERSE_D(73, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_74(o, s, l) BOOST_PP_LIST_FOLD_LEFT_74(o, s, BOOST_PP_LIST_REVERSE_D(74, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_75(o, s, l) BOOST_PP_LIST_FOLD_LEFT_75(o, s, BOOST_PP_LIST_REVERSE_D(75, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_76(o, s, l) BOOST_PP_LIST_FOLD_LEFT_76(o, s, BOOST_PP_LIST_REVERSE_D(76, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_77(o, s, l) BOOST_PP_LIST_FOLD_LEFT_77(o, s, BOOST_PP_LIST_REVERSE_D(77, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_78(o, s, l) BOOST_PP_LIST_FOLD_LEFT_78(o, s, BOOST_PP_LIST_REVERSE_D(78, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_79(o, s, l) BOOST_PP_LIST_FOLD_LEFT_79(o, s, BOOST_PP_LIST_REVERSE_D(79, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_80(o, s, l) BOOST_PP_LIST_FOLD_LEFT_80(o, s, BOOST_PP_LIST_REVERSE_D(80, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_81(o, s, l) BOOST_PP_LIST_FOLD_LEFT_81(o, s, BOOST_PP_LIST_REVERSE_D(81, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_82(o, s, l) BOOST_PP_LIST_FOLD_LEFT_82(o, s, BOOST_PP_LIST_REVERSE_D(82, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_83(o, s, l) BOOST_PP_LIST_FOLD_LEFT_83(o, s, BOOST_PP_LIST_REVERSE_D(83, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_84(o, s, l) BOOST_PP_LIST_FOLD_LEFT_84(o, s, BOOST_PP_LIST_REVERSE_D(84, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_85(o, s, l) BOOST_PP_LIST_FOLD_LEFT_85(o, s, BOOST_PP_LIST_REVERSE_D(85, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_86(o, s, l) BOOST_PP_LIST_FOLD_LEFT_86(o, s, BOOST_PP_LIST_REVERSE_D(86, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_87(o, s, l) BOOST_PP_LIST_FOLD_LEFT_87(o, s, BOOST_PP_LIST_REVERSE_D(87, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_88(o, s, l) BOOST_PP_LIST_FOLD_LEFT_88(o, s, BOOST_PP_LIST_REVERSE_D(88, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_89(o, s, l) BOOST_PP_LIST_FOLD_LEFT_89(o, s, BOOST_PP_LIST_REVERSE_D(89, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_90(o, s, l) BOOST_PP_LIST_FOLD_LEFT_90(o, s, BOOST_PP_LIST_REVERSE_D(90, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_91(o, s, l) BOOST_PP_LIST_FOLD_LEFT_91(o, s, BOOST_PP_LIST_REVERSE_D(91, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_92(o, s, l) BOOST_PP_LIST_FOLD_LEFT_92(o, s, BOOST_PP_LIST_REVERSE_D(92, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_93(o, s, l) BOOST_PP_LIST_FOLD_LEFT_93(o, s, BOOST_PP_LIST_REVERSE_D(93, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_94(o, s, l) BOOST_PP_LIST_FOLD_LEFT_94(o, s, BOOST_PP_LIST_REVERSE_D(94, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_95(o, s, l) BOOST_PP_LIST_FOLD_LEFT_95(o, s, BOOST_PP_LIST_REVERSE_D(95, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_96(o, s, l) BOOST_PP_LIST_FOLD_LEFT_96(o, s, BOOST_PP_LIST_REVERSE_D(96, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_97(o, s, l) BOOST_PP_LIST_FOLD_LEFT_97(o, s, BOOST_PP_LIST_REVERSE_D(97, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_98(o, s, l) BOOST_PP_LIST_FOLD_LEFT_98(o, s, BOOST_PP_LIST_REVERSE_D(98, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_99(o, s, l) BOOST_PP_LIST_FOLD_LEFT_99(o, s, BOOST_PP_LIST_REVERSE_D(99, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_100(o, s, l) BOOST_PP_LIST_FOLD_LEFT_100(o, s, BOOST_PP_LIST_REVERSE_D(100, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_101(o, s, l) BOOST_PP_LIST_FOLD_LEFT_101(o, s, BOOST_PP_LIST_REVERSE_D(101, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_102(o, s, l) BOOST_PP_LIST_FOLD_LEFT_102(o, s, BOOST_PP_LIST_REVERSE_D(102, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_103(o, s, l) BOOST_PP_LIST_FOLD_LEFT_103(o, s, BOOST_PP_LIST_REVERSE_D(103, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_104(o, s, l) BOOST_PP_LIST_FOLD_LEFT_104(o, s, BOOST_PP_LIST_REVERSE_D(104, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_105(o, s, l) BOOST_PP_LIST_FOLD_LEFT_105(o, s, BOOST_PP_LIST_REVERSE_D(105, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_106(o, s, l) BOOST_PP_LIST_FOLD_LEFT_106(o, s, BOOST_PP_LIST_REVERSE_D(106, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_107(o, s, l) BOOST_PP_LIST_FOLD_LEFT_107(o, s, BOOST_PP_LIST_REVERSE_D(107, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_108(o, s, l) BOOST_PP_LIST_FOLD_LEFT_108(o, s, BOOST_PP_LIST_REVERSE_D(108, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_109(o, s, l) BOOST_PP_LIST_FOLD_LEFT_109(o, s, BOOST_PP_LIST_REVERSE_D(109, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_110(o, s, l) BOOST_PP_LIST_FOLD_LEFT_110(o, s, BOOST_PP_LIST_REVERSE_D(110, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_111(o, s, l) BOOST_PP_LIST_FOLD_LEFT_111(o, s, BOOST_PP_LIST_REVERSE_D(111, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_112(o, s, l) BOOST_PP_LIST_FOLD_LEFT_112(o, s, BOOST_PP_LIST_REVERSE_D(112, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_113(o, s, l) BOOST_PP_LIST_FOLD_LEFT_113(o, s, BOOST_PP_LIST_REVERSE_D(113, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_114(o, s, l) BOOST_PP_LIST_FOLD_LEFT_114(o, s, BOOST_PP_LIST_REVERSE_D(114, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_115(o, s, l) BOOST_PP_LIST_FOLD_LEFT_115(o, s, BOOST_PP_LIST_REVERSE_D(115, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_116(o, s, l) BOOST_PP_LIST_FOLD_LEFT_116(o, s, BOOST_PP_LIST_REVERSE_D(116, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_117(o, s, l) BOOST_PP_LIST_FOLD_LEFT_117(o, s, BOOST_PP_LIST_REVERSE_D(117, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_118(o, s, l) BOOST_PP_LIST_FOLD_LEFT_118(o, s, BOOST_PP_LIST_REVERSE_D(118, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_119(o, s, l) BOOST_PP_LIST_FOLD_LEFT_119(o, s, BOOST_PP_LIST_REVERSE_D(119, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_120(o, s, l) BOOST_PP_LIST_FOLD_LEFT_120(o, s, BOOST_PP_LIST_REVERSE_D(120, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_121(o, s, l) BOOST_PP_LIST_FOLD_LEFT_121(o, s, BOOST_PP_LIST_REVERSE_D(121, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_122(o, s, l) BOOST_PP_LIST_FOLD_LEFT_122(o, s, BOOST_PP_LIST_REVERSE_D(122, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_123(o, s, l) BOOST_PP_LIST_FOLD_LEFT_123(o, s, BOOST_PP_LIST_REVERSE_D(123, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_124(o, s, l) BOOST_PP_LIST_FOLD_LEFT_124(o, s, BOOST_PP_LIST_REVERSE_D(124, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_125(o, s, l) BOOST_PP_LIST_FOLD_LEFT_125(o, s, BOOST_PP_LIST_REVERSE_D(125, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_126(o, s, l) BOOST_PP_LIST_FOLD_LEFT_126(o, s, BOOST_PP_LIST_REVERSE_D(126, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_127(o, s, l) BOOST_PP_LIST_FOLD_LEFT_127(o, s, BOOST_PP_LIST_REVERSE_D(127, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_128(o, s, l) BOOST_PP_LIST_FOLD_LEFT_128(o, s, BOOST_PP_LIST_REVERSE_D(128, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_129(o, s, l) BOOST_PP_LIST_FOLD_LEFT_129(o, s, BOOST_PP_LIST_REVERSE_D(129, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_130(o, s, l) BOOST_PP_LIST_FOLD_LEFT_130(o, s, BOOST_PP_LIST_REVERSE_D(130, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_131(o, s, l) BOOST_PP_LIST_FOLD_LEFT_131(o, s, BOOST_PP_LIST_REVERSE_D(131, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_132(o, s, l) BOOST_PP_LIST_FOLD_LEFT_132(o, s, BOOST_PP_LIST_REVERSE_D(132, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_133(o, s, l) BOOST_PP_LIST_FOLD_LEFT_133(o, s, BOOST_PP_LIST_REVERSE_D(133, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_134(o, s, l) BOOST_PP_LIST_FOLD_LEFT_134(o, s, BOOST_PP_LIST_REVERSE_D(134, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_135(o, s, l) BOOST_PP_LIST_FOLD_LEFT_135(o, s, BOOST_PP_LIST_REVERSE_D(135, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_136(o, s, l) BOOST_PP_LIST_FOLD_LEFT_136(o, s, BOOST_PP_LIST_REVERSE_D(136, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_137(o, s, l) BOOST_PP_LIST_FOLD_LEFT_137(o, s, BOOST_PP_LIST_REVERSE_D(137, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_138(o, s, l) BOOST_PP_LIST_FOLD_LEFT_138(o, s, BOOST_PP_LIST_REVERSE_D(138, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_139(o, s, l) BOOST_PP_LIST_FOLD_LEFT_139(o, s, BOOST_PP_LIST_REVERSE_D(139, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_140(o, s, l) BOOST_PP_LIST_FOLD_LEFT_140(o, s, BOOST_PP_LIST_REVERSE_D(140, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_141(o, s, l) BOOST_PP_LIST_FOLD_LEFT_141(o, s, BOOST_PP_LIST_REVERSE_D(141, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_142(o, s, l) BOOST_PP_LIST_FOLD_LEFT_142(o, s, BOOST_PP_LIST_REVERSE_D(142, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_143(o, s, l) BOOST_PP_LIST_FOLD_LEFT_143(o, s, BOOST_PP_LIST_REVERSE_D(143, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_144(o, s, l) BOOST_PP_LIST_FOLD_LEFT_144(o, s, BOOST_PP_LIST_REVERSE_D(144, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_145(o, s, l) BOOST_PP_LIST_FOLD_LEFT_145(o, s, BOOST_PP_LIST_REVERSE_D(145, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_146(o, s, l) BOOST_PP_LIST_FOLD_LEFT_146(o, s, BOOST_PP_LIST_REVERSE_D(146, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_147(o, s, l) BOOST_PP_LIST_FOLD_LEFT_147(o, s, BOOST_PP_LIST_REVERSE_D(147, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_148(o, s, l) BOOST_PP_LIST_FOLD_LEFT_148(o, s, BOOST_PP_LIST_REVERSE_D(148, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_149(o, s, l) BOOST_PP_LIST_FOLD_LEFT_149(o, s, BOOST_PP_LIST_REVERSE_D(149, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_150(o, s, l) BOOST_PP_LIST_FOLD_LEFT_150(o, s, BOOST_PP_LIST_REVERSE_D(150, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_151(o, s, l) BOOST_PP_LIST_FOLD_LEFT_151(o, s, BOOST_PP_LIST_REVERSE_D(151, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_152(o, s, l) BOOST_PP_LIST_FOLD_LEFT_152(o, s, BOOST_PP_LIST_REVERSE_D(152, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_153(o, s, l) BOOST_PP_LIST_FOLD_LEFT_153(o, s, BOOST_PP_LIST_REVERSE_D(153, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_154(o, s, l) BOOST_PP_LIST_FOLD_LEFT_154(o, s, BOOST_PP_LIST_REVERSE_D(154, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_155(o, s, l) BOOST_PP_LIST_FOLD_LEFT_155(o, s, BOOST_PP_LIST_REVERSE_D(155, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_156(o, s, l) BOOST_PP_LIST_FOLD_LEFT_156(o, s, BOOST_PP_LIST_REVERSE_D(156, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_157(o, s, l) BOOST_PP_LIST_FOLD_LEFT_157(o, s, BOOST_PP_LIST_REVERSE_D(157, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_158(o, s, l) BOOST_PP_LIST_FOLD_LEFT_158(o, s, BOOST_PP_LIST_REVERSE_D(158, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_159(o, s, l) BOOST_PP_LIST_FOLD_LEFT_159(o, s, BOOST_PP_LIST_REVERSE_D(159, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_160(o, s, l) BOOST_PP_LIST_FOLD_LEFT_160(o, s, BOOST_PP_LIST_REVERSE_D(160, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_161(o, s, l) BOOST_PP_LIST_FOLD_LEFT_161(o, s, BOOST_PP_LIST_REVERSE_D(161, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_162(o, s, l) BOOST_PP_LIST_FOLD_LEFT_162(o, s, BOOST_PP_LIST_REVERSE_D(162, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_163(o, s, l) BOOST_PP_LIST_FOLD_LEFT_163(o, s, BOOST_PP_LIST_REVERSE_D(163, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_164(o, s, l) BOOST_PP_LIST_FOLD_LEFT_164(o, s, BOOST_PP_LIST_REVERSE_D(164, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_165(o, s, l) BOOST_PP_LIST_FOLD_LEFT_165(o, s, BOOST_PP_LIST_REVERSE_D(165, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_166(o, s, l) BOOST_PP_LIST_FOLD_LEFT_166(o, s, BOOST_PP_LIST_REVERSE_D(166, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_167(o, s, l) BOOST_PP_LIST_FOLD_LEFT_167(o, s, BOOST_PP_LIST_REVERSE_D(167, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_168(o, s, l) BOOST_PP_LIST_FOLD_LEFT_168(o, s, BOOST_PP_LIST_REVERSE_D(168, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_169(o, s, l) BOOST_PP_LIST_FOLD_LEFT_169(o, s, BOOST_PP_LIST_REVERSE_D(169, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_170(o, s, l) BOOST_PP_LIST_FOLD_LEFT_170(o, s, BOOST_PP_LIST_REVERSE_D(170, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_171(o, s, l) BOOST_PP_LIST_FOLD_LEFT_171(o, s, BOOST_PP_LIST_REVERSE_D(171, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_172(o, s, l) BOOST_PP_LIST_FOLD_LEFT_172(o, s, BOOST_PP_LIST_REVERSE_D(172, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_173(o, s, l) BOOST_PP_LIST_FOLD_LEFT_173(o, s, BOOST_PP_LIST_REVERSE_D(173, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_174(o, s, l) BOOST_PP_LIST_FOLD_LEFT_174(o, s, BOOST_PP_LIST_REVERSE_D(174, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_175(o, s, l) BOOST_PP_LIST_FOLD_LEFT_175(o, s, BOOST_PP_LIST_REVERSE_D(175, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_176(o, s, l) BOOST_PP_LIST_FOLD_LEFT_176(o, s, BOOST_PP_LIST_REVERSE_D(176, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_177(o, s, l) BOOST_PP_LIST_FOLD_LEFT_177(o, s, BOOST_PP_LIST_REVERSE_D(177, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_178(o, s, l) BOOST_PP_LIST_FOLD_LEFT_178(o, s, BOOST_PP_LIST_REVERSE_D(178, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_179(o, s, l) BOOST_PP_LIST_FOLD_LEFT_179(o, s, BOOST_PP_LIST_REVERSE_D(179, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_180(o, s, l) BOOST_PP_LIST_FOLD_LEFT_180(o, s, BOOST_PP_LIST_REVERSE_D(180, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_181(o, s, l) BOOST_PP_LIST_FOLD_LEFT_181(o, s, BOOST_PP_LIST_REVERSE_D(181, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_182(o, s, l) BOOST_PP_LIST_FOLD_LEFT_182(o, s, BOOST_PP_LIST_REVERSE_D(182, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_183(o, s, l) BOOST_PP_LIST_FOLD_LEFT_183(o, s, BOOST_PP_LIST_REVERSE_D(183, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_184(o, s, l) BOOST_PP_LIST_FOLD_LEFT_184(o, s, BOOST_PP_LIST_REVERSE_D(184, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_185(o, s, l) BOOST_PP_LIST_FOLD_LEFT_185(o, s, BOOST_PP_LIST_REVERSE_D(185, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_186(o, s, l) BOOST_PP_LIST_FOLD_LEFT_186(o, s, BOOST_PP_LIST_REVERSE_D(186, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_187(o, s, l) BOOST_PP_LIST_FOLD_LEFT_187(o, s, BOOST_PP_LIST_REVERSE_D(187, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_188(o, s, l) BOOST_PP_LIST_FOLD_LEFT_188(o, s, BOOST_PP_LIST_REVERSE_D(188, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_189(o, s, l) BOOST_PP_LIST_FOLD_LEFT_189(o, s, BOOST_PP_LIST_REVERSE_D(189, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_190(o, s, l) BOOST_PP_LIST_FOLD_LEFT_190(o, s, BOOST_PP_LIST_REVERSE_D(190, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_191(o, s, l) BOOST_PP_LIST_FOLD_LEFT_191(o, s, BOOST_PP_LIST_REVERSE_D(191, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_192(o, s, l) BOOST_PP_LIST_FOLD_LEFT_192(o, s, BOOST_PP_LIST_REVERSE_D(192, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_193(o, s, l) BOOST_PP_LIST_FOLD_LEFT_193(o, s, BOOST_PP_LIST_REVERSE_D(193, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_194(o, s, l) BOOST_PP_LIST_FOLD_LEFT_194(o, s, BOOST_PP_LIST_REVERSE_D(194, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_195(o, s, l) BOOST_PP_LIST_FOLD_LEFT_195(o, s, BOOST_PP_LIST_REVERSE_D(195, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_196(o, s, l) BOOST_PP_LIST_FOLD_LEFT_196(o, s, BOOST_PP_LIST_REVERSE_D(196, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_197(o, s, l) BOOST_PP_LIST_FOLD_LEFT_197(o, s, BOOST_PP_LIST_REVERSE_D(197, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_198(o, s, l) BOOST_PP_LIST_FOLD_LEFT_198(o, s, BOOST_PP_LIST_REVERSE_D(198, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_199(o, s, l) BOOST_PP_LIST_FOLD_LEFT_199(o, s, BOOST_PP_LIST_REVERSE_D(199, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_200(o, s, l) BOOST_PP_LIST_FOLD_LEFT_200(o, s, BOOST_PP_LIST_REVERSE_D(200, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_201(o, s, l) BOOST_PP_LIST_FOLD_LEFT_201(o, s, BOOST_PP_LIST_REVERSE_D(201, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_202(o, s, l) BOOST_PP_LIST_FOLD_LEFT_202(o, s, BOOST_PP_LIST_REVERSE_D(202, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_203(o, s, l) BOOST_PP_LIST_FOLD_LEFT_203(o, s, BOOST_PP_LIST_REVERSE_D(203, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_204(o, s, l) BOOST_PP_LIST_FOLD_LEFT_204(o, s, BOOST_PP_LIST_REVERSE_D(204, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_205(o, s, l) BOOST_PP_LIST_FOLD_LEFT_205(o, s, BOOST_PP_LIST_REVERSE_D(205, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_206(o, s, l) BOOST_PP_LIST_FOLD_LEFT_206(o, s, BOOST_PP_LIST_REVERSE_D(206, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_207(o, s, l) BOOST_PP_LIST_FOLD_LEFT_207(o, s, BOOST_PP_LIST_REVERSE_D(207, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_208(o, s, l) BOOST_PP_LIST_FOLD_LEFT_208(o, s, BOOST_PP_LIST_REVERSE_D(208, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_209(o, s, l) BOOST_PP_LIST_FOLD_LEFT_209(o, s, BOOST_PP_LIST_REVERSE_D(209, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_210(o, s, l) BOOST_PP_LIST_FOLD_LEFT_210(o, s, BOOST_PP_LIST_REVERSE_D(210, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_211(o, s, l) BOOST_PP_LIST_FOLD_LEFT_211(o, s, BOOST_PP_LIST_REVERSE_D(211, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_212(o, s, l) BOOST_PP_LIST_FOLD_LEFT_212(o, s, BOOST_PP_LIST_REVERSE_D(212, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_213(o, s, l) BOOST_PP_LIST_FOLD_LEFT_213(o, s, BOOST_PP_LIST_REVERSE_D(213, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_214(o, s, l) BOOST_PP_LIST_FOLD_LEFT_214(o, s, BOOST_PP_LIST_REVERSE_D(214, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_215(o, s, l) BOOST_PP_LIST_FOLD_LEFT_215(o, s, BOOST_PP_LIST_REVERSE_D(215, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_216(o, s, l) BOOST_PP_LIST_FOLD_LEFT_216(o, s, BOOST_PP_LIST_REVERSE_D(216, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_217(o, s, l) BOOST_PP_LIST_FOLD_LEFT_217(o, s, BOOST_PP_LIST_REVERSE_D(217, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_218(o, s, l) BOOST_PP_LIST_FOLD_LEFT_218(o, s, BOOST_PP_LIST_REVERSE_D(218, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_219(o, s, l) BOOST_PP_LIST_FOLD_LEFT_219(o, s, BOOST_PP_LIST_REVERSE_D(219, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_220(o, s, l) BOOST_PP_LIST_FOLD_LEFT_220(o, s, BOOST_PP_LIST_REVERSE_D(220, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_221(o, s, l) BOOST_PP_LIST_FOLD_LEFT_221(o, s, BOOST_PP_LIST_REVERSE_D(221, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_222(o, s, l) BOOST_PP_LIST_FOLD_LEFT_222(o, s, BOOST_PP_LIST_REVERSE_D(222, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_223(o, s, l) BOOST_PP_LIST_FOLD_LEFT_223(o, s, BOOST_PP_LIST_REVERSE_D(223, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_224(o, s, l) BOOST_PP_LIST_FOLD_LEFT_224(o, s, BOOST_PP_LIST_REVERSE_D(224, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_225(o, s, l) BOOST_PP_LIST_FOLD_LEFT_225(o, s, BOOST_PP_LIST_REVERSE_D(225, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_226(o, s, l) BOOST_PP_LIST_FOLD_LEFT_226(o, s, BOOST_PP_LIST_REVERSE_D(226, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_227(o, s, l) BOOST_PP_LIST_FOLD_LEFT_227(o, s, BOOST_PP_LIST_REVERSE_D(227, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_228(o, s, l) BOOST_PP_LIST_FOLD_LEFT_228(o, s, BOOST_PP_LIST_REVERSE_D(228, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_229(o, s, l) BOOST_PP_LIST_FOLD_LEFT_229(o, s, BOOST_PP_LIST_REVERSE_D(229, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_230(o, s, l) BOOST_PP_LIST_FOLD_LEFT_230(o, s, BOOST_PP_LIST_REVERSE_D(230, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_231(o, s, l) BOOST_PP_LIST_FOLD_LEFT_231(o, s, BOOST_PP_LIST_REVERSE_D(231, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_232(o, s, l) BOOST_PP_LIST_FOLD_LEFT_232(o, s, BOOST_PP_LIST_REVERSE_D(232, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_233(o, s, l) BOOST_PP_LIST_FOLD_LEFT_233(o, s, BOOST_PP_LIST_REVERSE_D(233, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_234(o, s, l) BOOST_PP_LIST_FOLD_LEFT_234(o, s, BOOST_PP_LIST_REVERSE_D(234, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_235(o, s, l) BOOST_PP_LIST_FOLD_LEFT_235(o, s, BOOST_PP_LIST_REVERSE_D(235, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_236(o, s, l) BOOST_PP_LIST_FOLD_LEFT_236(o, s, BOOST_PP_LIST_REVERSE_D(236, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_237(o, s, l) BOOST_PP_LIST_FOLD_LEFT_237(o, s, BOOST_PP_LIST_REVERSE_D(237, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_238(o, s, l) BOOST_PP_LIST_FOLD_LEFT_238(o, s, BOOST_PP_LIST_REVERSE_D(238, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_239(o, s, l) BOOST_PP_LIST_FOLD_LEFT_239(o, s, BOOST_PP_LIST_REVERSE_D(239, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_240(o, s, l) BOOST_PP_LIST_FOLD_LEFT_240(o, s, BOOST_PP_LIST_REVERSE_D(240, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_241(o, s, l) BOOST_PP_LIST_FOLD_LEFT_241(o, s, BOOST_PP_LIST_REVERSE_D(241, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_242(o, s, l) BOOST_PP_LIST_FOLD_LEFT_242(o, s, BOOST_PP_LIST_REVERSE_D(242, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_243(o, s, l) BOOST_PP_LIST_FOLD_LEFT_243(o, s, BOOST_PP_LIST_REVERSE_D(243, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_244(o, s, l) BOOST_PP_LIST_FOLD_LEFT_244(o, s, BOOST_PP_LIST_REVERSE_D(244, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_245(o, s, l) BOOST_PP_LIST_FOLD_LEFT_245(o, s, BOOST_PP_LIST_REVERSE_D(245, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_246(o, s, l) BOOST_PP_LIST_FOLD_LEFT_246(o, s, BOOST_PP_LIST_REVERSE_D(246, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_247(o, s, l) BOOST_PP_LIST_FOLD_LEFT_247(o, s, BOOST_PP_LIST_REVERSE_D(247, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_248(o, s, l) BOOST_PP_LIST_FOLD_LEFT_248(o, s, BOOST_PP_LIST_REVERSE_D(248, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_249(o, s, l) BOOST_PP_LIST_FOLD_LEFT_249(o, s, BOOST_PP_LIST_REVERSE_D(249, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_250(o, s, l) BOOST_PP_LIST_FOLD_LEFT_250(o, s, BOOST_PP_LIST_REVERSE_D(250, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_251(o, s, l) BOOST_PP_LIST_FOLD_LEFT_251(o, s, BOOST_PP_LIST_REVERSE_D(251, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_252(o, s, l) BOOST_PP_LIST_FOLD_LEFT_252(o, s, BOOST_PP_LIST_REVERSE_D(252, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_253(o, s, l) BOOST_PP_LIST_FOLD_LEFT_253(o, s, BOOST_PP_LIST_REVERSE_D(253, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_254(o, s, l) BOOST_PP_LIST_FOLD_LEFT_254(o, s, BOOST_PP_LIST_REVERSE_D(254, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_255(o, s, l) BOOST_PP_LIST_FOLD_LEFT_255(o, s, BOOST_PP_LIST_REVERSE_D(255, l))\n# define BOOST_PP_LIST_FOLD_RIGHT_256(o, s, l) BOOST_PP_LIST_FOLD_LEFT_256(o, s, BOOST_PP_LIST_REVERSE_D(256, l))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/enum.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_ENUM_HPP\n# define BOOST_PREPROCESSOR_LIST_ENUM_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/for_each_i.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n#\n# /* BOOST_PP_LIST_ENUM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_ENUM(list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)\n# else\n#    define BOOST_PP_LIST_ENUM(list) BOOST_PP_LIST_ENUM_I(list)\n#    define BOOST_PP_LIST_ENUM_I(list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)\n# endif\n#\n# define BOOST_PP_LIST_ENUM_O(r, _, i, elem) BOOST_PP_COMMA_IF(i) elem\n#\n# /* BOOST_PP_LIST_ENUM_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_ENUM_R(r, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)\n# else\n#    define BOOST_PP_LIST_ENUM_R(r, list) BOOST_PP_LIST_ENUM_R_I(r, list)\n#    define BOOST_PP_LIST_ENUM_R_I(r, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_ENUM_O, BOOST_PP_NIL, list)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/filter.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FILTER_HPP\n# define BOOST_PREPROCESSOR_LIST_FILTER_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/list/fold_right.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_FILTER */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FILTER(pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))\n# else\n#    define BOOST_PP_LIST_FILTER(pred, data, list) BOOST_PP_LIST_FILTER_I(pred, data, list)\n#    define BOOST_PP_LIST_FILTER_I(pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FILTER_O(d, pdr, elem) BOOST_PP_LIST_FILTER_O_D(d, BOOST_PP_TUPLE_ELEM(3, 0, pdr), BOOST_PP_TUPLE_ELEM(3, 1, pdr), BOOST_PP_TUPLE_ELEM(3, 2, pdr), elem)\n# else\n#    define BOOST_PP_LIST_FILTER_O(d, pdr, elem) BOOST_PP_LIST_FILTER_O_I(d, BOOST_PP_TUPLE_REM_3 pdr, elem)\n#    define BOOST_PP_LIST_FILTER_O_I(d, im, elem) BOOST_PP_LIST_FILTER_O_D(d, im, elem)\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_LIST_FILTER_O_D(d, pred, data, res, elem) (pred, data, BOOST_PP_IF(pred(d, data, elem), (elem, res), res))\n# else\n#    define BOOST_PP_LIST_FILTER_O_D(d, pred, data, res, elem) (pred, data, BOOST_PP_IF(pred##(d, data, elem), (elem, res), res))\n# endif\n#\n# /* BOOST_PP_LIST_FILTER_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FILTER_D(d, pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))\n# else\n#    define BOOST_PP_LIST_FILTER_D(d, pred, data, list) BOOST_PP_LIST_FILTER_D_I(d, pred, data, list)\n#    define BOOST_PP_LIST_FILTER_D_I(d, pred, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_FILTER_O, (pred, data, BOOST_PP_NIL), list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/first_n.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FIRST_N_HPP\n# define BOOST_PREPROCESSOR_LIST_FIRST_N_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/list/reverse.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_FIRST_N */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FIRST_N(count, list) BOOST_PP_LIST_REVERSE(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))\n# else\n#    define BOOST_PP_LIST_FIRST_N(count, list) BOOST_PP_LIST_FIRST_N_I(count, list)\n#    define BOOST_PP_LIST_FIRST_N_I(count, list) BOOST_PP_LIST_REVERSE(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FIRST_N_P(d, data) BOOST_PP_TUPLE_ELEM(3, 0, data)\n# else\n#    define BOOST_PP_LIST_FIRST_N_P(d, data) BOOST_PP_LIST_FIRST_N_P_I data\n#    define BOOST_PP_LIST_FIRST_N_P_I(c, l, nl) c\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FIRST_N_O(d, data) BOOST_PP_LIST_FIRST_N_O_D data\n# else\n#    define BOOST_PP_LIST_FIRST_N_O(d, data) BOOST_PP_LIST_FIRST_N_O_D(BOOST_PP_TUPLE_ELEM(3, 0, data), BOOST_PP_TUPLE_ELEM(3, 1, data), BOOST_PP_TUPLE_ELEM(3, 2, data))\n# endif\n#\n# define BOOST_PP_LIST_FIRST_N_O_D(c, l, nl) (BOOST_PP_DEC(c), BOOST_PP_LIST_REST(l), (BOOST_PP_LIST_FIRST(l), nl))\n#\n# /* BOOST_PP_LIST_FIRST_N_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FIRST_N_D(d, count, list) BOOST_PP_LIST_REVERSE_D(d, BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))\n# else\n#    define BOOST_PP_LIST_FIRST_N_D(d, count, list) BOOST_PP_LIST_FIRST_N_D_I(d, count, list)\n#    define BOOST_PP_LIST_FIRST_N_D_I(d, count, list) BOOST_PP_LIST_REVERSE_D(d, BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_FIRST_N_P, BOOST_PP_LIST_FIRST_N_O, (count, list, BOOST_PP_NIL))))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/fold_left.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_LIST_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# /* BOOST_PP_LIST_FOLD_LEFT */\n#\n# if 0\n#    define BOOST_PP_LIST_FOLD_LEFT(op, state, list)\n# endif\n#\n# define BOOST_PP_LIST_FOLD_LEFT BOOST_PP_CAT(BOOST_PP_LIST_FOLD_LEFT_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))\n#\n# define BOOST_PP_LIST_FOLD_LEFT_257(o, s, l) BOOST_PP_ERROR(0x0004)\n#\n# define BOOST_PP_LIST_FOLD_LEFT_D(d, o, s, l) BOOST_PP_LIST_FOLD_LEFT_ ## d(o, s, l)\n# define BOOST_PP_LIST_FOLD_LEFT_2ND BOOST_PP_LIST_FOLD_LEFT\n# define BOOST_PP_LIST_FOLD_LEFT_2ND_D BOOST_PP_LIST_FOLD_LEFT_D\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/list/detail/edg/fold_left.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    include <boost/preprocessor/list/detail/dmc/fold_left.hpp>\n# else\n#    include <boost/preprocessor/list/detail/fold_left.hpp>\n# endif\n#\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_1(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_2(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_3(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_4(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_5(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_6(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_7(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_8(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_9(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_10(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_11(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_12(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_13(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_14(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_15(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_16(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_17(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_18(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_19(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_20(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_21(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_22(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_23(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_24(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_25(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_26(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_27(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_28(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_29(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_30(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_31(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_32(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_33(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_34(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_35(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_36(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_37(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_38(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_39(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_40(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_41(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_42(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_43(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_44(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_45(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_46(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_47(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_48(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_49(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_50(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_51(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_52(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_53(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_54(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_55(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_56(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_57(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_58(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_59(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_60(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_61(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_62(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_63(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_64(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_65(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_66(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_67(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_68(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_69(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_70(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_71(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_72(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_73(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_74(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_75(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_76(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_77(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_78(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_79(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_80(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_81(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_82(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_83(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_84(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_85(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_86(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_87(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_88(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_89(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_90(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_91(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_92(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_93(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_94(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_95(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_96(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_97(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_98(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_99(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_100(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_101(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_102(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_103(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_104(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_105(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_106(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_107(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_108(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_109(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_110(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_111(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_112(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_113(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_114(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_115(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_116(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_117(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_118(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_119(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_120(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_121(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_122(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_123(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_124(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_125(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_126(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_127(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_128(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_129(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_130(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_131(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_132(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_133(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_134(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_135(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_136(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_137(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_138(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_139(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_140(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_141(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_142(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_143(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_144(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_145(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_146(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_147(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_148(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_149(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_150(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_151(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_152(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_153(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_154(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_155(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_156(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_157(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_158(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_159(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_160(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_161(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_162(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_163(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_164(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_165(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_166(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_167(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_168(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_169(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_170(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_171(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_172(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_173(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_174(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_175(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_176(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_177(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_178(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_179(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_180(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_181(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_182(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_183(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_184(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_185(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_186(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_187(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_188(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_189(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_190(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_191(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_192(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_193(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_194(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_195(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_196(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_197(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_198(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_199(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_200(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_201(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_202(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_203(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_204(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_205(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_206(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_207(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_208(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_209(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_210(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_211(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_212(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_213(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_214(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_215(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_216(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_217(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_218(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_219(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_220(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_221(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_222(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_223(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_224(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_225(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_226(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_227(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_228(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_229(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_230(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_231(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_232(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_233(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_234(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_235(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_236(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_237(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_238(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_239(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_240(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_241(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_242(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_243(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_244(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_245(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_246(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_247(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_248(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_249(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_250(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_251(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_252(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_253(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_254(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_255(o, s, l) 0\n# define BOOST_PP_LIST_FOLD_LEFT_CHECK_BOOST_PP_LIST_FOLD_LEFT_256(o, s, l) 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/fold_right.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_LIST_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# if 0\n#    define BOOST_PP_LIST_FOLD_RIGHT(op, state, list)\n# endif\n#\n# define BOOST_PP_LIST_FOLD_RIGHT BOOST_PP_CAT(BOOST_PP_LIST_FOLD_RIGHT_, BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256))\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_257(o, s, l) BOOST_PP_ERROR(0x0004)\n#\n# define BOOST_PP_LIST_FOLD_RIGHT_D(d, o, s, l) BOOST_PP_LIST_FOLD_RIGHT_ ## d(o, s, l)\n# define BOOST_PP_LIST_FOLD_RIGHT_2ND BOOST_PP_LIST_FOLD_RIGHT\n# define BOOST_PP_LIST_FOLD_RIGHT_2ND_D BOOST_PP_LIST_FOLD_RIGHT_D\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/list/detail/edg/fold_right.hpp>\n# else\n#    include <boost/preprocessor/list/detail/fold_right.hpp>\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/for_each.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FOR_EACH_HPP\n# define BOOST_PREPROCESSOR_LIST_FOR_EACH_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/for_each_i.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_FOR_EACH */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH(macro, data, list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)\n# else\n#    define BOOST_PP_LIST_FOR_EACH(macro, data, list) BOOST_PP_LIST_FOR_EACH_X(macro, data, list)\n#    define BOOST_PP_LIST_FOR_EACH_X(macro, data, list) BOOST_PP_LIST_FOR_EACH_I(BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_O(r, md, i, elem) BOOST_PP_LIST_FOR_EACH_O_D(r, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md), elem)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_O(r, md, i, elem) BOOST_PP_LIST_FOR_EACH_O_I(r, BOOST_PP_TUPLE_REM_2 md, elem)\n#    define BOOST_PP_LIST_FOR_EACH_O_I(r, im, elem) BOOST_PP_LIST_FOR_EACH_O_D(r, im, elem)\n# endif\n#\n# define BOOST_PP_LIST_FOR_EACH_O_D(r, m, d, elem) m(r, d, elem)\n#\n# /* BOOST_PP_LIST_FOR_EACH_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_R_X(r, macro, data, list)\n#    define BOOST_PP_LIST_FOR_EACH_R_X(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R(r, BOOST_PP_LIST_FOR_EACH_O, (macro, data), list)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/for_each_i.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_LIST_FOR_EACH_I_HPP\n# define BOOST_PREPROCESSOR_LIST_LIST_FOR_EACH_I_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_FOR_EACH_I */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() && ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_LIST_FOR_EACH_I(macro, data, list) BOOST_PP_FOR((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I(macro, data, list) BOOST_PP_LIST_FOR_EACH_I_I(macro, data, list)\n#    define BOOST_PP_LIST_FOR_EACH_I_I(macro, data, list) BOOST_PP_FOR((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_LIST_FOR_EACH_I_P(r, x) BOOST_PP_LIST_FOR_EACH_I_P_D x\n#    define BOOST_PP_LIST_FOR_EACH_I_P_D(m, d, l, i) BOOST_PP_LIST_IS_CONS(l)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_P(r, x) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(4, 2, x))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FOR_EACH_I_O(r, x) BOOST_PP_LIST_FOR_EACH_I_O_D x\n#    define BOOST_PP_LIST_FOR_EACH_I_O_D(m, d, l, i) (m, d, BOOST_PP_LIST_REST(l), BOOST_PP_INC(i))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_O(r, x) (BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(4, 2, x)), BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 3, x)))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_I_M(r, x) BOOST_PP_LIST_FOR_EACH_I_M_D(r, BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_M(r, x) BOOST_PP_LIST_FOR_EACH_I_M_I(r, BOOST_PP_TUPLE_REM_4 x)\n#    define BOOST_PP_LIST_FOR_EACH_I_M_I(r, x_e) BOOST_PP_LIST_FOR_EACH_I_M_D(r, x_e)\n# endif\n#\n# define BOOST_PP_LIST_FOR_EACH_I_M_D(r, m, d, l, i) m(r, d, i, BOOST_PP_LIST_FIRST(l))\n#\n# /* BOOST_PP_LIST_FOR_EACH_I_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_I_R(r, macro, data, list) BOOST_PP_FOR_ ## r((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_I_R(r, macro, data, list) BOOST_PP_LIST_FOR_EACH_I_R_I(r, macro, data, list)\n#    define BOOST_PP_LIST_FOR_EACH_I_R_I(r, macro, data, list) BOOST_PP_FOR_ ## r((macro, data, list, 0), BOOST_PP_LIST_FOR_EACH_I_P, BOOST_PP_LIST_FOR_EACH_I_O, BOOST_PP_LIST_FOR_EACH_I_M)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/for_each_product.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_FOR_EACH_PRODUCT_HPP\n# define BOOST_PREPROCESSOR_LIST_FOR_EACH_PRODUCT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/list/to_tuple.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/to_list.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/tuple/reverse.hpp>\n#\n# /* BOOST_PP_LIST_FOR_EACH_PRODUCT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple)\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_Q(macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))\n# endif\n#\n# /* BOOST_PP_LIST_FOR_EACH_PRODUCT_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_R(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple)\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_R_Q(r, macro, size, tuple) BOOST_PP_LIST_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, size, BOOST_PP_TUPLE_TO_LIST(size, tuple))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_E(impl, macro, size, lists) impl((BOOST_PP_LIST_FIRST(lists), BOOST_PP_LIST_REST(lists), BOOST_PP_NIL, macro, size), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_0)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_E(impl, macro, size, lists) BOOST_PP_LIST_FOR_EACH_PRODUCT_E_D(impl, macro, size, lists)\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_E_D(impl, macro, size, lists) impl((BOOST_PP_LIST_FIRST(lists), BOOST_PP_LIST_REST(lists), BOOST_PP_NIL, macro, size), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_0)\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_P_I data\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_P_I(a, b, res, macro, size) BOOST_PP_LIST_IS_CONS(a)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(5, 0, data))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_O(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_O_I data\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_O_I(a, b, res, macro, size) (BOOST_PP_LIST_REST(a), b, res, macro, size)\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_O(r, data) (BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(5, 0, data)), BOOST_PP_TUPLE_ELEM(5, 1, data), BOOST_PP_TUPLE_ELEM(5, 2, data), BOOST_PP_TUPLE_ELEM(5, 3, data), BOOST_PP_TUPLE_ELEM(5, 4, data))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_I(r, BOOST_PP_TUPLE_ELEM(5, 0, data), BOOST_PP_TUPLE_ELEM(5, 1, data), BOOST_PP_TUPLE_ELEM(5, 2, data), BOOST_PP_TUPLE_ELEM(5, 3, data), BOOST_PP_TUPLE_ELEM(5, 4, data))\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_D(r, BOOST_PP_TUPLE_REM_5 data)\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_D(r, data_e) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_I(r, data_e)\n# endif\n#\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_I(r, a, b, res, macro, size) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_II(r, macro, BOOST_PP_LIST_TO_TUPLE_R(r, (BOOST_PP_LIST_FIRST(a), res)), size)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_II(r, macro, args, size) BOOST_PP_LIST_FOR_EACH_PRODUCT_I_III(r, macro, args, size)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_I_III(r, macro, args, size) macro(r, BOOST_PP_TUPLE_REVERSE(size, args))\n#\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, i) BOOST_PP_IF(BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(5, 1, data)), BOOST_PP_LIST_FOR_EACH_PRODUCT_N_ ## i, BOOST_PP_LIST_FOR_EACH_PRODUCT_I)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data) BOOST_PP_LIST_FOR_EACH_PRODUCT_H_I data\n# else\n#    define BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data) BOOST_PP_LIST_FOR_EACH_PRODUCT_H_I(BOOST_PP_TUPLE_ELEM(5, 0, data), BOOST_PP_TUPLE_ELEM(5, 1, data), BOOST_PP_TUPLE_ELEM(5, 2, data), BOOST_PP_TUPLE_ELEM(5, 3, data), BOOST_PP_TUPLE_ELEM(5, 4, data))\n# endif\n#\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_H_I(a, b, res, macro, size) (BOOST_PP_LIST_FIRST(b), BOOST_PP_LIST_REST(b), (BOOST_PP_LIST_FIRST(a), res), macro, size)\n#\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_0(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 0)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_1(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 1)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_2(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 2)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_3(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 3)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_4(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 4)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_5(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 5)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_6(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 6)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_7(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 7)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_8(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 8)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_9(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 9)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_10(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 10)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_11(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 11)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_12(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 12)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_13(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 13)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_14(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 14)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_15(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 15)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_16(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 16)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_17(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 17)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_18(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 18)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_19(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 19)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_20(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 20)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_21(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 21)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_22(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 22)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_23(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 23)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_24(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 24)(r, data)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_M_25(r, data) BOOST_PP_LIST_FOR_EACH_PRODUCT_C(data, 25)(r, data)\n#\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_0(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_1)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_1(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_2)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_2(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_3)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_3(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_4)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_4(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_5)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_5(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_6)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_6(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_7)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_7(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_8)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_8(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_9)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_9(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_10)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_10(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_11)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_11(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_12)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_12(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_13)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_13(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_14)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_14(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_15)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_15(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_16)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_16(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_17)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_17(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_18)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_18(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_19)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_19(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_20)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_20(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_21)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_21(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_22)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_22(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_23)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_23(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_24)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_24(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_25)\n# define BOOST_PP_LIST_FOR_EACH_PRODUCT_N_25(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_LIST_FOR_EACH_PRODUCT_H(data), BOOST_PP_LIST_FOR_EACH_PRODUCT_P, BOOST_PP_LIST_FOR_EACH_PRODUCT_O, BOOST_PP_LIST_FOR_EACH_PRODUCT_M_26)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/rest_n.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_REST_N_HPP\n# define BOOST_PREPROCESSOR_LIST_REST_N_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_LIST_REST_N */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REST_N(count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))\n# else\n#    define BOOST_PP_LIST_REST_N(count, list) BOOST_PP_LIST_REST_N_I(count, list)\n#    define BOOST_PP_LIST_REST_N_I(count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REST_N_P(d, lc) BOOST_PP_TUPLE_ELEM(2, 1, lc)\n# else\n#    define BOOST_PP_LIST_REST_N_P(d, lc) BOOST_PP_LIST_REST_N_P_I lc\n#    define BOOST_PP_LIST_REST_N_P_I(list, count) count\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REST_N_O(d, lc) (BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(2, 0, lc)), BOOST_PP_DEC(BOOST_PP_TUPLE_ELEM(2, 1, lc)))\n# else\n#    define BOOST_PP_LIST_REST_N_O(d, lc) BOOST_PP_LIST_REST_N_O_I lc\n#    define BOOST_PP_LIST_REST_N_O_I(list, count) (BOOST_PP_LIST_REST(list), BOOST_PP_DEC(count))\n# endif\n#\n# /* BOOST_PP_LIST_REST_N_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REST_N_D(d, count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))\n# else\n#    define BOOST_PP_LIST_REST_N_D(d, count, list) BOOST_PP_LIST_REST_N_D_I(d, count, list)\n#    define BOOST_PP_LIST_REST_N_D_I(d, count, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_REST_N_P, BOOST_PP_LIST_REST_N_O, (list, count)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/reverse.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_REVERSE_HPP\n# define BOOST_PREPROCESSOR_LIST_REVERSE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/fold_left.hpp>\n#\n# /* BOOST_PP_LIST_REVERSE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REVERSE(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# else\n#    define BOOST_PP_LIST_REVERSE(list) BOOST_PP_LIST_REVERSE_I(list)\n#    define BOOST_PP_LIST_REVERSE_I(list) BOOST_PP_LIST_FOLD_LEFT(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# endif\n#\n# define BOOST_PP_LIST_REVERSE_O(d, s, x) (x, s)\n#\n# /* BOOST_PP_LIST_REVERSE_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_REVERSE_D(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# else\n#    define BOOST_PP_LIST_REVERSE_D(d, list) BOOST_PP_LIST_REVERSE_D_I(d, list)\n#    define BOOST_PP_LIST_REVERSE_D_I(d, list) BOOST_PP_LIST_FOLD_LEFT_ ## d(BOOST_PP_LIST_REVERSE_O, BOOST_PP_NIL, list)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/size.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_SIZE_HPP\n# define BOOST_PREPROCESSOR_LIST_SIZE_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_SIZE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_SIZE(list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))\n# else\n#    define BOOST_PP_LIST_SIZE(list) BOOST_PP_LIST_SIZE_I(list)\n#    define BOOST_PP_LIST_SIZE_I(list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_SIZE_P(d, rl) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(2, 1, rl))\n# else\n#    define BOOST_PP_LIST_SIZE_P(d, rl) BOOST_PP_LIST_SIZE_P_I(BOOST_PP_TUPLE_REM_2 rl)\n#    define BOOST_PP_LIST_SIZE_P_I(im) BOOST_PP_LIST_SIZE_P_II(im)\n#    define BOOST_PP_LIST_SIZE_P_II(r, l) BOOST_PP_LIST_IS_CONS(l)\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_SIZE_O(d, rl) (BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(2, 0, rl)), BOOST_PP_LIST_REST(BOOST_PP_TUPLE_ELEM(2, 1, rl)))\n# else\n#    define BOOST_PP_LIST_SIZE_O(d, rl) BOOST_PP_LIST_SIZE_O_I(BOOST_PP_TUPLE_REM_2 rl)\n#    define BOOST_PP_LIST_SIZE_O_I(im) BOOST_PP_LIST_SIZE_O_II(im)\n#    define BOOST_PP_LIST_SIZE_O_II(r, l) (BOOST_PP_INC(r), BOOST_PP_LIST_REST(l))\n# endif\n#\n# /* BOOST_PP_LIST_SIZE_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_SIZE_D(d, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))\n# else\n#    define BOOST_PP_LIST_SIZE_D(d, list) BOOST_PP_LIST_SIZE_D_I(d, list)\n#    define BOOST_PP_LIST_SIZE_D_I(d, list) BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_WHILE_ ## d(BOOST_PP_LIST_SIZE_P, BOOST_PP_LIST_SIZE_O, (0, list)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/to_array.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2011.\n#  *     (C) Copyright Edward Diener 2011,2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP\n# define BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && (_MSC_VER <= 1400)\n# include <boost/preprocessor/control/iif.hpp>\n# endif\n#\n# /* BOOST_PP_LIST_TO_ARRAY */\n#\n# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && (_MSC_VER <= 1400)\n# define BOOST_PP_LIST_TO_ARRAY(list) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_LIST_IS_NIL(list), \\\n\t\tBOOST_PP_LIST_TO_ARRAY_VC8ORLESS_EMPTY, \\\n\t\tBOOST_PP_LIST_TO_ARRAY_VC8ORLESS_DO \\\n\t\t) \\\n\t(list) \\\n/**/\n# define BOOST_PP_LIST_TO_ARRAY_VC8ORLESS_EMPTY(list) (0,())\n# define BOOST_PP_LIST_TO_ARRAY_VC8ORLESS_DO(list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE, list)\n# else\n# define BOOST_PP_LIST_TO_ARRAY(list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE, list)\n# endif\n\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_LIST_TO_ARRAY_I(w, list) \\\n        BOOST_PP_LIST_TO_ARRAY_II(((BOOST_PP_TUPLE_REM_CTOR( \\\n            3, \\\n\t        w(BOOST_PP_LIST_TO_ARRAY_P, BOOST_PP_LIST_TO_ARRAY_O, (list, 1, (~))) \\\n        )))) \\\n        /**/\n#    define BOOST_PP_LIST_TO_ARRAY_II(p) BOOST_PP_LIST_TO_ARRAY_II_B(p)\n#    define BOOST_PP_LIST_TO_ARRAY_II_B(p) BOOST_PP_LIST_TO_ARRAY_II_C ## p\n#    define BOOST_PP_LIST_TO_ARRAY_II_C(p) BOOST_PP_LIST_TO_ARRAY_III p\n# else\n#    define BOOST_PP_LIST_TO_ARRAY_I(w, list) \\\n        BOOST_PP_LIST_TO_ARRAY_II(BOOST_PP_TUPLE_REM_CTOR( \\\n            3, \\\n\t        w(BOOST_PP_LIST_TO_ARRAY_P, BOOST_PP_LIST_TO_ARRAY_O, (list, 1, (~))) \\\n        )) \\\n        /**/\n#    define BOOST_PP_LIST_TO_ARRAY_II(im) BOOST_PP_LIST_TO_ARRAY_III(im)\n# endif\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_LIST_TO_ARRAY_III(list, size, tuple) (BOOST_PP_DEC(size), BOOST_PP_LIST_TO_ARRAY_IV tuple)\n#    define BOOST_PP_LIST_TO_ARRAY_IV(_, ...) (__VA_ARGS__)\n# else\n#    define BOOST_PP_LIST_TO_ARRAY_III(list, size, tuple) (BOOST_PP_DEC(size), BOOST_PP_LIST_TO_ARRAY_IV_ ## size tuple)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_2(_, e0)                 (e0)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_3(_, e0, e1)             (e0, e1)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_4(_, e0, e1, e2)         (e0, e1, e2)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_5(_, e0, e1, e2, e3)     (e0, e1, e2, e3)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_6(_, e0, e1, e2, e3, e4) (e0, e1, e2, e3, e4)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_7(_, e0, e1, e2, e3, e4, e5) (e0, e1, e2, e3, e4, e5)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_8(_, e0, e1, e2, e3, e4, e5, e6) (e0, e1, e2, e3, e4, e5, e6)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_9(_, e0, e1, e2, e3, e4, e5, e6, e7) (e0, e1, e2, e3, e4, e5, e6, e7)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_10(_, e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, e1, e2, e3, e4, e5, e6, e7, e8)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_11(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_12(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_13(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_14(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_15(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_16(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_17(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_18(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_19(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_20(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_21(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_22(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_23(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_24(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_25(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_26(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_27(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_28(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_29(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_30(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_31(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_32(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_33(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_34(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_35(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_36(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_37(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_38(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_39(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_40(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_41(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_42(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_43(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_44(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_45(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_46(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_47(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_48(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_49(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_50(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_51(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_52(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_53(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_54(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_55(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_56(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_57(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_58(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_59(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_60(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_61(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_62(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_63(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61)\n#    define BOOST_PP_LIST_TO_ARRAY_IV_64(_, e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62)\n# endif\n# define BOOST_PP_LIST_TO_ARRAY_P(d, state) BOOST_PP_LIST_IS_CONS(BOOST_PP_TUPLE_ELEM(3, 0, state))\n# define BOOST_PP_LIST_TO_ARRAY_O(d, state) BOOST_PP_LIST_TO_ARRAY_O_I state\n# define BOOST_PP_LIST_TO_ARRAY_O_I(list, size, tuple) (BOOST_PP_LIST_REST(list), BOOST_PP_INC(size), (BOOST_PP_TUPLE_REM(size) tuple, BOOST_PP_LIST_FIRST(list)))\n#\n# /* BOOST_PP_LIST_TO_ARRAY_D */\n#\n# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC && (_MSC_VER <= 1400)\n# define BOOST_PP_LIST_TO_ARRAY_D(d, list) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_LIST_IS_NIL(list), \\\n\t\tBOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_EMPTY, \\\n\t\tBOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_DO \\\n\t\t) \\\n\t(d, list) \\\n/**/\n# define BOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_EMPTY(d, list) (0,())\n# define BOOST_PP_LIST_TO_ARRAY_D_VC8ORLESS_DO(d, list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE_ ## d, list)\n# else\n# define BOOST_PP_LIST_TO_ARRAY_D(d, list) BOOST_PP_LIST_TO_ARRAY_I(BOOST_PP_WHILE_ ## d, list)\n# endif\n#\n# endif /* BOOST_PREPROCESSOR_LIST_TO_ARRAY_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/to_seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* Revised by Paul Mensonides (2011) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_TO_SEQ_HPP\n# define BOOST_PREPROCESSOR_LIST_TO_SEQ_HPP\n#\n# include <boost/preprocessor/list/for_each.hpp>\n#\n# /* BOOST_PP_LIST_TO_SEQ */\n#\n# define BOOST_PP_LIST_TO_SEQ(list) \\\n    BOOST_PP_LIST_FOR_EACH(BOOST_PP_LIST_TO_SEQ_MACRO, ~, list) \\\n    /**/\n# define BOOST_PP_LIST_TO_SEQ_MACRO(r, data, elem) (elem)\n#\n# /* BOOST_PP_LIST_TO_SEQ_R */\n#\n# define BOOST_PP_LIST_TO_SEQ_R(r, list) \\\n    BOOST_PP_LIST_FOR_EACH_R(r, BOOST_PP_LIST_TO_SEQ_MACRO, ~, list) \\\n    /**/\n#\n# endif /* BOOST_PREPROCESSOR_LIST_TO_SEQ_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/to_tuple.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_TO_TUPLE_HPP\n# define BOOST_PREPROCESSOR_LIST_TO_TUPLE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/enum.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_LIST_TO_TUPLE */\n#\n# define BOOST_PP_LIST_TO_TUPLE(list) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_LIST_IS_NIL(list), \\\n\t\tBOOST_PP_LIST_TO_TUPLE_EMPTY, \\\n\t\tBOOST_PP_LIST_TO_TUPLE_DO \\\n\t\t) \\\n\t(list) \\\n/**/\n# define BOOST_PP_LIST_TO_TUPLE_EMPTY(list)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_TO_TUPLE_DO(list) (BOOST_PP_LIST_ENUM(list))\n# else\n#    define BOOST_PP_LIST_TO_TUPLE_DO(list) BOOST_PP_LIST_TO_TUPLE_I(list)\n#    define BOOST_PP_LIST_TO_TUPLE_I(list) (BOOST_PP_LIST_ENUM(list))\n# endif\n#\n# /* BOOST_PP_LIST_TO_TUPLE_R */\n#\n# define BOOST_PP_LIST_TO_TUPLE_R(r, list) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_LIST_IS_NIL(list), \\\n\t\tBOOST_PP_LIST_TO_TUPLE_R_EMPTY, \\\n\t\tBOOST_PP_LIST_TO_TUPLE_R_DO \\\n\t\t) \\\n\t(r, list) \\\n/**/\n# define BOOST_PP_LIST_TO_TUPLE_R_EMPTY(r,list)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_TO_TUPLE_R_DO(r, list) (BOOST_PP_LIST_ENUM_R(r, list))\n# else\n#    define BOOST_PP_LIST_TO_TUPLE_R_DO(r, list) BOOST_PP_LIST_TO_TUPLE_R_I(r, list)\n#    define BOOST_PP_LIST_TO_TUPLE_R_I(r, list) (BOOST_PP_LIST_ENUM_R(r, list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list/transform.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_TRANSFORM_HPP\n# define BOOST_PREPROCESSOR_LIST_TRANSFORM_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/list/fold_right.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_LIST_TRANSFORM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_TRANSFORM(op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))\n# else\n#    define BOOST_PP_LIST_TRANSFORM(op, data, list) BOOST_PP_LIST_TRANSFORM_I(op, data, list)\n#    define BOOST_PP_LIST_TRANSFORM_I(op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_TRANSFORM_O(d, odr, elem) BOOST_PP_LIST_TRANSFORM_O_D(d, BOOST_PP_TUPLE_ELEM(3, 0, odr), BOOST_PP_TUPLE_ELEM(3, 1, odr), BOOST_PP_TUPLE_ELEM(3, 2, odr), elem)\n# else\n#    define BOOST_PP_LIST_TRANSFORM_O(d, odr, elem) BOOST_PP_LIST_TRANSFORM_O_I(d, BOOST_PP_TUPLE_REM_3 odr, elem)\n#    define BOOST_PP_LIST_TRANSFORM_O_I(d, im, elem) BOOST_PP_LIST_TRANSFORM_O_D(d, im, elem)\n# endif\n#\n# define BOOST_PP_LIST_TRANSFORM_O_D(d, op, data, res, elem) (op, data, (op(d, data, elem), res))\n#\n# /* BOOST_PP_LIST_TRANSFORM_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LIST_TRANSFORM_D(d, op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))\n# else\n#    define BOOST_PP_LIST_TRANSFORM_D(d, op, data, list) BOOST_PP_LIST_TRANSFORM_D_I(d, op, data, list)\n#    define BOOST_PP_LIST_TRANSFORM_D_I(d, op, data, list) BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_LIST_FOLD_RIGHT_ ## d(BOOST_PP_LIST_TRANSFORM_O, (op, data, BOOST_PP_NIL), list))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/list.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LIST_HPP\n# define BOOST_PREPROCESSOR_LIST_HPP\n#\n# include <boost/preprocessor/list/adt.hpp>\n# include <boost/preprocessor/list/append.hpp>\n# include <boost/preprocessor/list/at.hpp>\n# include <boost/preprocessor/list/cat.hpp>\n# include <boost/preprocessor/list/enum.hpp>\n# include <boost/preprocessor/list/filter.hpp>\n# include <boost/preprocessor/list/first_n.hpp>\n# include <boost/preprocessor/list/fold_left.hpp>\n# include <boost/preprocessor/list/fold_right.hpp>\n# include <boost/preprocessor/list/for_each.hpp>\n# include <boost/preprocessor/list/for_each_i.hpp>\n# include <boost/preprocessor/list/for_each_product.hpp>\n# include <boost/preprocessor/list/rest_n.hpp>\n# include <boost/preprocessor/list/reverse.hpp>\n# include <boost/preprocessor/list/size.hpp>\n# include <boost/preprocessor/list/to_array.hpp>\n# include <boost/preprocessor/list/to_seq.hpp>\n# include <boost/preprocessor/list/to_tuple.hpp>\n# include <boost/preprocessor/list/transform.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/and.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_AND_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_AND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n#\n# /* BOOST_PP_AND */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_AND(p, q) BOOST_PP_BITAND(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# else\n#    define BOOST_PP_AND(p, q) BOOST_PP_AND_I(p, q)\n#    define BOOST_PP_AND_I(p, q) BOOST_PP_BITAND(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/bitand.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BITAND_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BITAND_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BITAND */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BITAND(x, y) BOOST_PP_BITAND_I(x, y)\n# else\n#    define BOOST_PP_BITAND(x, y) BOOST_PP_BITAND_OO((x, y))\n#    define BOOST_PP_BITAND_OO(par) BOOST_PP_BITAND_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_BITAND_I(x, y) BOOST_PP_BITAND_ ## x ## y\n# else\n#    define BOOST_PP_BITAND_I(x, y) BOOST_PP_BITAND_ID(BOOST_PP_BITAND_ ## x ## y)\n#    define BOOST_PP_BITAND_ID(res) res\n# endif\n#\n# define BOOST_PP_BITAND_00 0\n# define BOOST_PP_BITAND_01 0\n# define BOOST_PP_BITAND_10 0\n# define BOOST_PP_BITAND_11 1\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/bitnor.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BITNOR_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BITNOR_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BITNOR */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BITNOR(x, y) BOOST_PP_BITNOR_I(x, y)\n# else\n#    define BOOST_PP_BITNOR(x, y) BOOST_PP_BITNOR_OO((x, y))\n#    define BOOST_PP_BITNOR_OO(par) BOOST_PP_BITNOR_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_BITNOR_I(x, y) BOOST_PP_BITNOR_ ## x ## y\n# else\n#    define BOOST_PP_BITNOR_I(x, y) BOOST_PP_BITNOR_ID(BOOST_PP_BITNOR_ ## x ## y)\n#    define BOOST_PP_BITNOR_ID(id) id\n# endif\n#\n# define BOOST_PP_BITNOR_00 1\n# define BOOST_PP_BITNOR_01 0\n# define BOOST_PP_BITNOR_10 0\n# define BOOST_PP_BITNOR_11 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/bitor.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BITOR_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BITOR_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BITOR */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BITOR(x, y) BOOST_PP_BITOR_I(x, y)\n# else\n#    define BOOST_PP_BITOR(x, y) BOOST_PP_BITOR_OO((x, y))\n#    define BOOST_PP_BITOR_OO(par) BOOST_PP_BITOR_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_BITOR_I(x, y) BOOST_PP_BITOR_ ## x ## y\n# else\n#    define BOOST_PP_BITOR_I(x, y) BOOST_PP_BITOR_ID(BOOST_PP_BITOR_ ## x ## y)\n#    define BOOST_PP_BITOR_ID(id) id\n# endif\n#\n# define BOOST_PP_BITOR_00 0\n# define BOOST_PP_BITOR_01 1\n# define BOOST_PP_BITOR_10 1\n# define BOOST_PP_BITOR_11 1\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/bitxor.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BITXOR_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BITXOR_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BITXOR */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BITXOR(x, y) BOOST_PP_BITXOR_I(x, y)\n# else\n#    define BOOST_PP_BITXOR(x, y) BOOST_PP_BITXOR_OO((x, y))\n#    define BOOST_PP_BITXOR_OO(par) BOOST_PP_BITXOR_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_BITXOR_I(x, y) BOOST_PP_BITXOR_ ## x ## y\n# else\n#    define BOOST_PP_BITXOR_I(x, y) BOOST_PP_BITXOR_ID(BOOST_PP_BITXOR_ ## x ## y)\n#    define BOOST_PP_BITXOR_ID(id) id\n# endif\n#\n# define BOOST_PP_BITXOR_00 0\n# define BOOST_PP_BITXOR_01 1\n# define BOOST_PP_BITXOR_10 1\n# define BOOST_PP_BITXOR_11 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/bool.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_BOOL_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_BOOL_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_BOOL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_BOOL(x) BOOST_PP_BOOL_I(x)\n# else\n#    define BOOST_PP_BOOL(x) BOOST_PP_BOOL_OO((x))\n#    define BOOST_PP_BOOL_OO(par) BOOST_PP_BOOL_I ## par\n# endif\n#\n# define BOOST_PP_BOOL_I(x) BOOST_PP_BOOL_ ## x\n#\n# define BOOST_PP_BOOL_0 0\n# define BOOST_PP_BOOL_1 1\n# define BOOST_PP_BOOL_2 1\n# define BOOST_PP_BOOL_3 1\n# define BOOST_PP_BOOL_4 1\n# define BOOST_PP_BOOL_5 1\n# define BOOST_PP_BOOL_6 1\n# define BOOST_PP_BOOL_7 1\n# define BOOST_PP_BOOL_8 1\n# define BOOST_PP_BOOL_9 1\n# define BOOST_PP_BOOL_10 1\n# define BOOST_PP_BOOL_11 1\n# define BOOST_PP_BOOL_12 1\n# define BOOST_PP_BOOL_13 1\n# define BOOST_PP_BOOL_14 1\n# define BOOST_PP_BOOL_15 1\n# define BOOST_PP_BOOL_16 1\n# define BOOST_PP_BOOL_17 1\n# define BOOST_PP_BOOL_18 1\n# define BOOST_PP_BOOL_19 1\n# define BOOST_PP_BOOL_20 1\n# define BOOST_PP_BOOL_21 1\n# define BOOST_PP_BOOL_22 1\n# define BOOST_PP_BOOL_23 1\n# define BOOST_PP_BOOL_24 1\n# define BOOST_PP_BOOL_25 1\n# define BOOST_PP_BOOL_26 1\n# define BOOST_PP_BOOL_27 1\n# define BOOST_PP_BOOL_28 1\n# define BOOST_PP_BOOL_29 1\n# define BOOST_PP_BOOL_30 1\n# define BOOST_PP_BOOL_31 1\n# define BOOST_PP_BOOL_32 1\n# define BOOST_PP_BOOL_33 1\n# define BOOST_PP_BOOL_34 1\n# define BOOST_PP_BOOL_35 1\n# define BOOST_PP_BOOL_36 1\n# define BOOST_PP_BOOL_37 1\n# define BOOST_PP_BOOL_38 1\n# define BOOST_PP_BOOL_39 1\n# define BOOST_PP_BOOL_40 1\n# define BOOST_PP_BOOL_41 1\n# define BOOST_PP_BOOL_42 1\n# define BOOST_PP_BOOL_43 1\n# define BOOST_PP_BOOL_44 1\n# define BOOST_PP_BOOL_45 1\n# define BOOST_PP_BOOL_46 1\n# define BOOST_PP_BOOL_47 1\n# define BOOST_PP_BOOL_48 1\n# define BOOST_PP_BOOL_49 1\n# define BOOST_PP_BOOL_50 1\n# define BOOST_PP_BOOL_51 1\n# define BOOST_PP_BOOL_52 1\n# define BOOST_PP_BOOL_53 1\n# define BOOST_PP_BOOL_54 1\n# define BOOST_PP_BOOL_55 1\n# define BOOST_PP_BOOL_56 1\n# define BOOST_PP_BOOL_57 1\n# define BOOST_PP_BOOL_58 1\n# define BOOST_PP_BOOL_59 1\n# define BOOST_PP_BOOL_60 1\n# define BOOST_PP_BOOL_61 1\n# define BOOST_PP_BOOL_62 1\n# define BOOST_PP_BOOL_63 1\n# define BOOST_PP_BOOL_64 1\n# define BOOST_PP_BOOL_65 1\n# define BOOST_PP_BOOL_66 1\n# define BOOST_PP_BOOL_67 1\n# define BOOST_PP_BOOL_68 1\n# define BOOST_PP_BOOL_69 1\n# define BOOST_PP_BOOL_70 1\n# define BOOST_PP_BOOL_71 1\n# define BOOST_PP_BOOL_72 1\n# define BOOST_PP_BOOL_73 1\n# define BOOST_PP_BOOL_74 1\n# define BOOST_PP_BOOL_75 1\n# define BOOST_PP_BOOL_76 1\n# define BOOST_PP_BOOL_77 1\n# define BOOST_PP_BOOL_78 1\n# define BOOST_PP_BOOL_79 1\n# define BOOST_PP_BOOL_80 1\n# define BOOST_PP_BOOL_81 1\n# define BOOST_PP_BOOL_82 1\n# define BOOST_PP_BOOL_83 1\n# define BOOST_PP_BOOL_84 1\n# define BOOST_PP_BOOL_85 1\n# define BOOST_PP_BOOL_86 1\n# define BOOST_PP_BOOL_87 1\n# define BOOST_PP_BOOL_88 1\n# define BOOST_PP_BOOL_89 1\n# define BOOST_PP_BOOL_90 1\n# define BOOST_PP_BOOL_91 1\n# define BOOST_PP_BOOL_92 1\n# define BOOST_PP_BOOL_93 1\n# define BOOST_PP_BOOL_94 1\n# define BOOST_PP_BOOL_95 1\n# define BOOST_PP_BOOL_96 1\n# define BOOST_PP_BOOL_97 1\n# define BOOST_PP_BOOL_98 1\n# define BOOST_PP_BOOL_99 1\n# define BOOST_PP_BOOL_100 1\n# define BOOST_PP_BOOL_101 1\n# define BOOST_PP_BOOL_102 1\n# define BOOST_PP_BOOL_103 1\n# define BOOST_PP_BOOL_104 1\n# define BOOST_PP_BOOL_105 1\n# define BOOST_PP_BOOL_106 1\n# define BOOST_PP_BOOL_107 1\n# define BOOST_PP_BOOL_108 1\n# define BOOST_PP_BOOL_109 1\n# define BOOST_PP_BOOL_110 1\n# define BOOST_PP_BOOL_111 1\n# define BOOST_PP_BOOL_112 1\n# define BOOST_PP_BOOL_113 1\n# define BOOST_PP_BOOL_114 1\n# define BOOST_PP_BOOL_115 1\n# define BOOST_PP_BOOL_116 1\n# define BOOST_PP_BOOL_117 1\n# define BOOST_PP_BOOL_118 1\n# define BOOST_PP_BOOL_119 1\n# define BOOST_PP_BOOL_120 1\n# define BOOST_PP_BOOL_121 1\n# define BOOST_PP_BOOL_122 1\n# define BOOST_PP_BOOL_123 1\n# define BOOST_PP_BOOL_124 1\n# define BOOST_PP_BOOL_125 1\n# define BOOST_PP_BOOL_126 1\n# define BOOST_PP_BOOL_127 1\n# define BOOST_PP_BOOL_128 1\n# define BOOST_PP_BOOL_129 1\n# define BOOST_PP_BOOL_130 1\n# define BOOST_PP_BOOL_131 1\n# define BOOST_PP_BOOL_132 1\n# define BOOST_PP_BOOL_133 1\n# define BOOST_PP_BOOL_134 1\n# define BOOST_PP_BOOL_135 1\n# define BOOST_PP_BOOL_136 1\n# define BOOST_PP_BOOL_137 1\n# define BOOST_PP_BOOL_138 1\n# define BOOST_PP_BOOL_139 1\n# define BOOST_PP_BOOL_140 1\n# define BOOST_PP_BOOL_141 1\n# define BOOST_PP_BOOL_142 1\n# define BOOST_PP_BOOL_143 1\n# define BOOST_PP_BOOL_144 1\n# define BOOST_PP_BOOL_145 1\n# define BOOST_PP_BOOL_146 1\n# define BOOST_PP_BOOL_147 1\n# define BOOST_PP_BOOL_148 1\n# define BOOST_PP_BOOL_149 1\n# define BOOST_PP_BOOL_150 1\n# define BOOST_PP_BOOL_151 1\n# define BOOST_PP_BOOL_152 1\n# define BOOST_PP_BOOL_153 1\n# define BOOST_PP_BOOL_154 1\n# define BOOST_PP_BOOL_155 1\n# define BOOST_PP_BOOL_156 1\n# define BOOST_PP_BOOL_157 1\n# define BOOST_PP_BOOL_158 1\n# define BOOST_PP_BOOL_159 1\n# define BOOST_PP_BOOL_160 1\n# define BOOST_PP_BOOL_161 1\n# define BOOST_PP_BOOL_162 1\n# define BOOST_PP_BOOL_163 1\n# define BOOST_PP_BOOL_164 1\n# define BOOST_PP_BOOL_165 1\n# define BOOST_PP_BOOL_166 1\n# define BOOST_PP_BOOL_167 1\n# define BOOST_PP_BOOL_168 1\n# define BOOST_PP_BOOL_169 1\n# define BOOST_PP_BOOL_170 1\n# define BOOST_PP_BOOL_171 1\n# define BOOST_PP_BOOL_172 1\n# define BOOST_PP_BOOL_173 1\n# define BOOST_PP_BOOL_174 1\n# define BOOST_PP_BOOL_175 1\n# define BOOST_PP_BOOL_176 1\n# define BOOST_PP_BOOL_177 1\n# define BOOST_PP_BOOL_178 1\n# define BOOST_PP_BOOL_179 1\n# define BOOST_PP_BOOL_180 1\n# define BOOST_PP_BOOL_181 1\n# define BOOST_PP_BOOL_182 1\n# define BOOST_PP_BOOL_183 1\n# define BOOST_PP_BOOL_184 1\n# define BOOST_PP_BOOL_185 1\n# define BOOST_PP_BOOL_186 1\n# define BOOST_PP_BOOL_187 1\n# define BOOST_PP_BOOL_188 1\n# define BOOST_PP_BOOL_189 1\n# define BOOST_PP_BOOL_190 1\n# define BOOST_PP_BOOL_191 1\n# define BOOST_PP_BOOL_192 1\n# define BOOST_PP_BOOL_193 1\n# define BOOST_PP_BOOL_194 1\n# define BOOST_PP_BOOL_195 1\n# define BOOST_PP_BOOL_196 1\n# define BOOST_PP_BOOL_197 1\n# define BOOST_PP_BOOL_198 1\n# define BOOST_PP_BOOL_199 1\n# define BOOST_PP_BOOL_200 1\n# define BOOST_PP_BOOL_201 1\n# define BOOST_PP_BOOL_202 1\n# define BOOST_PP_BOOL_203 1\n# define BOOST_PP_BOOL_204 1\n# define BOOST_PP_BOOL_205 1\n# define BOOST_PP_BOOL_206 1\n# define BOOST_PP_BOOL_207 1\n# define BOOST_PP_BOOL_208 1\n# define BOOST_PP_BOOL_209 1\n# define BOOST_PP_BOOL_210 1\n# define BOOST_PP_BOOL_211 1\n# define BOOST_PP_BOOL_212 1\n# define BOOST_PP_BOOL_213 1\n# define BOOST_PP_BOOL_214 1\n# define BOOST_PP_BOOL_215 1\n# define BOOST_PP_BOOL_216 1\n# define BOOST_PP_BOOL_217 1\n# define BOOST_PP_BOOL_218 1\n# define BOOST_PP_BOOL_219 1\n# define BOOST_PP_BOOL_220 1\n# define BOOST_PP_BOOL_221 1\n# define BOOST_PP_BOOL_222 1\n# define BOOST_PP_BOOL_223 1\n# define BOOST_PP_BOOL_224 1\n# define BOOST_PP_BOOL_225 1\n# define BOOST_PP_BOOL_226 1\n# define BOOST_PP_BOOL_227 1\n# define BOOST_PP_BOOL_228 1\n# define BOOST_PP_BOOL_229 1\n# define BOOST_PP_BOOL_230 1\n# define BOOST_PP_BOOL_231 1\n# define BOOST_PP_BOOL_232 1\n# define BOOST_PP_BOOL_233 1\n# define BOOST_PP_BOOL_234 1\n# define BOOST_PP_BOOL_235 1\n# define BOOST_PP_BOOL_236 1\n# define BOOST_PP_BOOL_237 1\n# define BOOST_PP_BOOL_238 1\n# define BOOST_PP_BOOL_239 1\n# define BOOST_PP_BOOL_240 1\n# define BOOST_PP_BOOL_241 1\n# define BOOST_PP_BOOL_242 1\n# define BOOST_PP_BOOL_243 1\n# define BOOST_PP_BOOL_244 1\n# define BOOST_PP_BOOL_245 1\n# define BOOST_PP_BOOL_246 1\n# define BOOST_PP_BOOL_247 1\n# define BOOST_PP_BOOL_248 1\n# define BOOST_PP_BOOL_249 1\n# define BOOST_PP_BOOL_250 1\n# define BOOST_PP_BOOL_251 1\n# define BOOST_PP_BOOL_252 1\n# define BOOST_PP_BOOL_253 1\n# define BOOST_PP_BOOL_254 1\n# define BOOST_PP_BOOL_255 1\n# define BOOST_PP_BOOL_256 1\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/compl.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_COMPL_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_COMPL_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_COMPL */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_COMPL(x) BOOST_PP_COMPL_I(x)\n# else\n#    define BOOST_PP_COMPL(x) BOOST_PP_COMPL_OO((x))\n#    define BOOST_PP_COMPL_OO(par) BOOST_PP_COMPL_I ## par\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_COMPL_I(x) BOOST_PP_COMPL_ ## x\n# else\n#    define BOOST_PP_COMPL_I(x) BOOST_PP_COMPL_ID(BOOST_PP_COMPL_ ## x)\n#    define BOOST_PP_COMPL_ID(id) id\n# endif\n#\n# define BOOST_PP_COMPL_0 1\n# define BOOST_PP_COMPL_1 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/nor.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_NOR_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_NOR_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/bitnor.hpp>\n#\n# /* BOOST_PP_NOR */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_NOR(p, q) BOOST_PP_BITNOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# else\n#    define BOOST_PP_NOR(p, q) BOOST_PP_NOR_I(p, q)\n#    define BOOST_PP_NOR_I(p, q) BOOST_PP_BITNOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/not.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_NOT_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_NOT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n#\n# /* BOOST_PP_NOT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_NOT(x) BOOST_PP_COMPL(BOOST_PP_BOOL(x))\n# else\n#    define BOOST_PP_NOT(x) BOOST_PP_NOT_I(x)\n#    define BOOST_PP_NOT_I(x) BOOST_PP_COMPL(BOOST_PP_BOOL(x))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/or.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_OR_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_OR_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/bitor.hpp>\n#\n# /* BOOST_PP_OR */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_OR(p, q) BOOST_PP_BITOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# else\n#    define BOOST_PP_OR(p, q) BOOST_PP_OR_I(p, q)\n#    define BOOST_PP_OR_I(p, q) BOOST_PP_BITOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical/xor.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_XOR_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_XOR_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/bitxor.hpp>\n#\n# /* BOOST_PP_XOR */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_XOR(p, q) BOOST_PP_BITXOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# else\n#    define BOOST_PP_XOR(p, q) BOOST_PP_XOR_I(p, q)\n#    define BOOST_PP_XOR_I(p, q) BOOST_PP_BITXOR(BOOST_PP_BOOL(p), BOOST_PP_BOOL(q))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/logical.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_LOGICAL_HPP\n# define BOOST_PREPROCESSOR_LOGICAL_HPP\n#\n# include <boost/preprocessor/logical/and.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n# include <boost/preprocessor/logical/bitnor.hpp>\n# include <boost/preprocessor/logical/bitor.hpp>\n# include <boost/preprocessor/logical/bitxor.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n# include <boost/preprocessor/logical/nor.hpp>\n# include <boost/preprocessor/logical/not.hpp>\n# include <boost/preprocessor/logical/or.hpp>\n# include <boost/preprocessor/logical/xor.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/max.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_MAX_HPP\n# define BOOST_PREPROCESSOR_MAX_HPP\n#\n# include <boost/preprocessor/selection/max.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/min.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_MIN_HPP\n# define BOOST_PREPROCESSOR_MIN_HPP\n#\n# include <boost/preprocessor/selection/min.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/comma.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_COMMA_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_COMMA_HPP\n#\n# /* BOOST_PP_COMMA */\n#\n# define BOOST_PP_COMMA() ,\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/comma_if.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_COMMA_IF_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_COMMA_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/punctuation/comma.hpp>\n#\n# /* BOOST_PP_COMMA_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_COMMA_IF(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()\n# else\n#    define BOOST_PP_COMMA_IF(cond) BOOST_PP_COMMA_IF_I(cond)\n#    define BOOST_PP_COMMA_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_COMMA, BOOST_PP_EMPTY)()\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/detail/is_begin_parens.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n#ifndef BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP\n#define BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP\n\n#if BOOST_PP_VARIADICS_MSVC\n\n#include <boost/preprocessor/facilities/empty.hpp>\n\n#define BOOST_PP_DETAIL_VD_IBP_CAT(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b)\n#define BOOST_PP_DETAIL_VD_IBP_CAT_I(a, b) BOOST_PP_DETAIL_VD_IBP_CAT_II(a ## b)\n#define BOOST_PP_DETAIL_VD_IBP_CAT_II(res) res\n\n#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \\\n    BOOST_PP_DETAIL_VD_IBP_CAT(BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__),BOOST_PP_EMPTY()) \\\n/**/\n\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1 1\n\n#else\n\n#define BOOST_PP_DETAIL_IBP_SPLIT(i, ...) \\\n    BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(BOOST_PP_DETAIL_IBP_SPLIT_,i)(__VA_ARGS__) \\\n/**/\n\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_C(...) 1\n\n#endif /* BOOST_PP_VARIADICS_MSVC */\n\n#define BOOST_PP_DETAIL_IBP_SPLIT_0(a, ...) a\n#define BOOST_PP_DETAIL_IBP_SPLIT_1(a, ...) __VA_ARGS__\n\n#define BOOST_PP_DETAIL_IBP_CAT(a, ...) BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a,__VA_ARGS__)\n#define BOOST_PP_DETAIL_IBP_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__\n\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_1 1,\n#define BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_BOOST_PP_DETAIL_IBP_IS_VARIADIC_C 0,\n\n#endif /* BOOST_PREPROCESSOR_DETAIL_IS_BEGIN_PARENS_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/is_begin_parens.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP\n# define BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP\n\n# include <boost/preprocessor/config/config.hpp>\n\n#if BOOST_PP_VARIADICS\n\n#include <boost/preprocessor/punctuation/detail/is_begin_parens.hpp>\n\n#if BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400\n\n#define BOOST_PP_IS_BEGIN_PARENS(param) \\\n    BOOST_PP_DETAIL_IBP_SPLIT \\\n      ( \\\n      0, \\\n      BOOST_PP_DETAIL_IBP_CAT \\\n        ( \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_C param \\\n        ) \\\n      ) \\\n/**/\n\n#else\n\n#define BOOST_PP_IS_BEGIN_PARENS(...) \\\n    BOOST_PP_DETAIL_IBP_SPLIT \\\n      ( \\\n      0, \\\n      BOOST_PP_DETAIL_IBP_CAT \\\n        ( \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_R_, \\\n        BOOST_PP_DETAIL_IBP_IS_VARIADIC_C __VA_ARGS__ \\\n        ) \\\n      ) \\\n/**/\n\n#endif /* BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400 */\n#endif /* BOOST_PP_VARIADICS */\n#endif /* BOOST_PREPROCESSOR_IS_BEGIN_PARENS_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/paren.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_PAREN_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_PAREN_HPP\n#\n# /* BOOST_PP_LPAREN */\n#\n# define BOOST_PP_LPAREN() (\n#\n# /* BOOST_PP_RPAREN */\n#\n# define BOOST_PP_RPAREN() )\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/paren_if.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_PAREN_IF_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_PAREN_IF_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/punctuation/paren.hpp>\n#\n# /* BOOST_PP_LPAREN_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_LPAREN_IF(cond) BOOST_PP_IF(cond, BOOST_PP_LPAREN, BOOST_PP_EMPTY)()\n# else\n#    define BOOST_PP_LPAREN_IF(cond) BOOST_PP_LPAREN_IF_I(cond)\n#    define BOOST_PP_LPAREN_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_LPAREN, BOOST_PP_EMPTY)()\n# endif\n#\n# /* BOOST_PP_RPAREN_IF */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_RPAREN_IF(cond) BOOST_PP_IF(cond, BOOST_PP_RPAREN, BOOST_PP_EMPTY)()\n# else\n#    define BOOST_PP_RPAREN_IF(cond) BOOST_PP_RPAREN_IF_I(cond)\n#    define BOOST_PP_RPAREN_IF_I(cond) BOOST_PP_IF(cond, BOOST_PP_RPAREN, BOOST_PP_EMPTY)()\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation/remove_parens.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n#ifndef BOOST_PREPROCESSOR_REMOVE_PARENS_HPP\n#define BOOST_PREPROCESSOR_REMOVE_PARENS_HPP\n\n#include <boost/preprocessor/config/config.hpp>\n\n#if BOOST_PP_VARIADICS\n\n#include <boost/preprocessor/control/iif.hpp>\n#include <boost/preprocessor/facilities/identity.hpp>\n#include <boost/preprocessor/punctuation/is_begin_parens.hpp>\n#include <boost/preprocessor/tuple/enum.hpp>\n\n#define BOOST_PP_REMOVE_PARENS(param) \\\n    BOOST_PP_IIF \\\n      ( \\\n      BOOST_PP_IS_BEGIN_PARENS(param), \\\n      BOOST_PP_REMOVE_PARENS_DO, \\\n      BOOST_PP_IDENTITY \\\n      ) \\\n    (param)() \\\n/**/\n\n#define BOOST_PP_REMOVE_PARENS_DO(param) \\\n  BOOST_PP_IDENTITY(BOOST_PP_TUPLE_ENUM(param)) \\\n/**/\n\n#endif /* BOOST_PP_VARIADICS */\n#endif /* BOOST_PREPROCESSOR_REMOVE_PARENS_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/punctuation.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_PUNCTUATION_HPP\n# define BOOST_PREPROCESSOR_PUNCTUATION_HPP\n#\n# include <boost/preprocessor/punctuation/comma.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/punctuation/is_begin_parens.hpp>\n# include <boost/preprocessor/punctuation/paren.hpp>\n# include <boost/preprocessor/punctuation/paren_if.hpp>\n# include <boost/preprocessor/punctuation/remove_parens.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repeat.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_HPP\n# define BOOST_PREPROCESSOR_REPEAT_HPP\n#\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repeat_2nd.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_2ND_HPP\n# define BOOST_PREPROCESSOR_REPEAT_2ND_HPP\n#\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repeat_3rd.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_3RD_HPP\n# define BOOST_PREPROCESSOR_REPEAT_3RD_HPP\n#\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repeat_from_to.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_FROM_TO_HPP\n# define BOOST_PREPROCESSOR_REPEAT_FROM_TO_HPP\n#\n# include <boost/preprocessor/repetition/repeat_from_to.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repeat_from_to_2nd.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_FROM_TO_2ND_HPP\n# define BOOST_PREPROCESSOR_REPEAT_FROM_TO_2ND_HPP\n#\n# include <boost/preprocessor/repetition/repeat_from_to.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repeat_from_to_3rd.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPEAT_FROM_TO_3RD_HPP\n# define BOOST_PREPROCESSOR_REPEAT_FROM_TO_3RD_HPP\n#\n# include <boost/preprocessor/repetition/repeat_from_to.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/deduce_r.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DEDUCE_R_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DEDUCE_R_HPP\n#\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n#\n# /* BOOST_PP_DEDUCE_R */\n#\n# define BOOST_PP_DEDUCE_R() BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/deduce_z.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DEDUCE_Z_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DEDUCE_Z_HPP\n#\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_DEDUCE_Z */\n#\n# define BOOST_PP_DEDUCE_Z() BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/detail/dmc/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_C(BOOST_PP_BOOL(p##(2, s)), s, p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_C(BOOST_PP_BOOL(p##(3, s)), s, p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_C(BOOST_PP_BOOL(p##(4, s)), s, p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_C(BOOST_PP_BOOL(p##(5, s)), s, p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_C(BOOST_PP_BOOL(p##(6, s)), s, p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_C(BOOST_PP_BOOL(p##(7, s)), s, p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_C(BOOST_PP_BOOL(p##(8, s)), s, p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_C(BOOST_PP_BOOL(p##(9, s)), s, p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_C(BOOST_PP_BOOL(p##(10, s)), s, p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_C(BOOST_PP_BOOL(p##(11, s)), s, p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_C(BOOST_PP_BOOL(p##(12, s)), s, p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_C(BOOST_PP_BOOL(p##(13, s)), s, p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_C(BOOST_PP_BOOL(p##(14, s)), s, p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_C(BOOST_PP_BOOL(p##(15, s)), s, p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_C(BOOST_PP_BOOL(p##(16, s)), s, p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_C(BOOST_PP_BOOL(p##(17, s)), s, p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_C(BOOST_PP_BOOL(p##(18, s)), s, p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_C(BOOST_PP_BOOL(p##(19, s)), s, p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_C(BOOST_PP_BOOL(p##(20, s)), s, p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_C(BOOST_PP_BOOL(p##(21, s)), s, p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_C(BOOST_PP_BOOL(p##(22, s)), s, p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_C(BOOST_PP_BOOL(p##(23, s)), s, p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_C(BOOST_PP_BOOL(p##(24, s)), s, p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_C(BOOST_PP_BOOL(p##(25, s)), s, p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_C(BOOST_PP_BOOL(p##(26, s)), s, p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_C(BOOST_PP_BOOL(p##(27, s)), s, p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_C(BOOST_PP_BOOL(p##(28, s)), s, p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_C(BOOST_PP_BOOL(p##(29, s)), s, p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_C(BOOST_PP_BOOL(p##(30, s)), s, p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_C(BOOST_PP_BOOL(p##(31, s)), s, p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_C(BOOST_PP_BOOL(p##(32, s)), s, p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_C(BOOST_PP_BOOL(p##(33, s)), s, p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_C(BOOST_PP_BOOL(p##(34, s)), s, p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_C(BOOST_PP_BOOL(p##(35, s)), s, p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_C(BOOST_PP_BOOL(p##(36, s)), s, p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_C(BOOST_PP_BOOL(p##(37, s)), s, p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_C(BOOST_PP_BOOL(p##(38, s)), s, p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_C(BOOST_PP_BOOL(p##(39, s)), s, p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_C(BOOST_PP_BOOL(p##(40, s)), s, p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_C(BOOST_PP_BOOL(p##(41, s)), s, p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_C(BOOST_PP_BOOL(p##(42, s)), s, p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_C(BOOST_PP_BOOL(p##(43, s)), s, p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_C(BOOST_PP_BOOL(p##(44, s)), s, p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_C(BOOST_PP_BOOL(p##(45, s)), s, p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_C(BOOST_PP_BOOL(p##(46, s)), s, p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_C(BOOST_PP_BOOL(p##(47, s)), s, p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_C(BOOST_PP_BOOL(p##(48, s)), s, p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_C(BOOST_PP_BOOL(p##(49, s)), s, p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_C(BOOST_PP_BOOL(p##(50, s)), s, p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_C(BOOST_PP_BOOL(p##(51, s)), s, p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_C(BOOST_PP_BOOL(p##(52, s)), s, p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_C(BOOST_PP_BOOL(p##(53, s)), s, p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_C(BOOST_PP_BOOL(p##(54, s)), s, p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_C(BOOST_PP_BOOL(p##(55, s)), s, p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_C(BOOST_PP_BOOL(p##(56, s)), s, p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_C(BOOST_PP_BOOL(p##(57, s)), s, p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_C(BOOST_PP_BOOL(p##(58, s)), s, p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_C(BOOST_PP_BOOL(p##(59, s)), s, p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_C(BOOST_PP_BOOL(p##(60, s)), s, p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_C(BOOST_PP_BOOL(p##(61, s)), s, p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_C(BOOST_PP_BOOL(p##(62, s)), s, p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_C(BOOST_PP_BOOL(p##(63, s)), s, p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_C(BOOST_PP_BOOL(p##(64, s)), s, p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_C(BOOST_PP_BOOL(p##(65, s)), s, p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_C(BOOST_PP_BOOL(p##(66, s)), s, p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_C(BOOST_PP_BOOL(p##(67, s)), s, p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_C(BOOST_PP_BOOL(p##(68, s)), s, p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_C(BOOST_PP_BOOL(p##(69, s)), s, p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_C(BOOST_PP_BOOL(p##(70, s)), s, p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_C(BOOST_PP_BOOL(p##(71, s)), s, p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_C(BOOST_PP_BOOL(p##(72, s)), s, p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_C(BOOST_PP_BOOL(p##(73, s)), s, p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_C(BOOST_PP_BOOL(p##(74, s)), s, p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_C(BOOST_PP_BOOL(p##(75, s)), s, p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_C(BOOST_PP_BOOL(p##(76, s)), s, p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_C(BOOST_PP_BOOL(p##(77, s)), s, p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_C(BOOST_PP_BOOL(p##(78, s)), s, p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_C(BOOST_PP_BOOL(p##(79, s)), s, p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_C(BOOST_PP_BOOL(p##(80, s)), s, p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_C(BOOST_PP_BOOL(p##(81, s)), s, p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_C(BOOST_PP_BOOL(p##(82, s)), s, p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_C(BOOST_PP_BOOL(p##(83, s)), s, p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_C(BOOST_PP_BOOL(p##(84, s)), s, p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_C(BOOST_PP_BOOL(p##(85, s)), s, p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_C(BOOST_PP_BOOL(p##(86, s)), s, p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_C(BOOST_PP_BOOL(p##(87, s)), s, p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_C(BOOST_PP_BOOL(p##(88, s)), s, p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_C(BOOST_PP_BOOL(p##(89, s)), s, p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_C(BOOST_PP_BOOL(p##(90, s)), s, p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_C(BOOST_PP_BOOL(p##(91, s)), s, p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_C(BOOST_PP_BOOL(p##(92, s)), s, p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_C(BOOST_PP_BOOL(p##(93, s)), s, p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_C(BOOST_PP_BOOL(p##(94, s)), s, p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_C(BOOST_PP_BOOL(p##(95, s)), s, p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_C(BOOST_PP_BOOL(p##(96, s)), s, p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_C(BOOST_PP_BOOL(p##(97, s)), s, p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_C(BOOST_PP_BOOL(p##(98, s)), s, p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_C(BOOST_PP_BOOL(p##(99, s)), s, p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_C(BOOST_PP_BOOL(p##(100, s)), s, p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_C(BOOST_PP_BOOL(p##(101, s)), s, p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_C(BOOST_PP_BOOL(p##(102, s)), s, p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_C(BOOST_PP_BOOL(p##(103, s)), s, p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_C(BOOST_PP_BOOL(p##(104, s)), s, p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_C(BOOST_PP_BOOL(p##(105, s)), s, p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_C(BOOST_PP_BOOL(p##(106, s)), s, p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_C(BOOST_PP_BOOL(p##(107, s)), s, p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_C(BOOST_PP_BOOL(p##(108, s)), s, p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_C(BOOST_PP_BOOL(p##(109, s)), s, p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_C(BOOST_PP_BOOL(p##(110, s)), s, p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_C(BOOST_PP_BOOL(p##(111, s)), s, p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_C(BOOST_PP_BOOL(p##(112, s)), s, p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_C(BOOST_PP_BOOL(p##(113, s)), s, p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_C(BOOST_PP_BOOL(p##(114, s)), s, p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_C(BOOST_PP_BOOL(p##(115, s)), s, p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_C(BOOST_PP_BOOL(p##(116, s)), s, p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_C(BOOST_PP_BOOL(p##(117, s)), s, p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_C(BOOST_PP_BOOL(p##(118, s)), s, p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_C(BOOST_PP_BOOL(p##(119, s)), s, p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_C(BOOST_PP_BOOL(p##(120, s)), s, p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_C(BOOST_PP_BOOL(p##(121, s)), s, p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_C(BOOST_PP_BOOL(p##(122, s)), s, p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_C(BOOST_PP_BOOL(p##(123, s)), s, p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_C(BOOST_PP_BOOL(p##(124, s)), s, p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_C(BOOST_PP_BOOL(p##(125, s)), s, p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_C(BOOST_PP_BOOL(p##(126, s)), s, p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_C(BOOST_PP_BOOL(p##(127, s)), s, p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_C(BOOST_PP_BOOL(p##(128, s)), s, p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_C(BOOST_PP_BOOL(p##(129, s)), s, p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_C(BOOST_PP_BOOL(p##(130, s)), s, p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_C(BOOST_PP_BOOL(p##(131, s)), s, p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_C(BOOST_PP_BOOL(p##(132, s)), s, p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_C(BOOST_PP_BOOL(p##(133, s)), s, p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_C(BOOST_PP_BOOL(p##(134, s)), s, p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_C(BOOST_PP_BOOL(p##(135, s)), s, p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_C(BOOST_PP_BOOL(p##(136, s)), s, p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_C(BOOST_PP_BOOL(p##(137, s)), s, p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_C(BOOST_PP_BOOL(p##(138, s)), s, p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_C(BOOST_PP_BOOL(p##(139, s)), s, p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_C(BOOST_PP_BOOL(p##(140, s)), s, p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_C(BOOST_PP_BOOL(p##(141, s)), s, p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_C(BOOST_PP_BOOL(p##(142, s)), s, p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_C(BOOST_PP_BOOL(p##(143, s)), s, p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_C(BOOST_PP_BOOL(p##(144, s)), s, p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_C(BOOST_PP_BOOL(p##(145, s)), s, p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_C(BOOST_PP_BOOL(p##(146, s)), s, p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_C(BOOST_PP_BOOL(p##(147, s)), s, p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_C(BOOST_PP_BOOL(p##(148, s)), s, p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_C(BOOST_PP_BOOL(p##(149, s)), s, p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_C(BOOST_PP_BOOL(p##(150, s)), s, p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_C(BOOST_PP_BOOL(p##(151, s)), s, p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_C(BOOST_PP_BOOL(p##(152, s)), s, p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_C(BOOST_PP_BOOL(p##(153, s)), s, p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_C(BOOST_PP_BOOL(p##(154, s)), s, p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_C(BOOST_PP_BOOL(p##(155, s)), s, p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_C(BOOST_PP_BOOL(p##(156, s)), s, p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_C(BOOST_PP_BOOL(p##(157, s)), s, p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_C(BOOST_PP_BOOL(p##(158, s)), s, p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_C(BOOST_PP_BOOL(p##(159, s)), s, p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_C(BOOST_PP_BOOL(p##(160, s)), s, p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_C(BOOST_PP_BOOL(p##(161, s)), s, p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_C(BOOST_PP_BOOL(p##(162, s)), s, p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_C(BOOST_PP_BOOL(p##(163, s)), s, p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_C(BOOST_PP_BOOL(p##(164, s)), s, p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_C(BOOST_PP_BOOL(p##(165, s)), s, p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_C(BOOST_PP_BOOL(p##(166, s)), s, p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_C(BOOST_PP_BOOL(p##(167, s)), s, p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_C(BOOST_PP_BOOL(p##(168, s)), s, p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_C(BOOST_PP_BOOL(p##(169, s)), s, p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_C(BOOST_PP_BOOL(p##(170, s)), s, p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_C(BOOST_PP_BOOL(p##(171, s)), s, p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_C(BOOST_PP_BOOL(p##(172, s)), s, p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_C(BOOST_PP_BOOL(p##(173, s)), s, p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_C(BOOST_PP_BOOL(p##(174, s)), s, p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_C(BOOST_PP_BOOL(p##(175, s)), s, p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_C(BOOST_PP_BOOL(p##(176, s)), s, p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_C(BOOST_PP_BOOL(p##(177, s)), s, p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_C(BOOST_PP_BOOL(p##(178, s)), s, p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_C(BOOST_PP_BOOL(p##(179, s)), s, p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_C(BOOST_PP_BOOL(p##(180, s)), s, p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_C(BOOST_PP_BOOL(p##(181, s)), s, p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_C(BOOST_PP_BOOL(p##(182, s)), s, p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_C(BOOST_PP_BOOL(p##(183, s)), s, p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_C(BOOST_PP_BOOL(p##(184, s)), s, p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_C(BOOST_PP_BOOL(p##(185, s)), s, p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_C(BOOST_PP_BOOL(p##(186, s)), s, p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_C(BOOST_PP_BOOL(p##(187, s)), s, p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_C(BOOST_PP_BOOL(p##(188, s)), s, p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_C(BOOST_PP_BOOL(p##(189, s)), s, p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_C(BOOST_PP_BOOL(p##(190, s)), s, p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_C(BOOST_PP_BOOL(p##(191, s)), s, p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_C(BOOST_PP_BOOL(p##(192, s)), s, p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_C(BOOST_PP_BOOL(p##(193, s)), s, p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_C(BOOST_PP_BOOL(p##(194, s)), s, p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_C(BOOST_PP_BOOL(p##(195, s)), s, p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_C(BOOST_PP_BOOL(p##(196, s)), s, p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_C(BOOST_PP_BOOL(p##(197, s)), s, p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_C(BOOST_PP_BOOL(p##(198, s)), s, p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_C(BOOST_PP_BOOL(p##(199, s)), s, p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_C(BOOST_PP_BOOL(p##(200, s)), s, p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_C(BOOST_PP_BOOL(p##(201, s)), s, p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_C(BOOST_PP_BOOL(p##(202, s)), s, p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_C(BOOST_PP_BOOL(p##(203, s)), s, p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_C(BOOST_PP_BOOL(p##(204, s)), s, p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_C(BOOST_PP_BOOL(p##(205, s)), s, p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_C(BOOST_PP_BOOL(p##(206, s)), s, p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_C(BOOST_PP_BOOL(p##(207, s)), s, p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_C(BOOST_PP_BOOL(p##(208, s)), s, p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_C(BOOST_PP_BOOL(p##(209, s)), s, p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_C(BOOST_PP_BOOL(p##(210, s)), s, p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_C(BOOST_PP_BOOL(p##(211, s)), s, p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_C(BOOST_PP_BOOL(p##(212, s)), s, p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_C(BOOST_PP_BOOL(p##(213, s)), s, p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_C(BOOST_PP_BOOL(p##(214, s)), s, p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_C(BOOST_PP_BOOL(p##(215, s)), s, p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_C(BOOST_PP_BOOL(p##(216, s)), s, p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_C(BOOST_PP_BOOL(p##(217, s)), s, p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_C(BOOST_PP_BOOL(p##(218, s)), s, p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_C(BOOST_PP_BOOL(p##(219, s)), s, p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_C(BOOST_PP_BOOL(p##(220, s)), s, p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_C(BOOST_PP_BOOL(p##(221, s)), s, p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_C(BOOST_PP_BOOL(p##(222, s)), s, p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_C(BOOST_PP_BOOL(p##(223, s)), s, p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_C(BOOST_PP_BOOL(p##(224, s)), s, p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_C(BOOST_PP_BOOL(p##(225, s)), s, p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_C(BOOST_PP_BOOL(p##(226, s)), s, p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_C(BOOST_PP_BOOL(p##(227, s)), s, p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_C(BOOST_PP_BOOL(p##(228, s)), s, p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_C(BOOST_PP_BOOL(p##(229, s)), s, p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_C(BOOST_PP_BOOL(p##(230, s)), s, p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_C(BOOST_PP_BOOL(p##(231, s)), s, p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_C(BOOST_PP_BOOL(p##(232, s)), s, p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_C(BOOST_PP_BOOL(p##(233, s)), s, p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_C(BOOST_PP_BOOL(p##(234, s)), s, p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_C(BOOST_PP_BOOL(p##(235, s)), s, p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_C(BOOST_PP_BOOL(p##(236, s)), s, p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_C(BOOST_PP_BOOL(p##(237, s)), s, p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_C(BOOST_PP_BOOL(p##(238, s)), s, p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_C(BOOST_PP_BOOL(p##(239, s)), s, p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_C(BOOST_PP_BOOL(p##(240, s)), s, p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_C(BOOST_PP_BOOL(p##(241, s)), s, p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_C(BOOST_PP_BOOL(p##(242, s)), s, p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_C(BOOST_PP_BOOL(p##(243, s)), s, p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_C(BOOST_PP_BOOL(p##(244, s)), s, p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_C(BOOST_PP_BOOL(p##(245, s)), s, p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_C(BOOST_PP_BOOL(p##(246, s)), s, p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_C(BOOST_PP_BOOL(p##(247, s)), s, p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_C(BOOST_PP_BOOL(p##(248, s)), s, p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_C(BOOST_PP_BOOL(p##(249, s)), s, p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_C(BOOST_PP_BOOL(p##(250, s)), s, p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_C(BOOST_PP_BOOL(p##(251, s)), s, p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_C(BOOST_PP_BOOL(p##(252, s)), s, p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_C(BOOST_PP_BOOL(p##(253, s)), s, p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_C(BOOST_PP_BOOL(p##(254, s)), s, p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_C(BOOST_PP_BOOL(p##(255, s)), s, p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_C(BOOST_PP_BOOL(p##(256, s)), s, p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_C(BOOST_PP_BOOL(p##(257, s)), s, p, o, m)\n#\n# define BOOST_PP_FOR_1_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IIF(c, BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(2, s), p, o, m)\n# define BOOST_PP_FOR_2_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IIF(c, BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(3, s), p, o, m)\n# define BOOST_PP_FOR_3_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IIF(c, BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(4, s), p, o, m)\n# define BOOST_PP_FOR_4_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IIF(c, BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(5, s), p, o, m)\n# define BOOST_PP_FOR_5_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IIF(c, BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(6, s), p, o, m)\n# define BOOST_PP_FOR_6_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IIF(c, BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(7, s), p, o, m)\n# define BOOST_PP_FOR_7_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IIF(c, BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(8, s), p, o, m)\n# define BOOST_PP_FOR_8_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IIF(c, BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(9, s), p, o, m)\n# define BOOST_PP_FOR_9_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IIF(c, BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(10, s), p, o, m)\n# define BOOST_PP_FOR_10_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IIF(c, BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(11, s), p, o, m)\n# define BOOST_PP_FOR_11_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IIF(c, BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(12, s), p, o, m)\n# define BOOST_PP_FOR_12_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IIF(c, BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(13, s), p, o, m)\n# define BOOST_PP_FOR_13_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IIF(c, BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(14, s), p, o, m)\n# define BOOST_PP_FOR_14_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IIF(c, BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(15, s), p, o, m)\n# define BOOST_PP_FOR_15_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IIF(c, BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(16, s), p, o, m)\n# define BOOST_PP_FOR_16_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IIF(c, BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(17, s), p, o, m)\n# define BOOST_PP_FOR_17_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IIF(c, BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(18, s), p, o, m)\n# define BOOST_PP_FOR_18_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IIF(c, BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(19, s), p, o, m)\n# define BOOST_PP_FOR_19_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IIF(c, BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(20, s), p, o, m)\n# define BOOST_PP_FOR_20_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IIF(c, BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(21, s), p, o, m)\n# define BOOST_PP_FOR_21_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IIF(c, BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(22, s), p, o, m)\n# define BOOST_PP_FOR_22_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IIF(c, BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(23, s), p, o, m)\n# define BOOST_PP_FOR_23_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IIF(c, BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(24, s), p, o, m)\n# define BOOST_PP_FOR_24_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IIF(c, BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(25, s), p, o, m)\n# define BOOST_PP_FOR_25_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IIF(c, BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(26, s), p, o, m)\n# define BOOST_PP_FOR_26_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IIF(c, BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(27, s), p, o, m)\n# define BOOST_PP_FOR_27_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IIF(c, BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(28, s), p, o, m)\n# define BOOST_PP_FOR_28_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IIF(c, BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(29, s), p, o, m)\n# define BOOST_PP_FOR_29_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IIF(c, BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(30, s), p, o, m)\n# define BOOST_PP_FOR_30_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IIF(c, BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(31, s), p, o, m)\n# define BOOST_PP_FOR_31_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IIF(c, BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(32, s), p, o, m)\n# define BOOST_PP_FOR_32_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IIF(c, BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(33, s), p, o, m)\n# define BOOST_PP_FOR_33_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IIF(c, BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(34, s), p, o, m)\n# define BOOST_PP_FOR_34_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IIF(c, BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(35, s), p, o, m)\n# define BOOST_PP_FOR_35_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IIF(c, BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(36, s), p, o, m)\n# define BOOST_PP_FOR_36_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IIF(c, BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(37, s), p, o, m)\n# define BOOST_PP_FOR_37_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IIF(c, BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(38, s), p, o, m)\n# define BOOST_PP_FOR_38_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IIF(c, BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(39, s), p, o, m)\n# define BOOST_PP_FOR_39_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IIF(c, BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(40, s), p, o, m)\n# define BOOST_PP_FOR_40_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IIF(c, BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(41, s), p, o, m)\n# define BOOST_PP_FOR_41_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IIF(c, BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(42, s), p, o, m)\n# define BOOST_PP_FOR_42_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IIF(c, BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(43, s), p, o, m)\n# define BOOST_PP_FOR_43_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IIF(c, BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(44, s), p, o, m)\n# define BOOST_PP_FOR_44_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IIF(c, BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(45, s), p, o, m)\n# define BOOST_PP_FOR_45_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IIF(c, BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(46, s), p, o, m)\n# define BOOST_PP_FOR_46_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IIF(c, BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(47, s), p, o, m)\n# define BOOST_PP_FOR_47_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IIF(c, BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(48, s), p, o, m)\n# define BOOST_PP_FOR_48_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IIF(c, BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(49, s), p, o, m)\n# define BOOST_PP_FOR_49_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IIF(c, BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(50, s), p, o, m)\n# define BOOST_PP_FOR_50_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IIF(c, BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(51, s), p, o, m)\n# define BOOST_PP_FOR_51_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IIF(c, BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(52, s), p, o, m)\n# define BOOST_PP_FOR_52_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IIF(c, BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(53, s), p, o, m)\n# define BOOST_PP_FOR_53_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IIF(c, BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(54, s), p, o, m)\n# define BOOST_PP_FOR_54_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IIF(c, BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(55, s), p, o, m)\n# define BOOST_PP_FOR_55_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IIF(c, BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(56, s), p, o, m)\n# define BOOST_PP_FOR_56_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IIF(c, BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(57, s), p, o, m)\n# define BOOST_PP_FOR_57_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IIF(c, BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(58, s), p, o, m)\n# define BOOST_PP_FOR_58_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IIF(c, BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(59, s), p, o, m)\n# define BOOST_PP_FOR_59_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IIF(c, BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(60, s), p, o, m)\n# define BOOST_PP_FOR_60_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IIF(c, BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(61, s), p, o, m)\n# define BOOST_PP_FOR_61_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IIF(c, BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(62, s), p, o, m)\n# define BOOST_PP_FOR_62_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IIF(c, BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(63, s), p, o, m)\n# define BOOST_PP_FOR_63_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IIF(c, BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(64, s), p, o, m)\n# define BOOST_PP_FOR_64_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IIF(c, BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(65, s), p, o, m)\n# define BOOST_PP_FOR_65_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IIF(c, BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(66, s), p, o, m)\n# define BOOST_PP_FOR_66_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IIF(c, BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(67, s), p, o, m)\n# define BOOST_PP_FOR_67_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IIF(c, BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(68, s), p, o, m)\n# define BOOST_PP_FOR_68_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IIF(c, BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(69, s), p, o, m)\n# define BOOST_PP_FOR_69_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IIF(c, BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(70, s), p, o, m)\n# define BOOST_PP_FOR_70_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IIF(c, BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(71, s), p, o, m)\n# define BOOST_PP_FOR_71_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IIF(c, BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(72, s), p, o, m)\n# define BOOST_PP_FOR_72_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IIF(c, BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(73, s), p, o, m)\n# define BOOST_PP_FOR_73_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IIF(c, BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(74, s), p, o, m)\n# define BOOST_PP_FOR_74_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IIF(c, BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(75, s), p, o, m)\n# define BOOST_PP_FOR_75_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IIF(c, BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(76, s), p, o, m)\n# define BOOST_PP_FOR_76_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IIF(c, BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(77, s), p, o, m)\n# define BOOST_PP_FOR_77_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IIF(c, BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(78, s), p, o, m)\n# define BOOST_PP_FOR_78_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IIF(c, BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(79, s), p, o, m)\n# define BOOST_PP_FOR_79_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IIF(c, BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(80, s), p, o, m)\n# define BOOST_PP_FOR_80_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IIF(c, BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(81, s), p, o, m)\n# define BOOST_PP_FOR_81_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IIF(c, BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(82, s), p, o, m)\n# define BOOST_PP_FOR_82_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IIF(c, BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(83, s), p, o, m)\n# define BOOST_PP_FOR_83_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IIF(c, BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(84, s), p, o, m)\n# define BOOST_PP_FOR_84_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IIF(c, BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(85, s), p, o, m)\n# define BOOST_PP_FOR_85_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IIF(c, BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(86, s), p, o, m)\n# define BOOST_PP_FOR_86_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IIF(c, BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(87, s), p, o, m)\n# define BOOST_PP_FOR_87_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IIF(c, BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(88, s), p, o, m)\n# define BOOST_PP_FOR_88_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IIF(c, BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(89, s), p, o, m)\n# define BOOST_PP_FOR_89_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IIF(c, BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(90, s), p, o, m)\n# define BOOST_PP_FOR_90_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IIF(c, BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(91, s), p, o, m)\n# define BOOST_PP_FOR_91_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IIF(c, BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(92, s), p, o, m)\n# define BOOST_PP_FOR_92_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IIF(c, BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(93, s), p, o, m)\n# define BOOST_PP_FOR_93_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IIF(c, BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(94, s), p, o, m)\n# define BOOST_PP_FOR_94_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IIF(c, BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(95, s), p, o, m)\n# define BOOST_PP_FOR_95_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IIF(c, BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(96, s), p, o, m)\n# define BOOST_PP_FOR_96_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IIF(c, BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(97, s), p, o, m)\n# define BOOST_PP_FOR_97_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IIF(c, BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(98, s), p, o, m)\n# define BOOST_PP_FOR_98_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IIF(c, BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(99, s), p, o, m)\n# define BOOST_PP_FOR_99_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IIF(c, BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(100, s), p, o, m)\n# define BOOST_PP_FOR_100_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IIF(c, BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(101, s), p, o, m)\n# define BOOST_PP_FOR_101_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IIF(c, BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(102, s), p, o, m)\n# define BOOST_PP_FOR_102_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IIF(c, BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(103, s), p, o, m)\n# define BOOST_PP_FOR_103_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IIF(c, BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(104, s), p, o, m)\n# define BOOST_PP_FOR_104_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IIF(c, BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(105, s), p, o, m)\n# define BOOST_PP_FOR_105_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IIF(c, BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(106, s), p, o, m)\n# define BOOST_PP_FOR_106_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IIF(c, BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(107, s), p, o, m)\n# define BOOST_PP_FOR_107_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IIF(c, BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(108, s), p, o, m)\n# define BOOST_PP_FOR_108_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IIF(c, BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(109, s), p, o, m)\n# define BOOST_PP_FOR_109_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IIF(c, BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(110, s), p, o, m)\n# define BOOST_PP_FOR_110_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IIF(c, BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(111, s), p, o, m)\n# define BOOST_PP_FOR_111_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IIF(c, BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(112, s), p, o, m)\n# define BOOST_PP_FOR_112_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IIF(c, BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(113, s), p, o, m)\n# define BOOST_PP_FOR_113_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IIF(c, BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(114, s), p, o, m)\n# define BOOST_PP_FOR_114_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IIF(c, BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(115, s), p, o, m)\n# define BOOST_PP_FOR_115_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IIF(c, BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(116, s), p, o, m)\n# define BOOST_PP_FOR_116_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IIF(c, BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(117, s), p, o, m)\n# define BOOST_PP_FOR_117_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IIF(c, BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(118, s), p, o, m)\n# define BOOST_PP_FOR_118_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IIF(c, BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(119, s), p, o, m)\n# define BOOST_PP_FOR_119_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IIF(c, BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(120, s), p, o, m)\n# define BOOST_PP_FOR_120_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IIF(c, BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(121, s), p, o, m)\n# define BOOST_PP_FOR_121_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IIF(c, BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(122, s), p, o, m)\n# define BOOST_PP_FOR_122_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IIF(c, BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(123, s), p, o, m)\n# define BOOST_PP_FOR_123_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IIF(c, BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(124, s), p, o, m)\n# define BOOST_PP_FOR_124_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IIF(c, BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(125, s), p, o, m)\n# define BOOST_PP_FOR_125_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IIF(c, BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(126, s), p, o, m)\n# define BOOST_PP_FOR_126_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IIF(c, BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(127, s), p, o, m)\n# define BOOST_PP_FOR_127_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IIF(c, BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(128, s), p, o, m)\n# define BOOST_PP_FOR_128_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IIF(c, BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(129, s), p, o, m)\n# define BOOST_PP_FOR_129_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IIF(c, BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(130, s), p, o, m)\n# define BOOST_PP_FOR_130_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IIF(c, BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(131, s), p, o, m)\n# define BOOST_PP_FOR_131_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IIF(c, BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(132, s), p, o, m)\n# define BOOST_PP_FOR_132_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IIF(c, BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(133, s), p, o, m)\n# define BOOST_PP_FOR_133_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IIF(c, BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(134, s), p, o, m)\n# define BOOST_PP_FOR_134_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IIF(c, BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(135, s), p, o, m)\n# define BOOST_PP_FOR_135_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IIF(c, BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(136, s), p, o, m)\n# define BOOST_PP_FOR_136_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IIF(c, BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(137, s), p, o, m)\n# define BOOST_PP_FOR_137_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IIF(c, BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(138, s), p, o, m)\n# define BOOST_PP_FOR_138_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IIF(c, BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(139, s), p, o, m)\n# define BOOST_PP_FOR_139_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IIF(c, BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(140, s), p, o, m)\n# define BOOST_PP_FOR_140_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IIF(c, BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(141, s), p, o, m)\n# define BOOST_PP_FOR_141_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IIF(c, BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(142, s), p, o, m)\n# define BOOST_PP_FOR_142_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IIF(c, BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(143, s), p, o, m)\n# define BOOST_PP_FOR_143_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IIF(c, BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(144, s), p, o, m)\n# define BOOST_PP_FOR_144_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IIF(c, BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(145, s), p, o, m)\n# define BOOST_PP_FOR_145_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IIF(c, BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(146, s), p, o, m)\n# define BOOST_PP_FOR_146_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IIF(c, BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(147, s), p, o, m)\n# define BOOST_PP_FOR_147_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IIF(c, BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(148, s), p, o, m)\n# define BOOST_PP_FOR_148_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IIF(c, BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(149, s), p, o, m)\n# define BOOST_PP_FOR_149_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IIF(c, BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(150, s), p, o, m)\n# define BOOST_PP_FOR_150_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IIF(c, BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(151, s), p, o, m)\n# define BOOST_PP_FOR_151_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IIF(c, BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(152, s), p, o, m)\n# define BOOST_PP_FOR_152_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IIF(c, BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(153, s), p, o, m)\n# define BOOST_PP_FOR_153_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IIF(c, BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(154, s), p, o, m)\n# define BOOST_PP_FOR_154_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IIF(c, BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(155, s), p, o, m)\n# define BOOST_PP_FOR_155_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IIF(c, BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(156, s), p, o, m)\n# define BOOST_PP_FOR_156_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IIF(c, BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(157, s), p, o, m)\n# define BOOST_PP_FOR_157_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IIF(c, BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(158, s), p, o, m)\n# define BOOST_PP_FOR_158_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IIF(c, BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(159, s), p, o, m)\n# define BOOST_PP_FOR_159_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IIF(c, BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(160, s), p, o, m)\n# define BOOST_PP_FOR_160_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IIF(c, BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(161, s), p, o, m)\n# define BOOST_PP_FOR_161_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IIF(c, BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(162, s), p, o, m)\n# define BOOST_PP_FOR_162_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IIF(c, BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(163, s), p, o, m)\n# define BOOST_PP_FOR_163_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IIF(c, BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(164, s), p, o, m)\n# define BOOST_PP_FOR_164_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IIF(c, BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(165, s), p, o, m)\n# define BOOST_PP_FOR_165_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IIF(c, BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(166, s), p, o, m)\n# define BOOST_PP_FOR_166_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IIF(c, BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(167, s), p, o, m)\n# define BOOST_PP_FOR_167_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IIF(c, BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(168, s), p, o, m)\n# define BOOST_PP_FOR_168_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IIF(c, BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(169, s), p, o, m)\n# define BOOST_PP_FOR_169_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IIF(c, BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(170, s), p, o, m)\n# define BOOST_PP_FOR_170_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IIF(c, BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(171, s), p, o, m)\n# define BOOST_PP_FOR_171_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IIF(c, BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(172, s), p, o, m)\n# define BOOST_PP_FOR_172_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IIF(c, BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(173, s), p, o, m)\n# define BOOST_PP_FOR_173_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IIF(c, BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(174, s), p, o, m)\n# define BOOST_PP_FOR_174_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IIF(c, BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(175, s), p, o, m)\n# define BOOST_PP_FOR_175_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IIF(c, BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(176, s), p, o, m)\n# define BOOST_PP_FOR_176_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IIF(c, BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(177, s), p, o, m)\n# define BOOST_PP_FOR_177_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IIF(c, BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(178, s), p, o, m)\n# define BOOST_PP_FOR_178_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IIF(c, BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(179, s), p, o, m)\n# define BOOST_PP_FOR_179_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IIF(c, BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(180, s), p, o, m)\n# define BOOST_PP_FOR_180_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IIF(c, BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(181, s), p, o, m)\n# define BOOST_PP_FOR_181_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IIF(c, BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(182, s), p, o, m)\n# define BOOST_PP_FOR_182_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IIF(c, BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(183, s), p, o, m)\n# define BOOST_PP_FOR_183_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IIF(c, BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(184, s), p, o, m)\n# define BOOST_PP_FOR_184_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IIF(c, BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(185, s), p, o, m)\n# define BOOST_PP_FOR_185_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IIF(c, BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(186, s), p, o, m)\n# define BOOST_PP_FOR_186_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IIF(c, BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(187, s), p, o, m)\n# define BOOST_PP_FOR_187_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IIF(c, BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(188, s), p, o, m)\n# define BOOST_PP_FOR_188_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IIF(c, BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(189, s), p, o, m)\n# define BOOST_PP_FOR_189_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IIF(c, BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(190, s), p, o, m)\n# define BOOST_PP_FOR_190_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IIF(c, BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(191, s), p, o, m)\n# define BOOST_PP_FOR_191_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IIF(c, BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(192, s), p, o, m)\n# define BOOST_PP_FOR_192_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IIF(c, BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(193, s), p, o, m)\n# define BOOST_PP_FOR_193_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IIF(c, BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(194, s), p, o, m)\n# define BOOST_PP_FOR_194_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IIF(c, BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(195, s), p, o, m)\n# define BOOST_PP_FOR_195_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IIF(c, BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(196, s), p, o, m)\n# define BOOST_PP_FOR_196_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IIF(c, BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(197, s), p, o, m)\n# define BOOST_PP_FOR_197_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IIF(c, BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(198, s), p, o, m)\n# define BOOST_PP_FOR_198_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IIF(c, BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(199, s), p, o, m)\n# define BOOST_PP_FOR_199_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IIF(c, BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(200, s), p, o, m)\n# define BOOST_PP_FOR_200_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IIF(c, BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(201, s), p, o, m)\n# define BOOST_PP_FOR_201_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IIF(c, BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(202, s), p, o, m)\n# define BOOST_PP_FOR_202_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IIF(c, BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(203, s), p, o, m)\n# define BOOST_PP_FOR_203_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IIF(c, BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(204, s), p, o, m)\n# define BOOST_PP_FOR_204_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IIF(c, BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(205, s), p, o, m)\n# define BOOST_PP_FOR_205_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IIF(c, BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(206, s), p, o, m)\n# define BOOST_PP_FOR_206_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IIF(c, BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(207, s), p, o, m)\n# define BOOST_PP_FOR_207_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IIF(c, BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(208, s), p, o, m)\n# define BOOST_PP_FOR_208_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IIF(c, BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(209, s), p, o, m)\n# define BOOST_PP_FOR_209_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IIF(c, BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(210, s), p, o, m)\n# define BOOST_PP_FOR_210_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IIF(c, BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(211, s), p, o, m)\n# define BOOST_PP_FOR_211_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IIF(c, BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(212, s), p, o, m)\n# define BOOST_PP_FOR_212_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IIF(c, BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(213, s), p, o, m)\n# define BOOST_PP_FOR_213_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IIF(c, BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(214, s), p, o, m)\n# define BOOST_PP_FOR_214_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IIF(c, BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(215, s), p, o, m)\n# define BOOST_PP_FOR_215_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IIF(c, BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(216, s), p, o, m)\n# define BOOST_PP_FOR_216_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IIF(c, BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(217, s), p, o, m)\n# define BOOST_PP_FOR_217_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IIF(c, BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(218, s), p, o, m)\n# define BOOST_PP_FOR_218_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IIF(c, BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(219, s), p, o, m)\n# define BOOST_PP_FOR_219_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IIF(c, BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(220, s), p, o, m)\n# define BOOST_PP_FOR_220_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IIF(c, BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(221, s), p, o, m)\n# define BOOST_PP_FOR_221_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IIF(c, BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(222, s), p, o, m)\n# define BOOST_PP_FOR_222_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IIF(c, BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(223, s), p, o, m)\n# define BOOST_PP_FOR_223_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IIF(c, BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(224, s), p, o, m)\n# define BOOST_PP_FOR_224_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IIF(c, BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(225, s), p, o, m)\n# define BOOST_PP_FOR_225_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IIF(c, BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(226, s), p, o, m)\n# define BOOST_PP_FOR_226_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IIF(c, BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(227, s), p, o, m)\n# define BOOST_PP_FOR_227_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IIF(c, BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(228, s), p, o, m)\n# define BOOST_PP_FOR_228_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IIF(c, BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(229, s), p, o, m)\n# define BOOST_PP_FOR_229_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IIF(c, BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(230, s), p, o, m)\n# define BOOST_PP_FOR_230_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IIF(c, BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(231, s), p, o, m)\n# define BOOST_PP_FOR_231_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IIF(c, BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(232, s), p, o, m)\n# define BOOST_PP_FOR_232_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IIF(c, BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(233, s), p, o, m)\n# define BOOST_PP_FOR_233_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IIF(c, BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(234, s), p, o, m)\n# define BOOST_PP_FOR_234_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IIF(c, BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(235, s), p, o, m)\n# define BOOST_PP_FOR_235_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IIF(c, BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(236, s), p, o, m)\n# define BOOST_PP_FOR_236_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IIF(c, BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(237, s), p, o, m)\n# define BOOST_PP_FOR_237_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IIF(c, BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(238, s), p, o, m)\n# define BOOST_PP_FOR_238_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IIF(c, BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(239, s), p, o, m)\n# define BOOST_PP_FOR_239_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IIF(c, BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(240, s), p, o, m)\n# define BOOST_PP_FOR_240_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IIF(c, BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(241, s), p, o, m)\n# define BOOST_PP_FOR_241_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IIF(c, BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(242, s), p, o, m)\n# define BOOST_PP_FOR_242_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IIF(c, BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(243, s), p, o, m)\n# define BOOST_PP_FOR_243_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IIF(c, BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(244, s), p, o, m)\n# define BOOST_PP_FOR_244_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IIF(c, BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(245, s), p, o, m)\n# define BOOST_PP_FOR_245_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IIF(c, BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(246, s), p, o, m)\n# define BOOST_PP_FOR_246_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IIF(c, BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(247, s), p, o, m)\n# define BOOST_PP_FOR_247_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IIF(c, BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(248, s), p, o, m)\n# define BOOST_PP_FOR_248_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IIF(c, BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(249, s), p, o, m)\n# define BOOST_PP_FOR_249_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IIF(c, BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(250, s), p, o, m)\n# define BOOST_PP_FOR_250_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IIF(c, BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(251, s), p, o, m)\n# define BOOST_PP_FOR_251_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IIF(c, BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(252, s), p, o, m)\n# define BOOST_PP_FOR_252_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IIF(c, BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(253, s), p, o, m)\n# define BOOST_PP_FOR_253_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IIF(c, BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(254, s), p, o, m)\n# define BOOST_PP_FOR_254_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IIF(c, BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(255, s), p, o, m)\n# define BOOST_PP_FOR_255_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IIF(c, BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(256, s), p, o, m)\n# define BOOST_PP_FOR_256_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IIF(c, BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/detail/edg/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_EDG_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_EDG_FOR_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_I(s, p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_I(s, p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_I(s, p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_I(s, p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_I(s, p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_I(s, p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_I(s, p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_I(s, p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_I(s, p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_I(s, p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_I(s, p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_I(s, p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_I(s, p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_I(s, p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_I(s, p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_I(s, p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_I(s, p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_I(s, p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_I(s, p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_I(s, p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_I(s, p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_I(s, p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_I(s, p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_I(s, p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_I(s, p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_I(s, p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_I(s, p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_I(s, p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_I(s, p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_I(s, p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_I(s, p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_I(s, p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_I(s, p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_I(s, p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_I(s, p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_I(s, p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_I(s, p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_I(s, p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_I(s, p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_I(s, p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_I(s, p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_I(s, p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_I(s, p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_I(s, p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_I(s, p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_I(s, p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_I(s, p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_I(s, p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_I(s, p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_I(s, p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_I(s, p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_I(s, p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_I(s, p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_I(s, p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_I(s, p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_I(s, p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_I(s, p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_I(s, p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_I(s, p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_I(s, p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_I(s, p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_I(s, p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_I(s, p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_I(s, p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_I(s, p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_I(s, p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_I(s, p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_I(s, p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_I(s, p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_I(s, p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_I(s, p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_I(s, p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_I(s, p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_I(s, p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_I(s, p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_I(s, p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_I(s, p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_I(s, p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_I(s, p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_I(s, p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_I(s, p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_I(s, p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_I(s, p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_I(s, p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_I(s, p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_I(s, p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_I(s, p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_I(s, p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_I(s, p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_I(s, p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_I(s, p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_I(s, p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_I(s, p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_I(s, p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_I(s, p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_I(s, p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_I(s, p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_I(s, p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_I(s, p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_I(s, p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_I(s, p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_I(s, p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_I(s, p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_I(s, p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_I(s, p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_I(s, p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_I(s, p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_I(s, p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_I(s, p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_I(s, p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_I(s, p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_I(s, p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_I(s, p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_I(s, p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_I(s, p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_I(s, p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_I(s, p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_I(s, p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_I(s, p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_I(s, p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_I(s, p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_I(s, p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_I(s, p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_I(s, p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_I(s, p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_I(s, p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_I(s, p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_I(s, p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_I(s, p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_I(s, p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_I(s, p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_I(s, p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_I(s, p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_I(s, p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_I(s, p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_I(s, p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_I(s, p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_I(s, p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_I(s, p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_I(s, p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_I(s, p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_I(s, p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_I(s, p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_I(s, p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_I(s, p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_I(s, p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_I(s, p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_I(s, p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_I(s, p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_I(s, p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_I(s, p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_I(s, p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_I(s, p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_I(s, p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_I(s, p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_I(s, p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_I(s, p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_I(s, p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_I(s, p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_I(s, p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_I(s, p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_I(s, p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_I(s, p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_I(s, p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_I(s, p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_I(s, p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_I(s, p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_I(s, p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_I(s, p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_I(s, p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_I(s, p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_I(s, p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_I(s, p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_I(s, p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_I(s, p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_I(s, p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_I(s, p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_I(s, p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_I(s, p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_I(s, p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_I(s, p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_I(s, p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_I(s, p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_I(s, p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_I(s, p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_I(s, p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_I(s, p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_I(s, p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_I(s, p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_I(s, p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_I(s, p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_I(s, p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_I(s, p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_I(s, p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_I(s, p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_I(s, p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_I(s, p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_I(s, p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_I(s, p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_I(s, p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_I(s, p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_I(s, p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_I(s, p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_I(s, p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_I(s, p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_I(s, p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_I(s, p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_I(s, p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_I(s, p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_I(s, p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_I(s, p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_I(s, p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_I(s, p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_I(s, p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_I(s, p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_I(s, p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_I(s, p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_I(s, p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_I(s, p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_I(s, p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_I(s, p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_I(s, p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_I(s, p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_I(s, p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_I(s, p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_I(s, p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_I(s, p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_I(s, p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_I(s, p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_I(s, p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_I(s, p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_I(s, p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_I(s, p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_I(s, p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_I(s, p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_I(s, p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_I(s, p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_I(s, p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_I(s, p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_I(s, p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_I(s, p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_I(s, p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_I(s, p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_I(s, p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_I(s, p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_I(s, p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_I(s, p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_I(s, p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_I(s, p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_I(s, p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_I(s, p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_I(s, p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_I(s, p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_I(s, p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_I(s, p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_I(s, p, o, m)\n#\n# define BOOST_PP_FOR_1_I(s, p, o, m) BOOST_PP_IF(p(2, s), m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IF(p(2, s), BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(o(2, s), p, o, m)\n# define BOOST_PP_FOR_2_I(s, p, o, m) BOOST_PP_IF(p(3, s), m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IF(p(3, s), BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(o(3, s), p, o, m)\n# define BOOST_PP_FOR_3_I(s, p, o, m) BOOST_PP_IF(p(4, s), m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IF(p(4, s), BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(o(4, s), p, o, m)\n# define BOOST_PP_FOR_4_I(s, p, o, m) BOOST_PP_IF(p(5, s), m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IF(p(5, s), BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(o(5, s), p, o, m)\n# define BOOST_PP_FOR_5_I(s, p, o, m) BOOST_PP_IF(p(6, s), m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IF(p(6, s), BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(o(6, s), p, o, m)\n# define BOOST_PP_FOR_6_I(s, p, o, m) BOOST_PP_IF(p(7, s), m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IF(p(7, s), BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(o(7, s), p, o, m)\n# define BOOST_PP_FOR_7_I(s, p, o, m) BOOST_PP_IF(p(8, s), m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IF(p(8, s), BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(o(8, s), p, o, m)\n# define BOOST_PP_FOR_8_I(s, p, o, m) BOOST_PP_IF(p(9, s), m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IF(p(9, s), BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(o(9, s), p, o, m)\n# define BOOST_PP_FOR_9_I(s, p, o, m) BOOST_PP_IF(p(10, s), m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IF(p(10, s), BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(o(10, s), p, o, m)\n# define BOOST_PP_FOR_10_I(s, p, o, m) BOOST_PP_IF(p(11, s), m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IF(p(11, s), BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(o(11, s), p, o, m)\n# define BOOST_PP_FOR_11_I(s, p, o, m) BOOST_PP_IF(p(12, s), m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IF(p(12, s), BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(o(12, s), p, o, m)\n# define BOOST_PP_FOR_12_I(s, p, o, m) BOOST_PP_IF(p(13, s), m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IF(p(13, s), BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(o(13, s), p, o, m)\n# define BOOST_PP_FOR_13_I(s, p, o, m) BOOST_PP_IF(p(14, s), m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IF(p(14, s), BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(o(14, s), p, o, m)\n# define BOOST_PP_FOR_14_I(s, p, o, m) BOOST_PP_IF(p(15, s), m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IF(p(15, s), BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(o(15, s), p, o, m)\n# define BOOST_PP_FOR_15_I(s, p, o, m) BOOST_PP_IF(p(16, s), m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IF(p(16, s), BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(o(16, s), p, o, m)\n# define BOOST_PP_FOR_16_I(s, p, o, m) BOOST_PP_IF(p(17, s), m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IF(p(17, s), BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(o(17, s), p, o, m)\n# define BOOST_PP_FOR_17_I(s, p, o, m) BOOST_PP_IF(p(18, s), m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IF(p(18, s), BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(o(18, s), p, o, m)\n# define BOOST_PP_FOR_18_I(s, p, o, m) BOOST_PP_IF(p(19, s), m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IF(p(19, s), BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(o(19, s), p, o, m)\n# define BOOST_PP_FOR_19_I(s, p, o, m) BOOST_PP_IF(p(20, s), m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IF(p(20, s), BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(o(20, s), p, o, m)\n# define BOOST_PP_FOR_20_I(s, p, o, m) BOOST_PP_IF(p(21, s), m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IF(p(21, s), BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(o(21, s), p, o, m)\n# define BOOST_PP_FOR_21_I(s, p, o, m) BOOST_PP_IF(p(22, s), m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IF(p(22, s), BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(o(22, s), p, o, m)\n# define BOOST_PP_FOR_22_I(s, p, o, m) BOOST_PP_IF(p(23, s), m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IF(p(23, s), BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(o(23, s), p, o, m)\n# define BOOST_PP_FOR_23_I(s, p, o, m) BOOST_PP_IF(p(24, s), m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IF(p(24, s), BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(o(24, s), p, o, m)\n# define BOOST_PP_FOR_24_I(s, p, o, m) BOOST_PP_IF(p(25, s), m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IF(p(25, s), BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(o(25, s), p, o, m)\n# define BOOST_PP_FOR_25_I(s, p, o, m) BOOST_PP_IF(p(26, s), m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IF(p(26, s), BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(o(26, s), p, o, m)\n# define BOOST_PP_FOR_26_I(s, p, o, m) BOOST_PP_IF(p(27, s), m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IF(p(27, s), BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(o(27, s), p, o, m)\n# define BOOST_PP_FOR_27_I(s, p, o, m) BOOST_PP_IF(p(28, s), m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IF(p(28, s), BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(o(28, s), p, o, m)\n# define BOOST_PP_FOR_28_I(s, p, o, m) BOOST_PP_IF(p(29, s), m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IF(p(29, s), BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(o(29, s), p, o, m)\n# define BOOST_PP_FOR_29_I(s, p, o, m) BOOST_PP_IF(p(30, s), m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IF(p(30, s), BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(o(30, s), p, o, m)\n# define BOOST_PP_FOR_30_I(s, p, o, m) BOOST_PP_IF(p(31, s), m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IF(p(31, s), BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(o(31, s), p, o, m)\n# define BOOST_PP_FOR_31_I(s, p, o, m) BOOST_PP_IF(p(32, s), m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IF(p(32, s), BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(o(32, s), p, o, m)\n# define BOOST_PP_FOR_32_I(s, p, o, m) BOOST_PP_IF(p(33, s), m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IF(p(33, s), BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(o(33, s), p, o, m)\n# define BOOST_PP_FOR_33_I(s, p, o, m) BOOST_PP_IF(p(34, s), m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IF(p(34, s), BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(o(34, s), p, o, m)\n# define BOOST_PP_FOR_34_I(s, p, o, m) BOOST_PP_IF(p(35, s), m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IF(p(35, s), BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(o(35, s), p, o, m)\n# define BOOST_PP_FOR_35_I(s, p, o, m) BOOST_PP_IF(p(36, s), m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IF(p(36, s), BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(o(36, s), p, o, m)\n# define BOOST_PP_FOR_36_I(s, p, o, m) BOOST_PP_IF(p(37, s), m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IF(p(37, s), BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(o(37, s), p, o, m)\n# define BOOST_PP_FOR_37_I(s, p, o, m) BOOST_PP_IF(p(38, s), m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IF(p(38, s), BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(o(38, s), p, o, m)\n# define BOOST_PP_FOR_38_I(s, p, o, m) BOOST_PP_IF(p(39, s), m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IF(p(39, s), BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(o(39, s), p, o, m)\n# define BOOST_PP_FOR_39_I(s, p, o, m) BOOST_PP_IF(p(40, s), m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IF(p(40, s), BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(o(40, s), p, o, m)\n# define BOOST_PP_FOR_40_I(s, p, o, m) BOOST_PP_IF(p(41, s), m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IF(p(41, s), BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(o(41, s), p, o, m)\n# define BOOST_PP_FOR_41_I(s, p, o, m) BOOST_PP_IF(p(42, s), m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IF(p(42, s), BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(o(42, s), p, o, m)\n# define BOOST_PP_FOR_42_I(s, p, o, m) BOOST_PP_IF(p(43, s), m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IF(p(43, s), BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(o(43, s), p, o, m)\n# define BOOST_PP_FOR_43_I(s, p, o, m) BOOST_PP_IF(p(44, s), m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IF(p(44, s), BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(o(44, s), p, o, m)\n# define BOOST_PP_FOR_44_I(s, p, o, m) BOOST_PP_IF(p(45, s), m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IF(p(45, s), BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(o(45, s), p, o, m)\n# define BOOST_PP_FOR_45_I(s, p, o, m) BOOST_PP_IF(p(46, s), m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IF(p(46, s), BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(o(46, s), p, o, m)\n# define BOOST_PP_FOR_46_I(s, p, o, m) BOOST_PP_IF(p(47, s), m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IF(p(47, s), BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(o(47, s), p, o, m)\n# define BOOST_PP_FOR_47_I(s, p, o, m) BOOST_PP_IF(p(48, s), m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IF(p(48, s), BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(o(48, s), p, o, m)\n# define BOOST_PP_FOR_48_I(s, p, o, m) BOOST_PP_IF(p(49, s), m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IF(p(49, s), BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(o(49, s), p, o, m)\n# define BOOST_PP_FOR_49_I(s, p, o, m) BOOST_PP_IF(p(50, s), m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IF(p(50, s), BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(o(50, s), p, o, m)\n# define BOOST_PP_FOR_50_I(s, p, o, m) BOOST_PP_IF(p(51, s), m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IF(p(51, s), BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(o(51, s), p, o, m)\n# define BOOST_PP_FOR_51_I(s, p, o, m) BOOST_PP_IF(p(52, s), m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IF(p(52, s), BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(o(52, s), p, o, m)\n# define BOOST_PP_FOR_52_I(s, p, o, m) BOOST_PP_IF(p(53, s), m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IF(p(53, s), BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(o(53, s), p, o, m)\n# define BOOST_PP_FOR_53_I(s, p, o, m) BOOST_PP_IF(p(54, s), m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IF(p(54, s), BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(o(54, s), p, o, m)\n# define BOOST_PP_FOR_54_I(s, p, o, m) BOOST_PP_IF(p(55, s), m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IF(p(55, s), BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(o(55, s), p, o, m)\n# define BOOST_PP_FOR_55_I(s, p, o, m) BOOST_PP_IF(p(56, s), m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IF(p(56, s), BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(o(56, s), p, o, m)\n# define BOOST_PP_FOR_56_I(s, p, o, m) BOOST_PP_IF(p(57, s), m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IF(p(57, s), BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(o(57, s), p, o, m)\n# define BOOST_PP_FOR_57_I(s, p, o, m) BOOST_PP_IF(p(58, s), m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IF(p(58, s), BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(o(58, s), p, o, m)\n# define BOOST_PP_FOR_58_I(s, p, o, m) BOOST_PP_IF(p(59, s), m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IF(p(59, s), BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(o(59, s), p, o, m)\n# define BOOST_PP_FOR_59_I(s, p, o, m) BOOST_PP_IF(p(60, s), m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IF(p(60, s), BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(o(60, s), p, o, m)\n# define BOOST_PP_FOR_60_I(s, p, o, m) BOOST_PP_IF(p(61, s), m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IF(p(61, s), BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(o(61, s), p, o, m)\n# define BOOST_PP_FOR_61_I(s, p, o, m) BOOST_PP_IF(p(62, s), m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IF(p(62, s), BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(o(62, s), p, o, m)\n# define BOOST_PP_FOR_62_I(s, p, o, m) BOOST_PP_IF(p(63, s), m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IF(p(63, s), BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(o(63, s), p, o, m)\n# define BOOST_PP_FOR_63_I(s, p, o, m) BOOST_PP_IF(p(64, s), m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IF(p(64, s), BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(o(64, s), p, o, m)\n# define BOOST_PP_FOR_64_I(s, p, o, m) BOOST_PP_IF(p(65, s), m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IF(p(65, s), BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(o(65, s), p, o, m)\n# define BOOST_PP_FOR_65_I(s, p, o, m) BOOST_PP_IF(p(66, s), m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IF(p(66, s), BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(o(66, s), p, o, m)\n# define BOOST_PP_FOR_66_I(s, p, o, m) BOOST_PP_IF(p(67, s), m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IF(p(67, s), BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(o(67, s), p, o, m)\n# define BOOST_PP_FOR_67_I(s, p, o, m) BOOST_PP_IF(p(68, s), m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IF(p(68, s), BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(o(68, s), p, o, m)\n# define BOOST_PP_FOR_68_I(s, p, o, m) BOOST_PP_IF(p(69, s), m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IF(p(69, s), BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(o(69, s), p, o, m)\n# define BOOST_PP_FOR_69_I(s, p, o, m) BOOST_PP_IF(p(70, s), m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IF(p(70, s), BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(o(70, s), p, o, m)\n# define BOOST_PP_FOR_70_I(s, p, o, m) BOOST_PP_IF(p(71, s), m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IF(p(71, s), BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(o(71, s), p, o, m)\n# define BOOST_PP_FOR_71_I(s, p, o, m) BOOST_PP_IF(p(72, s), m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IF(p(72, s), BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(o(72, s), p, o, m)\n# define BOOST_PP_FOR_72_I(s, p, o, m) BOOST_PP_IF(p(73, s), m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IF(p(73, s), BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(o(73, s), p, o, m)\n# define BOOST_PP_FOR_73_I(s, p, o, m) BOOST_PP_IF(p(74, s), m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IF(p(74, s), BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(o(74, s), p, o, m)\n# define BOOST_PP_FOR_74_I(s, p, o, m) BOOST_PP_IF(p(75, s), m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IF(p(75, s), BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(o(75, s), p, o, m)\n# define BOOST_PP_FOR_75_I(s, p, o, m) BOOST_PP_IF(p(76, s), m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IF(p(76, s), BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(o(76, s), p, o, m)\n# define BOOST_PP_FOR_76_I(s, p, o, m) BOOST_PP_IF(p(77, s), m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IF(p(77, s), BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(o(77, s), p, o, m)\n# define BOOST_PP_FOR_77_I(s, p, o, m) BOOST_PP_IF(p(78, s), m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IF(p(78, s), BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(o(78, s), p, o, m)\n# define BOOST_PP_FOR_78_I(s, p, o, m) BOOST_PP_IF(p(79, s), m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IF(p(79, s), BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(o(79, s), p, o, m)\n# define BOOST_PP_FOR_79_I(s, p, o, m) BOOST_PP_IF(p(80, s), m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IF(p(80, s), BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(o(80, s), p, o, m)\n# define BOOST_PP_FOR_80_I(s, p, o, m) BOOST_PP_IF(p(81, s), m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IF(p(81, s), BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(o(81, s), p, o, m)\n# define BOOST_PP_FOR_81_I(s, p, o, m) BOOST_PP_IF(p(82, s), m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IF(p(82, s), BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(o(82, s), p, o, m)\n# define BOOST_PP_FOR_82_I(s, p, o, m) BOOST_PP_IF(p(83, s), m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IF(p(83, s), BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(o(83, s), p, o, m)\n# define BOOST_PP_FOR_83_I(s, p, o, m) BOOST_PP_IF(p(84, s), m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IF(p(84, s), BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(o(84, s), p, o, m)\n# define BOOST_PP_FOR_84_I(s, p, o, m) BOOST_PP_IF(p(85, s), m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IF(p(85, s), BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(o(85, s), p, o, m)\n# define BOOST_PP_FOR_85_I(s, p, o, m) BOOST_PP_IF(p(86, s), m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IF(p(86, s), BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(o(86, s), p, o, m)\n# define BOOST_PP_FOR_86_I(s, p, o, m) BOOST_PP_IF(p(87, s), m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IF(p(87, s), BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(o(87, s), p, o, m)\n# define BOOST_PP_FOR_87_I(s, p, o, m) BOOST_PP_IF(p(88, s), m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IF(p(88, s), BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(o(88, s), p, o, m)\n# define BOOST_PP_FOR_88_I(s, p, o, m) BOOST_PP_IF(p(89, s), m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IF(p(89, s), BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(o(89, s), p, o, m)\n# define BOOST_PP_FOR_89_I(s, p, o, m) BOOST_PP_IF(p(90, s), m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IF(p(90, s), BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(o(90, s), p, o, m)\n# define BOOST_PP_FOR_90_I(s, p, o, m) BOOST_PP_IF(p(91, s), m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IF(p(91, s), BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(o(91, s), p, o, m)\n# define BOOST_PP_FOR_91_I(s, p, o, m) BOOST_PP_IF(p(92, s), m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IF(p(92, s), BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(o(92, s), p, o, m)\n# define BOOST_PP_FOR_92_I(s, p, o, m) BOOST_PP_IF(p(93, s), m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IF(p(93, s), BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(o(93, s), p, o, m)\n# define BOOST_PP_FOR_93_I(s, p, o, m) BOOST_PP_IF(p(94, s), m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IF(p(94, s), BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(o(94, s), p, o, m)\n# define BOOST_PP_FOR_94_I(s, p, o, m) BOOST_PP_IF(p(95, s), m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IF(p(95, s), BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(o(95, s), p, o, m)\n# define BOOST_PP_FOR_95_I(s, p, o, m) BOOST_PP_IF(p(96, s), m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IF(p(96, s), BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(o(96, s), p, o, m)\n# define BOOST_PP_FOR_96_I(s, p, o, m) BOOST_PP_IF(p(97, s), m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IF(p(97, s), BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(o(97, s), p, o, m)\n# define BOOST_PP_FOR_97_I(s, p, o, m) BOOST_PP_IF(p(98, s), m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IF(p(98, s), BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(o(98, s), p, o, m)\n# define BOOST_PP_FOR_98_I(s, p, o, m) BOOST_PP_IF(p(99, s), m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IF(p(99, s), BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(o(99, s), p, o, m)\n# define BOOST_PP_FOR_99_I(s, p, o, m) BOOST_PP_IF(p(100, s), m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IF(p(100, s), BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(o(100, s), p, o, m)\n# define BOOST_PP_FOR_100_I(s, p, o, m) BOOST_PP_IF(p(101, s), m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IF(p(101, s), BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(o(101, s), p, o, m)\n# define BOOST_PP_FOR_101_I(s, p, o, m) BOOST_PP_IF(p(102, s), m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IF(p(102, s), BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(o(102, s), p, o, m)\n# define BOOST_PP_FOR_102_I(s, p, o, m) BOOST_PP_IF(p(103, s), m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IF(p(103, s), BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(o(103, s), p, o, m)\n# define BOOST_PP_FOR_103_I(s, p, o, m) BOOST_PP_IF(p(104, s), m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IF(p(104, s), BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(o(104, s), p, o, m)\n# define BOOST_PP_FOR_104_I(s, p, o, m) BOOST_PP_IF(p(105, s), m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IF(p(105, s), BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(o(105, s), p, o, m)\n# define BOOST_PP_FOR_105_I(s, p, o, m) BOOST_PP_IF(p(106, s), m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IF(p(106, s), BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(o(106, s), p, o, m)\n# define BOOST_PP_FOR_106_I(s, p, o, m) BOOST_PP_IF(p(107, s), m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IF(p(107, s), BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(o(107, s), p, o, m)\n# define BOOST_PP_FOR_107_I(s, p, o, m) BOOST_PP_IF(p(108, s), m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IF(p(108, s), BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(o(108, s), p, o, m)\n# define BOOST_PP_FOR_108_I(s, p, o, m) BOOST_PP_IF(p(109, s), m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IF(p(109, s), BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(o(109, s), p, o, m)\n# define BOOST_PP_FOR_109_I(s, p, o, m) BOOST_PP_IF(p(110, s), m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IF(p(110, s), BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(o(110, s), p, o, m)\n# define BOOST_PP_FOR_110_I(s, p, o, m) BOOST_PP_IF(p(111, s), m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IF(p(111, s), BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(o(111, s), p, o, m)\n# define BOOST_PP_FOR_111_I(s, p, o, m) BOOST_PP_IF(p(112, s), m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IF(p(112, s), BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(o(112, s), p, o, m)\n# define BOOST_PP_FOR_112_I(s, p, o, m) BOOST_PP_IF(p(113, s), m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IF(p(113, s), BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(o(113, s), p, o, m)\n# define BOOST_PP_FOR_113_I(s, p, o, m) BOOST_PP_IF(p(114, s), m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IF(p(114, s), BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(o(114, s), p, o, m)\n# define BOOST_PP_FOR_114_I(s, p, o, m) BOOST_PP_IF(p(115, s), m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IF(p(115, s), BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(o(115, s), p, o, m)\n# define BOOST_PP_FOR_115_I(s, p, o, m) BOOST_PP_IF(p(116, s), m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IF(p(116, s), BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(o(116, s), p, o, m)\n# define BOOST_PP_FOR_116_I(s, p, o, m) BOOST_PP_IF(p(117, s), m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IF(p(117, s), BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(o(117, s), p, o, m)\n# define BOOST_PP_FOR_117_I(s, p, o, m) BOOST_PP_IF(p(118, s), m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IF(p(118, s), BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(o(118, s), p, o, m)\n# define BOOST_PP_FOR_118_I(s, p, o, m) BOOST_PP_IF(p(119, s), m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IF(p(119, s), BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(o(119, s), p, o, m)\n# define BOOST_PP_FOR_119_I(s, p, o, m) BOOST_PP_IF(p(120, s), m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IF(p(120, s), BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(o(120, s), p, o, m)\n# define BOOST_PP_FOR_120_I(s, p, o, m) BOOST_PP_IF(p(121, s), m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IF(p(121, s), BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(o(121, s), p, o, m)\n# define BOOST_PP_FOR_121_I(s, p, o, m) BOOST_PP_IF(p(122, s), m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IF(p(122, s), BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(o(122, s), p, o, m)\n# define BOOST_PP_FOR_122_I(s, p, o, m) BOOST_PP_IF(p(123, s), m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IF(p(123, s), BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(o(123, s), p, o, m)\n# define BOOST_PP_FOR_123_I(s, p, o, m) BOOST_PP_IF(p(124, s), m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IF(p(124, s), BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(o(124, s), p, o, m)\n# define BOOST_PP_FOR_124_I(s, p, o, m) BOOST_PP_IF(p(125, s), m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IF(p(125, s), BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(o(125, s), p, o, m)\n# define BOOST_PP_FOR_125_I(s, p, o, m) BOOST_PP_IF(p(126, s), m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IF(p(126, s), BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(o(126, s), p, o, m)\n# define BOOST_PP_FOR_126_I(s, p, o, m) BOOST_PP_IF(p(127, s), m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IF(p(127, s), BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(o(127, s), p, o, m)\n# define BOOST_PP_FOR_127_I(s, p, o, m) BOOST_PP_IF(p(128, s), m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IF(p(128, s), BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(o(128, s), p, o, m)\n# define BOOST_PP_FOR_128_I(s, p, o, m) BOOST_PP_IF(p(129, s), m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IF(p(129, s), BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(o(129, s), p, o, m)\n# define BOOST_PP_FOR_129_I(s, p, o, m) BOOST_PP_IF(p(130, s), m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IF(p(130, s), BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(o(130, s), p, o, m)\n# define BOOST_PP_FOR_130_I(s, p, o, m) BOOST_PP_IF(p(131, s), m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IF(p(131, s), BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(o(131, s), p, o, m)\n# define BOOST_PP_FOR_131_I(s, p, o, m) BOOST_PP_IF(p(132, s), m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IF(p(132, s), BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(o(132, s), p, o, m)\n# define BOOST_PP_FOR_132_I(s, p, o, m) BOOST_PP_IF(p(133, s), m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IF(p(133, s), BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(o(133, s), p, o, m)\n# define BOOST_PP_FOR_133_I(s, p, o, m) BOOST_PP_IF(p(134, s), m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IF(p(134, s), BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(o(134, s), p, o, m)\n# define BOOST_PP_FOR_134_I(s, p, o, m) BOOST_PP_IF(p(135, s), m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IF(p(135, s), BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(o(135, s), p, o, m)\n# define BOOST_PP_FOR_135_I(s, p, o, m) BOOST_PP_IF(p(136, s), m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IF(p(136, s), BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(o(136, s), p, o, m)\n# define BOOST_PP_FOR_136_I(s, p, o, m) BOOST_PP_IF(p(137, s), m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IF(p(137, s), BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(o(137, s), p, o, m)\n# define BOOST_PP_FOR_137_I(s, p, o, m) BOOST_PP_IF(p(138, s), m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IF(p(138, s), BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(o(138, s), p, o, m)\n# define BOOST_PP_FOR_138_I(s, p, o, m) BOOST_PP_IF(p(139, s), m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IF(p(139, s), BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(o(139, s), p, o, m)\n# define BOOST_PP_FOR_139_I(s, p, o, m) BOOST_PP_IF(p(140, s), m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IF(p(140, s), BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(o(140, s), p, o, m)\n# define BOOST_PP_FOR_140_I(s, p, o, m) BOOST_PP_IF(p(141, s), m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IF(p(141, s), BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(o(141, s), p, o, m)\n# define BOOST_PP_FOR_141_I(s, p, o, m) BOOST_PP_IF(p(142, s), m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IF(p(142, s), BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(o(142, s), p, o, m)\n# define BOOST_PP_FOR_142_I(s, p, o, m) BOOST_PP_IF(p(143, s), m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IF(p(143, s), BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(o(143, s), p, o, m)\n# define BOOST_PP_FOR_143_I(s, p, o, m) BOOST_PP_IF(p(144, s), m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IF(p(144, s), BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(o(144, s), p, o, m)\n# define BOOST_PP_FOR_144_I(s, p, o, m) BOOST_PP_IF(p(145, s), m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IF(p(145, s), BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(o(145, s), p, o, m)\n# define BOOST_PP_FOR_145_I(s, p, o, m) BOOST_PP_IF(p(146, s), m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IF(p(146, s), BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(o(146, s), p, o, m)\n# define BOOST_PP_FOR_146_I(s, p, o, m) BOOST_PP_IF(p(147, s), m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IF(p(147, s), BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(o(147, s), p, o, m)\n# define BOOST_PP_FOR_147_I(s, p, o, m) BOOST_PP_IF(p(148, s), m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IF(p(148, s), BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(o(148, s), p, o, m)\n# define BOOST_PP_FOR_148_I(s, p, o, m) BOOST_PP_IF(p(149, s), m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IF(p(149, s), BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(o(149, s), p, o, m)\n# define BOOST_PP_FOR_149_I(s, p, o, m) BOOST_PP_IF(p(150, s), m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IF(p(150, s), BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(o(150, s), p, o, m)\n# define BOOST_PP_FOR_150_I(s, p, o, m) BOOST_PP_IF(p(151, s), m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IF(p(151, s), BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(o(151, s), p, o, m)\n# define BOOST_PP_FOR_151_I(s, p, o, m) BOOST_PP_IF(p(152, s), m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IF(p(152, s), BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(o(152, s), p, o, m)\n# define BOOST_PP_FOR_152_I(s, p, o, m) BOOST_PP_IF(p(153, s), m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IF(p(153, s), BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(o(153, s), p, o, m)\n# define BOOST_PP_FOR_153_I(s, p, o, m) BOOST_PP_IF(p(154, s), m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IF(p(154, s), BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(o(154, s), p, o, m)\n# define BOOST_PP_FOR_154_I(s, p, o, m) BOOST_PP_IF(p(155, s), m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IF(p(155, s), BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(o(155, s), p, o, m)\n# define BOOST_PP_FOR_155_I(s, p, o, m) BOOST_PP_IF(p(156, s), m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IF(p(156, s), BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(o(156, s), p, o, m)\n# define BOOST_PP_FOR_156_I(s, p, o, m) BOOST_PP_IF(p(157, s), m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IF(p(157, s), BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(o(157, s), p, o, m)\n# define BOOST_PP_FOR_157_I(s, p, o, m) BOOST_PP_IF(p(158, s), m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IF(p(158, s), BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(o(158, s), p, o, m)\n# define BOOST_PP_FOR_158_I(s, p, o, m) BOOST_PP_IF(p(159, s), m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IF(p(159, s), BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(o(159, s), p, o, m)\n# define BOOST_PP_FOR_159_I(s, p, o, m) BOOST_PP_IF(p(160, s), m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IF(p(160, s), BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(o(160, s), p, o, m)\n# define BOOST_PP_FOR_160_I(s, p, o, m) BOOST_PP_IF(p(161, s), m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IF(p(161, s), BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(o(161, s), p, o, m)\n# define BOOST_PP_FOR_161_I(s, p, o, m) BOOST_PP_IF(p(162, s), m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IF(p(162, s), BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(o(162, s), p, o, m)\n# define BOOST_PP_FOR_162_I(s, p, o, m) BOOST_PP_IF(p(163, s), m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IF(p(163, s), BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(o(163, s), p, o, m)\n# define BOOST_PP_FOR_163_I(s, p, o, m) BOOST_PP_IF(p(164, s), m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IF(p(164, s), BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(o(164, s), p, o, m)\n# define BOOST_PP_FOR_164_I(s, p, o, m) BOOST_PP_IF(p(165, s), m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IF(p(165, s), BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(o(165, s), p, o, m)\n# define BOOST_PP_FOR_165_I(s, p, o, m) BOOST_PP_IF(p(166, s), m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IF(p(166, s), BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(o(166, s), p, o, m)\n# define BOOST_PP_FOR_166_I(s, p, o, m) BOOST_PP_IF(p(167, s), m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IF(p(167, s), BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(o(167, s), p, o, m)\n# define BOOST_PP_FOR_167_I(s, p, o, m) BOOST_PP_IF(p(168, s), m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IF(p(168, s), BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(o(168, s), p, o, m)\n# define BOOST_PP_FOR_168_I(s, p, o, m) BOOST_PP_IF(p(169, s), m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IF(p(169, s), BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(o(169, s), p, o, m)\n# define BOOST_PP_FOR_169_I(s, p, o, m) BOOST_PP_IF(p(170, s), m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IF(p(170, s), BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(o(170, s), p, o, m)\n# define BOOST_PP_FOR_170_I(s, p, o, m) BOOST_PP_IF(p(171, s), m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IF(p(171, s), BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(o(171, s), p, o, m)\n# define BOOST_PP_FOR_171_I(s, p, o, m) BOOST_PP_IF(p(172, s), m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IF(p(172, s), BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(o(172, s), p, o, m)\n# define BOOST_PP_FOR_172_I(s, p, o, m) BOOST_PP_IF(p(173, s), m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IF(p(173, s), BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(o(173, s), p, o, m)\n# define BOOST_PP_FOR_173_I(s, p, o, m) BOOST_PP_IF(p(174, s), m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IF(p(174, s), BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(o(174, s), p, o, m)\n# define BOOST_PP_FOR_174_I(s, p, o, m) BOOST_PP_IF(p(175, s), m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IF(p(175, s), BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(o(175, s), p, o, m)\n# define BOOST_PP_FOR_175_I(s, p, o, m) BOOST_PP_IF(p(176, s), m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IF(p(176, s), BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(o(176, s), p, o, m)\n# define BOOST_PP_FOR_176_I(s, p, o, m) BOOST_PP_IF(p(177, s), m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IF(p(177, s), BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(o(177, s), p, o, m)\n# define BOOST_PP_FOR_177_I(s, p, o, m) BOOST_PP_IF(p(178, s), m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IF(p(178, s), BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(o(178, s), p, o, m)\n# define BOOST_PP_FOR_178_I(s, p, o, m) BOOST_PP_IF(p(179, s), m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IF(p(179, s), BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(o(179, s), p, o, m)\n# define BOOST_PP_FOR_179_I(s, p, o, m) BOOST_PP_IF(p(180, s), m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IF(p(180, s), BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(o(180, s), p, o, m)\n# define BOOST_PP_FOR_180_I(s, p, o, m) BOOST_PP_IF(p(181, s), m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IF(p(181, s), BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(o(181, s), p, o, m)\n# define BOOST_PP_FOR_181_I(s, p, o, m) BOOST_PP_IF(p(182, s), m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IF(p(182, s), BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(o(182, s), p, o, m)\n# define BOOST_PP_FOR_182_I(s, p, o, m) BOOST_PP_IF(p(183, s), m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IF(p(183, s), BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(o(183, s), p, o, m)\n# define BOOST_PP_FOR_183_I(s, p, o, m) BOOST_PP_IF(p(184, s), m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IF(p(184, s), BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(o(184, s), p, o, m)\n# define BOOST_PP_FOR_184_I(s, p, o, m) BOOST_PP_IF(p(185, s), m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IF(p(185, s), BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(o(185, s), p, o, m)\n# define BOOST_PP_FOR_185_I(s, p, o, m) BOOST_PP_IF(p(186, s), m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IF(p(186, s), BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(o(186, s), p, o, m)\n# define BOOST_PP_FOR_186_I(s, p, o, m) BOOST_PP_IF(p(187, s), m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IF(p(187, s), BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(o(187, s), p, o, m)\n# define BOOST_PP_FOR_187_I(s, p, o, m) BOOST_PP_IF(p(188, s), m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IF(p(188, s), BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(o(188, s), p, o, m)\n# define BOOST_PP_FOR_188_I(s, p, o, m) BOOST_PP_IF(p(189, s), m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IF(p(189, s), BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(o(189, s), p, o, m)\n# define BOOST_PP_FOR_189_I(s, p, o, m) BOOST_PP_IF(p(190, s), m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IF(p(190, s), BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(o(190, s), p, o, m)\n# define BOOST_PP_FOR_190_I(s, p, o, m) BOOST_PP_IF(p(191, s), m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IF(p(191, s), BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(o(191, s), p, o, m)\n# define BOOST_PP_FOR_191_I(s, p, o, m) BOOST_PP_IF(p(192, s), m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IF(p(192, s), BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(o(192, s), p, o, m)\n# define BOOST_PP_FOR_192_I(s, p, o, m) BOOST_PP_IF(p(193, s), m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IF(p(193, s), BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(o(193, s), p, o, m)\n# define BOOST_PP_FOR_193_I(s, p, o, m) BOOST_PP_IF(p(194, s), m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IF(p(194, s), BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(o(194, s), p, o, m)\n# define BOOST_PP_FOR_194_I(s, p, o, m) BOOST_PP_IF(p(195, s), m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IF(p(195, s), BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(o(195, s), p, o, m)\n# define BOOST_PP_FOR_195_I(s, p, o, m) BOOST_PP_IF(p(196, s), m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IF(p(196, s), BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(o(196, s), p, o, m)\n# define BOOST_PP_FOR_196_I(s, p, o, m) BOOST_PP_IF(p(197, s), m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IF(p(197, s), BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(o(197, s), p, o, m)\n# define BOOST_PP_FOR_197_I(s, p, o, m) BOOST_PP_IF(p(198, s), m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IF(p(198, s), BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(o(198, s), p, o, m)\n# define BOOST_PP_FOR_198_I(s, p, o, m) BOOST_PP_IF(p(199, s), m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IF(p(199, s), BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(o(199, s), p, o, m)\n# define BOOST_PP_FOR_199_I(s, p, o, m) BOOST_PP_IF(p(200, s), m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IF(p(200, s), BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(o(200, s), p, o, m)\n# define BOOST_PP_FOR_200_I(s, p, o, m) BOOST_PP_IF(p(201, s), m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IF(p(201, s), BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(o(201, s), p, o, m)\n# define BOOST_PP_FOR_201_I(s, p, o, m) BOOST_PP_IF(p(202, s), m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IF(p(202, s), BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(o(202, s), p, o, m)\n# define BOOST_PP_FOR_202_I(s, p, o, m) BOOST_PP_IF(p(203, s), m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IF(p(203, s), BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(o(203, s), p, o, m)\n# define BOOST_PP_FOR_203_I(s, p, o, m) BOOST_PP_IF(p(204, s), m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IF(p(204, s), BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(o(204, s), p, o, m)\n# define BOOST_PP_FOR_204_I(s, p, o, m) BOOST_PP_IF(p(205, s), m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IF(p(205, s), BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(o(205, s), p, o, m)\n# define BOOST_PP_FOR_205_I(s, p, o, m) BOOST_PP_IF(p(206, s), m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IF(p(206, s), BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(o(206, s), p, o, m)\n# define BOOST_PP_FOR_206_I(s, p, o, m) BOOST_PP_IF(p(207, s), m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IF(p(207, s), BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(o(207, s), p, o, m)\n# define BOOST_PP_FOR_207_I(s, p, o, m) BOOST_PP_IF(p(208, s), m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IF(p(208, s), BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(o(208, s), p, o, m)\n# define BOOST_PP_FOR_208_I(s, p, o, m) BOOST_PP_IF(p(209, s), m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IF(p(209, s), BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(o(209, s), p, o, m)\n# define BOOST_PP_FOR_209_I(s, p, o, m) BOOST_PP_IF(p(210, s), m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IF(p(210, s), BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(o(210, s), p, o, m)\n# define BOOST_PP_FOR_210_I(s, p, o, m) BOOST_PP_IF(p(211, s), m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IF(p(211, s), BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(o(211, s), p, o, m)\n# define BOOST_PP_FOR_211_I(s, p, o, m) BOOST_PP_IF(p(212, s), m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IF(p(212, s), BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(o(212, s), p, o, m)\n# define BOOST_PP_FOR_212_I(s, p, o, m) BOOST_PP_IF(p(213, s), m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IF(p(213, s), BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(o(213, s), p, o, m)\n# define BOOST_PP_FOR_213_I(s, p, o, m) BOOST_PP_IF(p(214, s), m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IF(p(214, s), BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(o(214, s), p, o, m)\n# define BOOST_PP_FOR_214_I(s, p, o, m) BOOST_PP_IF(p(215, s), m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IF(p(215, s), BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(o(215, s), p, o, m)\n# define BOOST_PP_FOR_215_I(s, p, o, m) BOOST_PP_IF(p(216, s), m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IF(p(216, s), BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(o(216, s), p, o, m)\n# define BOOST_PP_FOR_216_I(s, p, o, m) BOOST_PP_IF(p(217, s), m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IF(p(217, s), BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(o(217, s), p, o, m)\n# define BOOST_PP_FOR_217_I(s, p, o, m) BOOST_PP_IF(p(218, s), m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IF(p(218, s), BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(o(218, s), p, o, m)\n# define BOOST_PP_FOR_218_I(s, p, o, m) BOOST_PP_IF(p(219, s), m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IF(p(219, s), BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(o(219, s), p, o, m)\n# define BOOST_PP_FOR_219_I(s, p, o, m) BOOST_PP_IF(p(220, s), m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IF(p(220, s), BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(o(220, s), p, o, m)\n# define BOOST_PP_FOR_220_I(s, p, o, m) BOOST_PP_IF(p(221, s), m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IF(p(221, s), BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(o(221, s), p, o, m)\n# define BOOST_PP_FOR_221_I(s, p, o, m) BOOST_PP_IF(p(222, s), m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IF(p(222, s), BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(o(222, s), p, o, m)\n# define BOOST_PP_FOR_222_I(s, p, o, m) BOOST_PP_IF(p(223, s), m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IF(p(223, s), BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(o(223, s), p, o, m)\n# define BOOST_PP_FOR_223_I(s, p, o, m) BOOST_PP_IF(p(224, s), m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IF(p(224, s), BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(o(224, s), p, o, m)\n# define BOOST_PP_FOR_224_I(s, p, o, m) BOOST_PP_IF(p(225, s), m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IF(p(225, s), BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(o(225, s), p, o, m)\n# define BOOST_PP_FOR_225_I(s, p, o, m) BOOST_PP_IF(p(226, s), m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IF(p(226, s), BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(o(226, s), p, o, m)\n# define BOOST_PP_FOR_226_I(s, p, o, m) BOOST_PP_IF(p(227, s), m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IF(p(227, s), BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(o(227, s), p, o, m)\n# define BOOST_PP_FOR_227_I(s, p, o, m) BOOST_PP_IF(p(228, s), m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IF(p(228, s), BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(o(228, s), p, o, m)\n# define BOOST_PP_FOR_228_I(s, p, o, m) BOOST_PP_IF(p(229, s), m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IF(p(229, s), BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(o(229, s), p, o, m)\n# define BOOST_PP_FOR_229_I(s, p, o, m) BOOST_PP_IF(p(230, s), m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IF(p(230, s), BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(o(230, s), p, o, m)\n# define BOOST_PP_FOR_230_I(s, p, o, m) BOOST_PP_IF(p(231, s), m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IF(p(231, s), BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(o(231, s), p, o, m)\n# define BOOST_PP_FOR_231_I(s, p, o, m) BOOST_PP_IF(p(232, s), m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IF(p(232, s), BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(o(232, s), p, o, m)\n# define BOOST_PP_FOR_232_I(s, p, o, m) BOOST_PP_IF(p(233, s), m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IF(p(233, s), BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(o(233, s), p, o, m)\n# define BOOST_PP_FOR_233_I(s, p, o, m) BOOST_PP_IF(p(234, s), m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IF(p(234, s), BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(o(234, s), p, o, m)\n# define BOOST_PP_FOR_234_I(s, p, o, m) BOOST_PP_IF(p(235, s), m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IF(p(235, s), BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(o(235, s), p, o, m)\n# define BOOST_PP_FOR_235_I(s, p, o, m) BOOST_PP_IF(p(236, s), m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IF(p(236, s), BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(o(236, s), p, o, m)\n# define BOOST_PP_FOR_236_I(s, p, o, m) BOOST_PP_IF(p(237, s), m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IF(p(237, s), BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(o(237, s), p, o, m)\n# define BOOST_PP_FOR_237_I(s, p, o, m) BOOST_PP_IF(p(238, s), m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IF(p(238, s), BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(o(238, s), p, o, m)\n# define BOOST_PP_FOR_238_I(s, p, o, m) BOOST_PP_IF(p(239, s), m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IF(p(239, s), BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(o(239, s), p, o, m)\n# define BOOST_PP_FOR_239_I(s, p, o, m) BOOST_PP_IF(p(240, s), m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IF(p(240, s), BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(o(240, s), p, o, m)\n# define BOOST_PP_FOR_240_I(s, p, o, m) BOOST_PP_IF(p(241, s), m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IF(p(241, s), BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(o(241, s), p, o, m)\n# define BOOST_PP_FOR_241_I(s, p, o, m) BOOST_PP_IF(p(242, s), m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IF(p(242, s), BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(o(242, s), p, o, m)\n# define BOOST_PP_FOR_242_I(s, p, o, m) BOOST_PP_IF(p(243, s), m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IF(p(243, s), BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(o(243, s), p, o, m)\n# define BOOST_PP_FOR_243_I(s, p, o, m) BOOST_PP_IF(p(244, s), m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IF(p(244, s), BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(o(244, s), p, o, m)\n# define BOOST_PP_FOR_244_I(s, p, o, m) BOOST_PP_IF(p(245, s), m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IF(p(245, s), BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(o(245, s), p, o, m)\n# define BOOST_PP_FOR_245_I(s, p, o, m) BOOST_PP_IF(p(246, s), m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IF(p(246, s), BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(o(246, s), p, o, m)\n# define BOOST_PP_FOR_246_I(s, p, o, m) BOOST_PP_IF(p(247, s), m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IF(p(247, s), BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(o(247, s), p, o, m)\n# define BOOST_PP_FOR_247_I(s, p, o, m) BOOST_PP_IF(p(248, s), m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IF(p(248, s), BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(o(248, s), p, o, m)\n# define BOOST_PP_FOR_248_I(s, p, o, m) BOOST_PP_IF(p(249, s), m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IF(p(249, s), BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(o(249, s), p, o, m)\n# define BOOST_PP_FOR_249_I(s, p, o, m) BOOST_PP_IF(p(250, s), m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IF(p(250, s), BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(o(250, s), p, o, m)\n# define BOOST_PP_FOR_250_I(s, p, o, m) BOOST_PP_IF(p(251, s), m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IF(p(251, s), BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(o(251, s), p, o, m)\n# define BOOST_PP_FOR_251_I(s, p, o, m) BOOST_PP_IF(p(252, s), m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IF(p(252, s), BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(o(252, s), p, o, m)\n# define BOOST_PP_FOR_252_I(s, p, o, m) BOOST_PP_IF(p(253, s), m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IF(p(253, s), BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(o(253, s), p, o, m)\n# define BOOST_PP_FOR_253_I(s, p, o, m) BOOST_PP_IF(p(254, s), m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IF(p(254, s), BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(o(254, s), p, o, m)\n# define BOOST_PP_FOR_254_I(s, p, o, m) BOOST_PP_IF(p(255, s), m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IF(p(255, s), BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(o(255, s), p, o, m)\n# define BOOST_PP_FOR_255_I(s, p, o, m) BOOST_PP_IF(p(256, s), m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IF(p(256, s), BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(o(256, s), p, o, m)\n# define BOOST_PP_FOR_256_I(s, p, o, m) BOOST_PP_IF(p(257, s), m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IF(p(257, s), BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(o(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/detail/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_FOR_HPP\n#\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_FOR_1_C(BOOST_PP_BOOL(p(2, s)), s, p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_FOR_2_C(BOOST_PP_BOOL(p(3, s)), s, p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_FOR_3_C(BOOST_PP_BOOL(p(4, s)), s, p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_FOR_4_C(BOOST_PP_BOOL(p(5, s)), s, p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_FOR_5_C(BOOST_PP_BOOL(p(6, s)), s, p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_FOR_6_C(BOOST_PP_BOOL(p(7, s)), s, p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_FOR_7_C(BOOST_PP_BOOL(p(8, s)), s, p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_FOR_8_C(BOOST_PP_BOOL(p(9, s)), s, p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_FOR_9_C(BOOST_PP_BOOL(p(10, s)), s, p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_FOR_10_C(BOOST_PP_BOOL(p(11, s)), s, p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_FOR_11_C(BOOST_PP_BOOL(p(12, s)), s, p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_FOR_12_C(BOOST_PP_BOOL(p(13, s)), s, p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_FOR_13_C(BOOST_PP_BOOL(p(14, s)), s, p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_FOR_14_C(BOOST_PP_BOOL(p(15, s)), s, p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_FOR_15_C(BOOST_PP_BOOL(p(16, s)), s, p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_FOR_16_C(BOOST_PP_BOOL(p(17, s)), s, p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_FOR_17_C(BOOST_PP_BOOL(p(18, s)), s, p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_FOR_18_C(BOOST_PP_BOOL(p(19, s)), s, p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_FOR_19_C(BOOST_PP_BOOL(p(20, s)), s, p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_FOR_20_C(BOOST_PP_BOOL(p(21, s)), s, p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_FOR_21_C(BOOST_PP_BOOL(p(22, s)), s, p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_FOR_22_C(BOOST_PP_BOOL(p(23, s)), s, p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_FOR_23_C(BOOST_PP_BOOL(p(24, s)), s, p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_FOR_24_C(BOOST_PP_BOOL(p(25, s)), s, p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_FOR_25_C(BOOST_PP_BOOL(p(26, s)), s, p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_FOR_26_C(BOOST_PP_BOOL(p(27, s)), s, p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_FOR_27_C(BOOST_PP_BOOL(p(28, s)), s, p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_FOR_28_C(BOOST_PP_BOOL(p(29, s)), s, p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_FOR_29_C(BOOST_PP_BOOL(p(30, s)), s, p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_FOR_30_C(BOOST_PP_BOOL(p(31, s)), s, p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_FOR_31_C(BOOST_PP_BOOL(p(32, s)), s, p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_FOR_32_C(BOOST_PP_BOOL(p(33, s)), s, p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_FOR_33_C(BOOST_PP_BOOL(p(34, s)), s, p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_FOR_34_C(BOOST_PP_BOOL(p(35, s)), s, p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_FOR_35_C(BOOST_PP_BOOL(p(36, s)), s, p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_FOR_36_C(BOOST_PP_BOOL(p(37, s)), s, p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_FOR_37_C(BOOST_PP_BOOL(p(38, s)), s, p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_FOR_38_C(BOOST_PP_BOOL(p(39, s)), s, p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_FOR_39_C(BOOST_PP_BOOL(p(40, s)), s, p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_FOR_40_C(BOOST_PP_BOOL(p(41, s)), s, p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_FOR_41_C(BOOST_PP_BOOL(p(42, s)), s, p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_FOR_42_C(BOOST_PP_BOOL(p(43, s)), s, p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_FOR_43_C(BOOST_PP_BOOL(p(44, s)), s, p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_FOR_44_C(BOOST_PP_BOOL(p(45, s)), s, p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_FOR_45_C(BOOST_PP_BOOL(p(46, s)), s, p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_FOR_46_C(BOOST_PP_BOOL(p(47, s)), s, p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_FOR_47_C(BOOST_PP_BOOL(p(48, s)), s, p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_FOR_48_C(BOOST_PP_BOOL(p(49, s)), s, p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_FOR_49_C(BOOST_PP_BOOL(p(50, s)), s, p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_FOR_50_C(BOOST_PP_BOOL(p(51, s)), s, p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_FOR_51_C(BOOST_PP_BOOL(p(52, s)), s, p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_FOR_52_C(BOOST_PP_BOOL(p(53, s)), s, p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_FOR_53_C(BOOST_PP_BOOL(p(54, s)), s, p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_FOR_54_C(BOOST_PP_BOOL(p(55, s)), s, p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_FOR_55_C(BOOST_PP_BOOL(p(56, s)), s, p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_FOR_56_C(BOOST_PP_BOOL(p(57, s)), s, p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_FOR_57_C(BOOST_PP_BOOL(p(58, s)), s, p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_FOR_58_C(BOOST_PP_BOOL(p(59, s)), s, p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_FOR_59_C(BOOST_PP_BOOL(p(60, s)), s, p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_FOR_60_C(BOOST_PP_BOOL(p(61, s)), s, p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_FOR_61_C(BOOST_PP_BOOL(p(62, s)), s, p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_FOR_62_C(BOOST_PP_BOOL(p(63, s)), s, p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_FOR_63_C(BOOST_PP_BOOL(p(64, s)), s, p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_FOR_64_C(BOOST_PP_BOOL(p(65, s)), s, p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_FOR_65_C(BOOST_PP_BOOL(p(66, s)), s, p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_FOR_66_C(BOOST_PP_BOOL(p(67, s)), s, p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_FOR_67_C(BOOST_PP_BOOL(p(68, s)), s, p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_FOR_68_C(BOOST_PP_BOOL(p(69, s)), s, p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_FOR_69_C(BOOST_PP_BOOL(p(70, s)), s, p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_FOR_70_C(BOOST_PP_BOOL(p(71, s)), s, p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_FOR_71_C(BOOST_PP_BOOL(p(72, s)), s, p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_FOR_72_C(BOOST_PP_BOOL(p(73, s)), s, p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_FOR_73_C(BOOST_PP_BOOL(p(74, s)), s, p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_FOR_74_C(BOOST_PP_BOOL(p(75, s)), s, p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_FOR_75_C(BOOST_PP_BOOL(p(76, s)), s, p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_FOR_76_C(BOOST_PP_BOOL(p(77, s)), s, p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_FOR_77_C(BOOST_PP_BOOL(p(78, s)), s, p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_FOR_78_C(BOOST_PP_BOOL(p(79, s)), s, p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_FOR_79_C(BOOST_PP_BOOL(p(80, s)), s, p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_FOR_80_C(BOOST_PP_BOOL(p(81, s)), s, p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_FOR_81_C(BOOST_PP_BOOL(p(82, s)), s, p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_FOR_82_C(BOOST_PP_BOOL(p(83, s)), s, p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_FOR_83_C(BOOST_PP_BOOL(p(84, s)), s, p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_FOR_84_C(BOOST_PP_BOOL(p(85, s)), s, p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_FOR_85_C(BOOST_PP_BOOL(p(86, s)), s, p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_FOR_86_C(BOOST_PP_BOOL(p(87, s)), s, p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_FOR_87_C(BOOST_PP_BOOL(p(88, s)), s, p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_FOR_88_C(BOOST_PP_BOOL(p(89, s)), s, p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_FOR_89_C(BOOST_PP_BOOL(p(90, s)), s, p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_FOR_90_C(BOOST_PP_BOOL(p(91, s)), s, p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_FOR_91_C(BOOST_PP_BOOL(p(92, s)), s, p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_FOR_92_C(BOOST_PP_BOOL(p(93, s)), s, p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_FOR_93_C(BOOST_PP_BOOL(p(94, s)), s, p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_FOR_94_C(BOOST_PP_BOOL(p(95, s)), s, p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_FOR_95_C(BOOST_PP_BOOL(p(96, s)), s, p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_FOR_96_C(BOOST_PP_BOOL(p(97, s)), s, p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_FOR_97_C(BOOST_PP_BOOL(p(98, s)), s, p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_FOR_98_C(BOOST_PP_BOOL(p(99, s)), s, p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_FOR_99_C(BOOST_PP_BOOL(p(100, s)), s, p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_FOR_100_C(BOOST_PP_BOOL(p(101, s)), s, p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_FOR_101_C(BOOST_PP_BOOL(p(102, s)), s, p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_FOR_102_C(BOOST_PP_BOOL(p(103, s)), s, p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_FOR_103_C(BOOST_PP_BOOL(p(104, s)), s, p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_FOR_104_C(BOOST_PP_BOOL(p(105, s)), s, p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_FOR_105_C(BOOST_PP_BOOL(p(106, s)), s, p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_FOR_106_C(BOOST_PP_BOOL(p(107, s)), s, p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_FOR_107_C(BOOST_PP_BOOL(p(108, s)), s, p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_FOR_108_C(BOOST_PP_BOOL(p(109, s)), s, p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_FOR_109_C(BOOST_PP_BOOL(p(110, s)), s, p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_FOR_110_C(BOOST_PP_BOOL(p(111, s)), s, p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_FOR_111_C(BOOST_PP_BOOL(p(112, s)), s, p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_FOR_112_C(BOOST_PP_BOOL(p(113, s)), s, p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_FOR_113_C(BOOST_PP_BOOL(p(114, s)), s, p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_FOR_114_C(BOOST_PP_BOOL(p(115, s)), s, p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_FOR_115_C(BOOST_PP_BOOL(p(116, s)), s, p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_FOR_116_C(BOOST_PP_BOOL(p(117, s)), s, p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_FOR_117_C(BOOST_PP_BOOL(p(118, s)), s, p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_FOR_118_C(BOOST_PP_BOOL(p(119, s)), s, p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_FOR_119_C(BOOST_PP_BOOL(p(120, s)), s, p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_FOR_120_C(BOOST_PP_BOOL(p(121, s)), s, p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_FOR_121_C(BOOST_PP_BOOL(p(122, s)), s, p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_FOR_122_C(BOOST_PP_BOOL(p(123, s)), s, p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_FOR_123_C(BOOST_PP_BOOL(p(124, s)), s, p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_FOR_124_C(BOOST_PP_BOOL(p(125, s)), s, p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_FOR_125_C(BOOST_PP_BOOL(p(126, s)), s, p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_FOR_126_C(BOOST_PP_BOOL(p(127, s)), s, p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_FOR_127_C(BOOST_PP_BOOL(p(128, s)), s, p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_FOR_128_C(BOOST_PP_BOOL(p(129, s)), s, p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_FOR_129_C(BOOST_PP_BOOL(p(130, s)), s, p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_FOR_130_C(BOOST_PP_BOOL(p(131, s)), s, p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_FOR_131_C(BOOST_PP_BOOL(p(132, s)), s, p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_FOR_132_C(BOOST_PP_BOOL(p(133, s)), s, p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_FOR_133_C(BOOST_PP_BOOL(p(134, s)), s, p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_FOR_134_C(BOOST_PP_BOOL(p(135, s)), s, p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_FOR_135_C(BOOST_PP_BOOL(p(136, s)), s, p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_FOR_136_C(BOOST_PP_BOOL(p(137, s)), s, p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_FOR_137_C(BOOST_PP_BOOL(p(138, s)), s, p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_FOR_138_C(BOOST_PP_BOOL(p(139, s)), s, p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_FOR_139_C(BOOST_PP_BOOL(p(140, s)), s, p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_FOR_140_C(BOOST_PP_BOOL(p(141, s)), s, p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_FOR_141_C(BOOST_PP_BOOL(p(142, s)), s, p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_FOR_142_C(BOOST_PP_BOOL(p(143, s)), s, p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_FOR_143_C(BOOST_PP_BOOL(p(144, s)), s, p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_FOR_144_C(BOOST_PP_BOOL(p(145, s)), s, p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_FOR_145_C(BOOST_PP_BOOL(p(146, s)), s, p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_FOR_146_C(BOOST_PP_BOOL(p(147, s)), s, p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_FOR_147_C(BOOST_PP_BOOL(p(148, s)), s, p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_FOR_148_C(BOOST_PP_BOOL(p(149, s)), s, p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_FOR_149_C(BOOST_PP_BOOL(p(150, s)), s, p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_FOR_150_C(BOOST_PP_BOOL(p(151, s)), s, p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_FOR_151_C(BOOST_PP_BOOL(p(152, s)), s, p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_FOR_152_C(BOOST_PP_BOOL(p(153, s)), s, p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_FOR_153_C(BOOST_PP_BOOL(p(154, s)), s, p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_FOR_154_C(BOOST_PP_BOOL(p(155, s)), s, p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_FOR_155_C(BOOST_PP_BOOL(p(156, s)), s, p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_FOR_156_C(BOOST_PP_BOOL(p(157, s)), s, p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_FOR_157_C(BOOST_PP_BOOL(p(158, s)), s, p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_FOR_158_C(BOOST_PP_BOOL(p(159, s)), s, p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_FOR_159_C(BOOST_PP_BOOL(p(160, s)), s, p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_FOR_160_C(BOOST_PP_BOOL(p(161, s)), s, p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_FOR_161_C(BOOST_PP_BOOL(p(162, s)), s, p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_FOR_162_C(BOOST_PP_BOOL(p(163, s)), s, p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_FOR_163_C(BOOST_PP_BOOL(p(164, s)), s, p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_FOR_164_C(BOOST_PP_BOOL(p(165, s)), s, p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_FOR_165_C(BOOST_PP_BOOL(p(166, s)), s, p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_FOR_166_C(BOOST_PP_BOOL(p(167, s)), s, p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_FOR_167_C(BOOST_PP_BOOL(p(168, s)), s, p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_FOR_168_C(BOOST_PP_BOOL(p(169, s)), s, p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_FOR_169_C(BOOST_PP_BOOL(p(170, s)), s, p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_FOR_170_C(BOOST_PP_BOOL(p(171, s)), s, p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_FOR_171_C(BOOST_PP_BOOL(p(172, s)), s, p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_FOR_172_C(BOOST_PP_BOOL(p(173, s)), s, p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_FOR_173_C(BOOST_PP_BOOL(p(174, s)), s, p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_FOR_174_C(BOOST_PP_BOOL(p(175, s)), s, p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_FOR_175_C(BOOST_PP_BOOL(p(176, s)), s, p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_FOR_176_C(BOOST_PP_BOOL(p(177, s)), s, p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_FOR_177_C(BOOST_PP_BOOL(p(178, s)), s, p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_FOR_178_C(BOOST_PP_BOOL(p(179, s)), s, p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_FOR_179_C(BOOST_PP_BOOL(p(180, s)), s, p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_FOR_180_C(BOOST_PP_BOOL(p(181, s)), s, p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_FOR_181_C(BOOST_PP_BOOL(p(182, s)), s, p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_FOR_182_C(BOOST_PP_BOOL(p(183, s)), s, p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_FOR_183_C(BOOST_PP_BOOL(p(184, s)), s, p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_FOR_184_C(BOOST_PP_BOOL(p(185, s)), s, p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_FOR_185_C(BOOST_PP_BOOL(p(186, s)), s, p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_FOR_186_C(BOOST_PP_BOOL(p(187, s)), s, p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_FOR_187_C(BOOST_PP_BOOL(p(188, s)), s, p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_FOR_188_C(BOOST_PP_BOOL(p(189, s)), s, p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_FOR_189_C(BOOST_PP_BOOL(p(190, s)), s, p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_FOR_190_C(BOOST_PP_BOOL(p(191, s)), s, p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_FOR_191_C(BOOST_PP_BOOL(p(192, s)), s, p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_FOR_192_C(BOOST_PP_BOOL(p(193, s)), s, p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_FOR_193_C(BOOST_PP_BOOL(p(194, s)), s, p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_FOR_194_C(BOOST_PP_BOOL(p(195, s)), s, p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_FOR_195_C(BOOST_PP_BOOL(p(196, s)), s, p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_FOR_196_C(BOOST_PP_BOOL(p(197, s)), s, p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_FOR_197_C(BOOST_PP_BOOL(p(198, s)), s, p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_FOR_198_C(BOOST_PP_BOOL(p(199, s)), s, p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_FOR_199_C(BOOST_PP_BOOL(p(200, s)), s, p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_FOR_200_C(BOOST_PP_BOOL(p(201, s)), s, p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_FOR_201_C(BOOST_PP_BOOL(p(202, s)), s, p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_FOR_202_C(BOOST_PP_BOOL(p(203, s)), s, p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_FOR_203_C(BOOST_PP_BOOL(p(204, s)), s, p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_FOR_204_C(BOOST_PP_BOOL(p(205, s)), s, p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_FOR_205_C(BOOST_PP_BOOL(p(206, s)), s, p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_FOR_206_C(BOOST_PP_BOOL(p(207, s)), s, p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_FOR_207_C(BOOST_PP_BOOL(p(208, s)), s, p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_FOR_208_C(BOOST_PP_BOOL(p(209, s)), s, p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_FOR_209_C(BOOST_PP_BOOL(p(210, s)), s, p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_FOR_210_C(BOOST_PP_BOOL(p(211, s)), s, p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_FOR_211_C(BOOST_PP_BOOL(p(212, s)), s, p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_FOR_212_C(BOOST_PP_BOOL(p(213, s)), s, p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_FOR_213_C(BOOST_PP_BOOL(p(214, s)), s, p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_FOR_214_C(BOOST_PP_BOOL(p(215, s)), s, p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_FOR_215_C(BOOST_PP_BOOL(p(216, s)), s, p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_FOR_216_C(BOOST_PP_BOOL(p(217, s)), s, p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_FOR_217_C(BOOST_PP_BOOL(p(218, s)), s, p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_FOR_218_C(BOOST_PP_BOOL(p(219, s)), s, p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_FOR_219_C(BOOST_PP_BOOL(p(220, s)), s, p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_FOR_220_C(BOOST_PP_BOOL(p(221, s)), s, p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_FOR_221_C(BOOST_PP_BOOL(p(222, s)), s, p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_FOR_222_C(BOOST_PP_BOOL(p(223, s)), s, p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_FOR_223_C(BOOST_PP_BOOL(p(224, s)), s, p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_FOR_224_C(BOOST_PP_BOOL(p(225, s)), s, p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_FOR_225_C(BOOST_PP_BOOL(p(226, s)), s, p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_FOR_226_C(BOOST_PP_BOOL(p(227, s)), s, p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_FOR_227_C(BOOST_PP_BOOL(p(228, s)), s, p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_FOR_228_C(BOOST_PP_BOOL(p(229, s)), s, p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_FOR_229_C(BOOST_PP_BOOL(p(230, s)), s, p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_FOR_230_C(BOOST_PP_BOOL(p(231, s)), s, p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_FOR_231_C(BOOST_PP_BOOL(p(232, s)), s, p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_FOR_232_C(BOOST_PP_BOOL(p(233, s)), s, p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_FOR_233_C(BOOST_PP_BOOL(p(234, s)), s, p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_FOR_234_C(BOOST_PP_BOOL(p(235, s)), s, p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_FOR_235_C(BOOST_PP_BOOL(p(236, s)), s, p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_FOR_236_C(BOOST_PP_BOOL(p(237, s)), s, p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_FOR_237_C(BOOST_PP_BOOL(p(238, s)), s, p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_FOR_238_C(BOOST_PP_BOOL(p(239, s)), s, p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_FOR_239_C(BOOST_PP_BOOL(p(240, s)), s, p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_FOR_240_C(BOOST_PP_BOOL(p(241, s)), s, p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_FOR_241_C(BOOST_PP_BOOL(p(242, s)), s, p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_FOR_242_C(BOOST_PP_BOOL(p(243, s)), s, p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_FOR_243_C(BOOST_PP_BOOL(p(244, s)), s, p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_FOR_244_C(BOOST_PP_BOOL(p(245, s)), s, p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_FOR_245_C(BOOST_PP_BOOL(p(246, s)), s, p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_FOR_246_C(BOOST_PP_BOOL(p(247, s)), s, p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_FOR_247_C(BOOST_PP_BOOL(p(248, s)), s, p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_FOR_248_C(BOOST_PP_BOOL(p(249, s)), s, p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_FOR_249_C(BOOST_PP_BOOL(p(250, s)), s, p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_FOR_250_C(BOOST_PP_BOOL(p(251, s)), s, p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_FOR_251_C(BOOST_PP_BOOL(p(252, s)), s, p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_FOR_252_C(BOOST_PP_BOOL(p(253, s)), s, p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_FOR_253_C(BOOST_PP_BOOL(p(254, s)), s, p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_FOR_254_C(BOOST_PP_BOOL(p(255, s)), s, p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_FOR_255_C(BOOST_PP_BOOL(p(256, s)), s, p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_FOR_256_C(BOOST_PP_BOOL(p(257, s)), s, p, o, m)\n#\n# define BOOST_PP_FOR_1_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IIF(c, BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(2, s), p, o, m)\n# define BOOST_PP_FOR_2_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IIF(c, BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(3, s), p, o, m)\n# define BOOST_PP_FOR_3_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IIF(c, BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(4, s), p, o, m)\n# define BOOST_PP_FOR_4_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IIF(c, BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(5, s), p, o, m)\n# define BOOST_PP_FOR_5_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IIF(c, BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(6, s), p, o, m)\n# define BOOST_PP_FOR_6_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IIF(c, BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(7, s), p, o, m)\n# define BOOST_PP_FOR_7_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IIF(c, BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(8, s), p, o, m)\n# define BOOST_PP_FOR_8_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IIF(c, BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(9, s), p, o, m)\n# define BOOST_PP_FOR_9_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IIF(c, BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(10, s), p, o, m)\n# define BOOST_PP_FOR_10_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IIF(c, BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(11, s), p, o, m)\n# define BOOST_PP_FOR_11_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IIF(c, BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(12, s), p, o, m)\n# define BOOST_PP_FOR_12_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IIF(c, BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(13, s), p, o, m)\n# define BOOST_PP_FOR_13_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IIF(c, BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(14, s), p, o, m)\n# define BOOST_PP_FOR_14_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IIF(c, BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(15, s), p, o, m)\n# define BOOST_PP_FOR_15_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IIF(c, BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(16, s), p, o, m)\n# define BOOST_PP_FOR_16_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IIF(c, BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(17, s), p, o, m)\n# define BOOST_PP_FOR_17_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IIF(c, BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(18, s), p, o, m)\n# define BOOST_PP_FOR_18_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IIF(c, BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(19, s), p, o, m)\n# define BOOST_PP_FOR_19_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IIF(c, BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(20, s), p, o, m)\n# define BOOST_PP_FOR_20_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IIF(c, BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(21, s), p, o, m)\n# define BOOST_PP_FOR_21_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IIF(c, BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(22, s), p, o, m)\n# define BOOST_PP_FOR_22_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IIF(c, BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(23, s), p, o, m)\n# define BOOST_PP_FOR_23_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IIF(c, BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(24, s), p, o, m)\n# define BOOST_PP_FOR_24_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IIF(c, BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(25, s), p, o, m)\n# define BOOST_PP_FOR_25_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IIF(c, BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(26, s), p, o, m)\n# define BOOST_PP_FOR_26_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IIF(c, BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(27, s), p, o, m)\n# define BOOST_PP_FOR_27_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IIF(c, BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(28, s), p, o, m)\n# define BOOST_PP_FOR_28_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IIF(c, BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(29, s), p, o, m)\n# define BOOST_PP_FOR_29_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IIF(c, BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(30, s), p, o, m)\n# define BOOST_PP_FOR_30_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IIF(c, BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(31, s), p, o, m)\n# define BOOST_PP_FOR_31_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IIF(c, BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(32, s), p, o, m)\n# define BOOST_PP_FOR_32_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IIF(c, BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(33, s), p, o, m)\n# define BOOST_PP_FOR_33_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IIF(c, BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(34, s), p, o, m)\n# define BOOST_PP_FOR_34_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IIF(c, BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(35, s), p, o, m)\n# define BOOST_PP_FOR_35_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IIF(c, BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(36, s), p, o, m)\n# define BOOST_PP_FOR_36_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IIF(c, BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(37, s), p, o, m)\n# define BOOST_PP_FOR_37_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IIF(c, BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(38, s), p, o, m)\n# define BOOST_PP_FOR_38_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IIF(c, BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(39, s), p, o, m)\n# define BOOST_PP_FOR_39_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IIF(c, BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(40, s), p, o, m)\n# define BOOST_PP_FOR_40_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IIF(c, BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(41, s), p, o, m)\n# define BOOST_PP_FOR_41_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IIF(c, BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(42, s), p, o, m)\n# define BOOST_PP_FOR_42_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IIF(c, BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(43, s), p, o, m)\n# define BOOST_PP_FOR_43_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IIF(c, BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(44, s), p, o, m)\n# define BOOST_PP_FOR_44_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IIF(c, BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(45, s), p, o, m)\n# define BOOST_PP_FOR_45_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IIF(c, BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(46, s), p, o, m)\n# define BOOST_PP_FOR_46_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IIF(c, BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(47, s), p, o, m)\n# define BOOST_PP_FOR_47_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IIF(c, BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(48, s), p, o, m)\n# define BOOST_PP_FOR_48_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IIF(c, BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(49, s), p, o, m)\n# define BOOST_PP_FOR_49_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IIF(c, BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(50, s), p, o, m)\n# define BOOST_PP_FOR_50_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IIF(c, BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(51, s), p, o, m)\n# define BOOST_PP_FOR_51_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IIF(c, BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(52, s), p, o, m)\n# define BOOST_PP_FOR_52_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IIF(c, BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(53, s), p, o, m)\n# define BOOST_PP_FOR_53_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IIF(c, BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(54, s), p, o, m)\n# define BOOST_PP_FOR_54_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IIF(c, BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(55, s), p, o, m)\n# define BOOST_PP_FOR_55_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IIF(c, BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(56, s), p, o, m)\n# define BOOST_PP_FOR_56_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IIF(c, BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(57, s), p, o, m)\n# define BOOST_PP_FOR_57_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IIF(c, BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(58, s), p, o, m)\n# define BOOST_PP_FOR_58_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IIF(c, BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(59, s), p, o, m)\n# define BOOST_PP_FOR_59_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IIF(c, BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(60, s), p, o, m)\n# define BOOST_PP_FOR_60_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IIF(c, BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(61, s), p, o, m)\n# define BOOST_PP_FOR_61_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IIF(c, BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(62, s), p, o, m)\n# define BOOST_PP_FOR_62_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IIF(c, BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(63, s), p, o, m)\n# define BOOST_PP_FOR_63_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IIF(c, BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(64, s), p, o, m)\n# define BOOST_PP_FOR_64_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IIF(c, BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(65, s), p, o, m)\n# define BOOST_PP_FOR_65_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IIF(c, BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(66, s), p, o, m)\n# define BOOST_PP_FOR_66_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IIF(c, BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(67, s), p, o, m)\n# define BOOST_PP_FOR_67_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IIF(c, BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(68, s), p, o, m)\n# define BOOST_PP_FOR_68_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IIF(c, BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(69, s), p, o, m)\n# define BOOST_PP_FOR_69_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IIF(c, BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(70, s), p, o, m)\n# define BOOST_PP_FOR_70_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IIF(c, BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(71, s), p, o, m)\n# define BOOST_PP_FOR_71_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IIF(c, BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(72, s), p, o, m)\n# define BOOST_PP_FOR_72_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IIF(c, BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(73, s), p, o, m)\n# define BOOST_PP_FOR_73_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IIF(c, BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(74, s), p, o, m)\n# define BOOST_PP_FOR_74_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IIF(c, BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(75, s), p, o, m)\n# define BOOST_PP_FOR_75_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IIF(c, BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(76, s), p, o, m)\n# define BOOST_PP_FOR_76_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IIF(c, BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(77, s), p, o, m)\n# define BOOST_PP_FOR_77_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IIF(c, BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(78, s), p, o, m)\n# define BOOST_PP_FOR_78_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IIF(c, BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(79, s), p, o, m)\n# define BOOST_PP_FOR_79_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IIF(c, BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(80, s), p, o, m)\n# define BOOST_PP_FOR_80_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IIF(c, BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(81, s), p, o, m)\n# define BOOST_PP_FOR_81_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IIF(c, BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(82, s), p, o, m)\n# define BOOST_PP_FOR_82_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IIF(c, BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(83, s), p, o, m)\n# define BOOST_PP_FOR_83_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IIF(c, BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(84, s), p, o, m)\n# define BOOST_PP_FOR_84_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IIF(c, BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(85, s), p, o, m)\n# define BOOST_PP_FOR_85_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IIF(c, BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(86, s), p, o, m)\n# define BOOST_PP_FOR_86_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IIF(c, BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(87, s), p, o, m)\n# define BOOST_PP_FOR_87_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IIF(c, BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(88, s), p, o, m)\n# define BOOST_PP_FOR_88_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IIF(c, BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(89, s), p, o, m)\n# define BOOST_PP_FOR_89_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IIF(c, BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(90, s), p, o, m)\n# define BOOST_PP_FOR_90_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IIF(c, BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(91, s), p, o, m)\n# define BOOST_PP_FOR_91_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IIF(c, BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(92, s), p, o, m)\n# define BOOST_PP_FOR_92_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IIF(c, BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(93, s), p, o, m)\n# define BOOST_PP_FOR_93_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IIF(c, BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(94, s), p, o, m)\n# define BOOST_PP_FOR_94_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IIF(c, BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(95, s), p, o, m)\n# define BOOST_PP_FOR_95_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IIF(c, BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(96, s), p, o, m)\n# define BOOST_PP_FOR_96_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IIF(c, BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(97, s), p, o, m)\n# define BOOST_PP_FOR_97_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IIF(c, BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(98, s), p, o, m)\n# define BOOST_PP_FOR_98_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IIF(c, BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(99, s), p, o, m)\n# define BOOST_PP_FOR_99_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IIF(c, BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(100, s), p, o, m)\n# define BOOST_PP_FOR_100_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IIF(c, BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(101, s), p, o, m)\n# define BOOST_PP_FOR_101_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IIF(c, BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(102, s), p, o, m)\n# define BOOST_PP_FOR_102_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IIF(c, BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(103, s), p, o, m)\n# define BOOST_PP_FOR_103_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IIF(c, BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(104, s), p, o, m)\n# define BOOST_PP_FOR_104_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IIF(c, BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(105, s), p, o, m)\n# define BOOST_PP_FOR_105_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IIF(c, BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(106, s), p, o, m)\n# define BOOST_PP_FOR_106_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IIF(c, BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(107, s), p, o, m)\n# define BOOST_PP_FOR_107_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IIF(c, BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(108, s), p, o, m)\n# define BOOST_PP_FOR_108_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IIF(c, BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(109, s), p, o, m)\n# define BOOST_PP_FOR_109_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IIF(c, BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(110, s), p, o, m)\n# define BOOST_PP_FOR_110_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IIF(c, BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(111, s), p, o, m)\n# define BOOST_PP_FOR_111_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IIF(c, BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(112, s), p, o, m)\n# define BOOST_PP_FOR_112_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IIF(c, BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(113, s), p, o, m)\n# define BOOST_PP_FOR_113_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IIF(c, BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(114, s), p, o, m)\n# define BOOST_PP_FOR_114_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IIF(c, BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(115, s), p, o, m)\n# define BOOST_PP_FOR_115_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IIF(c, BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(116, s), p, o, m)\n# define BOOST_PP_FOR_116_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IIF(c, BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(117, s), p, o, m)\n# define BOOST_PP_FOR_117_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IIF(c, BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(118, s), p, o, m)\n# define BOOST_PP_FOR_118_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IIF(c, BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(119, s), p, o, m)\n# define BOOST_PP_FOR_119_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IIF(c, BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(120, s), p, o, m)\n# define BOOST_PP_FOR_120_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IIF(c, BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(121, s), p, o, m)\n# define BOOST_PP_FOR_121_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IIF(c, BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(122, s), p, o, m)\n# define BOOST_PP_FOR_122_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IIF(c, BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(123, s), p, o, m)\n# define BOOST_PP_FOR_123_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IIF(c, BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(124, s), p, o, m)\n# define BOOST_PP_FOR_124_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IIF(c, BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(125, s), p, o, m)\n# define BOOST_PP_FOR_125_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IIF(c, BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(126, s), p, o, m)\n# define BOOST_PP_FOR_126_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IIF(c, BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(127, s), p, o, m)\n# define BOOST_PP_FOR_127_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IIF(c, BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(128, s), p, o, m)\n# define BOOST_PP_FOR_128_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IIF(c, BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(129, s), p, o, m)\n# define BOOST_PP_FOR_129_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IIF(c, BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(130, s), p, o, m)\n# define BOOST_PP_FOR_130_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IIF(c, BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(131, s), p, o, m)\n# define BOOST_PP_FOR_131_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IIF(c, BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(132, s), p, o, m)\n# define BOOST_PP_FOR_132_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IIF(c, BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(133, s), p, o, m)\n# define BOOST_PP_FOR_133_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IIF(c, BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(134, s), p, o, m)\n# define BOOST_PP_FOR_134_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IIF(c, BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(135, s), p, o, m)\n# define BOOST_PP_FOR_135_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IIF(c, BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(136, s), p, o, m)\n# define BOOST_PP_FOR_136_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IIF(c, BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(137, s), p, o, m)\n# define BOOST_PP_FOR_137_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IIF(c, BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(138, s), p, o, m)\n# define BOOST_PP_FOR_138_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IIF(c, BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(139, s), p, o, m)\n# define BOOST_PP_FOR_139_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IIF(c, BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(140, s), p, o, m)\n# define BOOST_PP_FOR_140_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IIF(c, BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(141, s), p, o, m)\n# define BOOST_PP_FOR_141_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IIF(c, BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(142, s), p, o, m)\n# define BOOST_PP_FOR_142_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IIF(c, BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(143, s), p, o, m)\n# define BOOST_PP_FOR_143_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IIF(c, BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(144, s), p, o, m)\n# define BOOST_PP_FOR_144_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IIF(c, BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(145, s), p, o, m)\n# define BOOST_PP_FOR_145_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IIF(c, BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(146, s), p, o, m)\n# define BOOST_PP_FOR_146_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IIF(c, BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(147, s), p, o, m)\n# define BOOST_PP_FOR_147_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IIF(c, BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(148, s), p, o, m)\n# define BOOST_PP_FOR_148_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IIF(c, BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(149, s), p, o, m)\n# define BOOST_PP_FOR_149_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IIF(c, BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(150, s), p, o, m)\n# define BOOST_PP_FOR_150_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IIF(c, BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(151, s), p, o, m)\n# define BOOST_PP_FOR_151_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IIF(c, BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(152, s), p, o, m)\n# define BOOST_PP_FOR_152_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IIF(c, BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(153, s), p, o, m)\n# define BOOST_PP_FOR_153_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IIF(c, BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(154, s), p, o, m)\n# define BOOST_PP_FOR_154_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IIF(c, BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(155, s), p, o, m)\n# define BOOST_PP_FOR_155_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IIF(c, BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(156, s), p, o, m)\n# define BOOST_PP_FOR_156_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IIF(c, BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(157, s), p, o, m)\n# define BOOST_PP_FOR_157_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IIF(c, BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(158, s), p, o, m)\n# define BOOST_PP_FOR_158_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IIF(c, BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(159, s), p, o, m)\n# define BOOST_PP_FOR_159_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IIF(c, BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(160, s), p, o, m)\n# define BOOST_PP_FOR_160_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IIF(c, BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(161, s), p, o, m)\n# define BOOST_PP_FOR_161_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IIF(c, BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(162, s), p, o, m)\n# define BOOST_PP_FOR_162_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IIF(c, BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(163, s), p, o, m)\n# define BOOST_PP_FOR_163_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IIF(c, BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(164, s), p, o, m)\n# define BOOST_PP_FOR_164_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IIF(c, BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(165, s), p, o, m)\n# define BOOST_PP_FOR_165_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IIF(c, BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(166, s), p, o, m)\n# define BOOST_PP_FOR_166_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IIF(c, BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(167, s), p, o, m)\n# define BOOST_PP_FOR_167_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IIF(c, BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(168, s), p, o, m)\n# define BOOST_PP_FOR_168_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IIF(c, BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(169, s), p, o, m)\n# define BOOST_PP_FOR_169_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IIF(c, BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(170, s), p, o, m)\n# define BOOST_PP_FOR_170_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IIF(c, BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(171, s), p, o, m)\n# define BOOST_PP_FOR_171_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IIF(c, BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(172, s), p, o, m)\n# define BOOST_PP_FOR_172_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IIF(c, BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(173, s), p, o, m)\n# define BOOST_PP_FOR_173_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IIF(c, BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(174, s), p, o, m)\n# define BOOST_PP_FOR_174_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IIF(c, BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(175, s), p, o, m)\n# define BOOST_PP_FOR_175_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IIF(c, BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(176, s), p, o, m)\n# define BOOST_PP_FOR_176_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IIF(c, BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(177, s), p, o, m)\n# define BOOST_PP_FOR_177_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IIF(c, BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(178, s), p, o, m)\n# define BOOST_PP_FOR_178_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IIF(c, BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(179, s), p, o, m)\n# define BOOST_PP_FOR_179_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IIF(c, BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(180, s), p, o, m)\n# define BOOST_PP_FOR_180_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IIF(c, BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(181, s), p, o, m)\n# define BOOST_PP_FOR_181_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IIF(c, BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(182, s), p, o, m)\n# define BOOST_PP_FOR_182_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IIF(c, BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(183, s), p, o, m)\n# define BOOST_PP_FOR_183_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IIF(c, BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(184, s), p, o, m)\n# define BOOST_PP_FOR_184_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IIF(c, BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(185, s), p, o, m)\n# define BOOST_PP_FOR_185_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IIF(c, BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(186, s), p, o, m)\n# define BOOST_PP_FOR_186_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IIF(c, BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(187, s), p, o, m)\n# define BOOST_PP_FOR_187_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IIF(c, BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(188, s), p, o, m)\n# define BOOST_PP_FOR_188_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IIF(c, BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(189, s), p, o, m)\n# define BOOST_PP_FOR_189_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IIF(c, BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(190, s), p, o, m)\n# define BOOST_PP_FOR_190_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IIF(c, BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(191, s), p, o, m)\n# define BOOST_PP_FOR_191_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IIF(c, BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(192, s), p, o, m)\n# define BOOST_PP_FOR_192_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IIF(c, BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(193, s), p, o, m)\n# define BOOST_PP_FOR_193_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IIF(c, BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(194, s), p, o, m)\n# define BOOST_PP_FOR_194_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IIF(c, BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(195, s), p, o, m)\n# define BOOST_PP_FOR_195_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IIF(c, BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(196, s), p, o, m)\n# define BOOST_PP_FOR_196_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IIF(c, BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(197, s), p, o, m)\n# define BOOST_PP_FOR_197_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IIF(c, BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(198, s), p, o, m)\n# define BOOST_PP_FOR_198_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IIF(c, BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(199, s), p, o, m)\n# define BOOST_PP_FOR_199_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IIF(c, BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(200, s), p, o, m)\n# define BOOST_PP_FOR_200_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IIF(c, BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(201, s), p, o, m)\n# define BOOST_PP_FOR_201_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IIF(c, BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(202, s), p, o, m)\n# define BOOST_PP_FOR_202_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IIF(c, BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(203, s), p, o, m)\n# define BOOST_PP_FOR_203_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IIF(c, BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(204, s), p, o, m)\n# define BOOST_PP_FOR_204_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IIF(c, BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(205, s), p, o, m)\n# define BOOST_PP_FOR_205_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IIF(c, BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(206, s), p, o, m)\n# define BOOST_PP_FOR_206_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IIF(c, BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(207, s), p, o, m)\n# define BOOST_PP_FOR_207_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IIF(c, BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(208, s), p, o, m)\n# define BOOST_PP_FOR_208_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IIF(c, BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(209, s), p, o, m)\n# define BOOST_PP_FOR_209_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IIF(c, BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(210, s), p, o, m)\n# define BOOST_PP_FOR_210_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IIF(c, BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(211, s), p, o, m)\n# define BOOST_PP_FOR_211_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IIF(c, BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(212, s), p, o, m)\n# define BOOST_PP_FOR_212_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IIF(c, BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(213, s), p, o, m)\n# define BOOST_PP_FOR_213_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IIF(c, BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(214, s), p, o, m)\n# define BOOST_PP_FOR_214_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IIF(c, BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(215, s), p, o, m)\n# define BOOST_PP_FOR_215_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IIF(c, BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(216, s), p, o, m)\n# define BOOST_PP_FOR_216_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IIF(c, BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(217, s), p, o, m)\n# define BOOST_PP_FOR_217_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IIF(c, BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(218, s), p, o, m)\n# define BOOST_PP_FOR_218_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IIF(c, BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(219, s), p, o, m)\n# define BOOST_PP_FOR_219_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IIF(c, BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(220, s), p, o, m)\n# define BOOST_PP_FOR_220_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IIF(c, BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(221, s), p, o, m)\n# define BOOST_PP_FOR_221_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IIF(c, BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(222, s), p, o, m)\n# define BOOST_PP_FOR_222_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IIF(c, BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(223, s), p, o, m)\n# define BOOST_PP_FOR_223_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IIF(c, BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(224, s), p, o, m)\n# define BOOST_PP_FOR_224_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IIF(c, BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(225, s), p, o, m)\n# define BOOST_PP_FOR_225_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IIF(c, BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(226, s), p, o, m)\n# define BOOST_PP_FOR_226_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IIF(c, BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(227, s), p, o, m)\n# define BOOST_PP_FOR_227_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IIF(c, BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(228, s), p, o, m)\n# define BOOST_PP_FOR_228_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IIF(c, BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(229, s), p, o, m)\n# define BOOST_PP_FOR_229_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IIF(c, BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(230, s), p, o, m)\n# define BOOST_PP_FOR_230_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IIF(c, BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(231, s), p, o, m)\n# define BOOST_PP_FOR_231_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IIF(c, BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(232, s), p, o, m)\n# define BOOST_PP_FOR_232_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IIF(c, BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(233, s), p, o, m)\n# define BOOST_PP_FOR_233_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IIF(c, BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(234, s), p, o, m)\n# define BOOST_PP_FOR_234_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IIF(c, BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(235, s), p, o, m)\n# define BOOST_PP_FOR_235_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IIF(c, BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(236, s), p, o, m)\n# define BOOST_PP_FOR_236_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IIF(c, BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(237, s), p, o, m)\n# define BOOST_PP_FOR_237_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IIF(c, BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(238, s), p, o, m)\n# define BOOST_PP_FOR_238_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IIF(c, BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(239, s), p, o, m)\n# define BOOST_PP_FOR_239_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IIF(c, BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(240, s), p, o, m)\n# define BOOST_PP_FOR_240_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IIF(c, BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(241, s), p, o, m)\n# define BOOST_PP_FOR_241_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IIF(c, BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(242, s), p, o, m)\n# define BOOST_PP_FOR_242_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IIF(c, BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(243, s), p, o, m)\n# define BOOST_PP_FOR_243_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IIF(c, BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(244, s), p, o, m)\n# define BOOST_PP_FOR_244_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IIF(c, BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(245, s), p, o, m)\n# define BOOST_PP_FOR_245_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IIF(c, BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(246, s), p, o, m)\n# define BOOST_PP_FOR_246_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IIF(c, BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(247, s), p, o, m)\n# define BOOST_PP_FOR_247_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IIF(c, BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(248, s), p, o, m)\n# define BOOST_PP_FOR_248_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IIF(c, BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(249, s), p, o, m)\n# define BOOST_PP_FOR_249_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IIF(c, BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(250, s), p, o, m)\n# define BOOST_PP_FOR_250_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IIF(c, BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(251, s), p, o, m)\n# define BOOST_PP_FOR_251_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IIF(c, BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(252, s), p, o, m)\n# define BOOST_PP_FOR_252_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IIF(c, BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(253, s), p, o, m)\n# define BOOST_PP_FOR_253_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IIF(c, BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(254, s), p, o, m)\n# define BOOST_PP_FOR_254_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IIF(c, BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(255, s), p, o, m)\n# define BOOST_PP_FOR_255_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IIF(c, BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(256, s), p, o, m)\n# define BOOST_PP_FOR_256_C(c, s, p, o, m) BOOST_PP_IIF(c, m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IIF(c, BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(BOOST_PP_EXPR_IIF(c, o)(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/detail/msvc/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_DETAIL_MSVC_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_DETAIL_MSVC_FOR_HPP\n#\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# define BOOST_PP_FOR_1(s, p, o, m) BOOST_PP_IF(p(2, s), m, BOOST_PP_TUPLE_EAT_2)(2, s) BOOST_PP_IF(p(2, s), BOOST_PP_FOR_2, BOOST_PP_TUPLE_EAT_4)(o(2, s), p, o, m)\n# define BOOST_PP_FOR_2(s, p, o, m) BOOST_PP_IF(p(3, s), m, BOOST_PP_TUPLE_EAT_2)(3, s) BOOST_PP_IF(p(3, s), BOOST_PP_FOR_3, BOOST_PP_TUPLE_EAT_4)(o(3, s), p, o, m)\n# define BOOST_PP_FOR_3(s, p, o, m) BOOST_PP_IF(p(4, s), m, BOOST_PP_TUPLE_EAT_2)(4, s) BOOST_PP_IF(p(4, s), BOOST_PP_FOR_4, BOOST_PP_TUPLE_EAT_4)(o(4, s), p, o, m)\n# define BOOST_PP_FOR_4(s, p, o, m) BOOST_PP_IF(p(5, s), m, BOOST_PP_TUPLE_EAT_2)(5, s) BOOST_PP_IF(p(5, s), BOOST_PP_FOR_5, BOOST_PP_TUPLE_EAT_4)(o(5, s), p, o, m)\n# define BOOST_PP_FOR_5(s, p, o, m) BOOST_PP_IF(p(6, s), m, BOOST_PP_TUPLE_EAT_2)(6, s) BOOST_PP_IF(p(6, s), BOOST_PP_FOR_6, BOOST_PP_TUPLE_EAT_4)(o(6, s), p, o, m)\n# define BOOST_PP_FOR_6(s, p, o, m) BOOST_PP_IF(p(7, s), m, BOOST_PP_TUPLE_EAT_2)(7, s) BOOST_PP_IF(p(7, s), BOOST_PP_FOR_7, BOOST_PP_TUPLE_EAT_4)(o(7, s), p, o, m)\n# define BOOST_PP_FOR_7(s, p, o, m) BOOST_PP_IF(p(8, s), m, BOOST_PP_TUPLE_EAT_2)(8, s) BOOST_PP_IF(p(8, s), BOOST_PP_FOR_8, BOOST_PP_TUPLE_EAT_4)(o(8, s), p, o, m)\n# define BOOST_PP_FOR_8(s, p, o, m) BOOST_PP_IF(p(9, s), m, BOOST_PP_TUPLE_EAT_2)(9, s) BOOST_PP_IF(p(9, s), BOOST_PP_FOR_9, BOOST_PP_TUPLE_EAT_4)(o(9, s), p, o, m)\n# define BOOST_PP_FOR_9(s, p, o, m) BOOST_PP_IF(p(10, s), m, BOOST_PP_TUPLE_EAT_2)(10, s) BOOST_PP_IF(p(10, s), BOOST_PP_FOR_10, BOOST_PP_TUPLE_EAT_4)(o(10, s), p, o, m)\n# define BOOST_PP_FOR_10(s, p, o, m) BOOST_PP_IF(p(11, s), m, BOOST_PP_TUPLE_EAT_2)(11, s) BOOST_PP_IF(p(11, s), BOOST_PP_FOR_11, BOOST_PP_TUPLE_EAT_4)(o(11, s), p, o, m)\n# define BOOST_PP_FOR_11(s, p, o, m) BOOST_PP_IF(p(12, s), m, BOOST_PP_TUPLE_EAT_2)(12, s) BOOST_PP_IF(p(12, s), BOOST_PP_FOR_12, BOOST_PP_TUPLE_EAT_4)(o(12, s), p, o, m)\n# define BOOST_PP_FOR_12(s, p, o, m) BOOST_PP_IF(p(13, s), m, BOOST_PP_TUPLE_EAT_2)(13, s) BOOST_PP_IF(p(13, s), BOOST_PP_FOR_13, BOOST_PP_TUPLE_EAT_4)(o(13, s), p, o, m)\n# define BOOST_PP_FOR_13(s, p, o, m) BOOST_PP_IF(p(14, s), m, BOOST_PP_TUPLE_EAT_2)(14, s) BOOST_PP_IF(p(14, s), BOOST_PP_FOR_14, BOOST_PP_TUPLE_EAT_4)(o(14, s), p, o, m)\n# define BOOST_PP_FOR_14(s, p, o, m) BOOST_PP_IF(p(15, s), m, BOOST_PP_TUPLE_EAT_2)(15, s) BOOST_PP_IF(p(15, s), BOOST_PP_FOR_15, BOOST_PP_TUPLE_EAT_4)(o(15, s), p, o, m)\n# define BOOST_PP_FOR_15(s, p, o, m) BOOST_PP_IF(p(16, s), m, BOOST_PP_TUPLE_EAT_2)(16, s) BOOST_PP_IF(p(16, s), BOOST_PP_FOR_16, BOOST_PP_TUPLE_EAT_4)(o(16, s), p, o, m)\n# define BOOST_PP_FOR_16(s, p, o, m) BOOST_PP_IF(p(17, s), m, BOOST_PP_TUPLE_EAT_2)(17, s) BOOST_PP_IF(p(17, s), BOOST_PP_FOR_17, BOOST_PP_TUPLE_EAT_4)(o(17, s), p, o, m)\n# define BOOST_PP_FOR_17(s, p, o, m) BOOST_PP_IF(p(18, s), m, BOOST_PP_TUPLE_EAT_2)(18, s) BOOST_PP_IF(p(18, s), BOOST_PP_FOR_18, BOOST_PP_TUPLE_EAT_4)(o(18, s), p, o, m)\n# define BOOST_PP_FOR_18(s, p, o, m) BOOST_PP_IF(p(19, s), m, BOOST_PP_TUPLE_EAT_2)(19, s) BOOST_PP_IF(p(19, s), BOOST_PP_FOR_19, BOOST_PP_TUPLE_EAT_4)(o(19, s), p, o, m)\n# define BOOST_PP_FOR_19(s, p, o, m) BOOST_PP_IF(p(20, s), m, BOOST_PP_TUPLE_EAT_2)(20, s) BOOST_PP_IF(p(20, s), BOOST_PP_FOR_20, BOOST_PP_TUPLE_EAT_4)(o(20, s), p, o, m)\n# define BOOST_PP_FOR_20(s, p, o, m) BOOST_PP_IF(p(21, s), m, BOOST_PP_TUPLE_EAT_2)(21, s) BOOST_PP_IF(p(21, s), BOOST_PP_FOR_21, BOOST_PP_TUPLE_EAT_4)(o(21, s), p, o, m)\n# define BOOST_PP_FOR_21(s, p, o, m) BOOST_PP_IF(p(22, s), m, BOOST_PP_TUPLE_EAT_2)(22, s) BOOST_PP_IF(p(22, s), BOOST_PP_FOR_22, BOOST_PP_TUPLE_EAT_4)(o(22, s), p, o, m)\n# define BOOST_PP_FOR_22(s, p, o, m) BOOST_PP_IF(p(23, s), m, BOOST_PP_TUPLE_EAT_2)(23, s) BOOST_PP_IF(p(23, s), BOOST_PP_FOR_23, BOOST_PP_TUPLE_EAT_4)(o(23, s), p, o, m)\n# define BOOST_PP_FOR_23(s, p, o, m) BOOST_PP_IF(p(24, s), m, BOOST_PP_TUPLE_EAT_2)(24, s) BOOST_PP_IF(p(24, s), BOOST_PP_FOR_24, BOOST_PP_TUPLE_EAT_4)(o(24, s), p, o, m)\n# define BOOST_PP_FOR_24(s, p, o, m) BOOST_PP_IF(p(25, s), m, BOOST_PP_TUPLE_EAT_2)(25, s) BOOST_PP_IF(p(25, s), BOOST_PP_FOR_25, BOOST_PP_TUPLE_EAT_4)(o(25, s), p, o, m)\n# define BOOST_PP_FOR_25(s, p, o, m) BOOST_PP_IF(p(26, s), m, BOOST_PP_TUPLE_EAT_2)(26, s) BOOST_PP_IF(p(26, s), BOOST_PP_FOR_26, BOOST_PP_TUPLE_EAT_4)(o(26, s), p, o, m)\n# define BOOST_PP_FOR_26(s, p, o, m) BOOST_PP_IF(p(27, s), m, BOOST_PP_TUPLE_EAT_2)(27, s) BOOST_PP_IF(p(27, s), BOOST_PP_FOR_27, BOOST_PP_TUPLE_EAT_4)(o(27, s), p, o, m)\n# define BOOST_PP_FOR_27(s, p, o, m) BOOST_PP_IF(p(28, s), m, BOOST_PP_TUPLE_EAT_2)(28, s) BOOST_PP_IF(p(28, s), BOOST_PP_FOR_28, BOOST_PP_TUPLE_EAT_4)(o(28, s), p, o, m)\n# define BOOST_PP_FOR_28(s, p, o, m) BOOST_PP_IF(p(29, s), m, BOOST_PP_TUPLE_EAT_2)(29, s) BOOST_PP_IF(p(29, s), BOOST_PP_FOR_29, BOOST_PP_TUPLE_EAT_4)(o(29, s), p, o, m)\n# define BOOST_PP_FOR_29(s, p, o, m) BOOST_PP_IF(p(30, s), m, BOOST_PP_TUPLE_EAT_2)(30, s) BOOST_PP_IF(p(30, s), BOOST_PP_FOR_30, BOOST_PP_TUPLE_EAT_4)(o(30, s), p, o, m)\n# define BOOST_PP_FOR_30(s, p, o, m) BOOST_PP_IF(p(31, s), m, BOOST_PP_TUPLE_EAT_2)(31, s) BOOST_PP_IF(p(31, s), BOOST_PP_FOR_31, BOOST_PP_TUPLE_EAT_4)(o(31, s), p, o, m)\n# define BOOST_PP_FOR_31(s, p, o, m) BOOST_PP_IF(p(32, s), m, BOOST_PP_TUPLE_EAT_2)(32, s) BOOST_PP_IF(p(32, s), BOOST_PP_FOR_32, BOOST_PP_TUPLE_EAT_4)(o(32, s), p, o, m)\n# define BOOST_PP_FOR_32(s, p, o, m) BOOST_PP_IF(p(33, s), m, BOOST_PP_TUPLE_EAT_2)(33, s) BOOST_PP_IF(p(33, s), BOOST_PP_FOR_33, BOOST_PP_TUPLE_EAT_4)(o(33, s), p, o, m)\n# define BOOST_PP_FOR_33(s, p, o, m) BOOST_PP_IF(p(34, s), m, BOOST_PP_TUPLE_EAT_2)(34, s) BOOST_PP_IF(p(34, s), BOOST_PP_FOR_34, BOOST_PP_TUPLE_EAT_4)(o(34, s), p, o, m)\n# define BOOST_PP_FOR_34(s, p, o, m) BOOST_PP_IF(p(35, s), m, BOOST_PP_TUPLE_EAT_2)(35, s) BOOST_PP_IF(p(35, s), BOOST_PP_FOR_35, BOOST_PP_TUPLE_EAT_4)(o(35, s), p, o, m)\n# define BOOST_PP_FOR_35(s, p, o, m) BOOST_PP_IF(p(36, s), m, BOOST_PP_TUPLE_EAT_2)(36, s) BOOST_PP_IF(p(36, s), BOOST_PP_FOR_36, BOOST_PP_TUPLE_EAT_4)(o(36, s), p, o, m)\n# define BOOST_PP_FOR_36(s, p, o, m) BOOST_PP_IF(p(37, s), m, BOOST_PP_TUPLE_EAT_2)(37, s) BOOST_PP_IF(p(37, s), BOOST_PP_FOR_37, BOOST_PP_TUPLE_EAT_4)(o(37, s), p, o, m)\n# define BOOST_PP_FOR_37(s, p, o, m) BOOST_PP_IF(p(38, s), m, BOOST_PP_TUPLE_EAT_2)(38, s) BOOST_PP_IF(p(38, s), BOOST_PP_FOR_38, BOOST_PP_TUPLE_EAT_4)(o(38, s), p, o, m)\n# define BOOST_PP_FOR_38(s, p, o, m) BOOST_PP_IF(p(39, s), m, BOOST_PP_TUPLE_EAT_2)(39, s) BOOST_PP_IF(p(39, s), BOOST_PP_FOR_39, BOOST_PP_TUPLE_EAT_4)(o(39, s), p, o, m)\n# define BOOST_PP_FOR_39(s, p, o, m) BOOST_PP_IF(p(40, s), m, BOOST_PP_TUPLE_EAT_2)(40, s) BOOST_PP_IF(p(40, s), BOOST_PP_FOR_40, BOOST_PP_TUPLE_EAT_4)(o(40, s), p, o, m)\n# define BOOST_PP_FOR_40(s, p, o, m) BOOST_PP_IF(p(41, s), m, BOOST_PP_TUPLE_EAT_2)(41, s) BOOST_PP_IF(p(41, s), BOOST_PP_FOR_41, BOOST_PP_TUPLE_EAT_4)(o(41, s), p, o, m)\n# define BOOST_PP_FOR_41(s, p, o, m) BOOST_PP_IF(p(42, s), m, BOOST_PP_TUPLE_EAT_2)(42, s) BOOST_PP_IF(p(42, s), BOOST_PP_FOR_42, BOOST_PP_TUPLE_EAT_4)(o(42, s), p, o, m)\n# define BOOST_PP_FOR_42(s, p, o, m) BOOST_PP_IF(p(43, s), m, BOOST_PP_TUPLE_EAT_2)(43, s) BOOST_PP_IF(p(43, s), BOOST_PP_FOR_43, BOOST_PP_TUPLE_EAT_4)(o(43, s), p, o, m)\n# define BOOST_PP_FOR_43(s, p, o, m) BOOST_PP_IF(p(44, s), m, BOOST_PP_TUPLE_EAT_2)(44, s) BOOST_PP_IF(p(44, s), BOOST_PP_FOR_44, BOOST_PP_TUPLE_EAT_4)(o(44, s), p, o, m)\n# define BOOST_PP_FOR_44(s, p, o, m) BOOST_PP_IF(p(45, s), m, BOOST_PP_TUPLE_EAT_2)(45, s) BOOST_PP_IF(p(45, s), BOOST_PP_FOR_45, BOOST_PP_TUPLE_EAT_4)(o(45, s), p, o, m)\n# define BOOST_PP_FOR_45(s, p, o, m) BOOST_PP_IF(p(46, s), m, BOOST_PP_TUPLE_EAT_2)(46, s) BOOST_PP_IF(p(46, s), BOOST_PP_FOR_46, BOOST_PP_TUPLE_EAT_4)(o(46, s), p, o, m)\n# define BOOST_PP_FOR_46(s, p, o, m) BOOST_PP_IF(p(47, s), m, BOOST_PP_TUPLE_EAT_2)(47, s) BOOST_PP_IF(p(47, s), BOOST_PP_FOR_47, BOOST_PP_TUPLE_EAT_4)(o(47, s), p, o, m)\n# define BOOST_PP_FOR_47(s, p, o, m) BOOST_PP_IF(p(48, s), m, BOOST_PP_TUPLE_EAT_2)(48, s) BOOST_PP_IF(p(48, s), BOOST_PP_FOR_48, BOOST_PP_TUPLE_EAT_4)(o(48, s), p, o, m)\n# define BOOST_PP_FOR_48(s, p, o, m) BOOST_PP_IF(p(49, s), m, BOOST_PP_TUPLE_EAT_2)(49, s) BOOST_PP_IF(p(49, s), BOOST_PP_FOR_49, BOOST_PP_TUPLE_EAT_4)(o(49, s), p, o, m)\n# define BOOST_PP_FOR_49(s, p, o, m) BOOST_PP_IF(p(50, s), m, BOOST_PP_TUPLE_EAT_2)(50, s) BOOST_PP_IF(p(50, s), BOOST_PP_FOR_50, BOOST_PP_TUPLE_EAT_4)(o(50, s), p, o, m)\n# define BOOST_PP_FOR_50(s, p, o, m) BOOST_PP_IF(p(51, s), m, BOOST_PP_TUPLE_EAT_2)(51, s) BOOST_PP_IF(p(51, s), BOOST_PP_FOR_51, BOOST_PP_TUPLE_EAT_4)(o(51, s), p, o, m)\n# define BOOST_PP_FOR_51(s, p, o, m) BOOST_PP_IF(p(52, s), m, BOOST_PP_TUPLE_EAT_2)(52, s) BOOST_PP_IF(p(52, s), BOOST_PP_FOR_52, BOOST_PP_TUPLE_EAT_4)(o(52, s), p, o, m)\n# define BOOST_PP_FOR_52(s, p, o, m) BOOST_PP_IF(p(53, s), m, BOOST_PP_TUPLE_EAT_2)(53, s) BOOST_PP_IF(p(53, s), BOOST_PP_FOR_53, BOOST_PP_TUPLE_EAT_4)(o(53, s), p, o, m)\n# define BOOST_PP_FOR_53(s, p, o, m) BOOST_PP_IF(p(54, s), m, BOOST_PP_TUPLE_EAT_2)(54, s) BOOST_PP_IF(p(54, s), BOOST_PP_FOR_54, BOOST_PP_TUPLE_EAT_4)(o(54, s), p, o, m)\n# define BOOST_PP_FOR_54(s, p, o, m) BOOST_PP_IF(p(55, s), m, BOOST_PP_TUPLE_EAT_2)(55, s) BOOST_PP_IF(p(55, s), BOOST_PP_FOR_55, BOOST_PP_TUPLE_EAT_4)(o(55, s), p, o, m)\n# define BOOST_PP_FOR_55(s, p, o, m) BOOST_PP_IF(p(56, s), m, BOOST_PP_TUPLE_EAT_2)(56, s) BOOST_PP_IF(p(56, s), BOOST_PP_FOR_56, BOOST_PP_TUPLE_EAT_4)(o(56, s), p, o, m)\n# define BOOST_PP_FOR_56(s, p, o, m) BOOST_PP_IF(p(57, s), m, BOOST_PP_TUPLE_EAT_2)(57, s) BOOST_PP_IF(p(57, s), BOOST_PP_FOR_57, BOOST_PP_TUPLE_EAT_4)(o(57, s), p, o, m)\n# define BOOST_PP_FOR_57(s, p, o, m) BOOST_PP_IF(p(58, s), m, BOOST_PP_TUPLE_EAT_2)(58, s) BOOST_PP_IF(p(58, s), BOOST_PP_FOR_58, BOOST_PP_TUPLE_EAT_4)(o(58, s), p, o, m)\n# define BOOST_PP_FOR_58(s, p, o, m) BOOST_PP_IF(p(59, s), m, BOOST_PP_TUPLE_EAT_2)(59, s) BOOST_PP_IF(p(59, s), BOOST_PP_FOR_59, BOOST_PP_TUPLE_EAT_4)(o(59, s), p, o, m)\n# define BOOST_PP_FOR_59(s, p, o, m) BOOST_PP_IF(p(60, s), m, BOOST_PP_TUPLE_EAT_2)(60, s) BOOST_PP_IF(p(60, s), BOOST_PP_FOR_60, BOOST_PP_TUPLE_EAT_4)(o(60, s), p, o, m)\n# define BOOST_PP_FOR_60(s, p, o, m) BOOST_PP_IF(p(61, s), m, BOOST_PP_TUPLE_EAT_2)(61, s) BOOST_PP_IF(p(61, s), BOOST_PP_FOR_61, BOOST_PP_TUPLE_EAT_4)(o(61, s), p, o, m)\n# define BOOST_PP_FOR_61(s, p, o, m) BOOST_PP_IF(p(62, s), m, BOOST_PP_TUPLE_EAT_2)(62, s) BOOST_PP_IF(p(62, s), BOOST_PP_FOR_62, BOOST_PP_TUPLE_EAT_4)(o(62, s), p, o, m)\n# define BOOST_PP_FOR_62(s, p, o, m) BOOST_PP_IF(p(63, s), m, BOOST_PP_TUPLE_EAT_2)(63, s) BOOST_PP_IF(p(63, s), BOOST_PP_FOR_63, BOOST_PP_TUPLE_EAT_4)(o(63, s), p, o, m)\n# define BOOST_PP_FOR_63(s, p, o, m) BOOST_PP_IF(p(64, s), m, BOOST_PP_TUPLE_EAT_2)(64, s) BOOST_PP_IF(p(64, s), BOOST_PP_FOR_64, BOOST_PP_TUPLE_EAT_4)(o(64, s), p, o, m)\n# define BOOST_PP_FOR_64(s, p, o, m) BOOST_PP_IF(p(65, s), m, BOOST_PP_TUPLE_EAT_2)(65, s) BOOST_PP_IF(p(65, s), BOOST_PP_FOR_65, BOOST_PP_TUPLE_EAT_4)(o(65, s), p, o, m)\n# define BOOST_PP_FOR_65(s, p, o, m) BOOST_PP_IF(p(66, s), m, BOOST_PP_TUPLE_EAT_2)(66, s) BOOST_PP_IF(p(66, s), BOOST_PP_FOR_66, BOOST_PP_TUPLE_EAT_4)(o(66, s), p, o, m)\n# define BOOST_PP_FOR_66(s, p, o, m) BOOST_PP_IF(p(67, s), m, BOOST_PP_TUPLE_EAT_2)(67, s) BOOST_PP_IF(p(67, s), BOOST_PP_FOR_67, BOOST_PP_TUPLE_EAT_4)(o(67, s), p, o, m)\n# define BOOST_PP_FOR_67(s, p, o, m) BOOST_PP_IF(p(68, s), m, BOOST_PP_TUPLE_EAT_2)(68, s) BOOST_PP_IF(p(68, s), BOOST_PP_FOR_68, BOOST_PP_TUPLE_EAT_4)(o(68, s), p, o, m)\n# define BOOST_PP_FOR_68(s, p, o, m) BOOST_PP_IF(p(69, s), m, BOOST_PP_TUPLE_EAT_2)(69, s) BOOST_PP_IF(p(69, s), BOOST_PP_FOR_69, BOOST_PP_TUPLE_EAT_4)(o(69, s), p, o, m)\n# define BOOST_PP_FOR_69(s, p, o, m) BOOST_PP_IF(p(70, s), m, BOOST_PP_TUPLE_EAT_2)(70, s) BOOST_PP_IF(p(70, s), BOOST_PP_FOR_70, BOOST_PP_TUPLE_EAT_4)(o(70, s), p, o, m)\n# define BOOST_PP_FOR_70(s, p, o, m) BOOST_PP_IF(p(71, s), m, BOOST_PP_TUPLE_EAT_2)(71, s) BOOST_PP_IF(p(71, s), BOOST_PP_FOR_71, BOOST_PP_TUPLE_EAT_4)(o(71, s), p, o, m)\n# define BOOST_PP_FOR_71(s, p, o, m) BOOST_PP_IF(p(72, s), m, BOOST_PP_TUPLE_EAT_2)(72, s) BOOST_PP_IF(p(72, s), BOOST_PP_FOR_72, BOOST_PP_TUPLE_EAT_4)(o(72, s), p, o, m)\n# define BOOST_PP_FOR_72(s, p, o, m) BOOST_PP_IF(p(73, s), m, BOOST_PP_TUPLE_EAT_2)(73, s) BOOST_PP_IF(p(73, s), BOOST_PP_FOR_73, BOOST_PP_TUPLE_EAT_4)(o(73, s), p, o, m)\n# define BOOST_PP_FOR_73(s, p, o, m) BOOST_PP_IF(p(74, s), m, BOOST_PP_TUPLE_EAT_2)(74, s) BOOST_PP_IF(p(74, s), BOOST_PP_FOR_74, BOOST_PP_TUPLE_EAT_4)(o(74, s), p, o, m)\n# define BOOST_PP_FOR_74(s, p, o, m) BOOST_PP_IF(p(75, s), m, BOOST_PP_TUPLE_EAT_2)(75, s) BOOST_PP_IF(p(75, s), BOOST_PP_FOR_75, BOOST_PP_TUPLE_EAT_4)(o(75, s), p, o, m)\n# define BOOST_PP_FOR_75(s, p, o, m) BOOST_PP_IF(p(76, s), m, BOOST_PP_TUPLE_EAT_2)(76, s) BOOST_PP_IF(p(76, s), BOOST_PP_FOR_76, BOOST_PP_TUPLE_EAT_4)(o(76, s), p, o, m)\n# define BOOST_PP_FOR_76(s, p, o, m) BOOST_PP_IF(p(77, s), m, BOOST_PP_TUPLE_EAT_2)(77, s) BOOST_PP_IF(p(77, s), BOOST_PP_FOR_77, BOOST_PP_TUPLE_EAT_4)(o(77, s), p, o, m)\n# define BOOST_PP_FOR_77(s, p, o, m) BOOST_PP_IF(p(78, s), m, BOOST_PP_TUPLE_EAT_2)(78, s) BOOST_PP_IF(p(78, s), BOOST_PP_FOR_78, BOOST_PP_TUPLE_EAT_4)(o(78, s), p, o, m)\n# define BOOST_PP_FOR_78(s, p, o, m) BOOST_PP_IF(p(79, s), m, BOOST_PP_TUPLE_EAT_2)(79, s) BOOST_PP_IF(p(79, s), BOOST_PP_FOR_79, BOOST_PP_TUPLE_EAT_4)(o(79, s), p, o, m)\n# define BOOST_PP_FOR_79(s, p, o, m) BOOST_PP_IF(p(80, s), m, BOOST_PP_TUPLE_EAT_2)(80, s) BOOST_PP_IF(p(80, s), BOOST_PP_FOR_80, BOOST_PP_TUPLE_EAT_4)(o(80, s), p, o, m)\n# define BOOST_PP_FOR_80(s, p, o, m) BOOST_PP_IF(p(81, s), m, BOOST_PP_TUPLE_EAT_2)(81, s) BOOST_PP_IF(p(81, s), BOOST_PP_FOR_81, BOOST_PP_TUPLE_EAT_4)(o(81, s), p, o, m)\n# define BOOST_PP_FOR_81(s, p, o, m) BOOST_PP_IF(p(82, s), m, BOOST_PP_TUPLE_EAT_2)(82, s) BOOST_PP_IF(p(82, s), BOOST_PP_FOR_82, BOOST_PP_TUPLE_EAT_4)(o(82, s), p, o, m)\n# define BOOST_PP_FOR_82(s, p, o, m) BOOST_PP_IF(p(83, s), m, BOOST_PP_TUPLE_EAT_2)(83, s) BOOST_PP_IF(p(83, s), BOOST_PP_FOR_83, BOOST_PP_TUPLE_EAT_4)(o(83, s), p, o, m)\n# define BOOST_PP_FOR_83(s, p, o, m) BOOST_PP_IF(p(84, s), m, BOOST_PP_TUPLE_EAT_2)(84, s) BOOST_PP_IF(p(84, s), BOOST_PP_FOR_84, BOOST_PP_TUPLE_EAT_4)(o(84, s), p, o, m)\n# define BOOST_PP_FOR_84(s, p, o, m) BOOST_PP_IF(p(85, s), m, BOOST_PP_TUPLE_EAT_2)(85, s) BOOST_PP_IF(p(85, s), BOOST_PP_FOR_85, BOOST_PP_TUPLE_EAT_4)(o(85, s), p, o, m)\n# define BOOST_PP_FOR_85(s, p, o, m) BOOST_PP_IF(p(86, s), m, BOOST_PP_TUPLE_EAT_2)(86, s) BOOST_PP_IF(p(86, s), BOOST_PP_FOR_86, BOOST_PP_TUPLE_EAT_4)(o(86, s), p, o, m)\n# define BOOST_PP_FOR_86(s, p, o, m) BOOST_PP_IF(p(87, s), m, BOOST_PP_TUPLE_EAT_2)(87, s) BOOST_PP_IF(p(87, s), BOOST_PP_FOR_87, BOOST_PP_TUPLE_EAT_4)(o(87, s), p, o, m)\n# define BOOST_PP_FOR_87(s, p, o, m) BOOST_PP_IF(p(88, s), m, BOOST_PP_TUPLE_EAT_2)(88, s) BOOST_PP_IF(p(88, s), BOOST_PP_FOR_88, BOOST_PP_TUPLE_EAT_4)(o(88, s), p, o, m)\n# define BOOST_PP_FOR_88(s, p, o, m) BOOST_PP_IF(p(89, s), m, BOOST_PP_TUPLE_EAT_2)(89, s) BOOST_PP_IF(p(89, s), BOOST_PP_FOR_89, BOOST_PP_TUPLE_EAT_4)(o(89, s), p, o, m)\n# define BOOST_PP_FOR_89(s, p, o, m) BOOST_PP_IF(p(90, s), m, BOOST_PP_TUPLE_EAT_2)(90, s) BOOST_PP_IF(p(90, s), BOOST_PP_FOR_90, BOOST_PP_TUPLE_EAT_4)(o(90, s), p, o, m)\n# define BOOST_PP_FOR_90(s, p, o, m) BOOST_PP_IF(p(91, s), m, BOOST_PP_TUPLE_EAT_2)(91, s) BOOST_PP_IF(p(91, s), BOOST_PP_FOR_91, BOOST_PP_TUPLE_EAT_4)(o(91, s), p, o, m)\n# define BOOST_PP_FOR_91(s, p, o, m) BOOST_PP_IF(p(92, s), m, BOOST_PP_TUPLE_EAT_2)(92, s) BOOST_PP_IF(p(92, s), BOOST_PP_FOR_92, BOOST_PP_TUPLE_EAT_4)(o(92, s), p, o, m)\n# define BOOST_PP_FOR_92(s, p, o, m) BOOST_PP_IF(p(93, s), m, BOOST_PP_TUPLE_EAT_2)(93, s) BOOST_PP_IF(p(93, s), BOOST_PP_FOR_93, BOOST_PP_TUPLE_EAT_4)(o(93, s), p, o, m)\n# define BOOST_PP_FOR_93(s, p, o, m) BOOST_PP_IF(p(94, s), m, BOOST_PP_TUPLE_EAT_2)(94, s) BOOST_PP_IF(p(94, s), BOOST_PP_FOR_94, BOOST_PP_TUPLE_EAT_4)(o(94, s), p, o, m)\n# define BOOST_PP_FOR_94(s, p, o, m) BOOST_PP_IF(p(95, s), m, BOOST_PP_TUPLE_EAT_2)(95, s) BOOST_PP_IF(p(95, s), BOOST_PP_FOR_95, BOOST_PP_TUPLE_EAT_4)(o(95, s), p, o, m)\n# define BOOST_PP_FOR_95(s, p, o, m) BOOST_PP_IF(p(96, s), m, BOOST_PP_TUPLE_EAT_2)(96, s) BOOST_PP_IF(p(96, s), BOOST_PP_FOR_96, BOOST_PP_TUPLE_EAT_4)(o(96, s), p, o, m)\n# define BOOST_PP_FOR_96(s, p, o, m) BOOST_PP_IF(p(97, s), m, BOOST_PP_TUPLE_EAT_2)(97, s) BOOST_PP_IF(p(97, s), BOOST_PP_FOR_97, BOOST_PP_TUPLE_EAT_4)(o(97, s), p, o, m)\n# define BOOST_PP_FOR_97(s, p, o, m) BOOST_PP_IF(p(98, s), m, BOOST_PP_TUPLE_EAT_2)(98, s) BOOST_PP_IF(p(98, s), BOOST_PP_FOR_98, BOOST_PP_TUPLE_EAT_4)(o(98, s), p, o, m)\n# define BOOST_PP_FOR_98(s, p, o, m) BOOST_PP_IF(p(99, s), m, BOOST_PP_TUPLE_EAT_2)(99, s) BOOST_PP_IF(p(99, s), BOOST_PP_FOR_99, BOOST_PP_TUPLE_EAT_4)(o(99, s), p, o, m)\n# define BOOST_PP_FOR_99(s, p, o, m) BOOST_PP_IF(p(100, s), m, BOOST_PP_TUPLE_EAT_2)(100, s) BOOST_PP_IF(p(100, s), BOOST_PP_FOR_100, BOOST_PP_TUPLE_EAT_4)(o(100, s), p, o, m)\n# define BOOST_PP_FOR_100(s, p, o, m) BOOST_PP_IF(p(101, s), m, BOOST_PP_TUPLE_EAT_2)(101, s) BOOST_PP_IF(p(101, s), BOOST_PP_FOR_101, BOOST_PP_TUPLE_EAT_4)(o(101, s), p, o, m)\n# define BOOST_PP_FOR_101(s, p, o, m) BOOST_PP_IF(p(102, s), m, BOOST_PP_TUPLE_EAT_2)(102, s) BOOST_PP_IF(p(102, s), BOOST_PP_FOR_102, BOOST_PP_TUPLE_EAT_4)(o(102, s), p, o, m)\n# define BOOST_PP_FOR_102(s, p, o, m) BOOST_PP_IF(p(103, s), m, BOOST_PP_TUPLE_EAT_2)(103, s) BOOST_PP_IF(p(103, s), BOOST_PP_FOR_103, BOOST_PP_TUPLE_EAT_4)(o(103, s), p, o, m)\n# define BOOST_PP_FOR_103(s, p, o, m) BOOST_PP_IF(p(104, s), m, BOOST_PP_TUPLE_EAT_2)(104, s) BOOST_PP_IF(p(104, s), BOOST_PP_FOR_104, BOOST_PP_TUPLE_EAT_4)(o(104, s), p, o, m)\n# define BOOST_PP_FOR_104(s, p, o, m) BOOST_PP_IF(p(105, s), m, BOOST_PP_TUPLE_EAT_2)(105, s) BOOST_PP_IF(p(105, s), BOOST_PP_FOR_105, BOOST_PP_TUPLE_EAT_4)(o(105, s), p, o, m)\n# define BOOST_PP_FOR_105(s, p, o, m) BOOST_PP_IF(p(106, s), m, BOOST_PP_TUPLE_EAT_2)(106, s) BOOST_PP_IF(p(106, s), BOOST_PP_FOR_106, BOOST_PP_TUPLE_EAT_4)(o(106, s), p, o, m)\n# define BOOST_PP_FOR_106(s, p, o, m) BOOST_PP_IF(p(107, s), m, BOOST_PP_TUPLE_EAT_2)(107, s) BOOST_PP_IF(p(107, s), BOOST_PP_FOR_107, BOOST_PP_TUPLE_EAT_4)(o(107, s), p, o, m)\n# define BOOST_PP_FOR_107(s, p, o, m) BOOST_PP_IF(p(108, s), m, BOOST_PP_TUPLE_EAT_2)(108, s) BOOST_PP_IF(p(108, s), BOOST_PP_FOR_108, BOOST_PP_TUPLE_EAT_4)(o(108, s), p, o, m)\n# define BOOST_PP_FOR_108(s, p, o, m) BOOST_PP_IF(p(109, s), m, BOOST_PP_TUPLE_EAT_2)(109, s) BOOST_PP_IF(p(109, s), BOOST_PP_FOR_109, BOOST_PP_TUPLE_EAT_4)(o(109, s), p, o, m)\n# define BOOST_PP_FOR_109(s, p, o, m) BOOST_PP_IF(p(110, s), m, BOOST_PP_TUPLE_EAT_2)(110, s) BOOST_PP_IF(p(110, s), BOOST_PP_FOR_110, BOOST_PP_TUPLE_EAT_4)(o(110, s), p, o, m)\n# define BOOST_PP_FOR_110(s, p, o, m) BOOST_PP_IF(p(111, s), m, BOOST_PP_TUPLE_EAT_2)(111, s) BOOST_PP_IF(p(111, s), BOOST_PP_FOR_111, BOOST_PP_TUPLE_EAT_4)(o(111, s), p, o, m)\n# define BOOST_PP_FOR_111(s, p, o, m) BOOST_PP_IF(p(112, s), m, BOOST_PP_TUPLE_EAT_2)(112, s) BOOST_PP_IF(p(112, s), BOOST_PP_FOR_112, BOOST_PP_TUPLE_EAT_4)(o(112, s), p, o, m)\n# define BOOST_PP_FOR_112(s, p, o, m) BOOST_PP_IF(p(113, s), m, BOOST_PP_TUPLE_EAT_2)(113, s) BOOST_PP_IF(p(113, s), BOOST_PP_FOR_113, BOOST_PP_TUPLE_EAT_4)(o(113, s), p, o, m)\n# define BOOST_PP_FOR_113(s, p, o, m) BOOST_PP_IF(p(114, s), m, BOOST_PP_TUPLE_EAT_2)(114, s) BOOST_PP_IF(p(114, s), BOOST_PP_FOR_114, BOOST_PP_TUPLE_EAT_4)(o(114, s), p, o, m)\n# define BOOST_PP_FOR_114(s, p, o, m) BOOST_PP_IF(p(115, s), m, BOOST_PP_TUPLE_EAT_2)(115, s) BOOST_PP_IF(p(115, s), BOOST_PP_FOR_115, BOOST_PP_TUPLE_EAT_4)(o(115, s), p, o, m)\n# define BOOST_PP_FOR_115(s, p, o, m) BOOST_PP_IF(p(116, s), m, BOOST_PP_TUPLE_EAT_2)(116, s) BOOST_PP_IF(p(116, s), BOOST_PP_FOR_116, BOOST_PP_TUPLE_EAT_4)(o(116, s), p, o, m)\n# define BOOST_PP_FOR_116(s, p, o, m) BOOST_PP_IF(p(117, s), m, BOOST_PP_TUPLE_EAT_2)(117, s) BOOST_PP_IF(p(117, s), BOOST_PP_FOR_117, BOOST_PP_TUPLE_EAT_4)(o(117, s), p, o, m)\n# define BOOST_PP_FOR_117(s, p, o, m) BOOST_PP_IF(p(118, s), m, BOOST_PP_TUPLE_EAT_2)(118, s) BOOST_PP_IF(p(118, s), BOOST_PP_FOR_118, BOOST_PP_TUPLE_EAT_4)(o(118, s), p, o, m)\n# define BOOST_PP_FOR_118(s, p, o, m) BOOST_PP_IF(p(119, s), m, BOOST_PP_TUPLE_EAT_2)(119, s) BOOST_PP_IF(p(119, s), BOOST_PP_FOR_119, BOOST_PP_TUPLE_EAT_4)(o(119, s), p, o, m)\n# define BOOST_PP_FOR_119(s, p, o, m) BOOST_PP_IF(p(120, s), m, BOOST_PP_TUPLE_EAT_2)(120, s) BOOST_PP_IF(p(120, s), BOOST_PP_FOR_120, BOOST_PP_TUPLE_EAT_4)(o(120, s), p, o, m)\n# define BOOST_PP_FOR_120(s, p, o, m) BOOST_PP_IF(p(121, s), m, BOOST_PP_TUPLE_EAT_2)(121, s) BOOST_PP_IF(p(121, s), BOOST_PP_FOR_121, BOOST_PP_TUPLE_EAT_4)(o(121, s), p, o, m)\n# define BOOST_PP_FOR_121(s, p, o, m) BOOST_PP_IF(p(122, s), m, BOOST_PP_TUPLE_EAT_2)(122, s) BOOST_PP_IF(p(122, s), BOOST_PP_FOR_122, BOOST_PP_TUPLE_EAT_4)(o(122, s), p, o, m)\n# define BOOST_PP_FOR_122(s, p, o, m) BOOST_PP_IF(p(123, s), m, BOOST_PP_TUPLE_EAT_2)(123, s) BOOST_PP_IF(p(123, s), BOOST_PP_FOR_123, BOOST_PP_TUPLE_EAT_4)(o(123, s), p, o, m)\n# define BOOST_PP_FOR_123(s, p, o, m) BOOST_PP_IF(p(124, s), m, BOOST_PP_TUPLE_EAT_2)(124, s) BOOST_PP_IF(p(124, s), BOOST_PP_FOR_124, BOOST_PP_TUPLE_EAT_4)(o(124, s), p, o, m)\n# define BOOST_PP_FOR_124(s, p, o, m) BOOST_PP_IF(p(125, s), m, BOOST_PP_TUPLE_EAT_2)(125, s) BOOST_PP_IF(p(125, s), BOOST_PP_FOR_125, BOOST_PP_TUPLE_EAT_4)(o(125, s), p, o, m)\n# define BOOST_PP_FOR_125(s, p, o, m) BOOST_PP_IF(p(126, s), m, BOOST_PP_TUPLE_EAT_2)(126, s) BOOST_PP_IF(p(126, s), BOOST_PP_FOR_126, BOOST_PP_TUPLE_EAT_4)(o(126, s), p, o, m)\n# define BOOST_PP_FOR_126(s, p, o, m) BOOST_PP_IF(p(127, s), m, BOOST_PP_TUPLE_EAT_2)(127, s) BOOST_PP_IF(p(127, s), BOOST_PP_FOR_127, BOOST_PP_TUPLE_EAT_4)(o(127, s), p, o, m)\n# define BOOST_PP_FOR_127(s, p, o, m) BOOST_PP_IF(p(128, s), m, BOOST_PP_TUPLE_EAT_2)(128, s) BOOST_PP_IF(p(128, s), BOOST_PP_FOR_128, BOOST_PP_TUPLE_EAT_4)(o(128, s), p, o, m)\n# define BOOST_PP_FOR_128(s, p, o, m) BOOST_PP_IF(p(129, s), m, BOOST_PP_TUPLE_EAT_2)(129, s) BOOST_PP_IF(p(129, s), BOOST_PP_FOR_129, BOOST_PP_TUPLE_EAT_4)(o(129, s), p, o, m)\n# define BOOST_PP_FOR_129(s, p, o, m) BOOST_PP_IF(p(130, s), m, BOOST_PP_TUPLE_EAT_2)(130, s) BOOST_PP_IF(p(130, s), BOOST_PP_FOR_130, BOOST_PP_TUPLE_EAT_4)(o(130, s), p, o, m)\n# define BOOST_PP_FOR_130(s, p, o, m) BOOST_PP_IF(p(131, s), m, BOOST_PP_TUPLE_EAT_2)(131, s) BOOST_PP_IF(p(131, s), BOOST_PP_FOR_131, BOOST_PP_TUPLE_EAT_4)(o(131, s), p, o, m)\n# define BOOST_PP_FOR_131(s, p, o, m) BOOST_PP_IF(p(132, s), m, BOOST_PP_TUPLE_EAT_2)(132, s) BOOST_PP_IF(p(132, s), BOOST_PP_FOR_132, BOOST_PP_TUPLE_EAT_4)(o(132, s), p, o, m)\n# define BOOST_PP_FOR_132(s, p, o, m) BOOST_PP_IF(p(133, s), m, BOOST_PP_TUPLE_EAT_2)(133, s) BOOST_PP_IF(p(133, s), BOOST_PP_FOR_133, BOOST_PP_TUPLE_EAT_4)(o(133, s), p, o, m)\n# define BOOST_PP_FOR_133(s, p, o, m) BOOST_PP_IF(p(134, s), m, BOOST_PP_TUPLE_EAT_2)(134, s) BOOST_PP_IF(p(134, s), BOOST_PP_FOR_134, BOOST_PP_TUPLE_EAT_4)(o(134, s), p, o, m)\n# define BOOST_PP_FOR_134(s, p, o, m) BOOST_PP_IF(p(135, s), m, BOOST_PP_TUPLE_EAT_2)(135, s) BOOST_PP_IF(p(135, s), BOOST_PP_FOR_135, BOOST_PP_TUPLE_EAT_4)(o(135, s), p, o, m)\n# define BOOST_PP_FOR_135(s, p, o, m) BOOST_PP_IF(p(136, s), m, BOOST_PP_TUPLE_EAT_2)(136, s) BOOST_PP_IF(p(136, s), BOOST_PP_FOR_136, BOOST_PP_TUPLE_EAT_4)(o(136, s), p, o, m)\n# define BOOST_PP_FOR_136(s, p, o, m) BOOST_PP_IF(p(137, s), m, BOOST_PP_TUPLE_EAT_2)(137, s) BOOST_PP_IF(p(137, s), BOOST_PP_FOR_137, BOOST_PP_TUPLE_EAT_4)(o(137, s), p, o, m)\n# define BOOST_PP_FOR_137(s, p, o, m) BOOST_PP_IF(p(138, s), m, BOOST_PP_TUPLE_EAT_2)(138, s) BOOST_PP_IF(p(138, s), BOOST_PP_FOR_138, BOOST_PP_TUPLE_EAT_4)(o(138, s), p, o, m)\n# define BOOST_PP_FOR_138(s, p, o, m) BOOST_PP_IF(p(139, s), m, BOOST_PP_TUPLE_EAT_2)(139, s) BOOST_PP_IF(p(139, s), BOOST_PP_FOR_139, BOOST_PP_TUPLE_EAT_4)(o(139, s), p, o, m)\n# define BOOST_PP_FOR_139(s, p, o, m) BOOST_PP_IF(p(140, s), m, BOOST_PP_TUPLE_EAT_2)(140, s) BOOST_PP_IF(p(140, s), BOOST_PP_FOR_140, BOOST_PP_TUPLE_EAT_4)(o(140, s), p, o, m)\n# define BOOST_PP_FOR_140(s, p, o, m) BOOST_PP_IF(p(141, s), m, BOOST_PP_TUPLE_EAT_2)(141, s) BOOST_PP_IF(p(141, s), BOOST_PP_FOR_141, BOOST_PP_TUPLE_EAT_4)(o(141, s), p, o, m)\n# define BOOST_PP_FOR_141(s, p, o, m) BOOST_PP_IF(p(142, s), m, BOOST_PP_TUPLE_EAT_2)(142, s) BOOST_PP_IF(p(142, s), BOOST_PP_FOR_142, BOOST_PP_TUPLE_EAT_4)(o(142, s), p, o, m)\n# define BOOST_PP_FOR_142(s, p, o, m) BOOST_PP_IF(p(143, s), m, BOOST_PP_TUPLE_EAT_2)(143, s) BOOST_PP_IF(p(143, s), BOOST_PP_FOR_143, BOOST_PP_TUPLE_EAT_4)(o(143, s), p, o, m)\n# define BOOST_PP_FOR_143(s, p, o, m) BOOST_PP_IF(p(144, s), m, BOOST_PP_TUPLE_EAT_2)(144, s) BOOST_PP_IF(p(144, s), BOOST_PP_FOR_144, BOOST_PP_TUPLE_EAT_4)(o(144, s), p, o, m)\n# define BOOST_PP_FOR_144(s, p, o, m) BOOST_PP_IF(p(145, s), m, BOOST_PP_TUPLE_EAT_2)(145, s) BOOST_PP_IF(p(145, s), BOOST_PP_FOR_145, BOOST_PP_TUPLE_EAT_4)(o(145, s), p, o, m)\n# define BOOST_PP_FOR_145(s, p, o, m) BOOST_PP_IF(p(146, s), m, BOOST_PP_TUPLE_EAT_2)(146, s) BOOST_PP_IF(p(146, s), BOOST_PP_FOR_146, BOOST_PP_TUPLE_EAT_4)(o(146, s), p, o, m)\n# define BOOST_PP_FOR_146(s, p, o, m) BOOST_PP_IF(p(147, s), m, BOOST_PP_TUPLE_EAT_2)(147, s) BOOST_PP_IF(p(147, s), BOOST_PP_FOR_147, BOOST_PP_TUPLE_EAT_4)(o(147, s), p, o, m)\n# define BOOST_PP_FOR_147(s, p, o, m) BOOST_PP_IF(p(148, s), m, BOOST_PP_TUPLE_EAT_2)(148, s) BOOST_PP_IF(p(148, s), BOOST_PP_FOR_148, BOOST_PP_TUPLE_EAT_4)(o(148, s), p, o, m)\n# define BOOST_PP_FOR_148(s, p, o, m) BOOST_PP_IF(p(149, s), m, BOOST_PP_TUPLE_EAT_2)(149, s) BOOST_PP_IF(p(149, s), BOOST_PP_FOR_149, BOOST_PP_TUPLE_EAT_4)(o(149, s), p, o, m)\n# define BOOST_PP_FOR_149(s, p, o, m) BOOST_PP_IF(p(150, s), m, BOOST_PP_TUPLE_EAT_2)(150, s) BOOST_PP_IF(p(150, s), BOOST_PP_FOR_150, BOOST_PP_TUPLE_EAT_4)(o(150, s), p, o, m)\n# define BOOST_PP_FOR_150(s, p, o, m) BOOST_PP_IF(p(151, s), m, BOOST_PP_TUPLE_EAT_2)(151, s) BOOST_PP_IF(p(151, s), BOOST_PP_FOR_151, BOOST_PP_TUPLE_EAT_4)(o(151, s), p, o, m)\n# define BOOST_PP_FOR_151(s, p, o, m) BOOST_PP_IF(p(152, s), m, BOOST_PP_TUPLE_EAT_2)(152, s) BOOST_PP_IF(p(152, s), BOOST_PP_FOR_152, BOOST_PP_TUPLE_EAT_4)(o(152, s), p, o, m)\n# define BOOST_PP_FOR_152(s, p, o, m) BOOST_PP_IF(p(153, s), m, BOOST_PP_TUPLE_EAT_2)(153, s) BOOST_PP_IF(p(153, s), BOOST_PP_FOR_153, BOOST_PP_TUPLE_EAT_4)(o(153, s), p, o, m)\n# define BOOST_PP_FOR_153(s, p, o, m) BOOST_PP_IF(p(154, s), m, BOOST_PP_TUPLE_EAT_2)(154, s) BOOST_PP_IF(p(154, s), BOOST_PP_FOR_154, BOOST_PP_TUPLE_EAT_4)(o(154, s), p, o, m)\n# define BOOST_PP_FOR_154(s, p, o, m) BOOST_PP_IF(p(155, s), m, BOOST_PP_TUPLE_EAT_2)(155, s) BOOST_PP_IF(p(155, s), BOOST_PP_FOR_155, BOOST_PP_TUPLE_EAT_4)(o(155, s), p, o, m)\n# define BOOST_PP_FOR_155(s, p, o, m) BOOST_PP_IF(p(156, s), m, BOOST_PP_TUPLE_EAT_2)(156, s) BOOST_PP_IF(p(156, s), BOOST_PP_FOR_156, BOOST_PP_TUPLE_EAT_4)(o(156, s), p, o, m)\n# define BOOST_PP_FOR_156(s, p, o, m) BOOST_PP_IF(p(157, s), m, BOOST_PP_TUPLE_EAT_2)(157, s) BOOST_PP_IF(p(157, s), BOOST_PP_FOR_157, BOOST_PP_TUPLE_EAT_4)(o(157, s), p, o, m)\n# define BOOST_PP_FOR_157(s, p, o, m) BOOST_PP_IF(p(158, s), m, BOOST_PP_TUPLE_EAT_2)(158, s) BOOST_PP_IF(p(158, s), BOOST_PP_FOR_158, BOOST_PP_TUPLE_EAT_4)(o(158, s), p, o, m)\n# define BOOST_PP_FOR_158(s, p, o, m) BOOST_PP_IF(p(159, s), m, BOOST_PP_TUPLE_EAT_2)(159, s) BOOST_PP_IF(p(159, s), BOOST_PP_FOR_159, BOOST_PP_TUPLE_EAT_4)(o(159, s), p, o, m)\n# define BOOST_PP_FOR_159(s, p, o, m) BOOST_PP_IF(p(160, s), m, BOOST_PP_TUPLE_EAT_2)(160, s) BOOST_PP_IF(p(160, s), BOOST_PP_FOR_160, BOOST_PP_TUPLE_EAT_4)(o(160, s), p, o, m)\n# define BOOST_PP_FOR_160(s, p, o, m) BOOST_PP_IF(p(161, s), m, BOOST_PP_TUPLE_EAT_2)(161, s) BOOST_PP_IF(p(161, s), BOOST_PP_FOR_161, BOOST_PP_TUPLE_EAT_4)(o(161, s), p, o, m)\n# define BOOST_PP_FOR_161(s, p, o, m) BOOST_PP_IF(p(162, s), m, BOOST_PP_TUPLE_EAT_2)(162, s) BOOST_PP_IF(p(162, s), BOOST_PP_FOR_162, BOOST_PP_TUPLE_EAT_4)(o(162, s), p, o, m)\n# define BOOST_PP_FOR_162(s, p, o, m) BOOST_PP_IF(p(163, s), m, BOOST_PP_TUPLE_EAT_2)(163, s) BOOST_PP_IF(p(163, s), BOOST_PP_FOR_163, BOOST_PP_TUPLE_EAT_4)(o(163, s), p, o, m)\n# define BOOST_PP_FOR_163(s, p, o, m) BOOST_PP_IF(p(164, s), m, BOOST_PP_TUPLE_EAT_2)(164, s) BOOST_PP_IF(p(164, s), BOOST_PP_FOR_164, BOOST_PP_TUPLE_EAT_4)(o(164, s), p, o, m)\n# define BOOST_PP_FOR_164(s, p, o, m) BOOST_PP_IF(p(165, s), m, BOOST_PP_TUPLE_EAT_2)(165, s) BOOST_PP_IF(p(165, s), BOOST_PP_FOR_165, BOOST_PP_TUPLE_EAT_4)(o(165, s), p, o, m)\n# define BOOST_PP_FOR_165(s, p, o, m) BOOST_PP_IF(p(166, s), m, BOOST_PP_TUPLE_EAT_2)(166, s) BOOST_PP_IF(p(166, s), BOOST_PP_FOR_166, BOOST_PP_TUPLE_EAT_4)(o(166, s), p, o, m)\n# define BOOST_PP_FOR_166(s, p, o, m) BOOST_PP_IF(p(167, s), m, BOOST_PP_TUPLE_EAT_2)(167, s) BOOST_PP_IF(p(167, s), BOOST_PP_FOR_167, BOOST_PP_TUPLE_EAT_4)(o(167, s), p, o, m)\n# define BOOST_PP_FOR_167(s, p, o, m) BOOST_PP_IF(p(168, s), m, BOOST_PP_TUPLE_EAT_2)(168, s) BOOST_PP_IF(p(168, s), BOOST_PP_FOR_168, BOOST_PP_TUPLE_EAT_4)(o(168, s), p, o, m)\n# define BOOST_PP_FOR_168(s, p, o, m) BOOST_PP_IF(p(169, s), m, BOOST_PP_TUPLE_EAT_2)(169, s) BOOST_PP_IF(p(169, s), BOOST_PP_FOR_169, BOOST_PP_TUPLE_EAT_4)(o(169, s), p, o, m)\n# define BOOST_PP_FOR_169(s, p, o, m) BOOST_PP_IF(p(170, s), m, BOOST_PP_TUPLE_EAT_2)(170, s) BOOST_PP_IF(p(170, s), BOOST_PP_FOR_170, BOOST_PP_TUPLE_EAT_4)(o(170, s), p, o, m)\n# define BOOST_PP_FOR_170(s, p, o, m) BOOST_PP_IF(p(171, s), m, BOOST_PP_TUPLE_EAT_2)(171, s) BOOST_PP_IF(p(171, s), BOOST_PP_FOR_171, BOOST_PP_TUPLE_EAT_4)(o(171, s), p, o, m)\n# define BOOST_PP_FOR_171(s, p, o, m) BOOST_PP_IF(p(172, s), m, BOOST_PP_TUPLE_EAT_2)(172, s) BOOST_PP_IF(p(172, s), BOOST_PP_FOR_172, BOOST_PP_TUPLE_EAT_4)(o(172, s), p, o, m)\n# define BOOST_PP_FOR_172(s, p, o, m) BOOST_PP_IF(p(173, s), m, BOOST_PP_TUPLE_EAT_2)(173, s) BOOST_PP_IF(p(173, s), BOOST_PP_FOR_173, BOOST_PP_TUPLE_EAT_4)(o(173, s), p, o, m)\n# define BOOST_PP_FOR_173(s, p, o, m) BOOST_PP_IF(p(174, s), m, BOOST_PP_TUPLE_EAT_2)(174, s) BOOST_PP_IF(p(174, s), BOOST_PP_FOR_174, BOOST_PP_TUPLE_EAT_4)(o(174, s), p, o, m)\n# define BOOST_PP_FOR_174(s, p, o, m) BOOST_PP_IF(p(175, s), m, BOOST_PP_TUPLE_EAT_2)(175, s) BOOST_PP_IF(p(175, s), BOOST_PP_FOR_175, BOOST_PP_TUPLE_EAT_4)(o(175, s), p, o, m)\n# define BOOST_PP_FOR_175(s, p, o, m) BOOST_PP_IF(p(176, s), m, BOOST_PP_TUPLE_EAT_2)(176, s) BOOST_PP_IF(p(176, s), BOOST_PP_FOR_176, BOOST_PP_TUPLE_EAT_4)(o(176, s), p, o, m)\n# define BOOST_PP_FOR_176(s, p, o, m) BOOST_PP_IF(p(177, s), m, BOOST_PP_TUPLE_EAT_2)(177, s) BOOST_PP_IF(p(177, s), BOOST_PP_FOR_177, BOOST_PP_TUPLE_EAT_4)(o(177, s), p, o, m)\n# define BOOST_PP_FOR_177(s, p, o, m) BOOST_PP_IF(p(178, s), m, BOOST_PP_TUPLE_EAT_2)(178, s) BOOST_PP_IF(p(178, s), BOOST_PP_FOR_178, BOOST_PP_TUPLE_EAT_4)(o(178, s), p, o, m)\n# define BOOST_PP_FOR_178(s, p, o, m) BOOST_PP_IF(p(179, s), m, BOOST_PP_TUPLE_EAT_2)(179, s) BOOST_PP_IF(p(179, s), BOOST_PP_FOR_179, BOOST_PP_TUPLE_EAT_4)(o(179, s), p, o, m)\n# define BOOST_PP_FOR_179(s, p, o, m) BOOST_PP_IF(p(180, s), m, BOOST_PP_TUPLE_EAT_2)(180, s) BOOST_PP_IF(p(180, s), BOOST_PP_FOR_180, BOOST_PP_TUPLE_EAT_4)(o(180, s), p, o, m)\n# define BOOST_PP_FOR_180(s, p, o, m) BOOST_PP_IF(p(181, s), m, BOOST_PP_TUPLE_EAT_2)(181, s) BOOST_PP_IF(p(181, s), BOOST_PP_FOR_181, BOOST_PP_TUPLE_EAT_4)(o(181, s), p, o, m)\n# define BOOST_PP_FOR_181(s, p, o, m) BOOST_PP_IF(p(182, s), m, BOOST_PP_TUPLE_EAT_2)(182, s) BOOST_PP_IF(p(182, s), BOOST_PP_FOR_182, BOOST_PP_TUPLE_EAT_4)(o(182, s), p, o, m)\n# define BOOST_PP_FOR_182(s, p, o, m) BOOST_PP_IF(p(183, s), m, BOOST_PP_TUPLE_EAT_2)(183, s) BOOST_PP_IF(p(183, s), BOOST_PP_FOR_183, BOOST_PP_TUPLE_EAT_4)(o(183, s), p, o, m)\n# define BOOST_PP_FOR_183(s, p, o, m) BOOST_PP_IF(p(184, s), m, BOOST_PP_TUPLE_EAT_2)(184, s) BOOST_PP_IF(p(184, s), BOOST_PP_FOR_184, BOOST_PP_TUPLE_EAT_4)(o(184, s), p, o, m)\n# define BOOST_PP_FOR_184(s, p, o, m) BOOST_PP_IF(p(185, s), m, BOOST_PP_TUPLE_EAT_2)(185, s) BOOST_PP_IF(p(185, s), BOOST_PP_FOR_185, BOOST_PP_TUPLE_EAT_4)(o(185, s), p, o, m)\n# define BOOST_PP_FOR_185(s, p, o, m) BOOST_PP_IF(p(186, s), m, BOOST_PP_TUPLE_EAT_2)(186, s) BOOST_PP_IF(p(186, s), BOOST_PP_FOR_186, BOOST_PP_TUPLE_EAT_4)(o(186, s), p, o, m)\n# define BOOST_PP_FOR_186(s, p, o, m) BOOST_PP_IF(p(187, s), m, BOOST_PP_TUPLE_EAT_2)(187, s) BOOST_PP_IF(p(187, s), BOOST_PP_FOR_187, BOOST_PP_TUPLE_EAT_4)(o(187, s), p, o, m)\n# define BOOST_PP_FOR_187(s, p, o, m) BOOST_PP_IF(p(188, s), m, BOOST_PP_TUPLE_EAT_2)(188, s) BOOST_PP_IF(p(188, s), BOOST_PP_FOR_188, BOOST_PP_TUPLE_EAT_4)(o(188, s), p, o, m)\n# define BOOST_PP_FOR_188(s, p, o, m) BOOST_PP_IF(p(189, s), m, BOOST_PP_TUPLE_EAT_2)(189, s) BOOST_PP_IF(p(189, s), BOOST_PP_FOR_189, BOOST_PP_TUPLE_EAT_4)(o(189, s), p, o, m)\n# define BOOST_PP_FOR_189(s, p, o, m) BOOST_PP_IF(p(190, s), m, BOOST_PP_TUPLE_EAT_2)(190, s) BOOST_PP_IF(p(190, s), BOOST_PP_FOR_190, BOOST_PP_TUPLE_EAT_4)(o(190, s), p, o, m)\n# define BOOST_PP_FOR_190(s, p, o, m) BOOST_PP_IF(p(191, s), m, BOOST_PP_TUPLE_EAT_2)(191, s) BOOST_PP_IF(p(191, s), BOOST_PP_FOR_191, BOOST_PP_TUPLE_EAT_4)(o(191, s), p, o, m)\n# define BOOST_PP_FOR_191(s, p, o, m) BOOST_PP_IF(p(192, s), m, BOOST_PP_TUPLE_EAT_2)(192, s) BOOST_PP_IF(p(192, s), BOOST_PP_FOR_192, BOOST_PP_TUPLE_EAT_4)(o(192, s), p, o, m)\n# define BOOST_PP_FOR_192(s, p, o, m) BOOST_PP_IF(p(193, s), m, BOOST_PP_TUPLE_EAT_2)(193, s) BOOST_PP_IF(p(193, s), BOOST_PP_FOR_193, BOOST_PP_TUPLE_EAT_4)(o(193, s), p, o, m)\n# define BOOST_PP_FOR_193(s, p, o, m) BOOST_PP_IF(p(194, s), m, BOOST_PP_TUPLE_EAT_2)(194, s) BOOST_PP_IF(p(194, s), BOOST_PP_FOR_194, BOOST_PP_TUPLE_EAT_4)(o(194, s), p, o, m)\n# define BOOST_PP_FOR_194(s, p, o, m) BOOST_PP_IF(p(195, s), m, BOOST_PP_TUPLE_EAT_2)(195, s) BOOST_PP_IF(p(195, s), BOOST_PP_FOR_195, BOOST_PP_TUPLE_EAT_4)(o(195, s), p, o, m)\n# define BOOST_PP_FOR_195(s, p, o, m) BOOST_PP_IF(p(196, s), m, BOOST_PP_TUPLE_EAT_2)(196, s) BOOST_PP_IF(p(196, s), BOOST_PP_FOR_196, BOOST_PP_TUPLE_EAT_4)(o(196, s), p, o, m)\n# define BOOST_PP_FOR_196(s, p, o, m) BOOST_PP_IF(p(197, s), m, BOOST_PP_TUPLE_EAT_2)(197, s) BOOST_PP_IF(p(197, s), BOOST_PP_FOR_197, BOOST_PP_TUPLE_EAT_4)(o(197, s), p, o, m)\n# define BOOST_PP_FOR_197(s, p, o, m) BOOST_PP_IF(p(198, s), m, BOOST_PP_TUPLE_EAT_2)(198, s) BOOST_PP_IF(p(198, s), BOOST_PP_FOR_198, BOOST_PP_TUPLE_EAT_4)(o(198, s), p, o, m)\n# define BOOST_PP_FOR_198(s, p, o, m) BOOST_PP_IF(p(199, s), m, BOOST_PP_TUPLE_EAT_2)(199, s) BOOST_PP_IF(p(199, s), BOOST_PP_FOR_199, BOOST_PP_TUPLE_EAT_4)(o(199, s), p, o, m)\n# define BOOST_PP_FOR_199(s, p, o, m) BOOST_PP_IF(p(200, s), m, BOOST_PP_TUPLE_EAT_2)(200, s) BOOST_PP_IF(p(200, s), BOOST_PP_FOR_200, BOOST_PP_TUPLE_EAT_4)(o(200, s), p, o, m)\n# define BOOST_PP_FOR_200(s, p, o, m) BOOST_PP_IF(p(201, s), m, BOOST_PP_TUPLE_EAT_2)(201, s) BOOST_PP_IF(p(201, s), BOOST_PP_FOR_201, BOOST_PP_TUPLE_EAT_4)(o(201, s), p, o, m)\n# define BOOST_PP_FOR_201(s, p, o, m) BOOST_PP_IF(p(202, s), m, BOOST_PP_TUPLE_EAT_2)(202, s) BOOST_PP_IF(p(202, s), BOOST_PP_FOR_202, BOOST_PP_TUPLE_EAT_4)(o(202, s), p, o, m)\n# define BOOST_PP_FOR_202(s, p, o, m) BOOST_PP_IF(p(203, s), m, BOOST_PP_TUPLE_EAT_2)(203, s) BOOST_PP_IF(p(203, s), BOOST_PP_FOR_203, BOOST_PP_TUPLE_EAT_4)(o(203, s), p, o, m)\n# define BOOST_PP_FOR_203(s, p, o, m) BOOST_PP_IF(p(204, s), m, BOOST_PP_TUPLE_EAT_2)(204, s) BOOST_PP_IF(p(204, s), BOOST_PP_FOR_204, BOOST_PP_TUPLE_EAT_4)(o(204, s), p, o, m)\n# define BOOST_PP_FOR_204(s, p, o, m) BOOST_PP_IF(p(205, s), m, BOOST_PP_TUPLE_EAT_2)(205, s) BOOST_PP_IF(p(205, s), BOOST_PP_FOR_205, BOOST_PP_TUPLE_EAT_4)(o(205, s), p, o, m)\n# define BOOST_PP_FOR_205(s, p, o, m) BOOST_PP_IF(p(206, s), m, BOOST_PP_TUPLE_EAT_2)(206, s) BOOST_PP_IF(p(206, s), BOOST_PP_FOR_206, BOOST_PP_TUPLE_EAT_4)(o(206, s), p, o, m)\n# define BOOST_PP_FOR_206(s, p, o, m) BOOST_PP_IF(p(207, s), m, BOOST_PP_TUPLE_EAT_2)(207, s) BOOST_PP_IF(p(207, s), BOOST_PP_FOR_207, BOOST_PP_TUPLE_EAT_4)(o(207, s), p, o, m)\n# define BOOST_PP_FOR_207(s, p, o, m) BOOST_PP_IF(p(208, s), m, BOOST_PP_TUPLE_EAT_2)(208, s) BOOST_PP_IF(p(208, s), BOOST_PP_FOR_208, BOOST_PP_TUPLE_EAT_4)(o(208, s), p, o, m)\n# define BOOST_PP_FOR_208(s, p, o, m) BOOST_PP_IF(p(209, s), m, BOOST_PP_TUPLE_EAT_2)(209, s) BOOST_PP_IF(p(209, s), BOOST_PP_FOR_209, BOOST_PP_TUPLE_EAT_4)(o(209, s), p, o, m)\n# define BOOST_PP_FOR_209(s, p, o, m) BOOST_PP_IF(p(210, s), m, BOOST_PP_TUPLE_EAT_2)(210, s) BOOST_PP_IF(p(210, s), BOOST_PP_FOR_210, BOOST_PP_TUPLE_EAT_4)(o(210, s), p, o, m)\n# define BOOST_PP_FOR_210(s, p, o, m) BOOST_PP_IF(p(211, s), m, BOOST_PP_TUPLE_EAT_2)(211, s) BOOST_PP_IF(p(211, s), BOOST_PP_FOR_211, BOOST_PP_TUPLE_EAT_4)(o(211, s), p, o, m)\n# define BOOST_PP_FOR_211(s, p, o, m) BOOST_PP_IF(p(212, s), m, BOOST_PP_TUPLE_EAT_2)(212, s) BOOST_PP_IF(p(212, s), BOOST_PP_FOR_212, BOOST_PP_TUPLE_EAT_4)(o(212, s), p, o, m)\n# define BOOST_PP_FOR_212(s, p, o, m) BOOST_PP_IF(p(213, s), m, BOOST_PP_TUPLE_EAT_2)(213, s) BOOST_PP_IF(p(213, s), BOOST_PP_FOR_213, BOOST_PP_TUPLE_EAT_4)(o(213, s), p, o, m)\n# define BOOST_PP_FOR_213(s, p, o, m) BOOST_PP_IF(p(214, s), m, BOOST_PP_TUPLE_EAT_2)(214, s) BOOST_PP_IF(p(214, s), BOOST_PP_FOR_214, BOOST_PP_TUPLE_EAT_4)(o(214, s), p, o, m)\n# define BOOST_PP_FOR_214(s, p, o, m) BOOST_PP_IF(p(215, s), m, BOOST_PP_TUPLE_EAT_2)(215, s) BOOST_PP_IF(p(215, s), BOOST_PP_FOR_215, BOOST_PP_TUPLE_EAT_4)(o(215, s), p, o, m)\n# define BOOST_PP_FOR_215(s, p, o, m) BOOST_PP_IF(p(216, s), m, BOOST_PP_TUPLE_EAT_2)(216, s) BOOST_PP_IF(p(216, s), BOOST_PP_FOR_216, BOOST_PP_TUPLE_EAT_4)(o(216, s), p, o, m)\n# define BOOST_PP_FOR_216(s, p, o, m) BOOST_PP_IF(p(217, s), m, BOOST_PP_TUPLE_EAT_2)(217, s) BOOST_PP_IF(p(217, s), BOOST_PP_FOR_217, BOOST_PP_TUPLE_EAT_4)(o(217, s), p, o, m)\n# define BOOST_PP_FOR_217(s, p, o, m) BOOST_PP_IF(p(218, s), m, BOOST_PP_TUPLE_EAT_2)(218, s) BOOST_PP_IF(p(218, s), BOOST_PP_FOR_218, BOOST_PP_TUPLE_EAT_4)(o(218, s), p, o, m)\n# define BOOST_PP_FOR_218(s, p, o, m) BOOST_PP_IF(p(219, s), m, BOOST_PP_TUPLE_EAT_2)(219, s) BOOST_PP_IF(p(219, s), BOOST_PP_FOR_219, BOOST_PP_TUPLE_EAT_4)(o(219, s), p, o, m)\n# define BOOST_PP_FOR_219(s, p, o, m) BOOST_PP_IF(p(220, s), m, BOOST_PP_TUPLE_EAT_2)(220, s) BOOST_PP_IF(p(220, s), BOOST_PP_FOR_220, BOOST_PP_TUPLE_EAT_4)(o(220, s), p, o, m)\n# define BOOST_PP_FOR_220(s, p, o, m) BOOST_PP_IF(p(221, s), m, BOOST_PP_TUPLE_EAT_2)(221, s) BOOST_PP_IF(p(221, s), BOOST_PP_FOR_221, BOOST_PP_TUPLE_EAT_4)(o(221, s), p, o, m)\n# define BOOST_PP_FOR_221(s, p, o, m) BOOST_PP_IF(p(222, s), m, BOOST_PP_TUPLE_EAT_2)(222, s) BOOST_PP_IF(p(222, s), BOOST_PP_FOR_222, BOOST_PP_TUPLE_EAT_4)(o(222, s), p, o, m)\n# define BOOST_PP_FOR_222(s, p, o, m) BOOST_PP_IF(p(223, s), m, BOOST_PP_TUPLE_EAT_2)(223, s) BOOST_PP_IF(p(223, s), BOOST_PP_FOR_223, BOOST_PP_TUPLE_EAT_4)(o(223, s), p, o, m)\n# define BOOST_PP_FOR_223(s, p, o, m) BOOST_PP_IF(p(224, s), m, BOOST_PP_TUPLE_EAT_2)(224, s) BOOST_PP_IF(p(224, s), BOOST_PP_FOR_224, BOOST_PP_TUPLE_EAT_4)(o(224, s), p, o, m)\n# define BOOST_PP_FOR_224(s, p, o, m) BOOST_PP_IF(p(225, s), m, BOOST_PP_TUPLE_EAT_2)(225, s) BOOST_PP_IF(p(225, s), BOOST_PP_FOR_225, BOOST_PP_TUPLE_EAT_4)(o(225, s), p, o, m)\n# define BOOST_PP_FOR_225(s, p, o, m) BOOST_PP_IF(p(226, s), m, BOOST_PP_TUPLE_EAT_2)(226, s) BOOST_PP_IF(p(226, s), BOOST_PP_FOR_226, BOOST_PP_TUPLE_EAT_4)(o(226, s), p, o, m)\n# define BOOST_PP_FOR_226(s, p, o, m) BOOST_PP_IF(p(227, s), m, BOOST_PP_TUPLE_EAT_2)(227, s) BOOST_PP_IF(p(227, s), BOOST_PP_FOR_227, BOOST_PP_TUPLE_EAT_4)(o(227, s), p, o, m)\n# define BOOST_PP_FOR_227(s, p, o, m) BOOST_PP_IF(p(228, s), m, BOOST_PP_TUPLE_EAT_2)(228, s) BOOST_PP_IF(p(228, s), BOOST_PP_FOR_228, BOOST_PP_TUPLE_EAT_4)(o(228, s), p, o, m)\n# define BOOST_PP_FOR_228(s, p, o, m) BOOST_PP_IF(p(229, s), m, BOOST_PP_TUPLE_EAT_2)(229, s) BOOST_PP_IF(p(229, s), BOOST_PP_FOR_229, BOOST_PP_TUPLE_EAT_4)(o(229, s), p, o, m)\n# define BOOST_PP_FOR_229(s, p, o, m) BOOST_PP_IF(p(230, s), m, BOOST_PP_TUPLE_EAT_2)(230, s) BOOST_PP_IF(p(230, s), BOOST_PP_FOR_230, BOOST_PP_TUPLE_EAT_4)(o(230, s), p, o, m)\n# define BOOST_PP_FOR_230(s, p, o, m) BOOST_PP_IF(p(231, s), m, BOOST_PP_TUPLE_EAT_2)(231, s) BOOST_PP_IF(p(231, s), BOOST_PP_FOR_231, BOOST_PP_TUPLE_EAT_4)(o(231, s), p, o, m)\n# define BOOST_PP_FOR_231(s, p, o, m) BOOST_PP_IF(p(232, s), m, BOOST_PP_TUPLE_EAT_2)(232, s) BOOST_PP_IF(p(232, s), BOOST_PP_FOR_232, BOOST_PP_TUPLE_EAT_4)(o(232, s), p, o, m)\n# define BOOST_PP_FOR_232(s, p, o, m) BOOST_PP_IF(p(233, s), m, BOOST_PP_TUPLE_EAT_2)(233, s) BOOST_PP_IF(p(233, s), BOOST_PP_FOR_233, BOOST_PP_TUPLE_EAT_4)(o(233, s), p, o, m)\n# define BOOST_PP_FOR_233(s, p, o, m) BOOST_PP_IF(p(234, s), m, BOOST_PP_TUPLE_EAT_2)(234, s) BOOST_PP_IF(p(234, s), BOOST_PP_FOR_234, BOOST_PP_TUPLE_EAT_4)(o(234, s), p, o, m)\n# define BOOST_PP_FOR_234(s, p, o, m) BOOST_PP_IF(p(235, s), m, BOOST_PP_TUPLE_EAT_2)(235, s) BOOST_PP_IF(p(235, s), BOOST_PP_FOR_235, BOOST_PP_TUPLE_EAT_4)(o(235, s), p, o, m)\n# define BOOST_PP_FOR_235(s, p, o, m) BOOST_PP_IF(p(236, s), m, BOOST_PP_TUPLE_EAT_2)(236, s) BOOST_PP_IF(p(236, s), BOOST_PP_FOR_236, BOOST_PP_TUPLE_EAT_4)(o(236, s), p, o, m)\n# define BOOST_PP_FOR_236(s, p, o, m) BOOST_PP_IF(p(237, s), m, BOOST_PP_TUPLE_EAT_2)(237, s) BOOST_PP_IF(p(237, s), BOOST_PP_FOR_237, BOOST_PP_TUPLE_EAT_4)(o(237, s), p, o, m)\n# define BOOST_PP_FOR_237(s, p, o, m) BOOST_PP_IF(p(238, s), m, BOOST_PP_TUPLE_EAT_2)(238, s) BOOST_PP_IF(p(238, s), BOOST_PP_FOR_238, BOOST_PP_TUPLE_EAT_4)(o(238, s), p, o, m)\n# define BOOST_PP_FOR_238(s, p, o, m) BOOST_PP_IF(p(239, s), m, BOOST_PP_TUPLE_EAT_2)(239, s) BOOST_PP_IF(p(239, s), BOOST_PP_FOR_239, BOOST_PP_TUPLE_EAT_4)(o(239, s), p, o, m)\n# define BOOST_PP_FOR_239(s, p, o, m) BOOST_PP_IF(p(240, s), m, BOOST_PP_TUPLE_EAT_2)(240, s) BOOST_PP_IF(p(240, s), BOOST_PP_FOR_240, BOOST_PP_TUPLE_EAT_4)(o(240, s), p, o, m)\n# define BOOST_PP_FOR_240(s, p, o, m) BOOST_PP_IF(p(241, s), m, BOOST_PP_TUPLE_EAT_2)(241, s) BOOST_PP_IF(p(241, s), BOOST_PP_FOR_241, BOOST_PP_TUPLE_EAT_4)(o(241, s), p, o, m)\n# define BOOST_PP_FOR_241(s, p, o, m) BOOST_PP_IF(p(242, s), m, BOOST_PP_TUPLE_EAT_2)(242, s) BOOST_PP_IF(p(242, s), BOOST_PP_FOR_242, BOOST_PP_TUPLE_EAT_4)(o(242, s), p, o, m)\n# define BOOST_PP_FOR_242(s, p, o, m) BOOST_PP_IF(p(243, s), m, BOOST_PP_TUPLE_EAT_2)(243, s) BOOST_PP_IF(p(243, s), BOOST_PP_FOR_243, BOOST_PP_TUPLE_EAT_4)(o(243, s), p, o, m)\n# define BOOST_PP_FOR_243(s, p, o, m) BOOST_PP_IF(p(244, s), m, BOOST_PP_TUPLE_EAT_2)(244, s) BOOST_PP_IF(p(244, s), BOOST_PP_FOR_244, BOOST_PP_TUPLE_EAT_4)(o(244, s), p, o, m)\n# define BOOST_PP_FOR_244(s, p, o, m) BOOST_PP_IF(p(245, s), m, BOOST_PP_TUPLE_EAT_2)(245, s) BOOST_PP_IF(p(245, s), BOOST_PP_FOR_245, BOOST_PP_TUPLE_EAT_4)(o(245, s), p, o, m)\n# define BOOST_PP_FOR_245(s, p, o, m) BOOST_PP_IF(p(246, s), m, BOOST_PP_TUPLE_EAT_2)(246, s) BOOST_PP_IF(p(246, s), BOOST_PP_FOR_246, BOOST_PP_TUPLE_EAT_4)(o(246, s), p, o, m)\n# define BOOST_PP_FOR_246(s, p, o, m) BOOST_PP_IF(p(247, s), m, BOOST_PP_TUPLE_EAT_2)(247, s) BOOST_PP_IF(p(247, s), BOOST_PP_FOR_247, BOOST_PP_TUPLE_EAT_4)(o(247, s), p, o, m)\n# define BOOST_PP_FOR_247(s, p, o, m) BOOST_PP_IF(p(248, s), m, BOOST_PP_TUPLE_EAT_2)(248, s) BOOST_PP_IF(p(248, s), BOOST_PP_FOR_248, BOOST_PP_TUPLE_EAT_4)(o(248, s), p, o, m)\n# define BOOST_PP_FOR_248(s, p, o, m) BOOST_PP_IF(p(249, s), m, BOOST_PP_TUPLE_EAT_2)(249, s) BOOST_PP_IF(p(249, s), BOOST_PP_FOR_249, BOOST_PP_TUPLE_EAT_4)(o(249, s), p, o, m)\n# define BOOST_PP_FOR_249(s, p, o, m) BOOST_PP_IF(p(250, s), m, BOOST_PP_TUPLE_EAT_2)(250, s) BOOST_PP_IF(p(250, s), BOOST_PP_FOR_250, BOOST_PP_TUPLE_EAT_4)(o(250, s), p, o, m)\n# define BOOST_PP_FOR_250(s, p, o, m) BOOST_PP_IF(p(251, s), m, BOOST_PP_TUPLE_EAT_2)(251, s) BOOST_PP_IF(p(251, s), BOOST_PP_FOR_251, BOOST_PP_TUPLE_EAT_4)(o(251, s), p, o, m)\n# define BOOST_PP_FOR_251(s, p, o, m) BOOST_PP_IF(p(252, s), m, BOOST_PP_TUPLE_EAT_2)(252, s) BOOST_PP_IF(p(252, s), BOOST_PP_FOR_252, BOOST_PP_TUPLE_EAT_4)(o(252, s), p, o, m)\n# define BOOST_PP_FOR_252(s, p, o, m) BOOST_PP_IF(p(253, s), m, BOOST_PP_TUPLE_EAT_2)(253, s) BOOST_PP_IF(p(253, s), BOOST_PP_FOR_253, BOOST_PP_TUPLE_EAT_4)(o(253, s), p, o, m)\n# define BOOST_PP_FOR_253(s, p, o, m) BOOST_PP_IF(p(254, s), m, BOOST_PP_TUPLE_EAT_2)(254, s) BOOST_PP_IF(p(254, s), BOOST_PP_FOR_254, BOOST_PP_TUPLE_EAT_4)(o(254, s), p, o, m)\n# define BOOST_PP_FOR_254(s, p, o, m) BOOST_PP_IF(p(255, s), m, BOOST_PP_TUPLE_EAT_2)(255, s) BOOST_PP_IF(p(255, s), BOOST_PP_FOR_255, BOOST_PP_TUPLE_EAT_4)(o(255, s), p, o, m)\n# define BOOST_PP_FOR_255(s, p, o, m) BOOST_PP_IF(p(256, s), m, BOOST_PP_TUPLE_EAT_2)(256, s) BOOST_PP_IF(p(256, s), BOOST_PP_FOR_256, BOOST_PP_TUPLE_EAT_4)(o(256, s), p, o, m)\n# define BOOST_PP_FOR_256(s, p, o, m) BOOST_PP_IF(p(257, s), m, BOOST_PP_TUPLE_EAT_2)(257, s) BOOST_PP_IF(p(257, s), BOOST_PP_FOR_257, BOOST_PP_TUPLE_EAT_4)(o(257, s), p, o, m)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM */\n#\n# if 0\n#    define BOOST_PP_ENUM(count, macro, data)\n# endif\n#\n# define BOOST_PP_ENUM BOOST_PP_CAT(BOOST_PP_ENUM_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_1(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_M_1, (m, d))\n#    define BOOST_PP_ENUM_2(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_M_2, (m, d))\n#    define BOOST_PP_ENUM_3(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_M_3, (m, d))\n# else\n#    define BOOST_PP_ENUM_1(c, m, d) BOOST_PP_ENUM_1_I(c, m, d)\n#    define BOOST_PP_ENUM_2(c, m, d) BOOST_PP_ENUM_2_I(c, m, d)\n#    define BOOST_PP_ENUM_3(c, m, d) BOOST_PP_ENUM_3_I(c, m, d)\n#    define BOOST_PP_ENUM_1_I(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_M_1, (m, d))\n#    define BOOST_PP_ENUM_2_I(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_M_2, (m, d))\n#    define BOOST_PP_ENUM_3_I(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_M_3, (m, d))\n# endif\n#\n# define BOOST_PP_ENUM_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_M_1(z, n, md) BOOST_PP_ENUM_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_M_2(z, n, md) BOOST_PP_ENUM_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_M_3(z, n, md) BOOST_PP_ENUM_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_M_1_IM(z, n, im) BOOST_PP_ENUM_M_1_I(z, n, im)\n#    define BOOST_PP_ENUM_M_2_IM(z, n, im) BOOST_PP_ENUM_M_2_I(z, n, im)\n#    define BOOST_PP_ENUM_M_3_IM(z, n, im) BOOST_PP_ENUM_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_M_1(z, n, md) BOOST_PP_ENUM_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_M_2(z, n, md) BOOST_PP_ENUM_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_M_3(z, n, md) BOOST_PP_ENUM_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n# endif\n#\n# define BOOST_PP_ENUM_M_1_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)\n# define BOOST_PP_ENUM_M_2_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)\n# define BOOST_PP_ENUM_M_3_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, n, d)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_binary_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_BINARY_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_BINARY_PARAMS_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_BINARY_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_I(count, p1, p2)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_M_II(z, n, p1, p2)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_II(z, n, p1, p2) BOOST_PP_COMMA_IF(n) p1 ## n p2 ## n\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(p1, n) BOOST_PP_CAT(p2, n)\n# endif\n#\n# /* BOOST_PP_ENUM_BINARY_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_BINARY_PARAMS_Z_I(z, count, p1, p2)\n#    define BOOST_PP_ENUM_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_params.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_ENUM_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_ENUM_PARAMS_I(count, param)\n#    define BOOST_PP_ENUM_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, param)\n# endif\n#\n# define BOOST_PP_ENUM_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) param ## n\n#\n# /* BOOST_PP_ENUM_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_PARAMS_Z(z, count, param) BOOST_PP_ENUM_PARAMS_Z_I(z, count, param)\n#    define BOOST_PP_ENUM_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_PARAMS_M, param)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_params_with_a_default.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_A_DEFAULT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/intercept.hpp>\n# include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#\n# /* BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT */\n#\n# define BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(count, param, def) BOOST_PP_ENUM_BINARY_PARAMS(count, param, = def BOOST_PP_INTERCEPT)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_params_with_defaults.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_DEFAULTS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_PARAMS_WITH_DEFAULTS_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/repetition/enum_binary_params.hpp>\n#\n# /* BOOST_PP_ENUM_PARAMS_WITH_DEFAULTS */\n#\n# define BOOST_PP_ENUM_PARAMS_WITH_DEFAULTS(count, param, def) BOOST_PP_ENUM_BINARY_PARAMS(count, param, = def)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_shifted.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_SHIFTED */\n#\n# if 0\n#    define BOOST_PP_ENUM_SHIFTED(count, macro, data)\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED BOOST_PP_CAT(BOOST_PP_ENUM_SHIFTED_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_1(c, m, d) BOOST_PP_REPEAT_1(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_1, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_2(c, m, d) BOOST_PP_REPEAT_2(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_2, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_3(c, m, d) BOOST_PP_REPEAT_3(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_3, (m, d))\n# else\n#    define BOOST_PP_ENUM_SHIFTED_1(c, m, d) BOOST_PP_ENUM_SHIFTED_1_I(c, m, d)\n#    define BOOST_PP_ENUM_SHIFTED_2(c, m, d) BOOST_PP_ENUM_SHIFTED_1_2(c, m, d)\n#    define BOOST_PP_ENUM_SHIFTED_3(c, m, d) BOOST_PP_ENUM_SHIFTED_1_3(c, m, d)\n#    define BOOST_PP_ENUM_SHIFTED_1_I(c, m, d) BOOST_PP_REPEAT_1(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_1, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_2_I(c, m, d) BOOST_PP_REPEAT_2(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_2, (m, d))\n#    define BOOST_PP_ENUM_SHIFTED_3_I(c, m, d) BOOST_PP_REPEAT_3(BOOST_PP_DEC(c), BOOST_PP_ENUM_SHIFTED_M_3, (m, d))\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_SHIFTED_M_1(z, n, md) BOOST_PP_ENUM_SHIFTED_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_SHIFTED_M_2(z, n, md) BOOST_PP_ENUM_SHIFTED_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_SHIFTED_M_3(z, n, md) BOOST_PP_ENUM_SHIFTED_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_SHIFTED_M_1_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, im)\n#    define BOOST_PP_ENUM_SHIFTED_M_2_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, im)\n#    define BOOST_PP_ENUM_SHIFTED_M_3_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_M_1(z, n, md) BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_SHIFTED_M_2(z, n, md) BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_SHIFTED_M_3(z, n, md) BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_M_1_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)\n# define BOOST_PP_ENUM_SHIFTED_M_2_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)\n# define BOOST_PP_ENUM_SHIFTED_M_3_I(z, n, m, d) BOOST_PP_COMMA_IF(n) m(z, BOOST_PP_INC(n), d)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_shifted_binary_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2005.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_BINARY_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_BINARY_PARAMS_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_I(count, p1, p2)\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(p1, BOOST_PP_INC(n)) BOOST_PP_CAT(p2, BOOST_PP_INC(n))\n#\n# /* BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z_I(z, count, p1, p2)\n#    define BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_shifted_params.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_SHIFTED_PARAMS_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/punctuation/comma_if.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_ENUM_SHIFTED_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_I(count, param)\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_I(count, param) BOOST_PP_REPEAT(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# endif\n#\n# define BOOST_PP_ENUM_SHIFTED_PARAMS_M(z, n, param) BOOST_PP_COMMA_IF(n) BOOST_PP_CAT(param, BOOST_PP_INC(n))\n#\n# /* BOOST_PP_ENUM_SHIFTED_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z(z, count, param) BOOST_PP_ENUM_SHIFTED_PARAMS_Z_I(z, count, param)\n#    define BOOST_PP_ENUM_SHIFTED_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(BOOST_PP_DEC(count), BOOST_PP_ENUM_SHIFTED_PARAMS_M, param)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_trailing.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_TRAILING */\n#\n# if 0\n#    define BOOST_PP_ENUM_TRAILING(count, macro, data)\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING BOOST_PP_CAT(BOOST_PP_ENUM_TRAILING_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_1(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_TRAILING_M_1, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_2(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_TRAILING_M_2, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_3(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_TRAILING_M_3, (m, d))\n# else\n#    define BOOST_PP_ENUM_TRAILING_1(c, m, d) BOOST_PP_ENUM_TRAILING_1_I(c, m, d)\n#    define BOOST_PP_ENUM_TRAILING_2(c, m, d) BOOST_PP_ENUM_TRAILING_2_I(c, m, d)\n#    define BOOST_PP_ENUM_TRAILING_3(c, m, d) BOOST_PP_ENUM_TRAILING_3_I(c, m, d)\n#    define BOOST_PP_ENUM_TRAILING_1_I(c, m, d) BOOST_PP_REPEAT_1(c, BOOST_PP_ENUM_TRAILING_M_1, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_2_I(c, m, d) BOOST_PP_REPEAT_2(c, BOOST_PP_ENUM_TRAILING_M_2, (m, d))\n#    define BOOST_PP_ENUM_TRAILING_3_I(c, m, d) BOOST_PP_REPEAT_3(c, BOOST_PP_ENUM_TRAILING_M_3, (m, d))\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_TRAILING_M_1(z, n, md) BOOST_PP_ENUM_TRAILING_M_1_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_TRAILING_M_2(z, n, md) BOOST_PP_ENUM_TRAILING_M_2_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_TRAILING_M_3(z, n, md) BOOST_PP_ENUM_TRAILING_M_3_IM(z, n, BOOST_PP_TUPLE_REM_2 md)\n#    define BOOST_PP_ENUM_TRAILING_M_1_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_1_I(z, n, im)\n#    define BOOST_PP_ENUM_TRAILING_M_2_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_2_I(z, n, im)\n#    define BOOST_PP_ENUM_TRAILING_M_3_IM(z, n, im) BOOST_PP_ENUM_TRAILING_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_TRAILING_M_1(z, n, md) BOOST_PP_ENUM_TRAILING_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_TRAILING_M_2(z, n, md) BOOST_PP_ENUM_TRAILING_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n#    define BOOST_PP_ENUM_TRAILING_M_3(z, n, md) BOOST_PP_ENUM_TRAILING_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, md), BOOST_PP_TUPLE_ELEM(2, 1, md))\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING_M_1_I(z, n, m, d) , m(z, n, d)\n# define BOOST_PP_ENUM_TRAILING_M_2_I(z, n, m, d) , m(z, n, d)\n# define BOOST_PP_ENUM_TRAILING_M_3_I(z, n, m, d) , m(z, n, d)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_trailing_binary_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_BINARY_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_BINARY_PARAMS_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_ENUM_TRAILING_BINARY_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(count, p1, p2) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_I(count, p1, p2)\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_I(count, p1, p2) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_IM(z, n, BOOST_PP_TUPLE_REM_2 pp)\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_IM(z, n, im) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, im)\n# else\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M(z, n, pp) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, BOOST_PP_TUPLE_ELEM(2, 0, pp), BOOST_PP_TUPLE_ELEM(2, 1, pp))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, p1, p2) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_II(z, n, p1, p2)\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_II(z, n, p1, p2) , p1 ## n p2 ## n\n# else\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M_I(z, n, p1, p2) , BOOST_PP_CAT(p1, n) BOOST_PP_CAT(p2, n)\n# endif\n#\n# /* BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))\n# else\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z(z, count, p1, p2) BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z_I(z, count, p1, p2)\n#    define BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z_I(z, count, p1, p2) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_M, (p1, p2))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/enum_trailing_params.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP\n# define BOOST_PREPROCESSOR_REPETITION_ENUM_TRAILING_PARAMS_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n#\n# /* BOOST_PP_ENUM_TRAILING_PARAMS */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_TRAILING_PARAMS(count, param) BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param)\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_I(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# endif\n#\n# define BOOST_PP_ENUM_TRAILING_PARAMS_M(z, n, param) , param ## n\n#\n# /* BOOST_PP_ENUM_TRAILING_PARAMS_Z */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# else\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, count, param) BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param)\n#    define BOOST_PP_ENUM_TRAILING_PARAMS_Z_I(z, count, param) BOOST_PP_REPEAT_ ## z(count, BOOST_PP_ENUM_TRAILING_PARAMS_M, param)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/for.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_FOR_HPP\n# define BOOST_PREPROCESSOR_REPETITION_FOR_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n#\n# /* BOOST_PP_FOR */\n#\n# if 0\n#    define BOOST_PP_FOR(state, pred, op, macro)\n# endif\n#\n# define BOOST_PP_FOR BOOST_PP_CAT(BOOST_PP_FOR_, BOOST_PP_AUTO_REC(BOOST_PP_FOR_P, 256))\n#\n# define BOOST_PP_FOR_P(n) BOOST_PP_CAT(BOOST_PP_FOR_CHECK_, BOOST_PP_FOR_ ## n(1, BOOST_PP_FOR_SR_P, BOOST_PP_FOR_SR_O, BOOST_PP_FOR_SR_M))\n#\n# define BOOST_PP_FOR_SR_P(r, s) s\n# define BOOST_PP_FOR_SR_O(r, s) 0\n# define BOOST_PP_FOR_SR_M(r, s) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    include <boost/preprocessor/repetition/detail/edg/for.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    include <boost/preprocessor/repetition/detail/msvc/for.hpp>\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    include <boost/preprocessor/repetition/detail/dmc/for.hpp>\n# else\n#    include <boost/preprocessor/repetition/detail/for.hpp>\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n# define BOOST_PP_FOR_257_PR(s, p) BOOST_PP_BOOL(p##(257, s))\n# else\n# define BOOST_PP_FOR_257_PR(s, p) BOOST_PP_BOOL(p(257, s))\n# endif\n\n# define BOOST_PP_FOR_257_ERROR() BOOST_PP_ERROR(0x0002)\n# define BOOST_PP_FOR_257(s, p, o, m) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_FOR_257_PR(s,p), \\\n\t\tBOOST_PP_FOR_257_ERROR, \\\n\t\tBOOST_PP_EMPTY \\\n\t\t) \\\n\t() \\\n/**/\n// # define BOOST_PP_FOR_257(s, p, o, m) BOOST_PP_ERROR(0x0002)\n#\n# define BOOST_PP_FOR_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_1(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_2(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_3(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_4(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_5(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_6(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_7(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_8(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_9(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_10(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_11(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_12(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_13(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_14(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_15(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_16(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_17(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_18(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_19(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_20(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_21(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_22(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_23(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_24(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_25(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_26(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_27(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_28(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_29(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_30(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_31(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_32(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_33(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_34(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_35(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_36(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_37(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_38(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_39(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_40(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_41(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_42(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_43(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_44(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_45(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_46(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_47(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_48(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_49(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_50(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_51(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_52(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_53(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_54(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_55(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_56(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_57(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_58(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_59(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_60(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_61(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_62(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_63(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_64(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_65(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_66(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_67(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_68(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_69(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_70(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_71(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_72(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_73(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_74(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_75(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_76(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_77(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_78(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_79(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_80(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_81(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_82(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_83(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_84(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_85(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_86(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_87(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_88(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_89(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_90(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_91(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_92(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_93(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_94(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_95(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_96(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_97(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_98(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_99(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_100(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_101(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_102(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_103(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_104(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_105(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_106(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_107(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_108(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_109(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_110(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_111(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_112(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_113(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_114(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_115(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_116(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_117(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_118(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_119(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_120(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_121(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_122(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_123(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_124(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_125(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_126(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_127(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_128(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_129(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_130(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_131(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_132(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_133(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_134(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_135(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_136(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_137(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_138(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_139(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_140(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_141(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_142(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_143(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_144(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_145(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_146(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_147(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_148(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_149(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_150(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_151(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_152(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_153(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_154(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_155(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_156(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_157(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_158(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_159(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_160(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_161(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_162(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_163(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_164(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_165(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_166(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_167(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_168(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_169(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_170(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_171(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_172(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_173(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_174(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_175(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_176(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_177(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_178(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_179(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_180(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_181(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_182(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_183(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_184(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_185(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_186(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_187(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_188(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_189(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_190(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_191(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_192(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_193(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_194(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_195(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_196(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_197(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_198(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_199(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_200(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_201(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_202(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_203(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_204(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_205(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_206(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_207(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_208(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_209(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_210(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_211(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_212(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_213(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_214(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_215(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_216(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_217(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_218(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_219(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_220(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_221(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_222(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_223(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_224(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_225(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_226(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_227(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_228(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_229(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_230(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_231(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_232(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_233(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_234(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_235(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_236(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_237(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_238(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_239(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_240(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_241(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_242(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_243(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_244(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_245(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_246(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_247(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_248(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_249(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_250(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_251(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_252(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_253(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_254(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_255(s, p, o, m) 0\n# define BOOST_PP_FOR_CHECK_BOOST_PP_FOR_256(s, p, o, m) 0\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/repeat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_REPEAT_HPP\n# define BOOST_PREPROCESSOR_REPETITION_REPEAT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_REPEAT */\n#\n# if 0\n#    define BOOST_PP_REPEAT(count, macro, data)\n# endif\n#\n# define BOOST_PP_REPEAT BOOST_PP_CAT(BOOST_PP_REPEAT_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# define BOOST_PP_REPEAT_P(n) BOOST_PP_CAT(BOOST_PP_REPEAT_CHECK_, BOOST_PP_REPEAT_ ## n(1, BOOST_PP_NIL BOOST_PP_TUPLE_EAT_3, BOOST_PP_NIL))\n#\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_NIL 1\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_1(c, m, d) 0\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_2(c, m, d) 0\n# define BOOST_PP_REPEAT_CHECK_BOOST_PP_REPEAT_3(c, m, d) 0\n#\n# define BOOST_PP_REPEAT_1(c, m, d) BOOST_PP_REPEAT_1_I(c, m, d)\n# define BOOST_PP_REPEAT_2(c, m, d) BOOST_PP_REPEAT_2_I(c, m, d)\n# define BOOST_PP_REPEAT_3(c, m, d) BOOST_PP_REPEAT_3_I(c, m, d)\n# define BOOST_PP_REPEAT_4(c, m, d) BOOST_PP_ERROR(0x0003)\n#\n# define BOOST_PP_REPEAT_1_I(c, m, d) BOOST_PP_REPEAT_1_ ## c(m, d)\n# define BOOST_PP_REPEAT_2_I(c, m, d) BOOST_PP_REPEAT_2_ ## c(m, d)\n# define BOOST_PP_REPEAT_3_I(c, m, d) BOOST_PP_REPEAT_3_ ## c(m, d)\n#\n# define BOOST_PP_REPEAT_1ST BOOST_PP_REPEAT_1\n# define BOOST_PP_REPEAT_2ND BOOST_PP_REPEAT_2\n# define BOOST_PP_REPEAT_3RD BOOST_PP_REPEAT_3\n#\n# define BOOST_PP_REPEAT_1_0(m, d)\n# define BOOST_PP_REPEAT_1_1(m, d) m(2, 0, d)\n# define BOOST_PP_REPEAT_1_2(m, d) BOOST_PP_REPEAT_1_1(m, d) m(2, 1, d)\n# define BOOST_PP_REPEAT_1_3(m, d) BOOST_PP_REPEAT_1_2(m, d) m(2, 2, d)\n# define BOOST_PP_REPEAT_1_4(m, d) BOOST_PP_REPEAT_1_3(m, d) m(2, 3, d)\n# define BOOST_PP_REPEAT_1_5(m, d) BOOST_PP_REPEAT_1_4(m, d) m(2, 4, d)\n# define BOOST_PP_REPEAT_1_6(m, d) BOOST_PP_REPEAT_1_5(m, d) m(2, 5, d)\n# define BOOST_PP_REPEAT_1_7(m, d) BOOST_PP_REPEAT_1_6(m, d) m(2, 6, d)\n# define BOOST_PP_REPEAT_1_8(m, d) BOOST_PP_REPEAT_1_7(m, d) m(2, 7, d)\n# define BOOST_PP_REPEAT_1_9(m, d) BOOST_PP_REPEAT_1_8(m, d) m(2, 8, d)\n# define BOOST_PP_REPEAT_1_10(m, d) BOOST_PP_REPEAT_1_9(m, d) m(2, 9, d)\n# define BOOST_PP_REPEAT_1_11(m, d) BOOST_PP_REPEAT_1_10(m, d) m(2, 10, d)\n# define BOOST_PP_REPEAT_1_12(m, d) BOOST_PP_REPEAT_1_11(m, d) m(2, 11, d)\n# define BOOST_PP_REPEAT_1_13(m, d) BOOST_PP_REPEAT_1_12(m, d) m(2, 12, d)\n# define BOOST_PP_REPEAT_1_14(m, d) BOOST_PP_REPEAT_1_13(m, d) m(2, 13, d)\n# define BOOST_PP_REPEAT_1_15(m, d) BOOST_PP_REPEAT_1_14(m, d) m(2, 14, d)\n# define BOOST_PP_REPEAT_1_16(m, d) BOOST_PP_REPEAT_1_15(m, d) m(2, 15, d)\n# define BOOST_PP_REPEAT_1_17(m, d) BOOST_PP_REPEAT_1_16(m, d) m(2, 16, d)\n# define BOOST_PP_REPEAT_1_18(m, d) BOOST_PP_REPEAT_1_17(m, d) m(2, 17, d)\n# define BOOST_PP_REPEAT_1_19(m, d) BOOST_PP_REPEAT_1_18(m, d) m(2, 18, d)\n# define BOOST_PP_REPEAT_1_20(m, d) BOOST_PP_REPEAT_1_19(m, d) m(2, 19, d)\n# define BOOST_PP_REPEAT_1_21(m, d) BOOST_PP_REPEAT_1_20(m, d) m(2, 20, d)\n# define BOOST_PP_REPEAT_1_22(m, d) BOOST_PP_REPEAT_1_21(m, d) m(2, 21, d)\n# define BOOST_PP_REPEAT_1_23(m, d) BOOST_PP_REPEAT_1_22(m, d) m(2, 22, d)\n# define BOOST_PP_REPEAT_1_24(m, d) BOOST_PP_REPEAT_1_23(m, d) m(2, 23, d)\n# define BOOST_PP_REPEAT_1_25(m, d) BOOST_PP_REPEAT_1_24(m, d) m(2, 24, d)\n# define BOOST_PP_REPEAT_1_26(m, d) BOOST_PP_REPEAT_1_25(m, d) m(2, 25, d)\n# define BOOST_PP_REPEAT_1_27(m, d) BOOST_PP_REPEAT_1_26(m, d) m(2, 26, d)\n# define BOOST_PP_REPEAT_1_28(m, d) BOOST_PP_REPEAT_1_27(m, d) m(2, 27, d)\n# define BOOST_PP_REPEAT_1_29(m, d) BOOST_PP_REPEAT_1_28(m, d) m(2, 28, d)\n# define BOOST_PP_REPEAT_1_30(m, d) BOOST_PP_REPEAT_1_29(m, d) m(2, 29, d)\n# define BOOST_PP_REPEAT_1_31(m, d) BOOST_PP_REPEAT_1_30(m, d) m(2, 30, d)\n# define BOOST_PP_REPEAT_1_32(m, d) BOOST_PP_REPEAT_1_31(m, d) m(2, 31, d)\n# define BOOST_PP_REPEAT_1_33(m, d) BOOST_PP_REPEAT_1_32(m, d) m(2, 32, d)\n# define BOOST_PP_REPEAT_1_34(m, d) BOOST_PP_REPEAT_1_33(m, d) m(2, 33, d)\n# define BOOST_PP_REPEAT_1_35(m, d) BOOST_PP_REPEAT_1_34(m, d) m(2, 34, d)\n# define BOOST_PP_REPEAT_1_36(m, d) BOOST_PP_REPEAT_1_35(m, d) m(2, 35, d)\n# define BOOST_PP_REPEAT_1_37(m, d) BOOST_PP_REPEAT_1_36(m, d) m(2, 36, d)\n# define BOOST_PP_REPEAT_1_38(m, d) BOOST_PP_REPEAT_1_37(m, d) m(2, 37, d)\n# define BOOST_PP_REPEAT_1_39(m, d) BOOST_PP_REPEAT_1_38(m, d) m(2, 38, d)\n# define BOOST_PP_REPEAT_1_40(m, d) BOOST_PP_REPEAT_1_39(m, d) m(2, 39, d)\n# define BOOST_PP_REPEAT_1_41(m, d) BOOST_PP_REPEAT_1_40(m, d) m(2, 40, d)\n# define BOOST_PP_REPEAT_1_42(m, d) BOOST_PP_REPEAT_1_41(m, d) m(2, 41, d)\n# define BOOST_PP_REPEAT_1_43(m, d) BOOST_PP_REPEAT_1_42(m, d) m(2, 42, d)\n# define BOOST_PP_REPEAT_1_44(m, d) BOOST_PP_REPEAT_1_43(m, d) m(2, 43, d)\n# define BOOST_PP_REPEAT_1_45(m, d) BOOST_PP_REPEAT_1_44(m, d) m(2, 44, d)\n# define BOOST_PP_REPEAT_1_46(m, d) BOOST_PP_REPEAT_1_45(m, d) m(2, 45, d)\n# define BOOST_PP_REPEAT_1_47(m, d) BOOST_PP_REPEAT_1_46(m, d) m(2, 46, d)\n# define BOOST_PP_REPEAT_1_48(m, d) BOOST_PP_REPEAT_1_47(m, d) m(2, 47, d)\n# define BOOST_PP_REPEAT_1_49(m, d) BOOST_PP_REPEAT_1_48(m, d) m(2, 48, d)\n# define BOOST_PP_REPEAT_1_50(m, d) BOOST_PP_REPEAT_1_49(m, d) m(2, 49, d)\n# define BOOST_PP_REPEAT_1_51(m, d) BOOST_PP_REPEAT_1_50(m, d) m(2, 50, d)\n# define BOOST_PP_REPEAT_1_52(m, d) BOOST_PP_REPEAT_1_51(m, d) m(2, 51, d)\n# define BOOST_PP_REPEAT_1_53(m, d) BOOST_PP_REPEAT_1_52(m, d) m(2, 52, d)\n# define BOOST_PP_REPEAT_1_54(m, d) BOOST_PP_REPEAT_1_53(m, d) m(2, 53, d)\n# define BOOST_PP_REPEAT_1_55(m, d) BOOST_PP_REPEAT_1_54(m, d) m(2, 54, d)\n# define BOOST_PP_REPEAT_1_56(m, d) BOOST_PP_REPEAT_1_55(m, d) m(2, 55, d)\n# define BOOST_PP_REPEAT_1_57(m, d) BOOST_PP_REPEAT_1_56(m, d) m(2, 56, d)\n# define BOOST_PP_REPEAT_1_58(m, d) BOOST_PP_REPEAT_1_57(m, d) m(2, 57, d)\n# define BOOST_PP_REPEAT_1_59(m, d) BOOST_PP_REPEAT_1_58(m, d) m(2, 58, d)\n# define BOOST_PP_REPEAT_1_60(m, d) BOOST_PP_REPEAT_1_59(m, d) m(2, 59, d)\n# define BOOST_PP_REPEAT_1_61(m, d) BOOST_PP_REPEAT_1_60(m, d) m(2, 60, d)\n# define BOOST_PP_REPEAT_1_62(m, d) BOOST_PP_REPEAT_1_61(m, d) m(2, 61, d)\n# define BOOST_PP_REPEAT_1_63(m, d) BOOST_PP_REPEAT_1_62(m, d) m(2, 62, d)\n# define BOOST_PP_REPEAT_1_64(m, d) BOOST_PP_REPEAT_1_63(m, d) m(2, 63, d)\n# define BOOST_PP_REPEAT_1_65(m, d) BOOST_PP_REPEAT_1_64(m, d) m(2, 64, d)\n# define BOOST_PP_REPEAT_1_66(m, d) BOOST_PP_REPEAT_1_65(m, d) m(2, 65, d)\n# define BOOST_PP_REPEAT_1_67(m, d) BOOST_PP_REPEAT_1_66(m, d) m(2, 66, d)\n# define BOOST_PP_REPEAT_1_68(m, d) BOOST_PP_REPEAT_1_67(m, d) m(2, 67, d)\n# define BOOST_PP_REPEAT_1_69(m, d) BOOST_PP_REPEAT_1_68(m, d) m(2, 68, d)\n# define BOOST_PP_REPEAT_1_70(m, d) BOOST_PP_REPEAT_1_69(m, d) m(2, 69, d)\n# define BOOST_PP_REPEAT_1_71(m, d) BOOST_PP_REPEAT_1_70(m, d) m(2, 70, d)\n# define BOOST_PP_REPEAT_1_72(m, d) BOOST_PP_REPEAT_1_71(m, d) m(2, 71, d)\n# define BOOST_PP_REPEAT_1_73(m, d) BOOST_PP_REPEAT_1_72(m, d) m(2, 72, d)\n# define BOOST_PP_REPEAT_1_74(m, d) BOOST_PP_REPEAT_1_73(m, d) m(2, 73, d)\n# define BOOST_PP_REPEAT_1_75(m, d) BOOST_PP_REPEAT_1_74(m, d) m(2, 74, d)\n# define BOOST_PP_REPEAT_1_76(m, d) BOOST_PP_REPEAT_1_75(m, d) m(2, 75, d)\n# define BOOST_PP_REPEAT_1_77(m, d) BOOST_PP_REPEAT_1_76(m, d) m(2, 76, d)\n# define BOOST_PP_REPEAT_1_78(m, d) BOOST_PP_REPEAT_1_77(m, d) m(2, 77, d)\n# define BOOST_PP_REPEAT_1_79(m, d) BOOST_PP_REPEAT_1_78(m, d) m(2, 78, d)\n# define BOOST_PP_REPEAT_1_80(m, d) BOOST_PP_REPEAT_1_79(m, d) m(2, 79, d)\n# define BOOST_PP_REPEAT_1_81(m, d) BOOST_PP_REPEAT_1_80(m, d) m(2, 80, d)\n# define BOOST_PP_REPEAT_1_82(m, d) BOOST_PP_REPEAT_1_81(m, d) m(2, 81, d)\n# define BOOST_PP_REPEAT_1_83(m, d) BOOST_PP_REPEAT_1_82(m, d) m(2, 82, d)\n# define BOOST_PP_REPEAT_1_84(m, d) BOOST_PP_REPEAT_1_83(m, d) m(2, 83, d)\n# define BOOST_PP_REPEAT_1_85(m, d) BOOST_PP_REPEAT_1_84(m, d) m(2, 84, d)\n# define BOOST_PP_REPEAT_1_86(m, d) BOOST_PP_REPEAT_1_85(m, d) m(2, 85, d)\n# define BOOST_PP_REPEAT_1_87(m, d) BOOST_PP_REPEAT_1_86(m, d) m(2, 86, d)\n# define BOOST_PP_REPEAT_1_88(m, d) BOOST_PP_REPEAT_1_87(m, d) m(2, 87, d)\n# define BOOST_PP_REPEAT_1_89(m, d) BOOST_PP_REPEAT_1_88(m, d) m(2, 88, d)\n# define BOOST_PP_REPEAT_1_90(m, d) BOOST_PP_REPEAT_1_89(m, d) m(2, 89, d)\n# define BOOST_PP_REPEAT_1_91(m, d) BOOST_PP_REPEAT_1_90(m, d) m(2, 90, d)\n# define BOOST_PP_REPEAT_1_92(m, d) BOOST_PP_REPEAT_1_91(m, d) m(2, 91, d)\n# define BOOST_PP_REPEAT_1_93(m, d) BOOST_PP_REPEAT_1_92(m, d) m(2, 92, d)\n# define BOOST_PP_REPEAT_1_94(m, d) BOOST_PP_REPEAT_1_93(m, d) m(2, 93, d)\n# define BOOST_PP_REPEAT_1_95(m, d) BOOST_PP_REPEAT_1_94(m, d) m(2, 94, d)\n# define BOOST_PP_REPEAT_1_96(m, d) BOOST_PP_REPEAT_1_95(m, d) m(2, 95, d)\n# define BOOST_PP_REPEAT_1_97(m, d) BOOST_PP_REPEAT_1_96(m, d) m(2, 96, d)\n# define BOOST_PP_REPEAT_1_98(m, d) BOOST_PP_REPEAT_1_97(m, d) m(2, 97, d)\n# define BOOST_PP_REPEAT_1_99(m, d) BOOST_PP_REPEAT_1_98(m, d) m(2, 98, d)\n# define BOOST_PP_REPEAT_1_100(m, d) BOOST_PP_REPEAT_1_99(m, d) m(2, 99, d)\n# define BOOST_PP_REPEAT_1_101(m, d) BOOST_PP_REPEAT_1_100(m, d) m(2, 100, d)\n# define BOOST_PP_REPEAT_1_102(m, d) BOOST_PP_REPEAT_1_101(m, d) m(2, 101, d)\n# define BOOST_PP_REPEAT_1_103(m, d) BOOST_PP_REPEAT_1_102(m, d) m(2, 102, d)\n# define BOOST_PP_REPEAT_1_104(m, d) BOOST_PP_REPEAT_1_103(m, d) m(2, 103, d)\n# define BOOST_PP_REPEAT_1_105(m, d) BOOST_PP_REPEAT_1_104(m, d) m(2, 104, d)\n# define BOOST_PP_REPEAT_1_106(m, d) BOOST_PP_REPEAT_1_105(m, d) m(2, 105, d)\n# define BOOST_PP_REPEAT_1_107(m, d) BOOST_PP_REPEAT_1_106(m, d) m(2, 106, d)\n# define BOOST_PP_REPEAT_1_108(m, d) BOOST_PP_REPEAT_1_107(m, d) m(2, 107, d)\n# define BOOST_PP_REPEAT_1_109(m, d) BOOST_PP_REPEAT_1_108(m, d) m(2, 108, d)\n# define BOOST_PP_REPEAT_1_110(m, d) BOOST_PP_REPEAT_1_109(m, d) m(2, 109, d)\n# define BOOST_PP_REPEAT_1_111(m, d) BOOST_PP_REPEAT_1_110(m, d) m(2, 110, d)\n# define BOOST_PP_REPEAT_1_112(m, d) BOOST_PP_REPEAT_1_111(m, d) m(2, 111, d)\n# define BOOST_PP_REPEAT_1_113(m, d) BOOST_PP_REPEAT_1_112(m, d) m(2, 112, d)\n# define BOOST_PP_REPEAT_1_114(m, d) BOOST_PP_REPEAT_1_113(m, d) m(2, 113, d)\n# define BOOST_PP_REPEAT_1_115(m, d) BOOST_PP_REPEAT_1_114(m, d) m(2, 114, d)\n# define BOOST_PP_REPEAT_1_116(m, d) BOOST_PP_REPEAT_1_115(m, d) m(2, 115, d)\n# define BOOST_PP_REPEAT_1_117(m, d) BOOST_PP_REPEAT_1_116(m, d) m(2, 116, d)\n# define BOOST_PP_REPEAT_1_118(m, d) BOOST_PP_REPEAT_1_117(m, d) m(2, 117, d)\n# define BOOST_PP_REPEAT_1_119(m, d) BOOST_PP_REPEAT_1_118(m, d) m(2, 118, d)\n# define BOOST_PP_REPEAT_1_120(m, d) BOOST_PP_REPEAT_1_119(m, d) m(2, 119, d)\n# define BOOST_PP_REPEAT_1_121(m, d) BOOST_PP_REPEAT_1_120(m, d) m(2, 120, d)\n# define BOOST_PP_REPEAT_1_122(m, d) BOOST_PP_REPEAT_1_121(m, d) m(2, 121, d)\n# define BOOST_PP_REPEAT_1_123(m, d) BOOST_PP_REPEAT_1_122(m, d) m(2, 122, d)\n# define BOOST_PP_REPEAT_1_124(m, d) BOOST_PP_REPEAT_1_123(m, d) m(2, 123, d)\n# define BOOST_PP_REPEAT_1_125(m, d) BOOST_PP_REPEAT_1_124(m, d) m(2, 124, d)\n# define BOOST_PP_REPEAT_1_126(m, d) BOOST_PP_REPEAT_1_125(m, d) m(2, 125, d)\n# define BOOST_PP_REPEAT_1_127(m, d) BOOST_PP_REPEAT_1_126(m, d) m(2, 126, d)\n# define BOOST_PP_REPEAT_1_128(m, d) BOOST_PP_REPEAT_1_127(m, d) m(2, 127, d)\n# define BOOST_PP_REPEAT_1_129(m, d) BOOST_PP_REPEAT_1_128(m, d) m(2, 128, d)\n# define BOOST_PP_REPEAT_1_130(m, d) BOOST_PP_REPEAT_1_129(m, d) m(2, 129, d)\n# define BOOST_PP_REPEAT_1_131(m, d) BOOST_PP_REPEAT_1_130(m, d) m(2, 130, d)\n# define BOOST_PP_REPEAT_1_132(m, d) BOOST_PP_REPEAT_1_131(m, d) m(2, 131, d)\n# define BOOST_PP_REPEAT_1_133(m, d) BOOST_PP_REPEAT_1_132(m, d) m(2, 132, d)\n# define BOOST_PP_REPEAT_1_134(m, d) BOOST_PP_REPEAT_1_133(m, d) m(2, 133, d)\n# define BOOST_PP_REPEAT_1_135(m, d) BOOST_PP_REPEAT_1_134(m, d) m(2, 134, d)\n# define BOOST_PP_REPEAT_1_136(m, d) BOOST_PP_REPEAT_1_135(m, d) m(2, 135, d)\n# define BOOST_PP_REPEAT_1_137(m, d) BOOST_PP_REPEAT_1_136(m, d) m(2, 136, d)\n# define BOOST_PP_REPEAT_1_138(m, d) BOOST_PP_REPEAT_1_137(m, d) m(2, 137, d)\n# define BOOST_PP_REPEAT_1_139(m, d) BOOST_PP_REPEAT_1_138(m, d) m(2, 138, d)\n# define BOOST_PP_REPEAT_1_140(m, d) BOOST_PP_REPEAT_1_139(m, d) m(2, 139, d)\n# define BOOST_PP_REPEAT_1_141(m, d) BOOST_PP_REPEAT_1_140(m, d) m(2, 140, d)\n# define BOOST_PP_REPEAT_1_142(m, d) BOOST_PP_REPEAT_1_141(m, d) m(2, 141, d)\n# define BOOST_PP_REPEAT_1_143(m, d) BOOST_PP_REPEAT_1_142(m, d) m(2, 142, d)\n# define BOOST_PP_REPEAT_1_144(m, d) BOOST_PP_REPEAT_1_143(m, d) m(2, 143, d)\n# define BOOST_PP_REPEAT_1_145(m, d) BOOST_PP_REPEAT_1_144(m, d) m(2, 144, d)\n# define BOOST_PP_REPEAT_1_146(m, d) BOOST_PP_REPEAT_1_145(m, d) m(2, 145, d)\n# define BOOST_PP_REPEAT_1_147(m, d) BOOST_PP_REPEAT_1_146(m, d) m(2, 146, d)\n# define BOOST_PP_REPEAT_1_148(m, d) BOOST_PP_REPEAT_1_147(m, d) m(2, 147, d)\n# define BOOST_PP_REPEAT_1_149(m, d) BOOST_PP_REPEAT_1_148(m, d) m(2, 148, d)\n# define BOOST_PP_REPEAT_1_150(m, d) BOOST_PP_REPEAT_1_149(m, d) m(2, 149, d)\n# define BOOST_PP_REPEAT_1_151(m, d) BOOST_PP_REPEAT_1_150(m, d) m(2, 150, d)\n# define BOOST_PP_REPEAT_1_152(m, d) BOOST_PP_REPEAT_1_151(m, d) m(2, 151, d)\n# define BOOST_PP_REPEAT_1_153(m, d) BOOST_PP_REPEAT_1_152(m, d) m(2, 152, d)\n# define BOOST_PP_REPEAT_1_154(m, d) BOOST_PP_REPEAT_1_153(m, d) m(2, 153, d)\n# define BOOST_PP_REPEAT_1_155(m, d) BOOST_PP_REPEAT_1_154(m, d) m(2, 154, d)\n# define BOOST_PP_REPEAT_1_156(m, d) BOOST_PP_REPEAT_1_155(m, d) m(2, 155, d)\n# define BOOST_PP_REPEAT_1_157(m, d) BOOST_PP_REPEAT_1_156(m, d) m(2, 156, d)\n# define BOOST_PP_REPEAT_1_158(m, d) BOOST_PP_REPEAT_1_157(m, d) m(2, 157, d)\n# define BOOST_PP_REPEAT_1_159(m, d) BOOST_PP_REPEAT_1_158(m, d) m(2, 158, d)\n# define BOOST_PP_REPEAT_1_160(m, d) BOOST_PP_REPEAT_1_159(m, d) m(2, 159, d)\n# define BOOST_PP_REPEAT_1_161(m, d) BOOST_PP_REPEAT_1_160(m, d) m(2, 160, d)\n# define BOOST_PP_REPEAT_1_162(m, d) BOOST_PP_REPEAT_1_161(m, d) m(2, 161, d)\n# define BOOST_PP_REPEAT_1_163(m, d) BOOST_PP_REPEAT_1_162(m, d) m(2, 162, d)\n# define BOOST_PP_REPEAT_1_164(m, d) BOOST_PP_REPEAT_1_163(m, d) m(2, 163, d)\n# define BOOST_PP_REPEAT_1_165(m, d) BOOST_PP_REPEAT_1_164(m, d) m(2, 164, d)\n# define BOOST_PP_REPEAT_1_166(m, d) BOOST_PP_REPEAT_1_165(m, d) m(2, 165, d)\n# define BOOST_PP_REPEAT_1_167(m, d) BOOST_PP_REPEAT_1_166(m, d) m(2, 166, d)\n# define BOOST_PP_REPEAT_1_168(m, d) BOOST_PP_REPEAT_1_167(m, d) m(2, 167, d)\n# define BOOST_PP_REPEAT_1_169(m, d) BOOST_PP_REPEAT_1_168(m, d) m(2, 168, d)\n# define BOOST_PP_REPEAT_1_170(m, d) BOOST_PP_REPEAT_1_169(m, d) m(2, 169, d)\n# define BOOST_PP_REPEAT_1_171(m, d) BOOST_PP_REPEAT_1_170(m, d) m(2, 170, d)\n# define BOOST_PP_REPEAT_1_172(m, d) BOOST_PP_REPEAT_1_171(m, d) m(2, 171, d)\n# define BOOST_PP_REPEAT_1_173(m, d) BOOST_PP_REPEAT_1_172(m, d) m(2, 172, d)\n# define BOOST_PP_REPEAT_1_174(m, d) BOOST_PP_REPEAT_1_173(m, d) m(2, 173, d)\n# define BOOST_PP_REPEAT_1_175(m, d) BOOST_PP_REPEAT_1_174(m, d) m(2, 174, d)\n# define BOOST_PP_REPEAT_1_176(m, d) BOOST_PP_REPEAT_1_175(m, d) m(2, 175, d)\n# define BOOST_PP_REPEAT_1_177(m, d) BOOST_PP_REPEAT_1_176(m, d) m(2, 176, d)\n# define BOOST_PP_REPEAT_1_178(m, d) BOOST_PP_REPEAT_1_177(m, d) m(2, 177, d)\n# define BOOST_PP_REPEAT_1_179(m, d) BOOST_PP_REPEAT_1_178(m, d) m(2, 178, d)\n# define BOOST_PP_REPEAT_1_180(m, d) BOOST_PP_REPEAT_1_179(m, d) m(2, 179, d)\n# define BOOST_PP_REPEAT_1_181(m, d) BOOST_PP_REPEAT_1_180(m, d) m(2, 180, d)\n# define BOOST_PP_REPEAT_1_182(m, d) BOOST_PP_REPEAT_1_181(m, d) m(2, 181, d)\n# define BOOST_PP_REPEAT_1_183(m, d) BOOST_PP_REPEAT_1_182(m, d) m(2, 182, d)\n# define BOOST_PP_REPEAT_1_184(m, d) BOOST_PP_REPEAT_1_183(m, d) m(2, 183, d)\n# define BOOST_PP_REPEAT_1_185(m, d) BOOST_PP_REPEAT_1_184(m, d) m(2, 184, d)\n# define BOOST_PP_REPEAT_1_186(m, d) BOOST_PP_REPEAT_1_185(m, d) m(2, 185, d)\n# define BOOST_PP_REPEAT_1_187(m, d) BOOST_PP_REPEAT_1_186(m, d) m(2, 186, d)\n# define BOOST_PP_REPEAT_1_188(m, d) BOOST_PP_REPEAT_1_187(m, d) m(2, 187, d)\n# define BOOST_PP_REPEAT_1_189(m, d) BOOST_PP_REPEAT_1_188(m, d) m(2, 188, d)\n# define BOOST_PP_REPEAT_1_190(m, d) BOOST_PP_REPEAT_1_189(m, d) m(2, 189, d)\n# define BOOST_PP_REPEAT_1_191(m, d) BOOST_PP_REPEAT_1_190(m, d) m(2, 190, d)\n# define BOOST_PP_REPEAT_1_192(m, d) BOOST_PP_REPEAT_1_191(m, d) m(2, 191, d)\n# define BOOST_PP_REPEAT_1_193(m, d) BOOST_PP_REPEAT_1_192(m, d) m(2, 192, d)\n# define BOOST_PP_REPEAT_1_194(m, d) BOOST_PP_REPEAT_1_193(m, d) m(2, 193, d)\n# define BOOST_PP_REPEAT_1_195(m, d) BOOST_PP_REPEAT_1_194(m, d) m(2, 194, d)\n# define BOOST_PP_REPEAT_1_196(m, d) BOOST_PP_REPEAT_1_195(m, d) m(2, 195, d)\n# define BOOST_PP_REPEAT_1_197(m, d) BOOST_PP_REPEAT_1_196(m, d) m(2, 196, d)\n# define BOOST_PP_REPEAT_1_198(m, d) BOOST_PP_REPEAT_1_197(m, d) m(2, 197, d)\n# define BOOST_PP_REPEAT_1_199(m, d) BOOST_PP_REPEAT_1_198(m, d) m(2, 198, d)\n# define BOOST_PP_REPEAT_1_200(m, d) BOOST_PP_REPEAT_1_199(m, d) m(2, 199, d)\n# define BOOST_PP_REPEAT_1_201(m, d) BOOST_PP_REPEAT_1_200(m, d) m(2, 200, d)\n# define BOOST_PP_REPEAT_1_202(m, d) BOOST_PP_REPEAT_1_201(m, d) m(2, 201, d)\n# define BOOST_PP_REPEAT_1_203(m, d) BOOST_PP_REPEAT_1_202(m, d) m(2, 202, d)\n# define BOOST_PP_REPEAT_1_204(m, d) BOOST_PP_REPEAT_1_203(m, d) m(2, 203, d)\n# define BOOST_PP_REPEAT_1_205(m, d) BOOST_PP_REPEAT_1_204(m, d) m(2, 204, d)\n# define BOOST_PP_REPEAT_1_206(m, d) BOOST_PP_REPEAT_1_205(m, d) m(2, 205, d)\n# define BOOST_PP_REPEAT_1_207(m, d) BOOST_PP_REPEAT_1_206(m, d) m(2, 206, d)\n# define BOOST_PP_REPEAT_1_208(m, d) BOOST_PP_REPEAT_1_207(m, d) m(2, 207, d)\n# define BOOST_PP_REPEAT_1_209(m, d) BOOST_PP_REPEAT_1_208(m, d) m(2, 208, d)\n# define BOOST_PP_REPEAT_1_210(m, d) BOOST_PP_REPEAT_1_209(m, d) m(2, 209, d)\n# define BOOST_PP_REPEAT_1_211(m, d) BOOST_PP_REPEAT_1_210(m, d) m(2, 210, d)\n# define BOOST_PP_REPEAT_1_212(m, d) BOOST_PP_REPEAT_1_211(m, d) m(2, 211, d)\n# define BOOST_PP_REPEAT_1_213(m, d) BOOST_PP_REPEAT_1_212(m, d) m(2, 212, d)\n# define BOOST_PP_REPEAT_1_214(m, d) BOOST_PP_REPEAT_1_213(m, d) m(2, 213, d)\n# define BOOST_PP_REPEAT_1_215(m, d) BOOST_PP_REPEAT_1_214(m, d) m(2, 214, d)\n# define BOOST_PP_REPEAT_1_216(m, d) BOOST_PP_REPEAT_1_215(m, d) m(2, 215, d)\n# define BOOST_PP_REPEAT_1_217(m, d) BOOST_PP_REPEAT_1_216(m, d) m(2, 216, d)\n# define BOOST_PP_REPEAT_1_218(m, d) BOOST_PP_REPEAT_1_217(m, d) m(2, 217, d)\n# define BOOST_PP_REPEAT_1_219(m, d) BOOST_PP_REPEAT_1_218(m, d) m(2, 218, d)\n# define BOOST_PP_REPEAT_1_220(m, d) BOOST_PP_REPEAT_1_219(m, d) m(2, 219, d)\n# define BOOST_PP_REPEAT_1_221(m, d) BOOST_PP_REPEAT_1_220(m, d) m(2, 220, d)\n# define BOOST_PP_REPEAT_1_222(m, d) BOOST_PP_REPEAT_1_221(m, d) m(2, 221, d)\n# define BOOST_PP_REPEAT_1_223(m, d) BOOST_PP_REPEAT_1_222(m, d) m(2, 222, d)\n# define BOOST_PP_REPEAT_1_224(m, d) BOOST_PP_REPEAT_1_223(m, d) m(2, 223, d)\n# define BOOST_PP_REPEAT_1_225(m, d) BOOST_PP_REPEAT_1_224(m, d) m(2, 224, d)\n# define BOOST_PP_REPEAT_1_226(m, d) BOOST_PP_REPEAT_1_225(m, d) m(2, 225, d)\n# define BOOST_PP_REPEAT_1_227(m, d) BOOST_PP_REPEAT_1_226(m, d) m(2, 226, d)\n# define BOOST_PP_REPEAT_1_228(m, d) BOOST_PP_REPEAT_1_227(m, d) m(2, 227, d)\n# define BOOST_PP_REPEAT_1_229(m, d) BOOST_PP_REPEAT_1_228(m, d) m(2, 228, d)\n# define BOOST_PP_REPEAT_1_230(m, d) BOOST_PP_REPEAT_1_229(m, d) m(2, 229, d)\n# define BOOST_PP_REPEAT_1_231(m, d) BOOST_PP_REPEAT_1_230(m, d) m(2, 230, d)\n# define BOOST_PP_REPEAT_1_232(m, d) BOOST_PP_REPEAT_1_231(m, d) m(2, 231, d)\n# define BOOST_PP_REPEAT_1_233(m, d) BOOST_PP_REPEAT_1_232(m, d) m(2, 232, d)\n# define BOOST_PP_REPEAT_1_234(m, d) BOOST_PP_REPEAT_1_233(m, d) m(2, 233, d)\n# define BOOST_PP_REPEAT_1_235(m, d) BOOST_PP_REPEAT_1_234(m, d) m(2, 234, d)\n# define BOOST_PP_REPEAT_1_236(m, d) BOOST_PP_REPEAT_1_235(m, d) m(2, 235, d)\n# define BOOST_PP_REPEAT_1_237(m, d) BOOST_PP_REPEAT_1_236(m, d) m(2, 236, d)\n# define BOOST_PP_REPEAT_1_238(m, d) BOOST_PP_REPEAT_1_237(m, d) m(2, 237, d)\n# define BOOST_PP_REPEAT_1_239(m, d) BOOST_PP_REPEAT_1_238(m, d) m(2, 238, d)\n# define BOOST_PP_REPEAT_1_240(m, d) BOOST_PP_REPEAT_1_239(m, d) m(2, 239, d)\n# define BOOST_PP_REPEAT_1_241(m, d) BOOST_PP_REPEAT_1_240(m, d) m(2, 240, d)\n# define BOOST_PP_REPEAT_1_242(m, d) BOOST_PP_REPEAT_1_241(m, d) m(2, 241, d)\n# define BOOST_PP_REPEAT_1_243(m, d) BOOST_PP_REPEAT_1_242(m, d) m(2, 242, d)\n# define BOOST_PP_REPEAT_1_244(m, d) BOOST_PP_REPEAT_1_243(m, d) m(2, 243, d)\n# define BOOST_PP_REPEAT_1_245(m, d) BOOST_PP_REPEAT_1_244(m, d) m(2, 244, d)\n# define BOOST_PP_REPEAT_1_246(m, d) BOOST_PP_REPEAT_1_245(m, d) m(2, 245, d)\n# define BOOST_PP_REPEAT_1_247(m, d) BOOST_PP_REPEAT_1_246(m, d) m(2, 246, d)\n# define BOOST_PP_REPEAT_1_248(m, d) BOOST_PP_REPEAT_1_247(m, d) m(2, 247, d)\n# define BOOST_PP_REPEAT_1_249(m, d) BOOST_PP_REPEAT_1_248(m, d) m(2, 248, d)\n# define BOOST_PP_REPEAT_1_250(m, d) BOOST_PP_REPEAT_1_249(m, d) m(2, 249, d)\n# define BOOST_PP_REPEAT_1_251(m, d) BOOST_PP_REPEAT_1_250(m, d) m(2, 250, d)\n# define BOOST_PP_REPEAT_1_252(m, d) BOOST_PP_REPEAT_1_251(m, d) m(2, 251, d)\n# define BOOST_PP_REPEAT_1_253(m, d) BOOST_PP_REPEAT_1_252(m, d) m(2, 252, d)\n# define BOOST_PP_REPEAT_1_254(m, d) BOOST_PP_REPEAT_1_253(m, d) m(2, 253, d)\n# define BOOST_PP_REPEAT_1_255(m, d) BOOST_PP_REPEAT_1_254(m, d) m(2, 254, d)\n# define BOOST_PP_REPEAT_1_256(m, d) BOOST_PP_REPEAT_1_255(m, d) m(2, 255, d)\n#\n# define BOOST_PP_REPEAT_2_0(m, d)\n# define BOOST_PP_REPEAT_2_1(m, d) m(3, 0, d)\n# define BOOST_PP_REPEAT_2_2(m, d) BOOST_PP_REPEAT_2_1(m, d) m(3, 1, d)\n# define BOOST_PP_REPEAT_2_3(m, d) BOOST_PP_REPEAT_2_2(m, d) m(3, 2, d)\n# define BOOST_PP_REPEAT_2_4(m, d) BOOST_PP_REPEAT_2_3(m, d) m(3, 3, d)\n# define BOOST_PP_REPEAT_2_5(m, d) BOOST_PP_REPEAT_2_4(m, d) m(3, 4, d)\n# define BOOST_PP_REPEAT_2_6(m, d) BOOST_PP_REPEAT_2_5(m, d) m(3, 5, d)\n# define BOOST_PP_REPEAT_2_7(m, d) BOOST_PP_REPEAT_2_6(m, d) m(3, 6, d)\n# define BOOST_PP_REPEAT_2_8(m, d) BOOST_PP_REPEAT_2_7(m, d) m(3, 7, d)\n# define BOOST_PP_REPEAT_2_9(m, d) BOOST_PP_REPEAT_2_8(m, d) m(3, 8, d)\n# define BOOST_PP_REPEAT_2_10(m, d) BOOST_PP_REPEAT_2_9(m, d) m(3, 9, d)\n# define BOOST_PP_REPEAT_2_11(m, d) BOOST_PP_REPEAT_2_10(m, d) m(3, 10, d)\n# define BOOST_PP_REPEAT_2_12(m, d) BOOST_PP_REPEAT_2_11(m, d) m(3, 11, d)\n# define BOOST_PP_REPEAT_2_13(m, d) BOOST_PP_REPEAT_2_12(m, d) m(3, 12, d)\n# define BOOST_PP_REPEAT_2_14(m, d) BOOST_PP_REPEAT_2_13(m, d) m(3, 13, d)\n# define BOOST_PP_REPEAT_2_15(m, d) BOOST_PP_REPEAT_2_14(m, d) m(3, 14, d)\n# define BOOST_PP_REPEAT_2_16(m, d) BOOST_PP_REPEAT_2_15(m, d) m(3, 15, d)\n# define BOOST_PP_REPEAT_2_17(m, d) BOOST_PP_REPEAT_2_16(m, d) m(3, 16, d)\n# define BOOST_PP_REPEAT_2_18(m, d) BOOST_PP_REPEAT_2_17(m, d) m(3, 17, d)\n# define BOOST_PP_REPEAT_2_19(m, d) BOOST_PP_REPEAT_2_18(m, d) m(3, 18, d)\n# define BOOST_PP_REPEAT_2_20(m, d) BOOST_PP_REPEAT_2_19(m, d) m(3, 19, d)\n# define BOOST_PP_REPEAT_2_21(m, d) BOOST_PP_REPEAT_2_20(m, d) m(3, 20, d)\n# define BOOST_PP_REPEAT_2_22(m, d) BOOST_PP_REPEAT_2_21(m, d) m(3, 21, d)\n# define BOOST_PP_REPEAT_2_23(m, d) BOOST_PP_REPEAT_2_22(m, d) m(3, 22, d)\n# define BOOST_PP_REPEAT_2_24(m, d) BOOST_PP_REPEAT_2_23(m, d) m(3, 23, d)\n# define BOOST_PP_REPEAT_2_25(m, d) BOOST_PP_REPEAT_2_24(m, d) m(3, 24, d)\n# define BOOST_PP_REPEAT_2_26(m, d) BOOST_PP_REPEAT_2_25(m, d) m(3, 25, d)\n# define BOOST_PP_REPEAT_2_27(m, d) BOOST_PP_REPEAT_2_26(m, d) m(3, 26, d)\n# define BOOST_PP_REPEAT_2_28(m, d) BOOST_PP_REPEAT_2_27(m, d) m(3, 27, d)\n# define BOOST_PP_REPEAT_2_29(m, d) BOOST_PP_REPEAT_2_28(m, d) m(3, 28, d)\n# define BOOST_PP_REPEAT_2_30(m, d) BOOST_PP_REPEAT_2_29(m, d) m(3, 29, d)\n# define BOOST_PP_REPEAT_2_31(m, d) BOOST_PP_REPEAT_2_30(m, d) m(3, 30, d)\n# define BOOST_PP_REPEAT_2_32(m, d) BOOST_PP_REPEAT_2_31(m, d) m(3, 31, d)\n# define BOOST_PP_REPEAT_2_33(m, d) BOOST_PP_REPEAT_2_32(m, d) m(3, 32, d)\n# define BOOST_PP_REPEAT_2_34(m, d) BOOST_PP_REPEAT_2_33(m, d) m(3, 33, d)\n# define BOOST_PP_REPEAT_2_35(m, d) BOOST_PP_REPEAT_2_34(m, d) m(3, 34, d)\n# define BOOST_PP_REPEAT_2_36(m, d) BOOST_PP_REPEAT_2_35(m, d) m(3, 35, d)\n# define BOOST_PP_REPEAT_2_37(m, d) BOOST_PP_REPEAT_2_36(m, d) m(3, 36, d)\n# define BOOST_PP_REPEAT_2_38(m, d) BOOST_PP_REPEAT_2_37(m, d) m(3, 37, d)\n# define BOOST_PP_REPEAT_2_39(m, d) BOOST_PP_REPEAT_2_38(m, d) m(3, 38, d)\n# define BOOST_PP_REPEAT_2_40(m, d) BOOST_PP_REPEAT_2_39(m, d) m(3, 39, d)\n# define BOOST_PP_REPEAT_2_41(m, d) BOOST_PP_REPEAT_2_40(m, d) m(3, 40, d)\n# define BOOST_PP_REPEAT_2_42(m, d) BOOST_PP_REPEAT_2_41(m, d) m(3, 41, d)\n# define BOOST_PP_REPEAT_2_43(m, d) BOOST_PP_REPEAT_2_42(m, d) m(3, 42, d)\n# define BOOST_PP_REPEAT_2_44(m, d) BOOST_PP_REPEAT_2_43(m, d) m(3, 43, d)\n# define BOOST_PP_REPEAT_2_45(m, d) BOOST_PP_REPEAT_2_44(m, d) m(3, 44, d)\n# define BOOST_PP_REPEAT_2_46(m, d) BOOST_PP_REPEAT_2_45(m, d) m(3, 45, d)\n# define BOOST_PP_REPEAT_2_47(m, d) BOOST_PP_REPEAT_2_46(m, d) m(3, 46, d)\n# define BOOST_PP_REPEAT_2_48(m, d) BOOST_PP_REPEAT_2_47(m, d) m(3, 47, d)\n# define BOOST_PP_REPEAT_2_49(m, d) BOOST_PP_REPEAT_2_48(m, d) m(3, 48, d)\n# define BOOST_PP_REPEAT_2_50(m, d) BOOST_PP_REPEAT_2_49(m, d) m(3, 49, d)\n# define BOOST_PP_REPEAT_2_51(m, d) BOOST_PP_REPEAT_2_50(m, d) m(3, 50, d)\n# define BOOST_PP_REPEAT_2_52(m, d) BOOST_PP_REPEAT_2_51(m, d) m(3, 51, d)\n# define BOOST_PP_REPEAT_2_53(m, d) BOOST_PP_REPEAT_2_52(m, d) m(3, 52, d)\n# define BOOST_PP_REPEAT_2_54(m, d) BOOST_PP_REPEAT_2_53(m, d) m(3, 53, d)\n# define BOOST_PP_REPEAT_2_55(m, d) BOOST_PP_REPEAT_2_54(m, d) m(3, 54, d)\n# define BOOST_PP_REPEAT_2_56(m, d) BOOST_PP_REPEAT_2_55(m, d) m(3, 55, d)\n# define BOOST_PP_REPEAT_2_57(m, d) BOOST_PP_REPEAT_2_56(m, d) m(3, 56, d)\n# define BOOST_PP_REPEAT_2_58(m, d) BOOST_PP_REPEAT_2_57(m, d) m(3, 57, d)\n# define BOOST_PP_REPEAT_2_59(m, d) BOOST_PP_REPEAT_2_58(m, d) m(3, 58, d)\n# define BOOST_PP_REPEAT_2_60(m, d) BOOST_PP_REPEAT_2_59(m, d) m(3, 59, d)\n# define BOOST_PP_REPEAT_2_61(m, d) BOOST_PP_REPEAT_2_60(m, d) m(3, 60, d)\n# define BOOST_PP_REPEAT_2_62(m, d) BOOST_PP_REPEAT_2_61(m, d) m(3, 61, d)\n# define BOOST_PP_REPEAT_2_63(m, d) BOOST_PP_REPEAT_2_62(m, d) m(3, 62, d)\n# define BOOST_PP_REPEAT_2_64(m, d) BOOST_PP_REPEAT_2_63(m, d) m(3, 63, d)\n# define BOOST_PP_REPEAT_2_65(m, d) BOOST_PP_REPEAT_2_64(m, d) m(3, 64, d)\n# define BOOST_PP_REPEAT_2_66(m, d) BOOST_PP_REPEAT_2_65(m, d) m(3, 65, d)\n# define BOOST_PP_REPEAT_2_67(m, d) BOOST_PP_REPEAT_2_66(m, d) m(3, 66, d)\n# define BOOST_PP_REPEAT_2_68(m, d) BOOST_PP_REPEAT_2_67(m, d) m(3, 67, d)\n# define BOOST_PP_REPEAT_2_69(m, d) BOOST_PP_REPEAT_2_68(m, d) m(3, 68, d)\n# define BOOST_PP_REPEAT_2_70(m, d) BOOST_PP_REPEAT_2_69(m, d) m(3, 69, d)\n# define BOOST_PP_REPEAT_2_71(m, d) BOOST_PP_REPEAT_2_70(m, d) m(3, 70, d)\n# define BOOST_PP_REPEAT_2_72(m, d) BOOST_PP_REPEAT_2_71(m, d) m(3, 71, d)\n# define BOOST_PP_REPEAT_2_73(m, d) BOOST_PP_REPEAT_2_72(m, d) m(3, 72, d)\n# define BOOST_PP_REPEAT_2_74(m, d) BOOST_PP_REPEAT_2_73(m, d) m(3, 73, d)\n# define BOOST_PP_REPEAT_2_75(m, d) BOOST_PP_REPEAT_2_74(m, d) m(3, 74, d)\n# define BOOST_PP_REPEAT_2_76(m, d) BOOST_PP_REPEAT_2_75(m, d) m(3, 75, d)\n# define BOOST_PP_REPEAT_2_77(m, d) BOOST_PP_REPEAT_2_76(m, d) m(3, 76, d)\n# define BOOST_PP_REPEAT_2_78(m, d) BOOST_PP_REPEAT_2_77(m, d) m(3, 77, d)\n# define BOOST_PP_REPEAT_2_79(m, d) BOOST_PP_REPEAT_2_78(m, d) m(3, 78, d)\n# define BOOST_PP_REPEAT_2_80(m, d) BOOST_PP_REPEAT_2_79(m, d) m(3, 79, d)\n# define BOOST_PP_REPEAT_2_81(m, d) BOOST_PP_REPEAT_2_80(m, d) m(3, 80, d)\n# define BOOST_PP_REPEAT_2_82(m, d) BOOST_PP_REPEAT_2_81(m, d) m(3, 81, d)\n# define BOOST_PP_REPEAT_2_83(m, d) BOOST_PP_REPEAT_2_82(m, d) m(3, 82, d)\n# define BOOST_PP_REPEAT_2_84(m, d) BOOST_PP_REPEAT_2_83(m, d) m(3, 83, d)\n# define BOOST_PP_REPEAT_2_85(m, d) BOOST_PP_REPEAT_2_84(m, d) m(3, 84, d)\n# define BOOST_PP_REPEAT_2_86(m, d) BOOST_PP_REPEAT_2_85(m, d) m(3, 85, d)\n# define BOOST_PP_REPEAT_2_87(m, d) BOOST_PP_REPEAT_2_86(m, d) m(3, 86, d)\n# define BOOST_PP_REPEAT_2_88(m, d) BOOST_PP_REPEAT_2_87(m, d) m(3, 87, d)\n# define BOOST_PP_REPEAT_2_89(m, d) BOOST_PP_REPEAT_2_88(m, d) m(3, 88, d)\n# define BOOST_PP_REPEAT_2_90(m, d) BOOST_PP_REPEAT_2_89(m, d) m(3, 89, d)\n# define BOOST_PP_REPEAT_2_91(m, d) BOOST_PP_REPEAT_2_90(m, d) m(3, 90, d)\n# define BOOST_PP_REPEAT_2_92(m, d) BOOST_PP_REPEAT_2_91(m, d) m(3, 91, d)\n# define BOOST_PP_REPEAT_2_93(m, d) BOOST_PP_REPEAT_2_92(m, d) m(3, 92, d)\n# define BOOST_PP_REPEAT_2_94(m, d) BOOST_PP_REPEAT_2_93(m, d) m(3, 93, d)\n# define BOOST_PP_REPEAT_2_95(m, d) BOOST_PP_REPEAT_2_94(m, d) m(3, 94, d)\n# define BOOST_PP_REPEAT_2_96(m, d) BOOST_PP_REPEAT_2_95(m, d) m(3, 95, d)\n# define BOOST_PP_REPEAT_2_97(m, d) BOOST_PP_REPEAT_2_96(m, d) m(3, 96, d)\n# define BOOST_PP_REPEAT_2_98(m, d) BOOST_PP_REPEAT_2_97(m, d) m(3, 97, d)\n# define BOOST_PP_REPEAT_2_99(m, d) BOOST_PP_REPEAT_2_98(m, d) m(3, 98, d)\n# define BOOST_PP_REPEAT_2_100(m, d) BOOST_PP_REPEAT_2_99(m, d) m(3, 99, d)\n# define BOOST_PP_REPEAT_2_101(m, d) BOOST_PP_REPEAT_2_100(m, d) m(3, 100, d)\n# define BOOST_PP_REPEAT_2_102(m, d) BOOST_PP_REPEAT_2_101(m, d) m(3, 101, d)\n# define BOOST_PP_REPEAT_2_103(m, d) BOOST_PP_REPEAT_2_102(m, d) m(3, 102, d)\n# define BOOST_PP_REPEAT_2_104(m, d) BOOST_PP_REPEAT_2_103(m, d) m(3, 103, d)\n# define BOOST_PP_REPEAT_2_105(m, d) BOOST_PP_REPEAT_2_104(m, d) m(3, 104, d)\n# define BOOST_PP_REPEAT_2_106(m, d) BOOST_PP_REPEAT_2_105(m, d) m(3, 105, d)\n# define BOOST_PP_REPEAT_2_107(m, d) BOOST_PP_REPEAT_2_106(m, d) m(3, 106, d)\n# define BOOST_PP_REPEAT_2_108(m, d) BOOST_PP_REPEAT_2_107(m, d) m(3, 107, d)\n# define BOOST_PP_REPEAT_2_109(m, d) BOOST_PP_REPEAT_2_108(m, d) m(3, 108, d)\n# define BOOST_PP_REPEAT_2_110(m, d) BOOST_PP_REPEAT_2_109(m, d) m(3, 109, d)\n# define BOOST_PP_REPEAT_2_111(m, d) BOOST_PP_REPEAT_2_110(m, d) m(3, 110, d)\n# define BOOST_PP_REPEAT_2_112(m, d) BOOST_PP_REPEAT_2_111(m, d) m(3, 111, d)\n# define BOOST_PP_REPEAT_2_113(m, d) BOOST_PP_REPEAT_2_112(m, d) m(3, 112, d)\n# define BOOST_PP_REPEAT_2_114(m, d) BOOST_PP_REPEAT_2_113(m, d) m(3, 113, d)\n# define BOOST_PP_REPEAT_2_115(m, d) BOOST_PP_REPEAT_2_114(m, d) m(3, 114, d)\n# define BOOST_PP_REPEAT_2_116(m, d) BOOST_PP_REPEAT_2_115(m, d) m(3, 115, d)\n# define BOOST_PP_REPEAT_2_117(m, d) BOOST_PP_REPEAT_2_116(m, d) m(3, 116, d)\n# define BOOST_PP_REPEAT_2_118(m, d) BOOST_PP_REPEAT_2_117(m, d) m(3, 117, d)\n# define BOOST_PP_REPEAT_2_119(m, d) BOOST_PP_REPEAT_2_118(m, d) m(3, 118, d)\n# define BOOST_PP_REPEAT_2_120(m, d) BOOST_PP_REPEAT_2_119(m, d) m(3, 119, d)\n# define BOOST_PP_REPEAT_2_121(m, d) BOOST_PP_REPEAT_2_120(m, d) m(3, 120, d)\n# define BOOST_PP_REPEAT_2_122(m, d) BOOST_PP_REPEAT_2_121(m, d) m(3, 121, d)\n# define BOOST_PP_REPEAT_2_123(m, d) BOOST_PP_REPEAT_2_122(m, d) m(3, 122, d)\n# define BOOST_PP_REPEAT_2_124(m, d) BOOST_PP_REPEAT_2_123(m, d) m(3, 123, d)\n# define BOOST_PP_REPEAT_2_125(m, d) BOOST_PP_REPEAT_2_124(m, d) m(3, 124, d)\n# define BOOST_PP_REPEAT_2_126(m, d) BOOST_PP_REPEAT_2_125(m, d) m(3, 125, d)\n# define BOOST_PP_REPEAT_2_127(m, d) BOOST_PP_REPEAT_2_126(m, d) m(3, 126, d)\n# define BOOST_PP_REPEAT_2_128(m, d) BOOST_PP_REPEAT_2_127(m, d) m(3, 127, d)\n# define BOOST_PP_REPEAT_2_129(m, d) BOOST_PP_REPEAT_2_128(m, d) m(3, 128, d)\n# define BOOST_PP_REPEAT_2_130(m, d) BOOST_PP_REPEAT_2_129(m, d) m(3, 129, d)\n# define BOOST_PP_REPEAT_2_131(m, d) BOOST_PP_REPEAT_2_130(m, d) m(3, 130, d)\n# define BOOST_PP_REPEAT_2_132(m, d) BOOST_PP_REPEAT_2_131(m, d) m(3, 131, d)\n# define BOOST_PP_REPEAT_2_133(m, d) BOOST_PP_REPEAT_2_132(m, d) m(3, 132, d)\n# define BOOST_PP_REPEAT_2_134(m, d) BOOST_PP_REPEAT_2_133(m, d) m(3, 133, d)\n# define BOOST_PP_REPEAT_2_135(m, d) BOOST_PP_REPEAT_2_134(m, d) m(3, 134, d)\n# define BOOST_PP_REPEAT_2_136(m, d) BOOST_PP_REPEAT_2_135(m, d) m(3, 135, d)\n# define BOOST_PP_REPEAT_2_137(m, d) BOOST_PP_REPEAT_2_136(m, d) m(3, 136, d)\n# define BOOST_PP_REPEAT_2_138(m, d) BOOST_PP_REPEAT_2_137(m, d) m(3, 137, d)\n# define BOOST_PP_REPEAT_2_139(m, d) BOOST_PP_REPEAT_2_138(m, d) m(3, 138, d)\n# define BOOST_PP_REPEAT_2_140(m, d) BOOST_PP_REPEAT_2_139(m, d) m(3, 139, d)\n# define BOOST_PP_REPEAT_2_141(m, d) BOOST_PP_REPEAT_2_140(m, d) m(3, 140, d)\n# define BOOST_PP_REPEAT_2_142(m, d) BOOST_PP_REPEAT_2_141(m, d) m(3, 141, d)\n# define BOOST_PP_REPEAT_2_143(m, d) BOOST_PP_REPEAT_2_142(m, d) m(3, 142, d)\n# define BOOST_PP_REPEAT_2_144(m, d) BOOST_PP_REPEAT_2_143(m, d) m(3, 143, d)\n# define BOOST_PP_REPEAT_2_145(m, d) BOOST_PP_REPEAT_2_144(m, d) m(3, 144, d)\n# define BOOST_PP_REPEAT_2_146(m, d) BOOST_PP_REPEAT_2_145(m, d) m(3, 145, d)\n# define BOOST_PP_REPEAT_2_147(m, d) BOOST_PP_REPEAT_2_146(m, d) m(3, 146, d)\n# define BOOST_PP_REPEAT_2_148(m, d) BOOST_PP_REPEAT_2_147(m, d) m(3, 147, d)\n# define BOOST_PP_REPEAT_2_149(m, d) BOOST_PP_REPEAT_2_148(m, d) m(3, 148, d)\n# define BOOST_PP_REPEAT_2_150(m, d) BOOST_PP_REPEAT_2_149(m, d) m(3, 149, d)\n# define BOOST_PP_REPEAT_2_151(m, d) BOOST_PP_REPEAT_2_150(m, d) m(3, 150, d)\n# define BOOST_PP_REPEAT_2_152(m, d) BOOST_PP_REPEAT_2_151(m, d) m(3, 151, d)\n# define BOOST_PP_REPEAT_2_153(m, d) BOOST_PP_REPEAT_2_152(m, d) m(3, 152, d)\n# define BOOST_PP_REPEAT_2_154(m, d) BOOST_PP_REPEAT_2_153(m, d) m(3, 153, d)\n# define BOOST_PP_REPEAT_2_155(m, d) BOOST_PP_REPEAT_2_154(m, d) m(3, 154, d)\n# define BOOST_PP_REPEAT_2_156(m, d) BOOST_PP_REPEAT_2_155(m, d) m(3, 155, d)\n# define BOOST_PP_REPEAT_2_157(m, d) BOOST_PP_REPEAT_2_156(m, d) m(3, 156, d)\n# define BOOST_PP_REPEAT_2_158(m, d) BOOST_PP_REPEAT_2_157(m, d) m(3, 157, d)\n# define BOOST_PP_REPEAT_2_159(m, d) BOOST_PP_REPEAT_2_158(m, d) m(3, 158, d)\n# define BOOST_PP_REPEAT_2_160(m, d) BOOST_PP_REPEAT_2_159(m, d) m(3, 159, d)\n# define BOOST_PP_REPEAT_2_161(m, d) BOOST_PP_REPEAT_2_160(m, d) m(3, 160, d)\n# define BOOST_PP_REPEAT_2_162(m, d) BOOST_PP_REPEAT_2_161(m, d) m(3, 161, d)\n# define BOOST_PP_REPEAT_2_163(m, d) BOOST_PP_REPEAT_2_162(m, d) m(3, 162, d)\n# define BOOST_PP_REPEAT_2_164(m, d) BOOST_PP_REPEAT_2_163(m, d) m(3, 163, d)\n# define BOOST_PP_REPEAT_2_165(m, d) BOOST_PP_REPEAT_2_164(m, d) m(3, 164, d)\n# define BOOST_PP_REPEAT_2_166(m, d) BOOST_PP_REPEAT_2_165(m, d) m(3, 165, d)\n# define BOOST_PP_REPEAT_2_167(m, d) BOOST_PP_REPEAT_2_166(m, d) m(3, 166, d)\n# define BOOST_PP_REPEAT_2_168(m, d) BOOST_PP_REPEAT_2_167(m, d) m(3, 167, d)\n# define BOOST_PP_REPEAT_2_169(m, d) BOOST_PP_REPEAT_2_168(m, d) m(3, 168, d)\n# define BOOST_PP_REPEAT_2_170(m, d) BOOST_PP_REPEAT_2_169(m, d) m(3, 169, d)\n# define BOOST_PP_REPEAT_2_171(m, d) BOOST_PP_REPEAT_2_170(m, d) m(3, 170, d)\n# define BOOST_PP_REPEAT_2_172(m, d) BOOST_PP_REPEAT_2_171(m, d) m(3, 171, d)\n# define BOOST_PP_REPEAT_2_173(m, d) BOOST_PP_REPEAT_2_172(m, d) m(3, 172, d)\n# define BOOST_PP_REPEAT_2_174(m, d) BOOST_PP_REPEAT_2_173(m, d) m(3, 173, d)\n# define BOOST_PP_REPEAT_2_175(m, d) BOOST_PP_REPEAT_2_174(m, d) m(3, 174, d)\n# define BOOST_PP_REPEAT_2_176(m, d) BOOST_PP_REPEAT_2_175(m, d) m(3, 175, d)\n# define BOOST_PP_REPEAT_2_177(m, d) BOOST_PP_REPEAT_2_176(m, d) m(3, 176, d)\n# define BOOST_PP_REPEAT_2_178(m, d) BOOST_PP_REPEAT_2_177(m, d) m(3, 177, d)\n# define BOOST_PP_REPEAT_2_179(m, d) BOOST_PP_REPEAT_2_178(m, d) m(3, 178, d)\n# define BOOST_PP_REPEAT_2_180(m, d) BOOST_PP_REPEAT_2_179(m, d) m(3, 179, d)\n# define BOOST_PP_REPEAT_2_181(m, d) BOOST_PP_REPEAT_2_180(m, d) m(3, 180, d)\n# define BOOST_PP_REPEAT_2_182(m, d) BOOST_PP_REPEAT_2_181(m, d) m(3, 181, d)\n# define BOOST_PP_REPEAT_2_183(m, d) BOOST_PP_REPEAT_2_182(m, d) m(3, 182, d)\n# define BOOST_PP_REPEAT_2_184(m, d) BOOST_PP_REPEAT_2_183(m, d) m(3, 183, d)\n# define BOOST_PP_REPEAT_2_185(m, d) BOOST_PP_REPEAT_2_184(m, d) m(3, 184, d)\n# define BOOST_PP_REPEAT_2_186(m, d) BOOST_PP_REPEAT_2_185(m, d) m(3, 185, d)\n# define BOOST_PP_REPEAT_2_187(m, d) BOOST_PP_REPEAT_2_186(m, d) m(3, 186, d)\n# define BOOST_PP_REPEAT_2_188(m, d) BOOST_PP_REPEAT_2_187(m, d) m(3, 187, d)\n# define BOOST_PP_REPEAT_2_189(m, d) BOOST_PP_REPEAT_2_188(m, d) m(3, 188, d)\n# define BOOST_PP_REPEAT_2_190(m, d) BOOST_PP_REPEAT_2_189(m, d) m(3, 189, d)\n# define BOOST_PP_REPEAT_2_191(m, d) BOOST_PP_REPEAT_2_190(m, d) m(3, 190, d)\n# define BOOST_PP_REPEAT_2_192(m, d) BOOST_PP_REPEAT_2_191(m, d) m(3, 191, d)\n# define BOOST_PP_REPEAT_2_193(m, d) BOOST_PP_REPEAT_2_192(m, d) m(3, 192, d)\n# define BOOST_PP_REPEAT_2_194(m, d) BOOST_PP_REPEAT_2_193(m, d) m(3, 193, d)\n# define BOOST_PP_REPEAT_2_195(m, d) BOOST_PP_REPEAT_2_194(m, d) m(3, 194, d)\n# define BOOST_PP_REPEAT_2_196(m, d) BOOST_PP_REPEAT_2_195(m, d) m(3, 195, d)\n# define BOOST_PP_REPEAT_2_197(m, d) BOOST_PP_REPEAT_2_196(m, d) m(3, 196, d)\n# define BOOST_PP_REPEAT_2_198(m, d) BOOST_PP_REPEAT_2_197(m, d) m(3, 197, d)\n# define BOOST_PP_REPEAT_2_199(m, d) BOOST_PP_REPEAT_2_198(m, d) m(3, 198, d)\n# define BOOST_PP_REPEAT_2_200(m, d) BOOST_PP_REPEAT_2_199(m, d) m(3, 199, d)\n# define BOOST_PP_REPEAT_2_201(m, d) BOOST_PP_REPEAT_2_200(m, d) m(3, 200, d)\n# define BOOST_PP_REPEAT_2_202(m, d) BOOST_PP_REPEAT_2_201(m, d) m(3, 201, d)\n# define BOOST_PP_REPEAT_2_203(m, d) BOOST_PP_REPEAT_2_202(m, d) m(3, 202, d)\n# define BOOST_PP_REPEAT_2_204(m, d) BOOST_PP_REPEAT_2_203(m, d) m(3, 203, d)\n# define BOOST_PP_REPEAT_2_205(m, d) BOOST_PP_REPEAT_2_204(m, d) m(3, 204, d)\n# define BOOST_PP_REPEAT_2_206(m, d) BOOST_PP_REPEAT_2_205(m, d) m(3, 205, d)\n# define BOOST_PP_REPEAT_2_207(m, d) BOOST_PP_REPEAT_2_206(m, d) m(3, 206, d)\n# define BOOST_PP_REPEAT_2_208(m, d) BOOST_PP_REPEAT_2_207(m, d) m(3, 207, d)\n# define BOOST_PP_REPEAT_2_209(m, d) BOOST_PP_REPEAT_2_208(m, d) m(3, 208, d)\n# define BOOST_PP_REPEAT_2_210(m, d) BOOST_PP_REPEAT_2_209(m, d) m(3, 209, d)\n# define BOOST_PP_REPEAT_2_211(m, d) BOOST_PP_REPEAT_2_210(m, d) m(3, 210, d)\n# define BOOST_PP_REPEAT_2_212(m, d) BOOST_PP_REPEAT_2_211(m, d) m(3, 211, d)\n# define BOOST_PP_REPEAT_2_213(m, d) BOOST_PP_REPEAT_2_212(m, d) m(3, 212, d)\n# define BOOST_PP_REPEAT_2_214(m, d) BOOST_PP_REPEAT_2_213(m, d) m(3, 213, d)\n# define BOOST_PP_REPEAT_2_215(m, d) BOOST_PP_REPEAT_2_214(m, d) m(3, 214, d)\n# define BOOST_PP_REPEAT_2_216(m, d) BOOST_PP_REPEAT_2_215(m, d) m(3, 215, d)\n# define BOOST_PP_REPEAT_2_217(m, d) BOOST_PP_REPEAT_2_216(m, d) m(3, 216, d)\n# define BOOST_PP_REPEAT_2_218(m, d) BOOST_PP_REPEAT_2_217(m, d) m(3, 217, d)\n# define BOOST_PP_REPEAT_2_219(m, d) BOOST_PP_REPEAT_2_218(m, d) m(3, 218, d)\n# define BOOST_PP_REPEAT_2_220(m, d) BOOST_PP_REPEAT_2_219(m, d) m(3, 219, d)\n# define BOOST_PP_REPEAT_2_221(m, d) BOOST_PP_REPEAT_2_220(m, d) m(3, 220, d)\n# define BOOST_PP_REPEAT_2_222(m, d) BOOST_PP_REPEAT_2_221(m, d) m(3, 221, d)\n# define BOOST_PP_REPEAT_2_223(m, d) BOOST_PP_REPEAT_2_222(m, d) m(3, 222, d)\n# define BOOST_PP_REPEAT_2_224(m, d) BOOST_PP_REPEAT_2_223(m, d) m(3, 223, d)\n# define BOOST_PP_REPEAT_2_225(m, d) BOOST_PP_REPEAT_2_224(m, d) m(3, 224, d)\n# define BOOST_PP_REPEAT_2_226(m, d) BOOST_PP_REPEAT_2_225(m, d) m(3, 225, d)\n# define BOOST_PP_REPEAT_2_227(m, d) BOOST_PP_REPEAT_2_226(m, d) m(3, 226, d)\n# define BOOST_PP_REPEAT_2_228(m, d) BOOST_PP_REPEAT_2_227(m, d) m(3, 227, d)\n# define BOOST_PP_REPEAT_2_229(m, d) BOOST_PP_REPEAT_2_228(m, d) m(3, 228, d)\n# define BOOST_PP_REPEAT_2_230(m, d) BOOST_PP_REPEAT_2_229(m, d) m(3, 229, d)\n# define BOOST_PP_REPEAT_2_231(m, d) BOOST_PP_REPEAT_2_230(m, d) m(3, 230, d)\n# define BOOST_PP_REPEAT_2_232(m, d) BOOST_PP_REPEAT_2_231(m, d) m(3, 231, d)\n# define BOOST_PP_REPEAT_2_233(m, d) BOOST_PP_REPEAT_2_232(m, d) m(3, 232, d)\n# define BOOST_PP_REPEAT_2_234(m, d) BOOST_PP_REPEAT_2_233(m, d) m(3, 233, d)\n# define BOOST_PP_REPEAT_2_235(m, d) BOOST_PP_REPEAT_2_234(m, d) m(3, 234, d)\n# define BOOST_PP_REPEAT_2_236(m, d) BOOST_PP_REPEAT_2_235(m, d) m(3, 235, d)\n# define BOOST_PP_REPEAT_2_237(m, d) BOOST_PP_REPEAT_2_236(m, d) m(3, 236, d)\n# define BOOST_PP_REPEAT_2_238(m, d) BOOST_PP_REPEAT_2_237(m, d) m(3, 237, d)\n# define BOOST_PP_REPEAT_2_239(m, d) BOOST_PP_REPEAT_2_238(m, d) m(3, 238, d)\n# define BOOST_PP_REPEAT_2_240(m, d) BOOST_PP_REPEAT_2_239(m, d) m(3, 239, d)\n# define BOOST_PP_REPEAT_2_241(m, d) BOOST_PP_REPEAT_2_240(m, d) m(3, 240, d)\n# define BOOST_PP_REPEAT_2_242(m, d) BOOST_PP_REPEAT_2_241(m, d) m(3, 241, d)\n# define BOOST_PP_REPEAT_2_243(m, d) BOOST_PP_REPEAT_2_242(m, d) m(3, 242, d)\n# define BOOST_PP_REPEAT_2_244(m, d) BOOST_PP_REPEAT_2_243(m, d) m(3, 243, d)\n# define BOOST_PP_REPEAT_2_245(m, d) BOOST_PP_REPEAT_2_244(m, d) m(3, 244, d)\n# define BOOST_PP_REPEAT_2_246(m, d) BOOST_PP_REPEAT_2_245(m, d) m(3, 245, d)\n# define BOOST_PP_REPEAT_2_247(m, d) BOOST_PP_REPEAT_2_246(m, d) m(3, 246, d)\n# define BOOST_PP_REPEAT_2_248(m, d) BOOST_PP_REPEAT_2_247(m, d) m(3, 247, d)\n# define BOOST_PP_REPEAT_2_249(m, d) BOOST_PP_REPEAT_2_248(m, d) m(3, 248, d)\n# define BOOST_PP_REPEAT_2_250(m, d) BOOST_PP_REPEAT_2_249(m, d) m(3, 249, d)\n# define BOOST_PP_REPEAT_2_251(m, d) BOOST_PP_REPEAT_2_250(m, d) m(3, 250, d)\n# define BOOST_PP_REPEAT_2_252(m, d) BOOST_PP_REPEAT_2_251(m, d) m(3, 251, d)\n# define BOOST_PP_REPEAT_2_253(m, d) BOOST_PP_REPEAT_2_252(m, d) m(3, 252, d)\n# define BOOST_PP_REPEAT_2_254(m, d) BOOST_PP_REPEAT_2_253(m, d) m(3, 253, d)\n# define BOOST_PP_REPEAT_2_255(m, d) BOOST_PP_REPEAT_2_254(m, d) m(3, 254, d)\n# define BOOST_PP_REPEAT_2_256(m, d) BOOST_PP_REPEAT_2_255(m, d) m(3, 255, d)\n#\n# define BOOST_PP_REPEAT_3_0(m, d)\n# define BOOST_PP_REPEAT_3_1(m, d) m(4, 0, d)\n# define BOOST_PP_REPEAT_3_2(m, d) BOOST_PP_REPEAT_3_1(m, d) m(4, 1, d)\n# define BOOST_PP_REPEAT_3_3(m, d) BOOST_PP_REPEAT_3_2(m, d) m(4, 2, d)\n# define BOOST_PP_REPEAT_3_4(m, d) BOOST_PP_REPEAT_3_3(m, d) m(4, 3, d)\n# define BOOST_PP_REPEAT_3_5(m, d) BOOST_PP_REPEAT_3_4(m, d) m(4, 4, d)\n# define BOOST_PP_REPEAT_3_6(m, d) BOOST_PP_REPEAT_3_5(m, d) m(4, 5, d)\n# define BOOST_PP_REPEAT_3_7(m, d) BOOST_PP_REPEAT_3_6(m, d) m(4, 6, d)\n# define BOOST_PP_REPEAT_3_8(m, d) BOOST_PP_REPEAT_3_7(m, d) m(4, 7, d)\n# define BOOST_PP_REPEAT_3_9(m, d) BOOST_PP_REPEAT_3_8(m, d) m(4, 8, d)\n# define BOOST_PP_REPEAT_3_10(m, d) BOOST_PP_REPEAT_3_9(m, d) m(4, 9, d)\n# define BOOST_PP_REPEAT_3_11(m, d) BOOST_PP_REPEAT_3_10(m, d) m(4, 10, d)\n# define BOOST_PP_REPEAT_3_12(m, d) BOOST_PP_REPEAT_3_11(m, d) m(4, 11, d)\n# define BOOST_PP_REPEAT_3_13(m, d) BOOST_PP_REPEAT_3_12(m, d) m(4, 12, d)\n# define BOOST_PP_REPEAT_3_14(m, d) BOOST_PP_REPEAT_3_13(m, d) m(4, 13, d)\n# define BOOST_PP_REPEAT_3_15(m, d) BOOST_PP_REPEAT_3_14(m, d) m(4, 14, d)\n# define BOOST_PP_REPEAT_3_16(m, d) BOOST_PP_REPEAT_3_15(m, d) m(4, 15, d)\n# define BOOST_PP_REPEAT_3_17(m, d) BOOST_PP_REPEAT_3_16(m, d) m(4, 16, d)\n# define BOOST_PP_REPEAT_3_18(m, d) BOOST_PP_REPEAT_3_17(m, d) m(4, 17, d)\n# define BOOST_PP_REPEAT_3_19(m, d) BOOST_PP_REPEAT_3_18(m, d) m(4, 18, d)\n# define BOOST_PP_REPEAT_3_20(m, d) BOOST_PP_REPEAT_3_19(m, d) m(4, 19, d)\n# define BOOST_PP_REPEAT_3_21(m, d) BOOST_PP_REPEAT_3_20(m, d) m(4, 20, d)\n# define BOOST_PP_REPEAT_3_22(m, d) BOOST_PP_REPEAT_3_21(m, d) m(4, 21, d)\n# define BOOST_PP_REPEAT_3_23(m, d) BOOST_PP_REPEAT_3_22(m, d) m(4, 22, d)\n# define BOOST_PP_REPEAT_3_24(m, d) BOOST_PP_REPEAT_3_23(m, d) m(4, 23, d)\n# define BOOST_PP_REPEAT_3_25(m, d) BOOST_PP_REPEAT_3_24(m, d) m(4, 24, d)\n# define BOOST_PP_REPEAT_3_26(m, d) BOOST_PP_REPEAT_3_25(m, d) m(4, 25, d)\n# define BOOST_PP_REPEAT_3_27(m, d) BOOST_PP_REPEAT_3_26(m, d) m(4, 26, d)\n# define BOOST_PP_REPEAT_3_28(m, d) BOOST_PP_REPEAT_3_27(m, d) m(4, 27, d)\n# define BOOST_PP_REPEAT_3_29(m, d) BOOST_PP_REPEAT_3_28(m, d) m(4, 28, d)\n# define BOOST_PP_REPEAT_3_30(m, d) BOOST_PP_REPEAT_3_29(m, d) m(4, 29, d)\n# define BOOST_PP_REPEAT_3_31(m, d) BOOST_PP_REPEAT_3_30(m, d) m(4, 30, d)\n# define BOOST_PP_REPEAT_3_32(m, d) BOOST_PP_REPEAT_3_31(m, d) m(4, 31, d)\n# define BOOST_PP_REPEAT_3_33(m, d) BOOST_PP_REPEAT_3_32(m, d) m(4, 32, d)\n# define BOOST_PP_REPEAT_3_34(m, d) BOOST_PP_REPEAT_3_33(m, d) m(4, 33, d)\n# define BOOST_PP_REPEAT_3_35(m, d) BOOST_PP_REPEAT_3_34(m, d) m(4, 34, d)\n# define BOOST_PP_REPEAT_3_36(m, d) BOOST_PP_REPEAT_3_35(m, d) m(4, 35, d)\n# define BOOST_PP_REPEAT_3_37(m, d) BOOST_PP_REPEAT_3_36(m, d) m(4, 36, d)\n# define BOOST_PP_REPEAT_3_38(m, d) BOOST_PP_REPEAT_3_37(m, d) m(4, 37, d)\n# define BOOST_PP_REPEAT_3_39(m, d) BOOST_PP_REPEAT_3_38(m, d) m(4, 38, d)\n# define BOOST_PP_REPEAT_3_40(m, d) BOOST_PP_REPEAT_3_39(m, d) m(4, 39, d)\n# define BOOST_PP_REPEAT_3_41(m, d) BOOST_PP_REPEAT_3_40(m, d) m(4, 40, d)\n# define BOOST_PP_REPEAT_3_42(m, d) BOOST_PP_REPEAT_3_41(m, d) m(4, 41, d)\n# define BOOST_PP_REPEAT_3_43(m, d) BOOST_PP_REPEAT_3_42(m, d) m(4, 42, d)\n# define BOOST_PP_REPEAT_3_44(m, d) BOOST_PP_REPEAT_3_43(m, d) m(4, 43, d)\n# define BOOST_PP_REPEAT_3_45(m, d) BOOST_PP_REPEAT_3_44(m, d) m(4, 44, d)\n# define BOOST_PP_REPEAT_3_46(m, d) BOOST_PP_REPEAT_3_45(m, d) m(4, 45, d)\n# define BOOST_PP_REPEAT_3_47(m, d) BOOST_PP_REPEAT_3_46(m, d) m(4, 46, d)\n# define BOOST_PP_REPEAT_3_48(m, d) BOOST_PP_REPEAT_3_47(m, d) m(4, 47, d)\n# define BOOST_PP_REPEAT_3_49(m, d) BOOST_PP_REPEAT_3_48(m, d) m(4, 48, d)\n# define BOOST_PP_REPEAT_3_50(m, d) BOOST_PP_REPEAT_3_49(m, d) m(4, 49, d)\n# define BOOST_PP_REPEAT_3_51(m, d) BOOST_PP_REPEAT_3_50(m, d) m(4, 50, d)\n# define BOOST_PP_REPEAT_3_52(m, d) BOOST_PP_REPEAT_3_51(m, d) m(4, 51, d)\n# define BOOST_PP_REPEAT_3_53(m, d) BOOST_PP_REPEAT_3_52(m, d) m(4, 52, d)\n# define BOOST_PP_REPEAT_3_54(m, d) BOOST_PP_REPEAT_3_53(m, d) m(4, 53, d)\n# define BOOST_PP_REPEAT_3_55(m, d) BOOST_PP_REPEAT_3_54(m, d) m(4, 54, d)\n# define BOOST_PP_REPEAT_3_56(m, d) BOOST_PP_REPEAT_3_55(m, d) m(4, 55, d)\n# define BOOST_PP_REPEAT_3_57(m, d) BOOST_PP_REPEAT_3_56(m, d) m(4, 56, d)\n# define BOOST_PP_REPEAT_3_58(m, d) BOOST_PP_REPEAT_3_57(m, d) m(4, 57, d)\n# define BOOST_PP_REPEAT_3_59(m, d) BOOST_PP_REPEAT_3_58(m, d) m(4, 58, d)\n# define BOOST_PP_REPEAT_3_60(m, d) BOOST_PP_REPEAT_3_59(m, d) m(4, 59, d)\n# define BOOST_PP_REPEAT_3_61(m, d) BOOST_PP_REPEAT_3_60(m, d) m(4, 60, d)\n# define BOOST_PP_REPEAT_3_62(m, d) BOOST_PP_REPEAT_3_61(m, d) m(4, 61, d)\n# define BOOST_PP_REPEAT_3_63(m, d) BOOST_PP_REPEAT_3_62(m, d) m(4, 62, d)\n# define BOOST_PP_REPEAT_3_64(m, d) BOOST_PP_REPEAT_3_63(m, d) m(4, 63, d)\n# define BOOST_PP_REPEAT_3_65(m, d) BOOST_PP_REPEAT_3_64(m, d) m(4, 64, d)\n# define BOOST_PP_REPEAT_3_66(m, d) BOOST_PP_REPEAT_3_65(m, d) m(4, 65, d)\n# define BOOST_PP_REPEAT_3_67(m, d) BOOST_PP_REPEAT_3_66(m, d) m(4, 66, d)\n# define BOOST_PP_REPEAT_3_68(m, d) BOOST_PP_REPEAT_3_67(m, d) m(4, 67, d)\n# define BOOST_PP_REPEAT_3_69(m, d) BOOST_PP_REPEAT_3_68(m, d) m(4, 68, d)\n# define BOOST_PP_REPEAT_3_70(m, d) BOOST_PP_REPEAT_3_69(m, d) m(4, 69, d)\n# define BOOST_PP_REPEAT_3_71(m, d) BOOST_PP_REPEAT_3_70(m, d) m(4, 70, d)\n# define BOOST_PP_REPEAT_3_72(m, d) BOOST_PP_REPEAT_3_71(m, d) m(4, 71, d)\n# define BOOST_PP_REPEAT_3_73(m, d) BOOST_PP_REPEAT_3_72(m, d) m(4, 72, d)\n# define BOOST_PP_REPEAT_3_74(m, d) BOOST_PP_REPEAT_3_73(m, d) m(4, 73, d)\n# define BOOST_PP_REPEAT_3_75(m, d) BOOST_PP_REPEAT_3_74(m, d) m(4, 74, d)\n# define BOOST_PP_REPEAT_3_76(m, d) BOOST_PP_REPEAT_3_75(m, d) m(4, 75, d)\n# define BOOST_PP_REPEAT_3_77(m, d) BOOST_PP_REPEAT_3_76(m, d) m(4, 76, d)\n# define BOOST_PP_REPEAT_3_78(m, d) BOOST_PP_REPEAT_3_77(m, d) m(4, 77, d)\n# define BOOST_PP_REPEAT_3_79(m, d) BOOST_PP_REPEAT_3_78(m, d) m(4, 78, d)\n# define BOOST_PP_REPEAT_3_80(m, d) BOOST_PP_REPEAT_3_79(m, d) m(4, 79, d)\n# define BOOST_PP_REPEAT_3_81(m, d) BOOST_PP_REPEAT_3_80(m, d) m(4, 80, d)\n# define BOOST_PP_REPEAT_3_82(m, d) BOOST_PP_REPEAT_3_81(m, d) m(4, 81, d)\n# define BOOST_PP_REPEAT_3_83(m, d) BOOST_PP_REPEAT_3_82(m, d) m(4, 82, d)\n# define BOOST_PP_REPEAT_3_84(m, d) BOOST_PP_REPEAT_3_83(m, d) m(4, 83, d)\n# define BOOST_PP_REPEAT_3_85(m, d) BOOST_PP_REPEAT_3_84(m, d) m(4, 84, d)\n# define BOOST_PP_REPEAT_3_86(m, d) BOOST_PP_REPEAT_3_85(m, d) m(4, 85, d)\n# define BOOST_PP_REPEAT_3_87(m, d) BOOST_PP_REPEAT_3_86(m, d) m(4, 86, d)\n# define BOOST_PP_REPEAT_3_88(m, d) BOOST_PP_REPEAT_3_87(m, d) m(4, 87, d)\n# define BOOST_PP_REPEAT_3_89(m, d) BOOST_PP_REPEAT_3_88(m, d) m(4, 88, d)\n# define BOOST_PP_REPEAT_3_90(m, d) BOOST_PP_REPEAT_3_89(m, d) m(4, 89, d)\n# define BOOST_PP_REPEAT_3_91(m, d) BOOST_PP_REPEAT_3_90(m, d) m(4, 90, d)\n# define BOOST_PP_REPEAT_3_92(m, d) BOOST_PP_REPEAT_3_91(m, d) m(4, 91, d)\n# define BOOST_PP_REPEAT_3_93(m, d) BOOST_PP_REPEAT_3_92(m, d) m(4, 92, d)\n# define BOOST_PP_REPEAT_3_94(m, d) BOOST_PP_REPEAT_3_93(m, d) m(4, 93, d)\n# define BOOST_PP_REPEAT_3_95(m, d) BOOST_PP_REPEAT_3_94(m, d) m(4, 94, d)\n# define BOOST_PP_REPEAT_3_96(m, d) BOOST_PP_REPEAT_3_95(m, d) m(4, 95, d)\n# define BOOST_PP_REPEAT_3_97(m, d) BOOST_PP_REPEAT_3_96(m, d) m(4, 96, d)\n# define BOOST_PP_REPEAT_3_98(m, d) BOOST_PP_REPEAT_3_97(m, d) m(4, 97, d)\n# define BOOST_PP_REPEAT_3_99(m, d) BOOST_PP_REPEAT_3_98(m, d) m(4, 98, d)\n# define BOOST_PP_REPEAT_3_100(m, d) BOOST_PP_REPEAT_3_99(m, d) m(4, 99, d)\n# define BOOST_PP_REPEAT_3_101(m, d) BOOST_PP_REPEAT_3_100(m, d) m(4, 100, d)\n# define BOOST_PP_REPEAT_3_102(m, d) BOOST_PP_REPEAT_3_101(m, d) m(4, 101, d)\n# define BOOST_PP_REPEAT_3_103(m, d) BOOST_PP_REPEAT_3_102(m, d) m(4, 102, d)\n# define BOOST_PP_REPEAT_3_104(m, d) BOOST_PP_REPEAT_3_103(m, d) m(4, 103, d)\n# define BOOST_PP_REPEAT_3_105(m, d) BOOST_PP_REPEAT_3_104(m, d) m(4, 104, d)\n# define BOOST_PP_REPEAT_3_106(m, d) BOOST_PP_REPEAT_3_105(m, d) m(4, 105, d)\n# define BOOST_PP_REPEAT_3_107(m, d) BOOST_PP_REPEAT_3_106(m, d) m(4, 106, d)\n# define BOOST_PP_REPEAT_3_108(m, d) BOOST_PP_REPEAT_3_107(m, d) m(4, 107, d)\n# define BOOST_PP_REPEAT_3_109(m, d) BOOST_PP_REPEAT_3_108(m, d) m(4, 108, d)\n# define BOOST_PP_REPEAT_3_110(m, d) BOOST_PP_REPEAT_3_109(m, d) m(4, 109, d)\n# define BOOST_PP_REPEAT_3_111(m, d) BOOST_PP_REPEAT_3_110(m, d) m(4, 110, d)\n# define BOOST_PP_REPEAT_3_112(m, d) BOOST_PP_REPEAT_3_111(m, d) m(4, 111, d)\n# define BOOST_PP_REPEAT_3_113(m, d) BOOST_PP_REPEAT_3_112(m, d) m(4, 112, d)\n# define BOOST_PP_REPEAT_3_114(m, d) BOOST_PP_REPEAT_3_113(m, d) m(4, 113, d)\n# define BOOST_PP_REPEAT_3_115(m, d) BOOST_PP_REPEAT_3_114(m, d) m(4, 114, d)\n# define BOOST_PP_REPEAT_3_116(m, d) BOOST_PP_REPEAT_3_115(m, d) m(4, 115, d)\n# define BOOST_PP_REPEAT_3_117(m, d) BOOST_PP_REPEAT_3_116(m, d) m(4, 116, d)\n# define BOOST_PP_REPEAT_3_118(m, d) BOOST_PP_REPEAT_3_117(m, d) m(4, 117, d)\n# define BOOST_PP_REPEAT_3_119(m, d) BOOST_PP_REPEAT_3_118(m, d) m(4, 118, d)\n# define BOOST_PP_REPEAT_3_120(m, d) BOOST_PP_REPEAT_3_119(m, d) m(4, 119, d)\n# define BOOST_PP_REPEAT_3_121(m, d) BOOST_PP_REPEAT_3_120(m, d) m(4, 120, d)\n# define BOOST_PP_REPEAT_3_122(m, d) BOOST_PP_REPEAT_3_121(m, d) m(4, 121, d)\n# define BOOST_PP_REPEAT_3_123(m, d) BOOST_PP_REPEAT_3_122(m, d) m(4, 122, d)\n# define BOOST_PP_REPEAT_3_124(m, d) BOOST_PP_REPEAT_3_123(m, d) m(4, 123, d)\n# define BOOST_PP_REPEAT_3_125(m, d) BOOST_PP_REPEAT_3_124(m, d) m(4, 124, d)\n# define BOOST_PP_REPEAT_3_126(m, d) BOOST_PP_REPEAT_3_125(m, d) m(4, 125, d)\n# define BOOST_PP_REPEAT_3_127(m, d) BOOST_PP_REPEAT_3_126(m, d) m(4, 126, d)\n# define BOOST_PP_REPEAT_3_128(m, d) BOOST_PP_REPEAT_3_127(m, d) m(4, 127, d)\n# define BOOST_PP_REPEAT_3_129(m, d) BOOST_PP_REPEAT_3_128(m, d) m(4, 128, d)\n# define BOOST_PP_REPEAT_3_130(m, d) BOOST_PP_REPEAT_3_129(m, d) m(4, 129, d)\n# define BOOST_PP_REPEAT_3_131(m, d) BOOST_PP_REPEAT_3_130(m, d) m(4, 130, d)\n# define BOOST_PP_REPEAT_3_132(m, d) BOOST_PP_REPEAT_3_131(m, d) m(4, 131, d)\n# define BOOST_PP_REPEAT_3_133(m, d) BOOST_PP_REPEAT_3_132(m, d) m(4, 132, d)\n# define BOOST_PP_REPEAT_3_134(m, d) BOOST_PP_REPEAT_3_133(m, d) m(4, 133, d)\n# define BOOST_PP_REPEAT_3_135(m, d) BOOST_PP_REPEAT_3_134(m, d) m(4, 134, d)\n# define BOOST_PP_REPEAT_3_136(m, d) BOOST_PP_REPEAT_3_135(m, d) m(4, 135, d)\n# define BOOST_PP_REPEAT_3_137(m, d) BOOST_PP_REPEAT_3_136(m, d) m(4, 136, d)\n# define BOOST_PP_REPEAT_3_138(m, d) BOOST_PP_REPEAT_3_137(m, d) m(4, 137, d)\n# define BOOST_PP_REPEAT_3_139(m, d) BOOST_PP_REPEAT_3_138(m, d) m(4, 138, d)\n# define BOOST_PP_REPEAT_3_140(m, d) BOOST_PP_REPEAT_3_139(m, d) m(4, 139, d)\n# define BOOST_PP_REPEAT_3_141(m, d) BOOST_PP_REPEAT_3_140(m, d) m(4, 140, d)\n# define BOOST_PP_REPEAT_3_142(m, d) BOOST_PP_REPEAT_3_141(m, d) m(4, 141, d)\n# define BOOST_PP_REPEAT_3_143(m, d) BOOST_PP_REPEAT_3_142(m, d) m(4, 142, d)\n# define BOOST_PP_REPEAT_3_144(m, d) BOOST_PP_REPEAT_3_143(m, d) m(4, 143, d)\n# define BOOST_PP_REPEAT_3_145(m, d) BOOST_PP_REPEAT_3_144(m, d) m(4, 144, d)\n# define BOOST_PP_REPEAT_3_146(m, d) BOOST_PP_REPEAT_3_145(m, d) m(4, 145, d)\n# define BOOST_PP_REPEAT_3_147(m, d) BOOST_PP_REPEAT_3_146(m, d) m(4, 146, d)\n# define BOOST_PP_REPEAT_3_148(m, d) BOOST_PP_REPEAT_3_147(m, d) m(4, 147, d)\n# define BOOST_PP_REPEAT_3_149(m, d) BOOST_PP_REPEAT_3_148(m, d) m(4, 148, d)\n# define BOOST_PP_REPEAT_3_150(m, d) BOOST_PP_REPEAT_3_149(m, d) m(4, 149, d)\n# define BOOST_PP_REPEAT_3_151(m, d) BOOST_PP_REPEAT_3_150(m, d) m(4, 150, d)\n# define BOOST_PP_REPEAT_3_152(m, d) BOOST_PP_REPEAT_3_151(m, d) m(4, 151, d)\n# define BOOST_PP_REPEAT_3_153(m, d) BOOST_PP_REPEAT_3_152(m, d) m(4, 152, d)\n# define BOOST_PP_REPEAT_3_154(m, d) BOOST_PP_REPEAT_3_153(m, d) m(4, 153, d)\n# define BOOST_PP_REPEAT_3_155(m, d) BOOST_PP_REPEAT_3_154(m, d) m(4, 154, d)\n# define BOOST_PP_REPEAT_3_156(m, d) BOOST_PP_REPEAT_3_155(m, d) m(4, 155, d)\n# define BOOST_PP_REPEAT_3_157(m, d) BOOST_PP_REPEAT_3_156(m, d) m(4, 156, d)\n# define BOOST_PP_REPEAT_3_158(m, d) BOOST_PP_REPEAT_3_157(m, d) m(4, 157, d)\n# define BOOST_PP_REPEAT_3_159(m, d) BOOST_PP_REPEAT_3_158(m, d) m(4, 158, d)\n# define BOOST_PP_REPEAT_3_160(m, d) BOOST_PP_REPEAT_3_159(m, d) m(4, 159, d)\n# define BOOST_PP_REPEAT_3_161(m, d) BOOST_PP_REPEAT_3_160(m, d) m(4, 160, d)\n# define BOOST_PP_REPEAT_3_162(m, d) BOOST_PP_REPEAT_3_161(m, d) m(4, 161, d)\n# define BOOST_PP_REPEAT_3_163(m, d) BOOST_PP_REPEAT_3_162(m, d) m(4, 162, d)\n# define BOOST_PP_REPEAT_3_164(m, d) BOOST_PP_REPEAT_3_163(m, d) m(4, 163, d)\n# define BOOST_PP_REPEAT_3_165(m, d) BOOST_PP_REPEAT_3_164(m, d) m(4, 164, d)\n# define BOOST_PP_REPEAT_3_166(m, d) BOOST_PP_REPEAT_3_165(m, d) m(4, 165, d)\n# define BOOST_PP_REPEAT_3_167(m, d) BOOST_PP_REPEAT_3_166(m, d) m(4, 166, d)\n# define BOOST_PP_REPEAT_3_168(m, d) BOOST_PP_REPEAT_3_167(m, d) m(4, 167, d)\n# define BOOST_PP_REPEAT_3_169(m, d) BOOST_PP_REPEAT_3_168(m, d) m(4, 168, d)\n# define BOOST_PP_REPEAT_3_170(m, d) BOOST_PP_REPEAT_3_169(m, d) m(4, 169, d)\n# define BOOST_PP_REPEAT_3_171(m, d) BOOST_PP_REPEAT_3_170(m, d) m(4, 170, d)\n# define BOOST_PP_REPEAT_3_172(m, d) BOOST_PP_REPEAT_3_171(m, d) m(4, 171, d)\n# define BOOST_PP_REPEAT_3_173(m, d) BOOST_PP_REPEAT_3_172(m, d) m(4, 172, d)\n# define BOOST_PP_REPEAT_3_174(m, d) BOOST_PP_REPEAT_3_173(m, d) m(4, 173, d)\n# define BOOST_PP_REPEAT_3_175(m, d) BOOST_PP_REPEAT_3_174(m, d) m(4, 174, d)\n# define BOOST_PP_REPEAT_3_176(m, d) BOOST_PP_REPEAT_3_175(m, d) m(4, 175, d)\n# define BOOST_PP_REPEAT_3_177(m, d) BOOST_PP_REPEAT_3_176(m, d) m(4, 176, d)\n# define BOOST_PP_REPEAT_3_178(m, d) BOOST_PP_REPEAT_3_177(m, d) m(4, 177, d)\n# define BOOST_PP_REPEAT_3_179(m, d) BOOST_PP_REPEAT_3_178(m, d) m(4, 178, d)\n# define BOOST_PP_REPEAT_3_180(m, d) BOOST_PP_REPEAT_3_179(m, d) m(4, 179, d)\n# define BOOST_PP_REPEAT_3_181(m, d) BOOST_PP_REPEAT_3_180(m, d) m(4, 180, d)\n# define BOOST_PP_REPEAT_3_182(m, d) BOOST_PP_REPEAT_3_181(m, d) m(4, 181, d)\n# define BOOST_PP_REPEAT_3_183(m, d) BOOST_PP_REPEAT_3_182(m, d) m(4, 182, d)\n# define BOOST_PP_REPEAT_3_184(m, d) BOOST_PP_REPEAT_3_183(m, d) m(4, 183, d)\n# define BOOST_PP_REPEAT_3_185(m, d) BOOST_PP_REPEAT_3_184(m, d) m(4, 184, d)\n# define BOOST_PP_REPEAT_3_186(m, d) BOOST_PP_REPEAT_3_185(m, d) m(4, 185, d)\n# define BOOST_PP_REPEAT_3_187(m, d) BOOST_PP_REPEAT_3_186(m, d) m(4, 186, d)\n# define BOOST_PP_REPEAT_3_188(m, d) BOOST_PP_REPEAT_3_187(m, d) m(4, 187, d)\n# define BOOST_PP_REPEAT_3_189(m, d) BOOST_PP_REPEAT_3_188(m, d) m(4, 188, d)\n# define BOOST_PP_REPEAT_3_190(m, d) BOOST_PP_REPEAT_3_189(m, d) m(4, 189, d)\n# define BOOST_PP_REPEAT_3_191(m, d) BOOST_PP_REPEAT_3_190(m, d) m(4, 190, d)\n# define BOOST_PP_REPEAT_3_192(m, d) BOOST_PP_REPEAT_3_191(m, d) m(4, 191, d)\n# define BOOST_PP_REPEAT_3_193(m, d) BOOST_PP_REPEAT_3_192(m, d) m(4, 192, d)\n# define BOOST_PP_REPEAT_3_194(m, d) BOOST_PP_REPEAT_3_193(m, d) m(4, 193, d)\n# define BOOST_PP_REPEAT_3_195(m, d) BOOST_PP_REPEAT_3_194(m, d) m(4, 194, d)\n# define BOOST_PP_REPEAT_3_196(m, d) BOOST_PP_REPEAT_3_195(m, d) m(4, 195, d)\n# define BOOST_PP_REPEAT_3_197(m, d) BOOST_PP_REPEAT_3_196(m, d) m(4, 196, d)\n# define BOOST_PP_REPEAT_3_198(m, d) BOOST_PP_REPEAT_3_197(m, d) m(4, 197, d)\n# define BOOST_PP_REPEAT_3_199(m, d) BOOST_PP_REPEAT_3_198(m, d) m(4, 198, d)\n# define BOOST_PP_REPEAT_3_200(m, d) BOOST_PP_REPEAT_3_199(m, d) m(4, 199, d)\n# define BOOST_PP_REPEAT_3_201(m, d) BOOST_PP_REPEAT_3_200(m, d) m(4, 200, d)\n# define BOOST_PP_REPEAT_3_202(m, d) BOOST_PP_REPEAT_3_201(m, d) m(4, 201, d)\n# define BOOST_PP_REPEAT_3_203(m, d) BOOST_PP_REPEAT_3_202(m, d) m(4, 202, d)\n# define BOOST_PP_REPEAT_3_204(m, d) BOOST_PP_REPEAT_3_203(m, d) m(4, 203, d)\n# define BOOST_PP_REPEAT_3_205(m, d) BOOST_PP_REPEAT_3_204(m, d) m(4, 204, d)\n# define BOOST_PP_REPEAT_3_206(m, d) BOOST_PP_REPEAT_3_205(m, d) m(4, 205, d)\n# define BOOST_PP_REPEAT_3_207(m, d) BOOST_PP_REPEAT_3_206(m, d) m(4, 206, d)\n# define BOOST_PP_REPEAT_3_208(m, d) BOOST_PP_REPEAT_3_207(m, d) m(4, 207, d)\n# define BOOST_PP_REPEAT_3_209(m, d) BOOST_PP_REPEAT_3_208(m, d) m(4, 208, d)\n# define BOOST_PP_REPEAT_3_210(m, d) BOOST_PP_REPEAT_3_209(m, d) m(4, 209, d)\n# define BOOST_PP_REPEAT_3_211(m, d) BOOST_PP_REPEAT_3_210(m, d) m(4, 210, d)\n# define BOOST_PP_REPEAT_3_212(m, d) BOOST_PP_REPEAT_3_211(m, d) m(4, 211, d)\n# define BOOST_PP_REPEAT_3_213(m, d) BOOST_PP_REPEAT_3_212(m, d) m(4, 212, d)\n# define BOOST_PP_REPEAT_3_214(m, d) BOOST_PP_REPEAT_3_213(m, d) m(4, 213, d)\n# define BOOST_PP_REPEAT_3_215(m, d) BOOST_PP_REPEAT_3_214(m, d) m(4, 214, d)\n# define BOOST_PP_REPEAT_3_216(m, d) BOOST_PP_REPEAT_3_215(m, d) m(4, 215, d)\n# define BOOST_PP_REPEAT_3_217(m, d) BOOST_PP_REPEAT_3_216(m, d) m(4, 216, d)\n# define BOOST_PP_REPEAT_3_218(m, d) BOOST_PP_REPEAT_3_217(m, d) m(4, 217, d)\n# define BOOST_PP_REPEAT_3_219(m, d) BOOST_PP_REPEAT_3_218(m, d) m(4, 218, d)\n# define BOOST_PP_REPEAT_3_220(m, d) BOOST_PP_REPEAT_3_219(m, d) m(4, 219, d)\n# define BOOST_PP_REPEAT_3_221(m, d) BOOST_PP_REPEAT_3_220(m, d) m(4, 220, d)\n# define BOOST_PP_REPEAT_3_222(m, d) BOOST_PP_REPEAT_3_221(m, d) m(4, 221, d)\n# define BOOST_PP_REPEAT_3_223(m, d) BOOST_PP_REPEAT_3_222(m, d) m(4, 222, d)\n# define BOOST_PP_REPEAT_3_224(m, d) BOOST_PP_REPEAT_3_223(m, d) m(4, 223, d)\n# define BOOST_PP_REPEAT_3_225(m, d) BOOST_PP_REPEAT_3_224(m, d) m(4, 224, d)\n# define BOOST_PP_REPEAT_3_226(m, d) BOOST_PP_REPEAT_3_225(m, d) m(4, 225, d)\n# define BOOST_PP_REPEAT_3_227(m, d) BOOST_PP_REPEAT_3_226(m, d) m(4, 226, d)\n# define BOOST_PP_REPEAT_3_228(m, d) BOOST_PP_REPEAT_3_227(m, d) m(4, 227, d)\n# define BOOST_PP_REPEAT_3_229(m, d) BOOST_PP_REPEAT_3_228(m, d) m(4, 228, d)\n# define BOOST_PP_REPEAT_3_230(m, d) BOOST_PP_REPEAT_3_229(m, d) m(4, 229, d)\n# define BOOST_PP_REPEAT_3_231(m, d) BOOST_PP_REPEAT_3_230(m, d) m(4, 230, d)\n# define BOOST_PP_REPEAT_3_232(m, d) BOOST_PP_REPEAT_3_231(m, d) m(4, 231, d)\n# define BOOST_PP_REPEAT_3_233(m, d) BOOST_PP_REPEAT_3_232(m, d) m(4, 232, d)\n# define BOOST_PP_REPEAT_3_234(m, d) BOOST_PP_REPEAT_3_233(m, d) m(4, 233, d)\n# define BOOST_PP_REPEAT_3_235(m, d) BOOST_PP_REPEAT_3_234(m, d) m(4, 234, d)\n# define BOOST_PP_REPEAT_3_236(m, d) BOOST_PP_REPEAT_3_235(m, d) m(4, 235, d)\n# define BOOST_PP_REPEAT_3_237(m, d) BOOST_PP_REPEAT_3_236(m, d) m(4, 236, d)\n# define BOOST_PP_REPEAT_3_238(m, d) BOOST_PP_REPEAT_3_237(m, d) m(4, 237, d)\n# define BOOST_PP_REPEAT_3_239(m, d) BOOST_PP_REPEAT_3_238(m, d) m(4, 238, d)\n# define BOOST_PP_REPEAT_3_240(m, d) BOOST_PP_REPEAT_3_239(m, d) m(4, 239, d)\n# define BOOST_PP_REPEAT_3_241(m, d) BOOST_PP_REPEAT_3_240(m, d) m(4, 240, d)\n# define BOOST_PP_REPEAT_3_242(m, d) BOOST_PP_REPEAT_3_241(m, d) m(4, 241, d)\n# define BOOST_PP_REPEAT_3_243(m, d) BOOST_PP_REPEAT_3_242(m, d) m(4, 242, d)\n# define BOOST_PP_REPEAT_3_244(m, d) BOOST_PP_REPEAT_3_243(m, d) m(4, 243, d)\n# define BOOST_PP_REPEAT_3_245(m, d) BOOST_PP_REPEAT_3_244(m, d) m(4, 244, d)\n# define BOOST_PP_REPEAT_3_246(m, d) BOOST_PP_REPEAT_3_245(m, d) m(4, 245, d)\n# define BOOST_PP_REPEAT_3_247(m, d) BOOST_PP_REPEAT_3_246(m, d) m(4, 246, d)\n# define BOOST_PP_REPEAT_3_248(m, d) BOOST_PP_REPEAT_3_247(m, d) m(4, 247, d)\n# define BOOST_PP_REPEAT_3_249(m, d) BOOST_PP_REPEAT_3_248(m, d) m(4, 248, d)\n# define BOOST_PP_REPEAT_3_250(m, d) BOOST_PP_REPEAT_3_249(m, d) m(4, 249, d)\n# define BOOST_PP_REPEAT_3_251(m, d) BOOST_PP_REPEAT_3_250(m, d) m(4, 250, d)\n# define BOOST_PP_REPEAT_3_252(m, d) BOOST_PP_REPEAT_3_251(m, d) m(4, 251, d)\n# define BOOST_PP_REPEAT_3_253(m, d) BOOST_PP_REPEAT_3_252(m, d) m(4, 252, d)\n# define BOOST_PP_REPEAT_3_254(m, d) BOOST_PP_REPEAT_3_253(m, d) m(4, 253, d)\n# define BOOST_PP_REPEAT_3_255(m, d) BOOST_PP_REPEAT_3_254(m, d) m(4, 254, d)\n# define BOOST_PP_REPEAT_3_256(m, d) BOOST_PP_REPEAT_3_255(m, d) m(4, 255, d)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition/repeat_from_to.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_REPEAT_FROM_TO_HPP\n# define BOOST_PREPROCESSOR_REPETITION_REPEAT_FROM_TO_HPP\n#\n# include <boost/preprocessor/arithmetic/add.hpp>\n# include <boost/preprocessor/arithmetic/sub.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_REPEAT_FROM_TO */\n#\n# if 0\n#    define BOOST_PP_REPEAT_FROM_TO(first, last, macro, data)\n# endif\n#\n# define BOOST_PP_REPEAT_FROM_TO BOOST_PP_CAT(BOOST_PP_REPEAT_FROM_TO_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# define BOOST_PP_REPEAT_FROM_TO_1(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_1(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_2(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_2(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_3(f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_3(BOOST_PP_AUTO_REC(BOOST_PP_WHILE_P, 256), f, l, m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_4(f, l, m, dt) BOOST_PP_ERROR(0x0003)\n#\n# define BOOST_PP_REPEAT_FROM_TO_1ST BOOST_PP_REPEAT_FROM_TO_1\n# define BOOST_PP_REPEAT_FROM_TO_2ND BOOST_PP_REPEAT_FROM_TO_2\n# define BOOST_PP_REPEAT_FROM_TO_3RD BOOST_PP_REPEAT_FROM_TO_3\n#\n# /* BOOST_PP_REPEAT_FROM_TO_D */\n#\n# if 0\n#    define BOOST_PP_REPEAT_FROM_TO_D(d, first, last, macro, data)\n# endif\n#\n# define BOOST_PP_REPEAT_FROM_TO_D BOOST_PP_CAT(BOOST_PP_REPEAT_FROM_TO_D_, BOOST_PP_AUTO_REC(BOOST_PP_REPEAT_P, 4))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_REPEAT_FROM_TO_D_1(d, f, l, m, dt) BOOST_PP_REPEAT_1(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_1, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_2(d, f, l, m, dt) BOOST_PP_REPEAT_2(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_2, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_3(d, f, l, m, dt) BOOST_PP_REPEAT_3(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_3, (d, f, m, dt))\n# else\n#    define BOOST_PP_REPEAT_FROM_TO_D_1(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_1_I(d, f, l, m, dt)\n#    define BOOST_PP_REPEAT_FROM_TO_D_2(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_2_I(d, f, l, m, dt)\n#    define BOOST_PP_REPEAT_FROM_TO_D_3(d, f, l, m, dt) BOOST_PP_REPEAT_FROM_TO_D_3_I(d, f, l, m, dt)\n#    define BOOST_PP_REPEAT_FROM_TO_D_1_I(d, f, l, m, dt) BOOST_PP_REPEAT_1(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_1, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_2_I(d, f, l, m, dt) BOOST_PP_REPEAT_2(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_2, (d, f, m, dt))\n#    define BOOST_PP_REPEAT_FROM_TO_D_3_I(d, f, l, m, dt) BOOST_PP_REPEAT_3(BOOST_PP_SUB_D(d, l, f), BOOST_PP_REPEAT_FROM_TO_M_3, (d, f, m, dt))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_REPEAT_FROM_TO_M_1(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_1_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)\n#    define BOOST_PP_REPEAT_FROM_TO_M_2(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_2_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)\n#    define BOOST_PP_REPEAT_FROM_TO_M_3(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_3_IM(z, n, BOOST_PP_TUPLE_REM_4 dfmd)\n#    define BOOST_PP_REPEAT_FROM_TO_M_1_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, im)\n#    define BOOST_PP_REPEAT_FROM_TO_M_2_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, im)\n#    define BOOST_PP_REPEAT_FROM_TO_M_3_IM(z, n, im) BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, im)\n# else\n#    define BOOST_PP_REPEAT_FROM_TO_M_1(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))\n#    define BOOST_PP_REPEAT_FROM_TO_M_2(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))\n#    define BOOST_PP_REPEAT_FROM_TO_M_3(z, n, dfmd) BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, BOOST_PP_TUPLE_ELEM(4, 0, dfmd), BOOST_PP_TUPLE_ELEM(4, 1, dfmd), BOOST_PP_TUPLE_ELEM(4, 2, dfmd), BOOST_PP_TUPLE_ELEM(4, 3, dfmd))\n# endif\n#\n# define BOOST_PP_REPEAT_FROM_TO_M_1_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_1_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_2_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_2_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_3_I(z, n, d, f, m, dt) BOOST_PP_REPEAT_FROM_TO_M_3_II(z, BOOST_PP_ADD_D(d, n, f), m, dt)\n#\n# define BOOST_PP_REPEAT_FROM_TO_M_1_II(z, n, m, dt) m(z, n, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_2_II(z, n, m, dt) m(z, n, dt)\n# define BOOST_PP_REPEAT_FROM_TO_M_3_II(z, n, m, dt) m(z, n, dt)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/repetition.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_REPETITION_HPP\n# define BOOST_PREPROCESSOR_REPETITION_HPP\n#\n# include <boost/preprocessor/repetition/deduce_r.hpp>\n# include <boost/preprocessor/repetition/deduce_z.hpp>\n# include <boost/preprocessor/repetition/enum.hpp>\n# include <boost/preprocessor/repetition/enum_binary_params.hpp>\n# include <boost/preprocessor/repetition/enum_params.hpp>\n# include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>\n# include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>\n# include <boost/preprocessor/repetition/enum_shifted.hpp>\n# include <boost/preprocessor/repetition/enum_shifted_binary_params.hpp>\n# include <boost/preprocessor/repetition/enum_shifted_params.hpp>\n# include <boost/preprocessor/repetition/enum_trailing.hpp>\n# include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp>\n# include <boost/preprocessor/repetition/enum_trailing_params.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/repetition/repeat.hpp>\n# include <boost/preprocessor/repetition/repeat_from_to.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/selection/max.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SELECTION_MAX_HPP\n# define BOOST_PREPROCESSOR_SELECTION_MAX_HPP\n#\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_MAX */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MAX(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(x, y), y, x)\n# else\n#    define BOOST_PP_MAX(x, y) BOOST_PP_MAX_I(x, y)\n#    define BOOST_PP_MAX_I(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(x, y), y, x)\n# endif\n#\n# /* BOOST_PP_MAX_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MAX_D(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, x, y), y, x)\n# else\n#    define BOOST_PP_MAX_D(d, x, y) BOOST_PP_MAX_D_I(d, x, y)\n#    define BOOST_PP_MAX_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, x, y), y, x)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/selection/min.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SELECTION_MIN_HPP\n# define BOOST_PREPROCESSOR_SELECTION_MIN_HPP\n#\n# include <boost/preprocessor/comparison/less_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n#\n# /* BOOST_PP_MIN */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MIN(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(y, x), y, x)\n# else\n#    define BOOST_PP_MIN(x, y) BOOST_PP_MIN_I(x, y)\n#    define BOOST_PP_MIN_I(x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL(y, x), y, x)\n# endif\n#\n# /* BOOST_PP_MIN_D */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_MIN_D(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, y, x), y, x)\n# else\n#    define BOOST_PP_MIN_D(d, x, y) BOOST_PP_MIN_D_I(d, x, y)\n#    define BOOST_PP_MIN_D_I(d, x, y) BOOST_PP_IIF(BOOST_PP_LESS_EQUAL_D(d, y, x), y, x)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/selection.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SELECTION_HPP\n# define BOOST_PREPROCESSOR_SELECTION_HPP\n#\n# include <boost/preprocessor/selection/max.hpp>\n# include <boost/preprocessor/selection/min.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/cat.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_CAT_HPP\n# define BOOST_PREPROCESSOR_SEQ_CAT_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n#\n# /* BOOST_PP_SEQ_CAT */\n#\n# define BOOST_PP_SEQ_CAT(seq) \\\n    BOOST_PP_IF( \\\n        BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), \\\n        BOOST_PP_SEQ_CAT_I, \\\n        BOOST_PP_SEQ_HEAD \\\n    )(seq) \\\n    /**/\n# define BOOST_PP_SEQ_CAT_I(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_CAT_O, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq))\n#\n# define BOOST_PP_SEQ_CAT_O(s, st, elem) BOOST_PP_SEQ_CAT_O_I(st, elem)\n# define BOOST_PP_SEQ_CAT_O_I(a, b) a ## b\n#\n# /* BOOST_PP_SEQ_CAT_S */\n#\n# define BOOST_PP_SEQ_CAT_S(s, seq) \\\n    BOOST_PP_IF( \\\n        BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), \\\n        BOOST_PP_SEQ_CAT_S_I_A, \\\n        BOOST_PP_SEQ_CAT_S_I_B \\\n    )(s, seq) \\\n    /**/\n# define BOOST_PP_SEQ_CAT_S_I_A(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_CAT_O, BOOST_PP_SEQ_HEAD(seq), BOOST_PP_SEQ_TAIL(seq))\n# define BOOST_PP_SEQ_CAT_S_I_B(s, seq) BOOST_PP_SEQ_HEAD(seq)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/detail/binary_transform.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_BINARY_TRANSFORM_HPP\n# define BOOST_PREPROCESSOR_SEQ_DETAIL_BINARY_TRANSFORM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/variadic/detail/is_single_return.hpp>\n#\n# /* BOOST_PP_SEQ_BINARY_TRANSFORM */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_SEQ_BINARY_TRANSFORM_I(, seq)\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM_I(p, seq) BOOST_PP_SEQ_BINARY_TRANSFORM_II(p ## seq)\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM_II(seq) BOOST_PP_SEQ_BINARY_TRANSFORM_III(seq)\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM_III(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)\n# else\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_BINARY_TRANSFORM_A seq, 0)\n# endif\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#\t\tdefine BOOST_PP_SEQ_BINARY_TRANSFORM_REM(data) data\n#       define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...) (BOOST_PP_SEQ_BINARY_TRANSFORM_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_B\n#       define BOOST_PP_SEQ_BINARY_TRANSFORM_B(...) (BOOST_PP_SEQ_BINARY_TRANSFORM_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_A\n#\t else\n#       define BOOST_PP_SEQ_BINARY_TRANSFORM_A(...) (BOOST_PP_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_B\n#       define BOOST_PP_SEQ_BINARY_TRANSFORM_B(...) (BOOST_PP_REM, __VA_ARGS__)() BOOST_PP_SEQ_BINARY_TRANSFORM_A\n#\t endif\n# else\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM_A(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_B\n#    define BOOST_PP_SEQ_BINARY_TRANSFORM_B(e) (BOOST_PP_REM, e)() BOOST_PP_SEQ_BINARY_TRANSFORM_A\n# endif\n# define BOOST_PP_SEQ_BINARY_TRANSFORM_A0 (BOOST_PP_EAT, ?)\n# define BOOST_PP_SEQ_BINARY_TRANSFORM_B0 (BOOST_PP_EAT, ?)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/detail/is_empty.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2015.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_IS_EMPTY_HPP\n# define BOOST_PREPROCESSOR_SEQ_DETAIL_IS_EMPTY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/logical/bool.hpp>\n# include <boost/preprocessor/logical/compl.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n/* An empty seq is one that is just BOOST_PP_SEQ_NIL */\n#\n# define BOOST_PP_SEQ_DETAIL_IS_EMPTY(seq) \\\n\tBOOST_PP_COMPL \\\n\t\t( \\\n\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq) \\\n\t\t) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_IS_EMPTY_SIZE(size) \\\n\tBOOST_PP_COMPL \\\n\t\t( \\\n\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(size) \\\n\t\t) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq) \\\n\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq)) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(size) \\\n\tBOOST_PP_BOOL(size) \\\n/**/\n#\n# define BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq) \\\n\tBOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq (nil))) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/detail/split.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_SPLIT_HPP\n# define BOOST_PREPROCESSOR_SEQ_DETAIL_SPLIT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_SEQ_SPLIT */\n#\n# define BOOST_PP_SEQ_SPLIT(n, seq) BOOST_PP_SEQ_SPLIT_D(n, seq)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_SPLIT_D(n, seq) (BOOST_PP_SEQ_SPLIT_ ## n seq)\n# else\n#    define BOOST_PP_SEQ_SPLIT_D(n, seq) (BOOST_PP_SEQ_SPLIT_ ## n ## seq)\n# endif\n#\n# define BOOST_PP_SEQ_SPLIT_1(x) (x),\n# define BOOST_PP_SEQ_SPLIT_2(x) (x) BOOST_PP_SEQ_SPLIT_1\n# define BOOST_PP_SEQ_SPLIT_3(x) (x) BOOST_PP_SEQ_SPLIT_2\n# define BOOST_PP_SEQ_SPLIT_4(x) (x) BOOST_PP_SEQ_SPLIT_3\n# define BOOST_PP_SEQ_SPLIT_5(x) (x) BOOST_PP_SEQ_SPLIT_4\n# define BOOST_PP_SEQ_SPLIT_6(x) (x) BOOST_PP_SEQ_SPLIT_5\n# define BOOST_PP_SEQ_SPLIT_7(x) (x) BOOST_PP_SEQ_SPLIT_6\n# define BOOST_PP_SEQ_SPLIT_8(x) (x) BOOST_PP_SEQ_SPLIT_7\n# define BOOST_PP_SEQ_SPLIT_9(x) (x) BOOST_PP_SEQ_SPLIT_8\n# define BOOST_PP_SEQ_SPLIT_10(x) (x) BOOST_PP_SEQ_SPLIT_9\n# define BOOST_PP_SEQ_SPLIT_11(x) (x) BOOST_PP_SEQ_SPLIT_10\n# define BOOST_PP_SEQ_SPLIT_12(x) (x) BOOST_PP_SEQ_SPLIT_11\n# define BOOST_PP_SEQ_SPLIT_13(x) (x) BOOST_PP_SEQ_SPLIT_12\n# define BOOST_PP_SEQ_SPLIT_14(x) (x) BOOST_PP_SEQ_SPLIT_13\n# define BOOST_PP_SEQ_SPLIT_15(x) (x) BOOST_PP_SEQ_SPLIT_14\n# define BOOST_PP_SEQ_SPLIT_16(x) (x) BOOST_PP_SEQ_SPLIT_15\n# define BOOST_PP_SEQ_SPLIT_17(x) (x) BOOST_PP_SEQ_SPLIT_16\n# define BOOST_PP_SEQ_SPLIT_18(x) (x) BOOST_PP_SEQ_SPLIT_17\n# define BOOST_PP_SEQ_SPLIT_19(x) (x) BOOST_PP_SEQ_SPLIT_18\n# define BOOST_PP_SEQ_SPLIT_20(x) (x) BOOST_PP_SEQ_SPLIT_19\n# define BOOST_PP_SEQ_SPLIT_21(x) (x) BOOST_PP_SEQ_SPLIT_20\n# define BOOST_PP_SEQ_SPLIT_22(x) (x) BOOST_PP_SEQ_SPLIT_21\n# define BOOST_PP_SEQ_SPLIT_23(x) (x) BOOST_PP_SEQ_SPLIT_22\n# define BOOST_PP_SEQ_SPLIT_24(x) (x) BOOST_PP_SEQ_SPLIT_23\n# define BOOST_PP_SEQ_SPLIT_25(x) (x) BOOST_PP_SEQ_SPLIT_24\n# define BOOST_PP_SEQ_SPLIT_26(x) (x) BOOST_PP_SEQ_SPLIT_25\n# define BOOST_PP_SEQ_SPLIT_27(x) (x) BOOST_PP_SEQ_SPLIT_26\n# define BOOST_PP_SEQ_SPLIT_28(x) (x) BOOST_PP_SEQ_SPLIT_27\n# define BOOST_PP_SEQ_SPLIT_29(x) (x) BOOST_PP_SEQ_SPLIT_28\n# define BOOST_PP_SEQ_SPLIT_30(x) (x) BOOST_PP_SEQ_SPLIT_29\n# define BOOST_PP_SEQ_SPLIT_31(x) (x) BOOST_PP_SEQ_SPLIT_30\n# define BOOST_PP_SEQ_SPLIT_32(x) (x) BOOST_PP_SEQ_SPLIT_31\n# define BOOST_PP_SEQ_SPLIT_33(x) (x) BOOST_PP_SEQ_SPLIT_32\n# define BOOST_PP_SEQ_SPLIT_34(x) (x) BOOST_PP_SEQ_SPLIT_33\n# define BOOST_PP_SEQ_SPLIT_35(x) (x) BOOST_PP_SEQ_SPLIT_34\n# define BOOST_PP_SEQ_SPLIT_36(x) (x) BOOST_PP_SEQ_SPLIT_35\n# define BOOST_PP_SEQ_SPLIT_37(x) (x) BOOST_PP_SEQ_SPLIT_36\n# define BOOST_PP_SEQ_SPLIT_38(x) (x) BOOST_PP_SEQ_SPLIT_37\n# define BOOST_PP_SEQ_SPLIT_39(x) (x) BOOST_PP_SEQ_SPLIT_38\n# define BOOST_PP_SEQ_SPLIT_40(x) (x) BOOST_PP_SEQ_SPLIT_39\n# define BOOST_PP_SEQ_SPLIT_41(x) (x) BOOST_PP_SEQ_SPLIT_40\n# define BOOST_PP_SEQ_SPLIT_42(x) (x) BOOST_PP_SEQ_SPLIT_41\n# define BOOST_PP_SEQ_SPLIT_43(x) (x) BOOST_PP_SEQ_SPLIT_42\n# define BOOST_PP_SEQ_SPLIT_44(x) (x) BOOST_PP_SEQ_SPLIT_43\n# define BOOST_PP_SEQ_SPLIT_45(x) (x) BOOST_PP_SEQ_SPLIT_44\n# define BOOST_PP_SEQ_SPLIT_46(x) (x) BOOST_PP_SEQ_SPLIT_45\n# define BOOST_PP_SEQ_SPLIT_47(x) (x) BOOST_PP_SEQ_SPLIT_46\n# define BOOST_PP_SEQ_SPLIT_48(x) (x) BOOST_PP_SEQ_SPLIT_47\n# define BOOST_PP_SEQ_SPLIT_49(x) (x) BOOST_PP_SEQ_SPLIT_48\n# define BOOST_PP_SEQ_SPLIT_50(x) (x) BOOST_PP_SEQ_SPLIT_49\n# define BOOST_PP_SEQ_SPLIT_51(x) (x) BOOST_PP_SEQ_SPLIT_50\n# define BOOST_PP_SEQ_SPLIT_52(x) (x) BOOST_PP_SEQ_SPLIT_51\n# define BOOST_PP_SEQ_SPLIT_53(x) (x) BOOST_PP_SEQ_SPLIT_52\n# define BOOST_PP_SEQ_SPLIT_54(x) (x) BOOST_PP_SEQ_SPLIT_53\n# define BOOST_PP_SEQ_SPLIT_55(x) (x) BOOST_PP_SEQ_SPLIT_54\n# define BOOST_PP_SEQ_SPLIT_56(x) (x) BOOST_PP_SEQ_SPLIT_55\n# define BOOST_PP_SEQ_SPLIT_57(x) (x) BOOST_PP_SEQ_SPLIT_56\n# define BOOST_PP_SEQ_SPLIT_58(x) (x) BOOST_PP_SEQ_SPLIT_57\n# define BOOST_PP_SEQ_SPLIT_59(x) (x) BOOST_PP_SEQ_SPLIT_58\n# define BOOST_PP_SEQ_SPLIT_60(x) (x) BOOST_PP_SEQ_SPLIT_59\n# define BOOST_PP_SEQ_SPLIT_61(x) (x) BOOST_PP_SEQ_SPLIT_60\n# define BOOST_PP_SEQ_SPLIT_62(x) (x) BOOST_PP_SEQ_SPLIT_61\n# define BOOST_PP_SEQ_SPLIT_63(x) (x) BOOST_PP_SEQ_SPLIT_62\n# define BOOST_PP_SEQ_SPLIT_64(x) (x) BOOST_PP_SEQ_SPLIT_63\n# define BOOST_PP_SEQ_SPLIT_65(x) (x) BOOST_PP_SEQ_SPLIT_64\n# define BOOST_PP_SEQ_SPLIT_66(x) (x) BOOST_PP_SEQ_SPLIT_65\n# define BOOST_PP_SEQ_SPLIT_67(x) (x) BOOST_PP_SEQ_SPLIT_66\n# define BOOST_PP_SEQ_SPLIT_68(x) (x) BOOST_PP_SEQ_SPLIT_67\n# define BOOST_PP_SEQ_SPLIT_69(x) (x) BOOST_PP_SEQ_SPLIT_68\n# define BOOST_PP_SEQ_SPLIT_70(x) (x) BOOST_PP_SEQ_SPLIT_69\n# define BOOST_PP_SEQ_SPLIT_71(x) (x) BOOST_PP_SEQ_SPLIT_70\n# define BOOST_PP_SEQ_SPLIT_72(x) (x) BOOST_PP_SEQ_SPLIT_71\n# define BOOST_PP_SEQ_SPLIT_73(x) (x) BOOST_PP_SEQ_SPLIT_72\n# define BOOST_PP_SEQ_SPLIT_74(x) (x) BOOST_PP_SEQ_SPLIT_73\n# define BOOST_PP_SEQ_SPLIT_75(x) (x) BOOST_PP_SEQ_SPLIT_74\n# define BOOST_PP_SEQ_SPLIT_76(x) (x) BOOST_PP_SEQ_SPLIT_75\n# define BOOST_PP_SEQ_SPLIT_77(x) (x) BOOST_PP_SEQ_SPLIT_76\n# define BOOST_PP_SEQ_SPLIT_78(x) (x) BOOST_PP_SEQ_SPLIT_77\n# define BOOST_PP_SEQ_SPLIT_79(x) (x) BOOST_PP_SEQ_SPLIT_78\n# define BOOST_PP_SEQ_SPLIT_80(x) (x) BOOST_PP_SEQ_SPLIT_79\n# define BOOST_PP_SEQ_SPLIT_81(x) (x) BOOST_PP_SEQ_SPLIT_80\n# define BOOST_PP_SEQ_SPLIT_82(x) (x) BOOST_PP_SEQ_SPLIT_81\n# define BOOST_PP_SEQ_SPLIT_83(x) (x) BOOST_PP_SEQ_SPLIT_82\n# define BOOST_PP_SEQ_SPLIT_84(x) (x) BOOST_PP_SEQ_SPLIT_83\n# define BOOST_PP_SEQ_SPLIT_85(x) (x) BOOST_PP_SEQ_SPLIT_84\n# define BOOST_PP_SEQ_SPLIT_86(x) (x) BOOST_PP_SEQ_SPLIT_85\n# define BOOST_PP_SEQ_SPLIT_87(x) (x) BOOST_PP_SEQ_SPLIT_86\n# define BOOST_PP_SEQ_SPLIT_88(x) (x) BOOST_PP_SEQ_SPLIT_87\n# define BOOST_PP_SEQ_SPLIT_89(x) (x) BOOST_PP_SEQ_SPLIT_88\n# define BOOST_PP_SEQ_SPLIT_90(x) (x) BOOST_PP_SEQ_SPLIT_89\n# define BOOST_PP_SEQ_SPLIT_91(x) (x) BOOST_PP_SEQ_SPLIT_90\n# define BOOST_PP_SEQ_SPLIT_92(x) (x) BOOST_PP_SEQ_SPLIT_91\n# define BOOST_PP_SEQ_SPLIT_93(x) (x) BOOST_PP_SEQ_SPLIT_92\n# define BOOST_PP_SEQ_SPLIT_94(x) (x) BOOST_PP_SEQ_SPLIT_93\n# define BOOST_PP_SEQ_SPLIT_95(x) (x) BOOST_PP_SEQ_SPLIT_94\n# define BOOST_PP_SEQ_SPLIT_96(x) (x) BOOST_PP_SEQ_SPLIT_95\n# define BOOST_PP_SEQ_SPLIT_97(x) (x) BOOST_PP_SEQ_SPLIT_96\n# define BOOST_PP_SEQ_SPLIT_98(x) (x) BOOST_PP_SEQ_SPLIT_97\n# define BOOST_PP_SEQ_SPLIT_99(x) (x) BOOST_PP_SEQ_SPLIT_98\n# define BOOST_PP_SEQ_SPLIT_100(x) (x) BOOST_PP_SEQ_SPLIT_99\n# define BOOST_PP_SEQ_SPLIT_101(x) (x) BOOST_PP_SEQ_SPLIT_100\n# define BOOST_PP_SEQ_SPLIT_102(x) (x) BOOST_PP_SEQ_SPLIT_101\n# define BOOST_PP_SEQ_SPLIT_103(x) (x) BOOST_PP_SEQ_SPLIT_102\n# define BOOST_PP_SEQ_SPLIT_104(x) (x) BOOST_PP_SEQ_SPLIT_103\n# define BOOST_PP_SEQ_SPLIT_105(x) (x) BOOST_PP_SEQ_SPLIT_104\n# define BOOST_PP_SEQ_SPLIT_106(x) (x) BOOST_PP_SEQ_SPLIT_105\n# define BOOST_PP_SEQ_SPLIT_107(x) (x) BOOST_PP_SEQ_SPLIT_106\n# define BOOST_PP_SEQ_SPLIT_108(x) (x) BOOST_PP_SEQ_SPLIT_107\n# define BOOST_PP_SEQ_SPLIT_109(x) (x) BOOST_PP_SEQ_SPLIT_108\n# define BOOST_PP_SEQ_SPLIT_110(x) (x) BOOST_PP_SEQ_SPLIT_109\n# define BOOST_PP_SEQ_SPLIT_111(x) (x) BOOST_PP_SEQ_SPLIT_110\n# define BOOST_PP_SEQ_SPLIT_112(x) (x) BOOST_PP_SEQ_SPLIT_111\n# define BOOST_PP_SEQ_SPLIT_113(x) (x) BOOST_PP_SEQ_SPLIT_112\n# define BOOST_PP_SEQ_SPLIT_114(x) (x) BOOST_PP_SEQ_SPLIT_113\n# define BOOST_PP_SEQ_SPLIT_115(x) (x) BOOST_PP_SEQ_SPLIT_114\n# define BOOST_PP_SEQ_SPLIT_116(x) (x) BOOST_PP_SEQ_SPLIT_115\n# define BOOST_PP_SEQ_SPLIT_117(x) (x) BOOST_PP_SEQ_SPLIT_116\n# define BOOST_PP_SEQ_SPLIT_118(x) (x) BOOST_PP_SEQ_SPLIT_117\n# define BOOST_PP_SEQ_SPLIT_119(x) (x) BOOST_PP_SEQ_SPLIT_118\n# define BOOST_PP_SEQ_SPLIT_120(x) (x) BOOST_PP_SEQ_SPLIT_119\n# define BOOST_PP_SEQ_SPLIT_121(x) (x) BOOST_PP_SEQ_SPLIT_120\n# define BOOST_PP_SEQ_SPLIT_122(x) (x) BOOST_PP_SEQ_SPLIT_121\n# define BOOST_PP_SEQ_SPLIT_123(x) (x) BOOST_PP_SEQ_SPLIT_122\n# define BOOST_PP_SEQ_SPLIT_124(x) (x) BOOST_PP_SEQ_SPLIT_123\n# define BOOST_PP_SEQ_SPLIT_125(x) (x) BOOST_PP_SEQ_SPLIT_124\n# define BOOST_PP_SEQ_SPLIT_126(x) (x) BOOST_PP_SEQ_SPLIT_125\n# define BOOST_PP_SEQ_SPLIT_127(x) (x) BOOST_PP_SEQ_SPLIT_126\n# define BOOST_PP_SEQ_SPLIT_128(x) (x) BOOST_PP_SEQ_SPLIT_127\n# define BOOST_PP_SEQ_SPLIT_129(x) (x) BOOST_PP_SEQ_SPLIT_128\n# define BOOST_PP_SEQ_SPLIT_130(x) (x) BOOST_PP_SEQ_SPLIT_129\n# define BOOST_PP_SEQ_SPLIT_131(x) (x) BOOST_PP_SEQ_SPLIT_130\n# define BOOST_PP_SEQ_SPLIT_132(x) (x) BOOST_PP_SEQ_SPLIT_131\n# define BOOST_PP_SEQ_SPLIT_133(x) (x) BOOST_PP_SEQ_SPLIT_132\n# define BOOST_PP_SEQ_SPLIT_134(x) (x) BOOST_PP_SEQ_SPLIT_133\n# define BOOST_PP_SEQ_SPLIT_135(x) (x) BOOST_PP_SEQ_SPLIT_134\n# define BOOST_PP_SEQ_SPLIT_136(x) (x) BOOST_PP_SEQ_SPLIT_135\n# define BOOST_PP_SEQ_SPLIT_137(x) (x) BOOST_PP_SEQ_SPLIT_136\n# define BOOST_PP_SEQ_SPLIT_138(x) (x) BOOST_PP_SEQ_SPLIT_137\n# define BOOST_PP_SEQ_SPLIT_139(x) (x) BOOST_PP_SEQ_SPLIT_138\n# define BOOST_PP_SEQ_SPLIT_140(x) (x) BOOST_PP_SEQ_SPLIT_139\n# define BOOST_PP_SEQ_SPLIT_141(x) (x) BOOST_PP_SEQ_SPLIT_140\n# define BOOST_PP_SEQ_SPLIT_142(x) (x) BOOST_PP_SEQ_SPLIT_141\n# define BOOST_PP_SEQ_SPLIT_143(x) (x) BOOST_PP_SEQ_SPLIT_142\n# define BOOST_PP_SEQ_SPLIT_144(x) (x) BOOST_PP_SEQ_SPLIT_143\n# define BOOST_PP_SEQ_SPLIT_145(x) (x) BOOST_PP_SEQ_SPLIT_144\n# define BOOST_PP_SEQ_SPLIT_146(x) (x) BOOST_PP_SEQ_SPLIT_145\n# define BOOST_PP_SEQ_SPLIT_147(x) (x) BOOST_PP_SEQ_SPLIT_146\n# define BOOST_PP_SEQ_SPLIT_148(x) (x) BOOST_PP_SEQ_SPLIT_147\n# define BOOST_PP_SEQ_SPLIT_149(x) (x) BOOST_PP_SEQ_SPLIT_148\n# define BOOST_PP_SEQ_SPLIT_150(x) (x) BOOST_PP_SEQ_SPLIT_149\n# define BOOST_PP_SEQ_SPLIT_151(x) (x) BOOST_PP_SEQ_SPLIT_150\n# define BOOST_PP_SEQ_SPLIT_152(x) (x) BOOST_PP_SEQ_SPLIT_151\n# define BOOST_PP_SEQ_SPLIT_153(x) (x) BOOST_PP_SEQ_SPLIT_152\n# define BOOST_PP_SEQ_SPLIT_154(x) (x) BOOST_PP_SEQ_SPLIT_153\n# define BOOST_PP_SEQ_SPLIT_155(x) (x) BOOST_PP_SEQ_SPLIT_154\n# define BOOST_PP_SEQ_SPLIT_156(x) (x) BOOST_PP_SEQ_SPLIT_155\n# define BOOST_PP_SEQ_SPLIT_157(x) (x) BOOST_PP_SEQ_SPLIT_156\n# define BOOST_PP_SEQ_SPLIT_158(x) (x) BOOST_PP_SEQ_SPLIT_157\n# define BOOST_PP_SEQ_SPLIT_159(x) (x) BOOST_PP_SEQ_SPLIT_158\n# define BOOST_PP_SEQ_SPLIT_160(x) (x) BOOST_PP_SEQ_SPLIT_159\n# define BOOST_PP_SEQ_SPLIT_161(x) (x) BOOST_PP_SEQ_SPLIT_160\n# define BOOST_PP_SEQ_SPLIT_162(x) (x) BOOST_PP_SEQ_SPLIT_161\n# define BOOST_PP_SEQ_SPLIT_163(x) (x) BOOST_PP_SEQ_SPLIT_162\n# define BOOST_PP_SEQ_SPLIT_164(x) (x) BOOST_PP_SEQ_SPLIT_163\n# define BOOST_PP_SEQ_SPLIT_165(x) (x) BOOST_PP_SEQ_SPLIT_164\n# define BOOST_PP_SEQ_SPLIT_166(x) (x) BOOST_PP_SEQ_SPLIT_165\n# define BOOST_PP_SEQ_SPLIT_167(x) (x) BOOST_PP_SEQ_SPLIT_166\n# define BOOST_PP_SEQ_SPLIT_168(x) (x) BOOST_PP_SEQ_SPLIT_167\n# define BOOST_PP_SEQ_SPLIT_169(x) (x) BOOST_PP_SEQ_SPLIT_168\n# define BOOST_PP_SEQ_SPLIT_170(x) (x) BOOST_PP_SEQ_SPLIT_169\n# define BOOST_PP_SEQ_SPLIT_171(x) (x) BOOST_PP_SEQ_SPLIT_170\n# define BOOST_PP_SEQ_SPLIT_172(x) (x) BOOST_PP_SEQ_SPLIT_171\n# define BOOST_PP_SEQ_SPLIT_173(x) (x) BOOST_PP_SEQ_SPLIT_172\n# define BOOST_PP_SEQ_SPLIT_174(x) (x) BOOST_PP_SEQ_SPLIT_173\n# define BOOST_PP_SEQ_SPLIT_175(x) (x) BOOST_PP_SEQ_SPLIT_174\n# define BOOST_PP_SEQ_SPLIT_176(x) (x) BOOST_PP_SEQ_SPLIT_175\n# define BOOST_PP_SEQ_SPLIT_177(x) (x) BOOST_PP_SEQ_SPLIT_176\n# define BOOST_PP_SEQ_SPLIT_178(x) (x) BOOST_PP_SEQ_SPLIT_177\n# define BOOST_PP_SEQ_SPLIT_179(x) (x) BOOST_PP_SEQ_SPLIT_178\n# define BOOST_PP_SEQ_SPLIT_180(x) (x) BOOST_PP_SEQ_SPLIT_179\n# define BOOST_PP_SEQ_SPLIT_181(x) (x) BOOST_PP_SEQ_SPLIT_180\n# define BOOST_PP_SEQ_SPLIT_182(x) (x) BOOST_PP_SEQ_SPLIT_181\n# define BOOST_PP_SEQ_SPLIT_183(x) (x) BOOST_PP_SEQ_SPLIT_182\n# define BOOST_PP_SEQ_SPLIT_184(x) (x) BOOST_PP_SEQ_SPLIT_183\n# define BOOST_PP_SEQ_SPLIT_185(x) (x) BOOST_PP_SEQ_SPLIT_184\n# define BOOST_PP_SEQ_SPLIT_186(x) (x) BOOST_PP_SEQ_SPLIT_185\n# define BOOST_PP_SEQ_SPLIT_187(x) (x) BOOST_PP_SEQ_SPLIT_186\n# define BOOST_PP_SEQ_SPLIT_188(x) (x) BOOST_PP_SEQ_SPLIT_187\n# define BOOST_PP_SEQ_SPLIT_189(x) (x) BOOST_PP_SEQ_SPLIT_188\n# define BOOST_PP_SEQ_SPLIT_190(x) (x) BOOST_PP_SEQ_SPLIT_189\n# define BOOST_PP_SEQ_SPLIT_191(x) (x) BOOST_PP_SEQ_SPLIT_190\n# define BOOST_PP_SEQ_SPLIT_192(x) (x) BOOST_PP_SEQ_SPLIT_191\n# define BOOST_PP_SEQ_SPLIT_193(x) (x) BOOST_PP_SEQ_SPLIT_192\n# define BOOST_PP_SEQ_SPLIT_194(x) (x) BOOST_PP_SEQ_SPLIT_193\n# define BOOST_PP_SEQ_SPLIT_195(x) (x) BOOST_PP_SEQ_SPLIT_194\n# define BOOST_PP_SEQ_SPLIT_196(x) (x) BOOST_PP_SEQ_SPLIT_195\n# define BOOST_PP_SEQ_SPLIT_197(x) (x) BOOST_PP_SEQ_SPLIT_196\n# define BOOST_PP_SEQ_SPLIT_198(x) (x) BOOST_PP_SEQ_SPLIT_197\n# define BOOST_PP_SEQ_SPLIT_199(x) (x) BOOST_PP_SEQ_SPLIT_198\n# define BOOST_PP_SEQ_SPLIT_200(x) (x) BOOST_PP_SEQ_SPLIT_199\n# define BOOST_PP_SEQ_SPLIT_201(x) (x) BOOST_PP_SEQ_SPLIT_200\n# define BOOST_PP_SEQ_SPLIT_202(x) (x) BOOST_PP_SEQ_SPLIT_201\n# define BOOST_PP_SEQ_SPLIT_203(x) (x) BOOST_PP_SEQ_SPLIT_202\n# define BOOST_PP_SEQ_SPLIT_204(x) (x) BOOST_PP_SEQ_SPLIT_203\n# define BOOST_PP_SEQ_SPLIT_205(x) (x) BOOST_PP_SEQ_SPLIT_204\n# define BOOST_PP_SEQ_SPLIT_206(x) (x) BOOST_PP_SEQ_SPLIT_205\n# define BOOST_PP_SEQ_SPLIT_207(x) (x) BOOST_PP_SEQ_SPLIT_206\n# define BOOST_PP_SEQ_SPLIT_208(x) (x) BOOST_PP_SEQ_SPLIT_207\n# define BOOST_PP_SEQ_SPLIT_209(x) (x) BOOST_PP_SEQ_SPLIT_208\n# define BOOST_PP_SEQ_SPLIT_210(x) (x) BOOST_PP_SEQ_SPLIT_209\n# define BOOST_PP_SEQ_SPLIT_211(x) (x) BOOST_PP_SEQ_SPLIT_210\n# define BOOST_PP_SEQ_SPLIT_212(x) (x) BOOST_PP_SEQ_SPLIT_211\n# define BOOST_PP_SEQ_SPLIT_213(x) (x) BOOST_PP_SEQ_SPLIT_212\n# define BOOST_PP_SEQ_SPLIT_214(x) (x) BOOST_PP_SEQ_SPLIT_213\n# define BOOST_PP_SEQ_SPLIT_215(x) (x) BOOST_PP_SEQ_SPLIT_214\n# define BOOST_PP_SEQ_SPLIT_216(x) (x) BOOST_PP_SEQ_SPLIT_215\n# define BOOST_PP_SEQ_SPLIT_217(x) (x) BOOST_PP_SEQ_SPLIT_216\n# define BOOST_PP_SEQ_SPLIT_218(x) (x) BOOST_PP_SEQ_SPLIT_217\n# define BOOST_PP_SEQ_SPLIT_219(x) (x) BOOST_PP_SEQ_SPLIT_218\n# define BOOST_PP_SEQ_SPLIT_220(x) (x) BOOST_PP_SEQ_SPLIT_219\n# define BOOST_PP_SEQ_SPLIT_221(x) (x) BOOST_PP_SEQ_SPLIT_220\n# define BOOST_PP_SEQ_SPLIT_222(x) (x) BOOST_PP_SEQ_SPLIT_221\n# define BOOST_PP_SEQ_SPLIT_223(x) (x) BOOST_PP_SEQ_SPLIT_222\n# define BOOST_PP_SEQ_SPLIT_224(x) (x) BOOST_PP_SEQ_SPLIT_223\n# define BOOST_PP_SEQ_SPLIT_225(x) (x) BOOST_PP_SEQ_SPLIT_224\n# define BOOST_PP_SEQ_SPLIT_226(x) (x) BOOST_PP_SEQ_SPLIT_225\n# define BOOST_PP_SEQ_SPLIT_227(x) (x) BOOST_PP_SEQ_SPLIT_226\n# define BOOST_PP_SEQ_SPLIT_228(x) (x) BOOST_PP_SEQ_SPLIT_227\n# define BOOST_PP_SEQ_SPLIT_229(x) (x) BOOST_PP_SEQ_SPLIT_228\n# define BOOST_PP_SEQ_SPLIT_230(x) (x) BOOST_PP_SEQ_SPLIT_229\n# define BOOST_PP_SEQ_SPLIT_231(x) (x) BOOST_PP_SEQ_SPLIT_230\n# define BOOST_PP_SEQ_SPLIT_232(x) (x) BOOST_PP_SEQ_SPLIT_231\n# define BOOST_PP_SEQ_SPLIT_233(x) (x) BOOST_PP_SEQ_SPLIT_232\n# define BOOST_PP_SEQ_SPLIT_234(x) (x) BOOST_PP_SEQ_SPLIT_233\n# define BOOST_PP_SEQ_SPLIT_235(x) (x) BOOST_PP_SEQ_SPLIT_234\n# define BOOST_PP_SEQ_SPLIT_236(x) (x) BOOST_PP_SEQ_SPLIT_235\n# define BOOST_PP_SEQ_SPLIT_237(x) (x) BOOST_PP_SEQ_SPLIT_236\n# define BOOST_PP_SEQ_SPLIT_238(x) (x) BOOST_PP_SEQ_SPLIT_237\n# define BOOST_PP_SEQ_SPLIT_239(x) (x) BOOST_PP_SEQ_SPLIT_238\n# define BOOST_PP_SEQ_SPLIT_240(x) (x) BOOST_PP_SEQ_SPLIT_239\n# define BOOST_PP_SEQ_SPLIT_241(x) (x) BOOST_PP_SEQ_SPLIT_240\n# define BOOST_PP_SEQ_SPLIT_242(x) (x) BOOST_PP_SEQ_SPLIT_241\n# define BOOST_PP_SEQ_SPLIT_243(x) (x) BOOST_PP_SEQ_SPLIT_242\n# define BOOST_PP_SEQ_SPLIT_244(x) (x) BOOST_PP_SEQ_SPLIT_243\n# define BOOST_PP_SEQ_SPLIT_245(x) (x) BOOST_PP_SEQ_SPLIT_244\n# define BOOST_PP_SEQ_SPLIT_246(x) (x) BOOST_PP_SEQ_SPLIT_245\n# define BOOST_PP_SEQ_SPLIT_247(x) (x) BOOST_PP_SEQ_SPLIT_246\n# define BOOST_PP_SEQ_SPLIT_248(x) (x) BOOST_PP_SEQ_SPLIT_247\n# define BOOST_PP_SEQ_SPLIT_249(x) (x) BOOST_PP_SEQ_SPLIT_248\n# define BOOST_PP_SEQ_SPLIT_250(x) (x) BOOST_PP_SEQ_SPLIT_249\n# define BOOST_PP_SEQ_SPLIT_251(x) (x) BOOST_PP_SEQ_SPLIT_250\n# define BOOST_PP_SEQ_SPLIT_252(x) (x) BOOST_PP_SEQ_SPLIT_251\n# define BOOST_PP_SEQ_SPLIT_253(x) (x) BOOST_PP_SEQ_SPLIT_252\n# define BOOST_PP_SEQ_SPLIT_254(x) (x) BOOST_PP_SEQ_SPLIT_253\n# define BOOST_PP_SEQ_SPLIT_255(x) (x) BOOST_PP_SEQ_SPLIT_254\n# define BOOST_PP_SEQ_SPLIT_256(x) (x) BOOST_PP_SEQ_SPLIT_255\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/detail/to_list_msvc.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2016.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_DETAIL_TO_LIST_MSVC_HPP\n# define BOOST_PREPROCESSOR_SEQ_DETAIL_TO_LIST_MSVC_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/control/while.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# define BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_STATE_RESULT(state) \\\n    BOOST_PP_TUPLE_ELEM(2, 0, state) \\\n/**/\n# define BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_STATE_SIZE(state) \\\n    BOOST_PP_TUPLE_ELEM(2, 1, state) \\\n/**/\n# define BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_PRED(d,state) \\\n    BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_STATE_SIZE(state) \\\n/**/\n# define BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_OP(d,state) \\\n    ( \\\n    BOOST_PP_CAT(BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_STATE_RESULT(state),), \\\n    BOOST_PP_DEC(BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_STATE_SIZE(state)) \\\n    ) \\\n/**/\n#\n# /* BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC */\n#\n# define BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC(result,seqsize) \\\n    BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_STATE_RESULT \\\n        ( \\\n        BOOST_PP_WHILE \\\n            ( \\\n            BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_PRED, \\\n            BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC_OP, \\\n            (result,seqsize) \\\n            ) \\\n        ) \\\n/**/\n# endif // BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#\n# endif // BOOST_PREPROCESSOR_SEQ_DETAIL_TO_LIST_MSVC_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/elem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_ELEM_HPP\n# define BOOST_PREPROCESSOR_SEQ_ELEM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n#\n# /* BOOST_PP_SEQ_ELEM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_ELEM(i, seq) BOOST_PP_SEQ_ELEM_I(i, seq)\n# else\n#    define BOOST_PP_SEQ_ELEM(i, seq) BOOST_PP_SEQ_ELEM_I((i, seq))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II((BOOST_PP_SEQ_ELEM_ ## i seq))\n#    define BOOST_PP_SEQ_ELEM_II(res) BOOST_PP_SEQ_ELEM_IV(BOOST_PP_SEQ_ELEM_III res)\n#    define BOOST_PP_SEQ_ELEM_III(x, _) x BOOST_PP_EMPTY()\n#    define BOOST_PP_SEQ_ELEM_IV(x) x\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_ELEM_I(par) BOOST_PP_SEQ_ELEM_II ## par\n#    define BOOST_PP_SEQ_ELEM_II(i, seq) BOOST_PP_SEQ_ELEM_III(BOOST_PP_SEQ_ELEM_ ## i ## seq)\n#    define BOOST_PP_SEQ_ELEM_III(im) BOOST_PP_SEQ_ELEM_IV(im)\n#    define BOOST_PP_SEQ_ELEM_IV(x, _) x\n# else\n#    if defined(__IBMC__) || defined(__IBMCPP__)\n#        define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II(BOOST_PP_CAT(BOOST_PP_SEQ_ELEM_ ## i, seq))\n#    else\n#        define BOOST_PP_SEQ_ELEM_I(i, seq) BOOST_PP_SEQ_ELEM_II(BOOST_PP_SEQ_ELEM_ ## i seq)\n#    endif\n#    define BOOST_PP_SEQ_ELEM_II(im) BOOST_PP_SEQ_ELEM_III(im)\n#    define BOOST_PP_SEQ_ELEM_III(x, _) x\n# endif\n#\n# define BOOST_PP_SEQ_ELEM_0(x) x, BOOST_PP_NIL\n# define BOOST_PP_SEQ_ELEM_1(_) BOOST_PP_SEQ_ELEM_0\n# define BOOST_PP_SEQ_ELEM_2(_) BOOST_PP_SEQ_ELEM_1\n# define BOOST_PP_SEQ_ELEM_3(_) BOOST_PP_SEQ_ELEM_2\n# define BOOST_PP_SEQ_ELEM_4(_) BOOST_PP_SEQ_ELEM_3\n# define BOOST_PP_SEQ_ELEM_5(_) BOOST_PP_SEQ_ELEM_4\n# define BOOST_PP_SEQ_ELEM_6(_) BOOST_PP_SEQ_ELEM_5\n# define BOOST_PP_SEQ_ELEM_7(_) BOOST_PP_SEQ_ELEM_6\n# define BOOST_PP_SEQ_ELEM_8(_) BOOST_PP_SEQ_ELEM_7\n# define BOOST_PP_SEQ_ELEM_9(_) BOOST_PP_SEQ_ELEM_8\n# define BOOST_PP_SEQ_ELEM_10(_) BOOST_PP_SEQ_ELEM_9\n# define BOOST_PP_SEQ_ELEM_11(_) BOOST_PP_SEQ_ELEM_10\n# define BOOST_PP_SEQ_ELEM_12(_) BOOST_PP_SEQ_ELEM_11\n# define BOOST_PP_SEQ_ELEM_13(_) BOOST_PP_SEQ_ELEM_12\n# define BOOST_PP_SEQ_ELEM_14(_) BOOST_PP_SEQ_ELEM_13\n# define BOOST_PP_SEQ_ELEM_15(_) BOOST_PP_SEQ_ELEM_14\n# define BOOST_PP_SEQ_ELEM_16(_) BOOST_PP_SEQ_ELEM_15\n# define BOOST_PP_SEQ_ELEM_17(_) BOOST_PP_SEQ_ELEM_16\n# define BOOST_PP_SEQ_ELEM_18(_) BOOST_PP_SEQ_ELEM_17\n# define BOOST_PP_SEQ_ELEM_19(_) BOOST_PP_SEQ_ELEM_18\n# define BOOST_PP_SEQ_ELEM_20(_) BOOST_PP_SEQ_ELEM_19\n# define BOOST_PP_SEQ_ELEM_21(_) BOOST_PP_SEQ_ELEM_20\n# define BOOST_PP_SEQ_ELEM_22(_) BOOST_PP_SEQ_ELEM_21\n# define BOOST_PP_SEQ_ELEM_23(_) BOOST_PP_SEQ_ELEM_22\n# define BOOST_PP_SEQ_ELEM_24(_) BOOST_PP_SEQ_ELEM_23\n# define BOOST_PP_SEQ_ELEM_25(_) BOOST_PP_SEQ_ELEM_24\n# define BOOST_PP_SEQ_ELEM_26(_) BOOST_PP_SEQ_ELEM_25\n# define BOOST_PP_SEQ_ELEM_27(_) BOOST_PP_SEQ_ELEM_26\n# define BOOST_PP_SEQ_ELEM_28(_) BOOST_PP_SEQ_ELEM_27\n# define BOOST_PP_SEQ_ELEM_29(_) BOOST_PP_SEQ_ELEM_28\n# define BOOST_PP_SEQ_ELEM_30(_) BOOST_PP_SEQ_ELEM_29\n# define BOOST_PP_SEQ_ELEM_31(_) BOOST_PP_SEQ_ELEM_30\n# define BOOST_PP_SEQ_ELEM_32(_) BOOST_PP_SEQ_ELEM_31\n# define BOOST_PP_SEQ_ELEM_33(_) BOOST_PP_SEQ_ELEM_32\n# define BOOST_PP_SEQ_ELEM_34(_) BOOST_PP_SEQ_ELEM_33\n# define BOOST_PP_SEQ_ELEM_35(_) BOOST_PP_SEQ_ELEM_34\n# define BOOST_PP_SEQ_ELEM_36(_) BOOST_PP_SEQ_ELEM_35\n# define BOOST_PP_SEQ_ELEM_37(_) BOOST_PP_SEQ_ELEM_36\n# define BOOST_PP_SEQ_ELEM_38(_) BOOST_PP_SEQ_ELEM_37\n# define BOOST_PP_SEQ_ELEM_39(_) BOOST_PP_SEQ_ELEM_38\n# define BOOST_PP_SEQ_ELEM_40(_) BOOST_PP_SEQ_ELEM_39\n# define BOOST_PP_SEQ_ELEM_41(_) BOOST_PP_SEQ_ELEM_40\n# define BOOST_PP_SEQ_ELEM_42(_) BOOST_PP_SEQ_ELEM_41\n# define BOOST_PP_SEQ_ELEM_43(_) BOOST_PP_SEQ_ELEM_42\n# define BOOST_PP_SEQ_ELEM_44(_) BOOST_PP_SEQ_ELEM_43\n# define BOOST_PP_SEQ_ELEM_45(_) BOOST_PP_SEQ_ELEM_44\n# define BOOST_PP_SEQ_ELEM_46(_) BOOST_PP_SEQ_ELEM_45\n# define BOOST_PP_SEQ_ELEM_47(_) BOOST_PP_SEQ_ELEM_46\n# define BOOST_PP_SEQ_ELEM_48(_) BOOST_PP_SEQ_ELEM_47\n# define BOOST_PP_SEQ_ELEM_49(_) BOOST_PP_SEQ_ELEM_48\n# define BOOST_PP_SEQ_ELEM_50(_) BOOST_PP_SEQ_ELEM_49\n# define BOOST_PP_SEQ_ELEM_51(_) BOOST_PP_SEQ_ELEM_50\n# define BOOST_PP_SEQ_ELEM_52(_) BOOST_PP_SEQ_ELEM_51\n# define BOOST_PP_SEQ_ELEM_53(_) BOOST_PP_SEQ_ELEM_52\n# define BOOST_PP_SEQ_ELEM_54(_) BOOST_PP_SEQ_ELEM_53\n# define BOOST_PP_SEQ_ELEM_55(_) BOOST_PP_SEQ_ELEM_54\n# define BOOST_PP_SEQ_ELEM_56(_) BOOST_PP_SEQ_ELEM_55\n# define BOOST_PP_SEQ_ELEM_57(_) BOOST_PP_SEQ_ELEM_56\n# define BOOST_PP_SEQ_ELEM_58(_) BOOST_PP_SEQ_ELEM_57\n# define BOOST_PP_SEQ_ELEM_59(_) BOOST_PP_SEQ_ELEM_58\n# define BOOST_PP_SEQ_ELEM_60(_) BOOST_PP_SEQ_ELEM_59\n# define BOOST_PP_SEQ_ELEM_61(_) BOOST_PP_SEQ_ELEM_60\n# define BOOST_PP_SEQ_ELEM_62(_) BOOST_PP_SEQ_ELEM_61\n# define BOOST_PP_SEQ_ELEM_63(_) BOOST_PP_SEQ_ELEM_62\n# define BOOST_PP_SEQ_ELEM_64(_) BOOST_PP_SEQ_ELEM_63\n# define BOOST_PP_SEQ_ELEM_65(_) BOOST_PP_SEQ_ELEM_64\n# define BOOST_PP_SEQ_ELEM_66(_) BOOST_PP_SEQ_ELEM_65\n# define BOOST_PP_SEQ_ELEM_67(_) BOOST_PP_SEQ_ELEM_66\n# define BOOST_PP_SEQ_ELEM_68(_) BOOST_PP_SEQ_ELEM_67\n# define BOOST_PP_SEQ_ELEM_69(_) BOOST_PP_SEQ_ELEM_68\n# define BOOST_PP_SEQ_ELEM_70(_) BOOST_PP_SEQ_ELEM_69\n# define BOOST_PP_SEQ_ELEM_71(_) BOOST_PP_SEQ_ELEM_70\n# define BOOST_PP_SEQ_ELEM_72(_) BOOST_PP_SEQ_ELEM_71\n# define BOOST_PP_SEQ_ELEM_73(_) BOOST_PP_SEQ_ELEM_72\n# define BOOST_PP_SEQ_ELEM_74(_) BOOST_PP_SEQ_ELEM_73\n# define BOOST_PP_SEQ_ELEM_75(_) BOOST_PP_SEQ_ELEM_74\n# define BOOST_PP_SEQ_ELEM_76(_) BOOST_PP_SEQ_ELEM_75\n# define BOOST_PP_SEQ_ELEM_77(_) BOOST_PP_SEQ_ELEM_76\n# define BOOST_PP_SEQ_ELEM_78(_) BOOST_PP_SEQ_ELEM_77\n# define BOOST_PP_SEQ_ELEM_79(_) BOOST_PP_SEQ_ELEM_78\n# define BOOST_PP_SEQ_ELEM_80(_) BOOST_PP_SEQ_ELEM_79\n# define BOOST_PP_SEQ_ELEM_81(_) BOOST_PP_SEQ_ELEM_80\n# define BOOST_PP_SEQ_ELEM_82(_) BOOST_PP_SEQ_ELEM_81\n# define BOOST_PP_SEQ_ELEM_83(_) BOOST_PP_SEQ_ELEM_82\n# define BOOST_PP_SEQ_ELEM_84(_) BOOST_PP_SEQ_ELEM_83\n# define BOOST_PP_SEQ_ELEM_85(_) BOOST_PP_SEQ_ELEM_84\n# define BOOST_PP_SEQ_ELEM_86(_) BOOST_PP_SEQ_ELEM_85\n# define BOOST_PP_SEQ_ELEM_87(_) BOOST_PP_SEQ_ELEM_86\n# define BOOST_PP_SEQ_ELEM_88(_) BOOST_PP_SEQ_ELEM_87\n# define BOOST_PP_SEQ_ELEM_89(_) BOOST_PP_SEQ_ELEM_88\n# define BOOST_PP_SEQ_ELEM_90(_) BOOST_PP_SEQ_ELEM_89\n# define BOOST_PP_SEQ_ELEM_91(_) BOOST_PP_SEQ_ELEM_90\n# define BOOST_PP_SEQ_ELEM_92(_) BOOST_PP_SEQ_ELEM_91\n# define BOOST_PP_SEQ_ELEM_93(_) BOOST_PP_SEQ_ELEM_92\n# define BOOST_PP_SEQ_ELEM_94(_) BOOST_PP_SEQ_ELEM_93\n# define BOOST_PP_SEQ_ELEM_95(_) BOOST_PP_SEQ_ELEM_94\n# define BOOST_PP_SEQ_ELEM_96(_) BOOST_PP_SEQ_ELEM_95\n# define BOOST_PP_SEQ_ELEM_97(_) BOOST_PP_SEQ_ELEM_96\n# define BOOST_PP_SEQ_ELEM_98(_) BOOST_PP_SEQ_ELEM_97\n# define BOOST_PP_SEQ_ELEM_99(_) BOOST_PP_SEQ_ELEM_98\n# define BOOST_PP_SEQ_ELEM_100(_) BOOST_PP_SEQ_ELEM_99\n# define BOOST_PP_SEQ_ELEM_101(_) BOOST_PP_SEQ_ELEM_100\n# define BOOST_PP_SEQ_ELEM_102(_) BOOST_PP_SEQ_ELEM_101\n# define BOOST_PP_SEQ_ELEM_103(_) BOOST_PP_SEQ_ELEM_102\n# define BOOST_PP_SEQ_ELEM_104(_) BOOST_PP_SEQ_ELEM_103\n# define BOOST_PP_SEQ_ELEM_105(_) BOOST_PP_SEQ_ELEM_104\n# define BOOST_PP_SEQ_ELEM_106(_) BOOST_PP_SEQ_ELEM_105\n# define BOOST_PP_SEQ_ELEM_107(_) BOOST_PP_SEQ_ELEM_106\n# define BOOST_PP_SEQ_ELEM_108(_) BOOST_PP_SEQ_ELEM_107\n# define BOOST_PP_SEQ_ELEM_109(_) BOOST_PP_SEQ_ELEM_108\n# define BOOST_PP_SEQ_ELEM_110(_) BOOST_PP_SEQ_ELEM_109\n# define BOOST_PP_SEQ_ELEM_111(_) BOOST_PP_SEQ_ELEM_110\n# define BOOST_PP_SEQ_ELEM_112(_) BOOST_PP_SEQ_ELEM_111\n# define BOOST_PP_SEQ_ELEM_113(_) BOOST_PP_SEQ_ELEM_112\n# define BOOST_PP_SEQ_ELEM_114(_) BOOST_PP_SEQ_ELEM_113\n# define BOOST_PP_SEQ_ELEM_115(_) BOOST_PP_SEQ_ELEM_114\n# define BOOST_PP_SEQ_ELEM_116(_) BOOST_PP_SEQ_ELEM_115\n# define BOOST_PP_SEQ_ELEM_117(_) BOOST_PP_SEQ_ELEM_116\n# define BOOST_PP_SEQ_ELEM_118(_) BOOST_PP_SEQ_ELEM_117\n# define BOOST_PP_SEQ_ELEM_119(_) BOOST_PP_SEQ_ELEM_118\n# define BOOST_PP_SEQ_ELEM_120(_) BOOST_PP_SEQ_ELEM_119\n# define BOOST_PP_SEQ_ELEM_121(_) BOOST_PP_SEQ_ELEM_120\n# define BOOST_PP_SEQ_ELEM_122(_) BOOST_PP_SEQ_ELEM_121\n# define BOOST_PP_SEQ_ELEM_123(_) BOOST_PP_SEQ_ELEM_122\n# define BOOST_PP_SEQ_ELEM_124(_) BOOST_PP_SEQ_ELEM_123\n# define BOOST_PP_SEQ_ELEM_125(_) BOOST_PP_SEQ_ELEM_124\n# define BOOST_PP_SEQ_ELEM_126(_) BOOST_PP_SEQ_ELEM_125\n# define BOOST_PP_SEQ_ELEM_127(_) BOOST_PP_SEQ_ELEM_126\n# define BOOST_PP_SEQ_ELEM_128(_) BOOST_PP_SEQ_ELEM_127\n# define BOOST_PP_SEQ_ELEM_129(_) BOOST_PP_SEQ_ELEM_128\n# define BOOST_PP_SEQ_ELEM_130(_) BOOST_PP_SEQ_ELEM_129\n# define BOOST_PP_SEQ_ELEM_131(_) BOOST_PP_SEQ_ELEM_130\n# define BOOST_PP_SEQ_ELEM_132(_) BOOST_PP_SEQ_ELEM_131\n# define BOOST_PP_SEQ_ELEM_133(_) BOOST_PP_SEQ_ELEM_132\n# define BOOST_PP_SEQ_ELEM_134(_) BOOST_PP_SEQ_ELEM_133\n# define BOOST_PP_SEQ_ELEM_135(_) BOOST_PP_SEQ_ELEM_134\n# define BOOST_PP_SEQ_ELEM_136(_) BOOST_PP_SEQ_ELEM_135\n# define BOOST_PP_SEQ_ELEM_137(_) BOOST_PP_SEQ_ELEM_136\n# define BOOST_PP_SEQ_ELEM_138(_) BOOST_PP_SEQ_ELEM_137\n# define BOOST_PP_SEQ_ELEM_139(_) BOOST_PP_SEQ_ELEM_138\n# define BOOST_PP_SEQ_ELEM_140(_) BOOST_PP_SEQ_ELEM_139\n# define BOOST_PP_SEQ_ELEM_141(_) BOOST_PP_SEQ_ELEM_140\n# define BOOST_PP_SEQ_ELEM_142(_) BOOST_PP_SEQ_ELEM_141\n# define BOOST_PP_SEQ_ELEM_143(_) BOOST_PP_SEQ_ELEM_142\n# define BOOST_PP_SEQ_ELEM_144(_) BOOST_PP_SEQ_ELEM_143\n# define BOOST_PP_SEQ_ELEM_145(_) BOOST_PP_SEQ_ELEM_144\n# define BOOST_PP_SEQ_ELEM_146(_) BOOST_PP_SEQ_ELEM_145\n# define BOOST_PP_SEQ_ELEM_147(_) BOOST_PP_SEQ_ELEM_146\n# define BOOST_PP_SEQ_ELEM_148(_) BOOST_PP_SEQ_ELEM_147\n# define BOOST_PP_SEQ_ELEM_149(_) BOOST_PP_SEQ_ELEM_148\n# define BOOST_PP_SEQ_ELEM_150(_) BOOST_PP_SEQ_ELEM_149\n# define BOOST_PP_SEQ_ELEM_151(_) BOOST_PP_SEQ_ELEM_150\n# define BOOST_PP_SEQ_ELEM_152(_) BOOST_PP_SEQ_ELEM_151\n# define BOOST_PP_SEQ_ELEM_153(_) BOOST_PP_SEQ_ELEM_152\n# define BOOST_PP_SEQ_ELEM_154(_) BOOST_PP_SEQ_ELEM_153\n# define BOOST_PP_SEQ_ELEM_155(_) BOOST_PP_SEQ_ELEM_154\n# define BOOST_PP_SEQ_ELEM_156(_) BOOST_PP_SEQ_ELEM_155\n# define BOOST_PP_SEQ_ELEM_157(_) BOOST_PP_SEQ_ELEM_156\n# define BOOST_PP_SEQ_ELEM_158(_) BOOST_PP_SEQ_ELEM_157\n# define BOOST_PP_SEQ_ELEM_159(_) BOOST_PP_SEQ_ELEM_158\n# define BOOST_PP_SEQ_ELEM_160(_) BOOST_PP_SEQ_ELEM_159\n# define BOOST_PP_SEQ_ELEM_161(_) BOOST_PP_SEQ_ELEM_160\n# define BOOST_PP_SEQ_ELEM_162(_) BOOST_PP_SEQ_ELEM_161\n# define BOOST_PP_SEQ_ELEM_163(_) BOOST_PP_SEQ_ELEM_162\n# define BOOST_PP_SEQ_ELEM_164(_) BOOST_PP_SEQ_ELEM_163\n# define BOOST_PP_SEQ_ELEM_165(_) BOOST_PP_SEQ_ELEM_164\n# define BOOST_PP_SEQ_ELEM_166(_) BOOST_PP_SEQ_ELEM_165\n# define BOOST_PP_SEQ_ELEM_167(_) BOOST_PP_SEQ_ELEM_166\n# define BOOST_PP_SEQ_ELEM_168(_) BOOST_PP_SEQ_ELEM_167\n# define BOOST_PP_SEQ_ELEM_169(_) BOOST_PP_SEQ_ELEM_168\n# define BOOST_PP_SEQ_ELEM_170(_) BOOST_PP_SEQ_ELEM_169\n# define BOOST_PP_SEQ_ELEM_171(_) BOOST_PP_SEQ_ELEM_170\n# define BOOST_PP_SEQ_ELEM_172(_) BOOST_PP_SEQ_ELEM_171\n# define BOOST_PP_SEQ_ELEM_173(_) BOOST_PP_SEQ_ELEM_172\n# define BOOST_PP_SEQ_ELEM_174(_) BOOST_PP_SEQ_ELEM_173\n# define BOOST_PP_SEQ_ELEM_175(_) BOOST_PP_SEQ_ELEM_174\n# define BOOST_PP_SEQ_ELEM_176(_) BOOST_PP_SEQ_ELEM_175\n# define BOOST_PP_SEQ_ELEM_177(_) BOOST_PP_SEQ_ELEM_176\n# define BOOST_PP_SEQ_ELEM_178(_) BOOST_PP_SEQ_ELEM_177\n# define BOOST_PP_SEQ_ELEM_179(_) BOOST_PP_SEQ_ELEM_178\n# define BOOST_PP_SEQ_ELEM_180(_) BOOST_PP_SEQ_ELEM_179\n# define BOOST_PP_SEQ_ELEM_181(_) BOOST_PP_SEQ_ELEM_180\n# define BOOST_PP_SEQ_ELEM_182(_) BOOST_PP_SEQ_ELEM_181\n# define BOOST_PP_SEQ_ELEM_183(_) BOOST_PP_SEQ_ELEM_182\n# define BOOST_PP_SEQ_ELEM_184(_) BOOST_PP_SEQ_ELEM_183\n# define BOOST_PP_SEQ_ELEM_185(_) BOOST_PP_SEQ_ELEM_184\n# define BOOST_PP_SEQ_ELEM_186(_) BOOST_PP_SEQ_ELEM_185\n# define BOOST_PP_SEQ_ELEM_187(_) BOOST_PP_SEQ_ELEM_186\n# define BOOST_PP_SEQ_ELEM_188(_) BOOST_PP_SEQ_ELEM_187\n# define BOOST_PP_SEQ_ELEM_189(_) BOOST_PP_SEQ_ELEM_188\n# define BOOST_PP_SEQ_ELEM_190(_) BOOST_PP_SEQ_ELEM_189\n# define BOOST_PP_SEQ_ELEM_191(_) BOOST_PP_SEQ_ELEM_190\n# define BOOST_PP_SEQ_ELEM_192(_) BOOST_PP_SEQ_ELEM_191\n# define BOOST_PP_SEQ_ELEM_193(_) BOOST_PP_SEQ_ELEM_192\n# define BOOST_PP_SEQ_ELEM_194(_) BOOST_PP_SEQ_ELEM_193\n# define BOOST_PP_SEQ_ELEM_195(_) BOOST_PP_SEQ_ELEM_194\n# define BOOST_PP_SEQ_ELEM_196(_) BOOST_PP_SEQ_ELEM_195\n# define BOOST_PP_SEQ_ELEM_197(_) BOOST_PP_SEQ_ELEM_196\n# define BOOST_PP_SEQ_ELEM_198(_) BOOST_PP_SEQ_ELEM_197\n# define BOOST_PP_SEQ_ELEM_199(_) BOOST_PP_SEQ_ELEM_198\n# define BOOST_PP_SEQ_ELEM_200(_) BOOST_PP_SEQ_ELEM_199\n# define BOOST_PP_SEQ_ELEM_201(_) BOOST_PP_SEQ_ELEM_200\n# define BOOST_PP_SEQ_ELEM_202(_) BOOST_PP_SEQ_ELEM_201\n# define BOOST_PP_SEQ_ELEM_203(_) BOOST_PP_SEQ_ELEM_202\n# define BOOST_PP_SEQ_ELEM_204(_) BOOST_PP_SEQ_ELEM_203\n# define BOOST_PP_SEQ_ELEM_205(_) BOOST_PP_SEQ_ELEM_204\n# define BOOST_PP_SEQ_ELEM_206(_) BOOST_PP_SEQ_ELEM_205\n# define BOOST_PP_SEQ_ELEM_207(_) BOOST_PP_SEQ_ELEM_206\n# define BOOST_PP_SEQ_ELEM_208(_) BOOST_PP_SEQ_ELEM_207\n# define BOOST_PP_SEQ_ELEM_209(_) BOOST_PP_SEQ_ELEM_208\n# define BOOST_PP_SEQ_ELEM_210(_) BOOST_PP_SEQ_ELEM_209\n# define BOOST_PP_SEQ_ELEM_211(_) BOOST_PP_SEQ_ELEM_210\n# define BOOST_PP_SEQ_ELEM_212(_) BOOST_PP_SEQ_ELEM_211\n# define BOOST_PP_SEQ_ELEM_213(_) BOOST_PP_SEQ_ELEM_212\n# define BOOST_PP_SEQ_ELEM_214(_) BOOST_PP_SEQ_ELEM_213\n# define BOOST_PP_SEQ_ELEM_215(_) BOOST_PP_SEQ_ELEM_214\n# define BOOST_PP_SEQ_ELEM_216(_) BOOST_PP_SEQ_ELEM_215\n# define BOOST_PP_SEQ_ELEM_217(_) BOOST_PP_SEQ_ELEM_216\n# define BOOST_PP_SEQ_ELEM_218(_) BOOST_PP_SEQ_ELEM_217\n# define BOOST_PP_SEQ_ELEM_219(_) BOOST_PP_SEQ_ELEM_218\n# define BOOST_PP_SEQ_ELEM_220(_) BOOST_PP_SEQ_ELEM_219\n# define BOOST_PP_SEQ_ELEM_221(_) BOOST_PP_SEQ_ELEM_220\n# define BOOST_PP_SEQ_ELEM_222(_) BOOST_PP_SEQ_ELEM_221\n# define BOOST_PP_SEQ_ELEM_223(_) BOOST_PP_SEQ_ELEM_222\n# define BOOST_PP_SEQ_ELEM_224(_) BOOST_PP_SEQ_ELEM_223\n# define BOOST_PP_SEQ_ELEM_225(_) BOOST_PP_SEQ_ELEM_224\n# define BOOST_PP_SEQ_ELEM_226(_) BOOST_PP_SEQ_ELEM_225\n# define BOOST_PP_SEQ_ELEM_227(_) BOOST_PP_SEQ_ELEM_226\n# define BOOST_PP_SEQ_ELEM_228(_) BOOST_PP_SEQ_ELEM_227\n# define BOOST_PP_SEQ_ELEM_229(_) BOOST_PP_SEQ_ELEM_228\n# define BOOST_PP_SEQ_ELEM_230(_) BOOST_PP_SEQ_ELEM_229\n# define BOOST_PP_SEQ_ELEM_231(_) BOOST_PP_SEQ_ELEM_230\n# define BOOST_PP_SEQ_ELEM_232(_) BOOST_PP_SEQ_ELEM_231\n# define BOOST_PP_SEQ_ELEM_233(_) BOOST_PP_SEQ_ELEM_232\n# define BOOST_PP_SEQ_ELEM_234(_) BOOST_PP_SEQ_ELEM_233\n# define BOOST_PP_SEQ_ELEM_235(_) BOOST_PP_SEQ_ELEM_234\n# define BOOST_PP_SEQ_ELEM_236(_) BOOST_PP_SEQ_ELEM_235\n# define BOOST_PP_SEQ_ELEM_237(_) BOOST_PP_SEQ_ELEM_236\n# define BOOST_PP_SEQ_ELEM_238(_) BOOST_PP_SEQ_ELEM_237\n# define BOOST_PP_SEQ_ELEM_239(_) BOOST_PP_SEQ_ELEM_238\n# define BOOST_PP_SEQ_ELEM_240(_) BOOST_PP_SEQ_ELEM_239\n# define BOOST_PP_SEQ_ELEM_241(_) BOOST_PP_SEQ_ELEM_240\n# define BOOST_PP_SEQ_ELEM_242(_) BOOST_PP_SEQ_ELEM_241\n# define BOOST_PP_SEQ_ELEM_243(_) BOOST_PP_SEQ_ELEM_242\n# define BOOST_PP_SEQ_ELEM_244(_) BOOST_PP_SEQ_ELEM_243\n# define BOOST_PP_SEQ_ELEM_245(_) BOOST_PP_SEQ_ELEM_244\n# define BOOST_PP_SEQ_ELEM_246(_) BOOST_PP_SEQ_ELEM_245\n# define BOOST_PP_SEQ_ELEM_247(_) BOOST_PP_SEQ_ELEM_246\n# define BOOST_PP_SEQ_ELEM_248(_) BOOST_PP_SEQ_ELEM_247\n# define BOOST_PP_SEQ_ELEM_249(_) BOOST_PP_SEQ_ELEM_248\n# define BOOST_PP_SEQ_ELEM_250(_) BOOST_PP_SEQ_ELEM_249\n# define BOOST_PP_SEQ_ELEM_251(_) BOOST_PP_SEQ_ELEM_250\n# define BOOST_PP_SEQ_ELEM_252(_) BOOST_PP_SEQ_ELEM_251\n# define BOOST_PP_SEQ_ELEM_253(_) BOOST_PP_SEQ_ELEM_252\n# define BOOST_PP_SEQ_ELEM_254(_) BOOST_PP_SEQ_ELEM_253\n# define BOOST_PP_SEQ_ELEM_255(_) BOOST_PP_SEQ_ELEM_254\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/enum.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_ENUM_HPP\n# define BOOST_PREPROCESSOR_SEQ_ENUM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_ENUM */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM_I(seq)\n#    define BOOST_PP_SEQ_ENUM_I(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, BOOST_PP_SEQ_SIZE(seq)) seq\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_SEQ_ENUM_I(BOOST_PP_SEQ_SIZE(seq), seq)\n#    define BOOST_PP_SEQ_ENUM_I(size, seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, size) seq\n# else\n#    define BOOST_PP_SEQ_ENUM(seq) BOOST_PP_CAT(BOOST_PP_SEQ_ENUM_, BOOST_PP_SEQ_SIZE(seq)) seq\n# endif\n#\n# define BOOST_PP_SEQ_ENUM_1(x) x\n# define BOOST_PP_SEQ_ENUM_2(x) x, BOOST_PP_SEQ_ENUM_1\n# define BOOST_PP_SEQ_ENUM_3(x) x, BOOST_PP_SEQ_ENUM_2\n# define BOOST_PP_SEQ_ENUM_4(x) x, BOOST_PP_SEQ_ENUM_3\n# define BOOST_PP_SEQ_ENUM_5(x) x, BOOST_PP_SEQ_ENUM_4\n# define BOOST_PP_SEQ_ENUM_6(x) x, BOOST_PP_SEQ_ENUM_5\n# define BOOST_PP_SEQ_ENUM_7(x) x, BOOST_PP_SEQ_ENUM_6\n# define BOOST_PP_SEQ_ENUM_8(x) x, BOOST_PP_SEQ_ENUM_7\n# define BOOST_PP_SEQ_ENUM_9(x) x, BOOST_PP_SEQ_ENUM_8\n# define BOOST_PP_SEQ_ENUM_10(x) x, BOOST_PP_SEQ_ENUM_9\n# define BOOST_PP_SEQ_ENUM_11(x) x, BOOST_PP_SEQ_ENUM_10\n# define BOOST_PP_SEQ_ENUM_12(x) x, BOOST_PP_SEQ_ENUM_11\n# define BOOST_PP_SEQ_ENUM_13(x) x, BOOST_PP_SEQ_ENUM_12\n# define BOOST_PP_SEQ_ENUM_14(x) x, BOOST_PP_SEQ_ENUM_13\n# define BOOST_PP_SEQ_ENUM_15(x) x, BOOST_PP_SEQ_ENUM_14\n# define BOOST_PP_SEQ_ENUM_16(x) x, BOOST_PP_SEQ_ENUM_15\n# define BOOST_PP_SEQ_ENUM_17(x) x, BOOST_PP_SEQ_ENUM_16\n# define BOOST_PP_SEQ_ENUM_18(x) x, BOOST_PP_SEQ_ENUM_17\n# define BOOST_PP_SEQ_ENUM_19(x) x, BOOST_PP_SEQ_ENUM_18\n# define BOOST_PP_SEQ_ENUM_20(x) x, BOOST_PP_SEQ_ENUM_19\n# define BOOST_PP_SEQ_ENUM_21(x) x, BOOST_PP_SEQ_ENUM_20\n# define BOOST_PP_SEQ_ENUM_22(x) x, BOOST_PP_SEQ_ENUM_21\n# define BOOST_PP_SEQ_ENUM_23(x) x, BOOST_PP_SEQ_ENUM_22\n# define BOOST_PP_SEQ_ENUM_24(x) x, BOOST_PP_SEQ_ENUM_23\n# define BOOST_PP_SEQ_ENUM_25(x) x, BOOST_PP_SEQ_ENUM_24\n# define BOOST_PP_SEQ_ENUM_26(x) x, BOOST_PP_SEQ_ENUM_25\n# define BOOST_PP_SEQ_ENUM_27(x) x, BOOST_PP_SEQ_ENUM_26\n# define BOOST_PP_SEQ_ENUM_28(x) x, BOOST_PP_SEQ_ENUM_27\n# define BOOST_PP_SEQ_ENUM_29(x) x, BOOST_PP_SEQ_ENUM_28\n# define BOOST_PP_SEQ_ENUM_30(x) x, BOOST_PP_SEQ_ENUM_29\n# define BOOST_PP_SEQ_ENUM_31(x) x, BOOST_PP_SEQ_ENUM_30\n# define BOOST_PP_SEQ_ENUM_32(x) x, BOOST_PP_SEQ_ENUM_31\n# define BOOST_PP_SEQ_ENUM_33(x) x, BOOST_PP_SEQ_ENUM_32\n# define BOOST_PP_SEQ_ENUM_34(x) x, BOOST_PP_SEQ_ENUM_33\n# define BOOST_PP_SEQ_ENUM_35(x) x, BOOST_PP_SEQ_ENUM_34\n# define BOOST_PP_SEQ_ENUM_36(x) x, BOOST_PP_SEQ_ENUM_35\n# define BOOST_PP_SEQ_ENUM_37(x) x, BOOST_PP_SEQ_ENUM_36\n# define BOOST_PP_SEQ_ENUM_38(x) x, BOOST_PP_SEQ_ENUM_37\n# define BOOST_PP_SEQ_ENUM_39(x) x, BOOST_PP_SEQ_ENUM_38\n# define BOOST_PP_SEQ_ENUM_40(x) x, BOOST_PP_SEQ_ENUM_39\n# define BOOST_PP_SEQ_ENUM_41(x) x, BOOST_PP_SEQ_ENUM_40\n# define BOOST_PP_SEQ_ENUM_42(x) x, BOOST_PP_SEQ_ENUM_41\n# define BOOST_PP_SEQ_ENUM_43(x) x, BOOST_PP_SEQ_ENUM_42\n# define BOOST_PP_SEQ_ENUM_44(x) x, BOOST_PP_SEQ_ENUM_43\n# define BOOST_PP_SEQ_ENUM_45(x) x, BOOST_PP_SEQ_ENUM_44\n# define BOOST_PP_SEQ_ENUM_46(x) x, BOOST_PP_SEQ_ENUM_45\n# define BOOST_PP_SEQ_ENUM_47(x) x, BOOST_PP_SEQ_ENUM_46\n# define BOOST_PP_SEQ_ENUM_48(x) x, BOOST_PP_SEQ_ENUM_47\n# define BOOST_PP_SEQ_ENUM_49(x) x, BOOST_PP_SEQ_ENUM_48\n# define BOOST_PP_SEQ_ENUM_50(x) x, BOOST_PP_SEQ_ENUM_49\n# define BOOST_PP_SEQ_ENUM_51(x) x, BOOST_PP_SEQ_ENUM_50\n# define BOOST_PP_SEQ_ENUM_52(x) x, BOOST_PP_SEQ_ENUM_51\n# define BOOST_PP_SEQ_ENUM_53(x) x, BOOST_PP_SEQ_ENUM_52\n# define BOOST_PP_SEQ_ENUM_54(x) x, BOOST_PP_SEQ_ENUM_53\n# define BOOST_PP_SEQ_ENUM_55(x) x, BOOST_PP_SEQ_ENUM_54\n# define BOOST_PP_SEQ_ENUM_56(x) x, BOOST_PP_SEQ_ENUM_55\n# define BOOST_PP_SEQ_ENUM_57(x) x, BOOST_PP_SEQ_ENUM_56\n# define BOOST_PP_SEQ_ENUM_58(x) x, BOOST_PP_SEQ_ENUM_57\n# define BOOST_PP_SEQ_ENUM_59(x) x, BOOST_PP_SEQ_ENUM_58\n# define BOOST_PP_SEQ_ENUM_60(x) x, BOOST_PP_SEQ_ENUM_59\n# define BOOST_PP_SEQ_ENUM_61(x) x, BOOST_PP_SEQ_ENUM_60\n# define BOOST_PP_SEQ_ENUM_62(x) x, BOOST_PP_SEQ_ENUM_61\n# define BOOST_PP_SEQ_ENUM_63(x) x, BOOST_PP_SEQ_ENUM_62\n# define BOOST_PP_SEQ_ENUM_64(x) x, BOOST_PP_SEQ_ENUM_63\n# define BOOST_PP_SEQ_ENUM_65(x) x, BOOST_PP_SEQ_ENUM_64\n# define BOOST_PP_SEQ_ENUM_66(x) x, BOOST_PP_SEQ_ENUM_65\n# define BOOST_PP_SEQ_ENUM_67(x) x, BOOST_PP_SEQ_ENUM_66\n# define BOOST_PP_SEQ_ENUM_68(x) x, BOOST_PP_SEQ_ENUM_67\n# define BOOST_PP_SEQ_ENUM_69(x) x, BOOST_PP_SEQ_ENUM_68\n# define BOOST_PP_SEQ_ENUM_70(x) x, BOOST_PP_SEQ_ENUM_69\n# define BOOST_PP_SEQ_ENUM_71(x) x, BOOST_PP_SEQ_ENUM_70\n# define BOOST_PP_SEQ_ENUM_72(x) x, BOOST_PP_SEQ_ENUM_71\n# define BOOST_PP_SEQ_ENUM_73(x) x, BOOST_PP_SEQ_ENUM_72\n# define BOOST_PP_SEQ_ENUM_74(x) x, BOOST_PP_SEQ_ENUM_73\n# define BOOST_PP_SEQ_ENUM_75(x) x, BOOST_PP_SEQ_ENUM_74\n# define BOOST_PP_SEQ_ENUM_76(x) x, BOOST_PP_SEQ_ENUM_75\n# define BOOST_PP_SEQ_ENUM_77(x) x, BOOST_PP_SEQ_ENUM_76\n# define BOOST_PP_SEQ_ENUM_78(x) x, BOOST_PP_SEQ_ENUM_77\n# define BOOST_PP_SEQ_ENUM_79(x) x, BOOST_PP_SEQ_ENUM_78\n# define BOOST_PP_SEQ_ENUM_80(x) x, BOOST_PP_SEQ_ENUM_79\n# define BOOST_PP_SEQ_ENUM_81(x) x, BOOST_PP_SEQ_ENUM_80\n# define BOOST_PP_SEQ_ENUM_82(x) x, BOOST_PP_SEQ_ENUM_81\n# define BOOST_PP_SEQ_ENUM_83(x) x, BOOST_PP_SEQ_ENUM_82\n# define BOOST_PP_SEQ_ENUM_84(x) x, BOOST_PP_SEQ_ENUM_83\n# define BOOST_PP_SEQ_ENUM_85(x) x, BOOST_PP_SEQ_ENUM_84\n# define BOOST_PP_SEQ_ENUM_86(x) x, BOOST_PP_SEQ_ENUM_85\n# define BOOST_PP_SEQ_ENUM_87(x) x, BOOST_PP_SEQ_ENUM_86\n# define BOOST_PP_SEQ_ENUM_88(x) x, BOOST_PP_SEQ_ENUM_87\n# define BOOST_PP_SEQ_ENUM_89(x) x, BOOST_PP_SEQ_ENUM_88\n# define BOOST_PP_SEQ_ENUM_90(x) x, BOOST_PP_SEQ_ENUM_89\n# define BOOST_PP_SEQ_ENUM_91(x) x, BOOST_PP_SEQ_ENUM_90\n# define BOOST_PP_SEQ_ENUM_92(x) x, BOOST_PP_SEQ_ENUM_91\n# define BOOST_PP_SEQ_ENUM_93(x) x, BOOST_PP_SEQ_ENUM_92\n# define BOOST_PP_SEQ_ENUM_94(x) x, BOOST_PP_SEQ_ENUM_93\n# define BOOST_PP_SEQ_ENUM_95(x) x, BOOST_PP_SEQ_ENUM_94\n# define BOOST_PP_SEQ_ENUM_96(x) x, BOOST_PP_SEQ_ENUM_95\n# define BOOST_PP_SEQ_ENUM_97(x) x, BOOST_PP_SEQ_ENUM_96\n# define BOOST_PP_SEQ_ENUM_98(x) x, BOOST_PP_SEQ_ENUM_97\n# define BOOST_PP_SEQ_ENUM_99(x) x, BOOST_PP_SEQ_ENUM_98\n# define BOOST_PP_SEQ_ENUM_100(x) x, BOOST_PP_SEQ_ENUM_99\n# define BOOST_PP_SEQ_ENUM_101(x) x, BOOST_PP_SEQ_ENUM_100\n# define BOOST_PP_SEQ_ENUM_102(x) x, BOOST_PP_SEQ_ENUM_101\n# define BOOST_PP_SEQ_ENUM_103(x) x, BOOST_PP_SEQ_ENUM_102\n# define BOOST_PP_SEQ_ENUM_104(x) x, BOOST_PP_SEQ_ENUM_103\n# define BOOST_PP_SEQ_ENUM_105(x) x, BOOST_PP_SEQ_ENUM_104\n# define BOOST_PP_SEQ_ENUM_106(x) x, BOOST_PP_SEQ_ENUM_105\n# define BOOST_PP_SEQ_ENUM_107(x) x, BOOST_PP_SEQ_ENUM_106\n# define BOOST_PP_SEQ_ENUM_108(x) x, BOOST_PP_SEQ_ENUM_107\n# define BOOST_PP_SEQ_ENUM_109(x) x, BOOST_PP_SEQ_ENUM_108\n# define BOOST_PP_SEQ_ENUM_110(x) x, BOOST_PP_SEQ_ENUM_109\n# define BOOST_PP_SEQ_ENUM_111(x) x, BOOST_PP_SEQ_ENUM_110\n# define BOOST_PP_SEQ_ENUM_112(x) x, BOOST_PP_SEQ_ENUM_111\n# define BOOST_PP_SEQ_ENUM_113(x) x, BOOST_PP_SEQ_ENUM_112\n# define BOOST_PP_SEQ_ENUM_114(x) x, BOOST_PP_SEQ_ENUM_113\n# define BOOST_PP_SEQ_ENUM_115(x) x, BOOST_PP_SEQ_ENUM_114\n# define BOOST_PP_SEQ_ENUM_116(x) x, BOOST_PP_SEQ_ENUM_115\n# define BOOST_PP_SEQ_ENUM_117(x) x, BOOST_PP_SEQ_ENUM_116\n# define BOOST_PP_SEQ_ENUM_118(x) x, BOOST_PP_SEQ_ENUM_117\n# define BOOST_PP_SEQ_ENUM_119(x) x, BOOST_PP_SEQ_ENUM_118\n# define BOOST_PP_SEQ_ENUM_120(x) x, BOOST_PP_SEQ_ENUM_119\n# define BOOST_PP_SEQ_ENUM_121(x) x, BOOST_PP_SEQ_ENUM_120\n# define BOOST_PP_SEQ_ENUM_122(x) x, BOOST_PP_SEQ_ENUM_121\n# define BOOST_PP_SEQ_ENUM_123(x) x, BOOST_PP_SEQ_ENUM_122\n# define BOOST_PP_SEQ_ENUM_124(x) x, BOOST_PP_SEQ_ENUM_123\n# define BOOST_PP_SEQ_ENUM_125(x) x, BOOST_PP_SEQ_ENUM_124\n# define BOOST_PP_SEQ_ENUM_126(x) x, BOOST_PP_SEQ_ENUM_125\n# define BOOST_PP_SEQ_ENUM_127(x) x, BOOST_PP_SEQ_ENUM_126\n# define BOOST_PP_SEQ_ENUM_128(x) x, BOOST_PP_SEQ_ENUM_127\n# define BOOST_PP_SEQ_ENUM_129(x) x, BOOST_PP_SEQ_ENUM_128\n# define BOOST_PP_SEQ_ENUM_130(x) x, BOOST_PP_SEQ_ENUM_129\n# define BOOST_PP_SEQ_ENUM_131(x) x, BOOST_PP_SEQ_ENUM_130\n# define BOOST_PP_SEQ_ENUM_132(x) x, BOOST_PP_SEQ_ENUM_131\n# define BOOST_PP_SEQ_ENUM_133(x) x, BOOST_PP_SEQ_ENUM_132\n# define BOOST_PP_SEQ_ENUM_134(x) x, BOOST_PP_SEQ_ENUM_133\n# define BOOST_PP_SEQ_ENUM_135(x) x, BOOST_PP_SEQ_ENUM_134\n# define BOOST_PP_SEQ_ENUM_136(x) x, BOOST_PP_SEQ_ENUM_135\n# define BOOST_PP_SEQ_ENUM_137(x) x, BOOST_PP_SEQ_ENUM_136\n# define BOOST_PP_SEQ_ENUM_138(x) x, BOOST_PP_SEQ_ENUM_137\n# define BOOST_PP_SEQ_ENUM_139(x) x, BOOST_PP_SEQ_ENUM_138\n# define BOOST_PP_SEQ_ENUM_140(x) x, BOOST_PP_SEQ_ENUM_139\n# define BOOST_PP_SEQ_ENUM_141(x) x, BOOST_PP_SEQ_ENUM_140\n# define BOOST_PP_SEQ_ENUM_142(x) x, BOOST_PP_SEQ_ENUM_141\n# define BOOST_PP_SEQ_ENUM_143(x) x, BOOST_PP_SEQ_ENUM_142\n# define BOOST_PP_SEQ_ENUM_144(x) x, BOOST_PP_SEQ_ENUM_143\n# define BOOST_PP_SEQ_ENUM_145(x) x, BOOST_PP_SEQ_ENUM_144\n# define BOOST_PP_SEQ_ENUM_146(x) x, BOOST_PP_SEQ_ENUM_145\n# define BOOST_PP_SEQ_ENUM_147(x) x, BOOST_PP_SEQ_ENUM_146\n# define BOOST_PP_SEQ_ENUM_148(x) x, BOOST_PP_SEQ_ENUM_147\n# define BOOST_PP_SEQ_ENUM_149(x) x, BOOST_PP_SEQ_ENUM_148\n# define BOOST_PP_SEQ_ENUM_150(x) x, BOOST_PP_SEQ_ENUM_149\n# define BOOST_PP_SEQ_ENUM_151(x) x, BOOST_PP_SEQ_ENUM_150\n# define BOOST_PP_SEQ_ENUM_152(x) x, BOOST_PP_SEQ_ENUM_151\n# define BOOST_PP_SEQ_ENUM_153(x) x, BOOST_PP_SEQ_ENUM_152\n# define BOOST_PP_SEQ_ENUM_154(x) x, BOOST_PP_SEQ_ENUM_153\n# define BOOST_PP_SEQ_ENUM_155(x) x, BOOST_PP_SEQ_ENUM_154\n# define BOOST_PP_SEQ_ENUM_156(x) x, BOOST_PP_SEQ_ENUM_155\n# define BOOST_PP_SEQ_ENUM_157(x) x, BOOST_PP_SEQ_ENUM_156\n# define BOOST_PP_SEQ_ENUM_158(x) x, BOOST_PP_SEQ_ENUM_157\n# define BOOST_PP_SEQ_ENUM_159(x) x, BOOST_PP_SEQ_ENUM_158\n# define BOOST_PP_SEQ_ENUM_160(x) x, BOOST_PP_SEQ_ENUM_159\n# define BOOST_PP_SEQ_ENUM_161(x) x, BOOST_PP_SEQ_ENUM_160\n# define BOOST_PP_SEQ_ENUM_162(x) x, BOOST_PP_SEQ_ENUM_161\n# define BOOST_PP_SEQ_ENUM_163(x) x, BOOST_PP_SEQ_ENUM_162\n# define BOOST_PP_SEQ_ENUM_164(x) x, BOOST_PP_SEQ_ENUM_163\n# define BOOST_PP_SEQ_ENUM_165(x) x, BOOST_PP_SEQ_ENUM_164\n# define BOOST_PP_SEQ_ENUM_166(x) x, BOOST_PP_SEQ_ENUM_165\n# define BOOST_PP_SEQ_ENUM_167(x) x, BOOST_PP_SEQ_ENUM_166\n# define BOOST_PP_SEQ_ENUM_168(x) x, BOOST_PP_SEQ_ENUM_167\n# define BOOST_PP_SEQ_ENUM_169(x) x, BOOST_PP_SEQ_ENUM_168\n# define BOOST_PP_SEQ_ENUM_170(x) x, BOOST_PP_SEQ_ENUM_169\n# define BOOST_PP_SEQ_ENUM_171(x) x, BOOST_PP_SEQ_ENUM_170\n# define BOOST_PP_SEQ_ENUM_172(x) x, BOOST_PP_SEQ_ENUM_171\n# define BOOST_PP_SEQ_ENUM_173(x) x, BOOST_PP_SEQ_ENUM_172\n# define BOOST_PP_SEQ_ENUM_174(x) x, BOOST_PP_SEQ_ENUM_173\n# define BOOST_PP_SEQ_ENUM_175(x) x, BOOST_PP_SEQ_ENUM_174\n# define BOOST_PP_SEQ_ENUM_176(x) x, BOOST_PP_SEQ_ENUM_175\n# define BOOST_PP_SEQ_ENUM_177(x) x, BOOST_PP_SEQ_ENUM_176\n# define BOOST_PP_SEQ_ENUM_178(x) x, BOOST_PP_SEQ_ENUM_177\n# define BOOST_PP_SEQ_ENUM_179(x) x, BOOST_PP_SEQ_ENUM_178\n# define BOOST_PP_SEQ_ENUM_180(x) x, BOOST_PP_SEQ_ENUM_179\n# define BOOST_PP_SEQ_ENUM_181(x) x, BOOST_PP_SEQ_ENUM_180\n# define BOOST_PP_SEQ_ENUM_182(x) x, BOOST_PP_SEQ_ENUM_181\n# define BOOST_PP_SEQ_ENUM_183(x) x, BOOST_PP_SEQ_ENUM_182\n# define BOOST_PP_SEQ_ENUM_184(x) x, BOOST_PP_SEQ_ENUM_183\n# define BOOST_PP_SEQ_ENUM_185(x) x, BOOST_PP_SEQ_ENUM_184\n# define BOOST_PP_SEQ_ENUM_186(x) x, BOOST_PP_SEQ_ENUM_185\n# define BOOST_PP_SEQ_ENUM_187(x) x, BOOST_PP_SEQ_ENUM_186\n# define BOOST_PP_SEQ_ENUM_188(x) x, BOOST_PP_SEQ_ENUM_187\n# define BOOST_PP_SEQ_ENUM_189(x) x, BOOST_PP_SEQ_ENUM_188\n# define BOOST_PP_SEQ_ENUM_190(x) x, BOOST_PP_SEQ_ENUM_189\n# define BOOST_PP_SEQ_ENUM_191(x) x, BOOST_PP_SEQ_ENUM_190\n# define BOOST_PP_SEQ_ENUM_192(x) x, BOOST_PP_SEQ_ENUM_191\n# define BOOST_PP_SEQ_ENUM_193(x) x, BOOST_PP_SEQ_ENUM_192\n# define BOOST_PP_SEQ_ENUM_194(x) x, BOOST_PP_SEQ_ENUM_193\n# define BOOST_PP_SEQ_ENUM_195(x) x, BOOST_PP_SEQ_ENUM_194\n# define BOOST_PP_SEQ_ENUM_196(x) x, BOOST_PP_SEQ_ENUM_195\n# define BOOST_PP_SEQ_ENUM_197(x) x, BOOST_PP_SEQ_ENUM_196\n# define BOOST_PP_SEQ_ENUM_198(x) x, BOOST_PP_SEQ_ENUM_197\n# define BOOST_PP_SEQ_ENUM_199(x) x, BOOST_PP_SEQ_ENUM_198\n# define BOOST_PP_SEQ_ENUM_200(x) x, BOOST_PP_SEQ_ENUM_199\n# define BOOST_PP_SEQ_ENUM_201(x) x, BOOST_PP_SEQ_ENUM_200\n# define BOOST_PP_SEQ_ENUM_202(x) x, BOOST_PP_SEQ_ENUM_201\n# define BOOST_PP_SEQ_ENUM_203(x) x, BOOST_PP_SEQ_ENUM_202\n# define BOOST_PP_SEQ_ENUM_204(x) x, BOOST_PP_SEQ_ENUM_203\n# define BOOST_PP_SEQ_ENUM_205(x) x, BOOST_PP_SEQ_ENUM_204\n# define BOOST_PP_SEQ_ENUM_206(x) x, BOOST_PP_SEQ_ENUM_205\n# define BOOST_PP_SEQ_ENUM_207(x) x, BOOST_PP_SEQ_ENUM_206\n# define BOOST_PP_SEQ_ENUM_208(x) x, BOOST_PP_SEQ_ENUM_207\n# define BOOST_PP_SEQ_ENUM_209(x) x, BOOST_PP_SEQ_ENUM_208\n# define BOOST_PP_SEQ_ENUM_210(x) x, BOOST_PP_SEQ_ENUM_209\n# define BOOST_PP_SEQ_ENUM_211(x) x, BOOST_PP_SEQ_ENUM_210\n# define BOOST_PP_SEQ_ENUM_212(x) x, BOOST_PP_SEQ_ENUM_211\n# define BOOST_PP_SEQ_ENUM_213(x) x, BOOST_PP_SEQ_ENUM_212\n# define BOOST_PP_SEQ_ENUM_214(x) x, BOOST_PP_SEQ_ENUM_213\n# define BOOST_PP_SEQ_ENUM_215(x) x, BOOST_PP_SEQ_ENUM_214\n# define BOOST_PP_SEQ_ENUM_216(x) x, BOOST_PP_SEQ_ENUM_215\n# define BOOST_PP_SEQ_ENUM_217(x) x, BOOST_PP_SEQ_ENUM_216\n# define BOOST_PP_SEQ_ENUM_218(x) x, BOOST_PP_SEQ_ENUM_217\n# define BOOST_PP_SEQ_ENUM_219(x) x, BOOST_PP_SEQ_ENUM_218\n# define BOOST_PP_SEQ_ENUM_220(x) x, BOOST_PP_SEQ_ENUM_219\n# define BOOST_PP_SEQ_ENUM_221(x) x, BOOST_PP_SEQ_ENUM_220\n# define BOOST_PP_SEQ_ENUM_222(x) x, BOOST_PP_SEQ_ENUM_221\n# define BOOST_PP_SEQ_ENUM_223(x) x, BOOST_PP_SEQ_ENUM_222\n# define BOOST_PP_SEQ_ENUM_224(x) x, BOOST_PP_SEQ_ENUM_223\n# define BOOST_PP_SEQ_ENUM_225(x) x, BOOST_PP_SEQ_ENUM_224\n# define BOOST_PP_SEQ_ENUM_226(x) x, BOOST_PP_SEQ_ENUM_225\n# define BOOST_PP_SEQ_ENUM_227(x) x, BOOST_PP_SEQ_ENUM_226\n# define BOOST_PP_SEQ_ENUM_228(x) x, BOOST_PP_SEQ_ENUM_227\n# define BOOST_PP_SEQ_ENUM_229(x) x, BOOST_PP_SEQ_ENUM_228\n# define BOOST_PP_SEQ_ENUM_230(x) x, BOOST_PP_SEQ_ENUM_229\n# define BOOST_PP_SEQ_ENUM_231(x) x, BOOST_PP_SEQ_ENUM_230\n# define BOOST_PP_SEQ_ENUM_232(x) x, BOOST_PP_SEQ_ENUM_231\n# define BOOST_PP_SEQ_ENUM_233(x) x, BOOST_PP_SEQ_ENUM_232\n# define BOOST_PP_SEQ_ENUM_234(x) x, BOOST_PP_SEQ_ENUM_233\n# define BOOST_PP_SEQ_ENUM_235(x) x, BOOST_PP_SEQ_ENUM_234\n# define BOOST_PP_SEQ_ENUM_236(x) x, BOOST_PP_SEQ_ENUM_235\n# define BOOST_PP_SEQ_ENUM_237(x) x, BOOST_PP_SEQ_ENUM_236\n# define BOOST_PP_SEQ_ENUM_238(x) x, BOOST_PP_SEQ_ENUM_237\n# define BOOST_PP_SEQ_ENUM_239(x) x, BOOST_PP_SEQ_ENUM_238\n# define BOOST_PP_SEQ_ENUM_240(x) x, BOOST_PP_SEQ_ENUM_239\n# define BOOST_PP_SEQ_ENUM_241(x) x, BOOST_PP_SEQ_ENUM_240\n# define BOOST_PP_SEQ_ENUM_242(x) x, BOOST_PP_SEQ_ENUM_241\n# define BOOST_PP_SEQ_ENUM_243(x) x, BOOST_PP_SEQ_ENUM_242\n# define BOOST_PP_SEQ_ENUM_244(x) x, BOOST_PP_SEQ_ENUM_243\n# define BOOST_PP_SEQ_ENUM_245(x) x, BOOST_PP_SEQ_ENUM_244\n# define BOOST_PP_SEQ_ENUM_246(x) x, BOOST_PP_SEQ_ENUM_245\n# define BOOST_PP_SEQ_ENUM_247(x) x, BOOST_PP_SEQ_ENUM_246\n# define BOOST_PP_SEQ_ENUM_248(x) x, BOOST_PP_SEQ_ENUM_247\n# define BOOST_PP_SEQ_ENUM_249(x) x, BOOST_PP_SEQ_ENUM_248\n# define BOOST_PP_SEQ_ENUM_250(x) x, BOOST_PP_SEQ_ENUM_249\n# define BOOST_PP_SEQ_ENUM_251(x) x, BOOST_PP_SEQ_ENUM_250\n# define BOOST_PP_SEQ_ENUM_252(x) x, BOOST_PP_SEQ_ENUM_251\n# define BOOST_PP_SEQ_ENUM_253(x) x, BOOST_PP_SEQ_ENUM_252\n# define BOOST_PP_SEQ_ENUM_254(x) x, BOOST_PP_SEQ_ENUM_253\n# define BOOST_PP_SEQ_ENUM_255(x) x, BOOST_PP_SEQ_ENUM_254\n# define BOOST_PP_SEQ_ENUM_256(x) x, BOOST_PP_SEQ_ENUM_255\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/filter.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FILTER_HPP\n# define BOOST_PREPROCESSOR_SEQ_FILTER_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_if.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FILTER */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FILTER(pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))\n# else\n#    define BOOST_PP_SEQ_FILTER(pred, data, seq) BOOST_PP_SEQ_FILTER_I(pred, data, seq)\n#    define BOOST_PP_SEQ_FILTER_I(pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FILTER_O(s, st, elem) BOOST_PP_SEQ_FILTER_O_IM(s, BOOST_PP_TUPLE_REM_3 st, elem)\n#    define BOOST_PP_SEQ_FILTER_O_IM(s, im, elem) BOOST_PP_SEQ_FILTER_O_I(s, im, elem)\n# else\n#    define BOOST_PP_SEQ_FILTER_O(s, st, elem) BOOST_PP_SEQ_FILTER_O_I(s, BOOST_PP_TUPLE_ELEM(3, 0, st), BOOST_PP_TUPLE_ELEM(3, 1, st), BOOST_PP_TUPLE_ELEM(3, 2, st), elem)\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#   define BOOST_PP_SEQ_FILTER_O_I(s, pred, data, res, elem) (pred, data, res BOOST_PP_EXPR_IF(pred(s, data, elem), (elem)))\n# else\n#   define BOOST_PP_SEQ_FILTER_O_I(s, pred, data, res, elem) (pred, data, res BOOST_PP_EXPR_IF(pred##(s, data, elem), (elem)))\n# endif\n#\n# /* BOOST_PP_SEQ_FILTER_S */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FILTER_S(s, pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))\n# else\n#    define BOOST_PP_SEQ_FILTER_S(s, pred, data, seq) BOOST_PP_SEQ_FILTER_S_I(s, pred, data, seq)\n#    define BOOST_PP_SEQ_FILTER_S_I(s, pred, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_FILTER_O, (pred, data, (nil)), seq)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/first_n.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FIRST_N_HPP\n# define BOOST_PREPROCESSOR_SEQ_FIRST_N_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/seq/detail/split.hpp>\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_SEQ_FIRST_N */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FIRST_N(n, seq) BOOST_PP_IF(n, BOOST_PP_TUPLE_ELEM, BOOST_PP_TUPLE_EAT_3)(2, 0, BOOST_PP_SEQ_SPLIT(n, seq (nil)))\n# else\n#    define BOOST_PP_SEQ_FIRST_N(n, seq) BOOST_PP_SEQ_FIRST_N_I(n, seq)\n#    define BOOST_PP_SEQ_FIRST_N_I(n, seq) BOOST_PP_IF(n, BOOST_PP_TUPLE_ELEM, BOOST_PP_TUPLE_EAT_3)(2, 0, BOOST_PP_SEQ_SPLIT(n, seq (nil)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/fold_left.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOLD_LEFT_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOLD_LEFT_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/debug/error.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_FOLD_LEFT */\n#\n# if 0\n#    define BOOST_PP_SEQ_FOLD_LEFT(op, state, seq) ...\n# endif\n#\n# define BOOST_PP_SEQ_FOLD_LEFT BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_LEFT_, BOOST_PP_AUTO_REC(BOOST_PP_SEQ_FOLD_LEFT_P, 256))\n# define BOOST_PP_SEQ_FOLD_LEFT_P(n) BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_LEFT_CHECK_, BOOST_PP_SEQ_FOLD_LEFT_I_ ## n(BOOST_PP_SEQ_FOLD_LEFT_O, BOOST_PP_NIL, (nil), 1))\n# define BOOST_PP_SEQ_FOLD_LEFT_O(s, st, _) st\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_257(op, st, ss) BOOST_PP_ERROR(0x0005)\n# define BOOST_PP_SEQ_FOLD_LEFT_I_257(op, st, ss, sz) BOOST_PP_ERROR(0x0005)\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_NIL 1\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) 0\n# define BOOST_PP_SEQ_FOLD_LEFT_CHECK_BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) 0\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_F(op, st, ss, sz) st\n#\n# define BOOST_PP_SEQ_FOLD_LEFT_1(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_2(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_3(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_4(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_5(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_6(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_7(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_8(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_9(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_10(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_11(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_12(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_13(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_14(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_15(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_16(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_17(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_18(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_19(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_20(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_21(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_22(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_23(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_24(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_25(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_26(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_27(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_28(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_29(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_30(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_31(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_32(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_33(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_34(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_35(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_36(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_37(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_38(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_39(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_40(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_41(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_42(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_43(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_44(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_45(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_46(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_47(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_48(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_49(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_50(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_51(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_52(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_53(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_54(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_55(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_56(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_57(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_58(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_59(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_60(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_61(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_62(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_63(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_64(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_65(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_66(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_67(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_68(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_69(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_70(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_71(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_72(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_73(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_74(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_75(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_76(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_77(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_78(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_79(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_80(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_81(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_82(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_83(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_84(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_85(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_86(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_87(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_88(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_89(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_90(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_91(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_92(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_93(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_94(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_95(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_96(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_97(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_98(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_99(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_100(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_101(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_102(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_103(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_104(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_105(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_106(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_107(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_108(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_109(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_110(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_111(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_112(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_113(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_114(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_115(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_116(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_117(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_118(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_119(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_120(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_121(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_122(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_123(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_124(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_125(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_126(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_127(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_128(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_129(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_130(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_131(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_132(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_133(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_134(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_135(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_136(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_137(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_138(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_139(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_140(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_141(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_142(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_143(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_144(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_145(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_146(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_147(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_148(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_149(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_150(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_151(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_152(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_153(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_154(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_155(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_156(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_157(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_158(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_159(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_160(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_161(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_162(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_163(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_164(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_165(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_166(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_167(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_168(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_169(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_170(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_171(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_172(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_173(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_174(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_175(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_176(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_177(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_178(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_179(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_180(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_181(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_182(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_183(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_184(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_185(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_186(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_187(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_188(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_189(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_190(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_191(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_192(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_193(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_194(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_195(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_196(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_197(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_198(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_199(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_200(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_201(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_202(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_203(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_204(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_205(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_206(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_207(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_208(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_209(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_210(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_211(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_212(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_213(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_214(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_215(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_216(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_217(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_218(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_219(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_220(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_221(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_222(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_223(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_224(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_225(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_226(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_227(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_228(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_229(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_230(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_231(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_232(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_233(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_234(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_235(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_236(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_237(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_238(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_239(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_240(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_241(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_242(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_243(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_244(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_245(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_246(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_247(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_248(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_249(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_250(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_251(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_252(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_253(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_254(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_255(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_LEFT_256(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, BOOST_PP_SEQ_SIZE(ss))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_DMC()\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_2, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(2, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_3, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(3, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_4, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(4, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_5, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(5, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_6, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(6, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_7, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(7, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_8, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(8, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_9, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(9, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_10, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(10, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_11, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(11, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_12, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(12, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_13, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(13, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_14, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(14, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_15, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(15, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_16, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(16, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_17, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(17, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_18, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(18, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_19, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(19, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_20, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(20, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_21, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(21, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_22, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(22, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_23, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(23, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_24, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(24, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_25, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(25, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_26, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(26, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_27, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(27, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_28, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(28, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_29, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(29, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_30, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(30, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_31, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(31, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_32, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(32, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_33, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(33, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_34, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(34, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_35, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(35, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_36, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(36, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_37, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(37, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_38, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(38, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_39, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(39, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_40, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(40, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_41, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(41, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_42, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(42, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_43, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(43, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_44, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(44, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_45, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(45, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_46, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(46, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_47, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(47, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_48, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(48, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_49, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(49, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_50, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(50, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_51, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(51, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_52, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(52, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_53, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(53, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_54, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(54, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_55, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(55, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_56, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(56, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_57, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(57, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_58, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(58, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_59, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(59, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_60, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(60, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_61, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(61, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_62, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(62, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_63, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(63, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_64, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(64, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_65, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(65, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_66, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(66, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_67, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(67, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_68, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(68, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_69, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(69, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_70, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(70, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_71, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(71, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_72, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(72, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_73, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(73, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_74, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(74, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_75, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(75, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_76, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(76, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_77, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(77, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_78, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(78, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_79, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(79, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_80, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(80, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_81, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(81, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_82, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(82, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_83, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(83, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_84, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(84, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_85, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(85, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_86, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(86, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_87, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(87, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_88, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(88, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_89, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(89, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_90, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(90, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_91, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(91, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_92, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(92, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_93, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(93, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_94, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(94, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_95, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(95, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_96, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(96, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_97, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(97, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_98, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(98, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_99, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(99, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_100, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(100, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_101, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(101, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_102, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(102, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_103, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(103, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_104, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(104, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_105, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(105, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_106, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(106, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_107, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(107, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_108, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(108, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_109, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(109, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_110, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(110, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_111, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(111, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_112, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(112, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_113, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(113, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_114, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(114, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_115, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(115, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_116, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(116, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_117, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(117, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_118, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(118, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_119, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(119, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_120, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(120, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_121, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(121, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_122, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(122, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_123, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(123, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_124, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(124, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_125, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(125, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_126, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(126, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_127, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(127, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_128, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(128, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_129, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(129, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_130, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(130, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_131, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(131, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_132, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(132, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_133, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(133, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_134, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(134, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_135, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(135, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_136, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(136, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_137, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(137, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_138, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(138, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_139, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(139, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_140, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(140, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_141, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(141, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_142, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(142, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_143, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(143, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_144, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(144, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_145, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(145, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_146, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(146, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_147, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(147, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_148, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(148, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_149, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(149, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_150, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(150, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_151, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(151, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_152, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(152, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_153, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(153, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_154, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(154, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_155, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(155, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_156, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(156, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_157, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(157, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_158, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(158, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_159, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(159, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_160, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(160, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_161, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(161, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_162, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(162, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_163, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(163, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_164, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(164, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_165, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(165, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_166, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(166, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_167, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(167, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_168, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(168, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_169, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(169, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_170, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(170, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_171, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(171, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_172, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(172, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_173, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(173, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_174, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(174, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_175, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(175, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_176, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(176, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_177, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(177, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_178, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(178, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_179, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(179, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_180, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(180, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_181, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(181, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_182, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(182, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_183, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(183, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_184, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(184, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_185, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(185, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_186, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(186, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_187, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(187, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_188, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(188, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_189, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(189, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_190, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(190, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_191, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(191, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_192, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(192, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_193, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(193, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_194, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(194, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_195, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(195, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_196, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(196, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_197, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(197, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_198, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(198, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_199, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(199, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_200, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(200, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_201, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(201, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_202, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(202, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_203, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(203, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_204, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(204, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_205, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(205, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_206, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(206, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_207, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(207, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_208, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(208, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_209, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(209, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_210, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(210, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_211, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(211, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_212, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(212, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_213, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(213, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_214, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(214, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_215, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(215, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_216, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(216, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_217, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(217, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_218, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(218, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_219, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(219, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_220, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(220, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_221, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(221, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_222, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(222, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_223, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(223, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_224, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(224, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_225, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(225, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_226, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(226, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_227, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(227, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_228, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(228, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_229, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(229, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_230, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(230, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_231, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(231, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_232, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(232, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_233, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(233, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_234, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(234, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_235, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(235, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_236, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(236, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_237, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(237, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_238, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(238, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_239, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(239, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_240, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(240, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_241, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(241, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_242, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(242, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_243, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(243, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_244, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(244, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_245, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(245, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_246, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(246, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_247, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(247, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_248, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(248, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_249, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(249, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_250, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(250, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_251, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(251, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_252, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(252, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_253, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(253, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_254, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(254, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_255, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(255, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_256, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(256, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_257, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op(257, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n# else\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_2, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(2, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_3, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(3, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_4, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(4, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_5, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(5, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_6, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(6, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_7, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(7, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_8, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(8, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_9, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(9, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_10, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(10, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_11, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(11, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_12, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(12, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_13, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(13, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_14, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(14, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_15, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(15, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_16, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(16, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_17, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(17, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_18, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(18, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_19, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(19, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_20, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(20, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_21, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(21, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_22, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(22, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_23, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(23, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_24, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(24, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_25, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(25, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_26, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(26, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_27, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(27, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_28, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(28, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_29, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(29, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_30, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(30, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_31, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(31, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_32, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(32, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_33, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(33, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_34, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(34, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_35, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(35, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_36, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(36, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_37, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(37, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_38, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(38, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_39, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(39, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_40, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(40, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_41, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(41, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_42, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(42, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_43, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(43, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_44, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(44, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_45, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(45, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_46, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(46, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_47, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(47, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_48, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(48, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_49, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(49, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_50, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(50, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_51, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(51, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_52, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(52, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_53, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(53, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_54, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(54, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_55, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(55, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_56, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(56, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_57, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(57, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_58, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(58, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_59, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(59, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_60, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(60, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_61, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(61, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_62, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(62, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_63, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(63, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_64, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(64, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_65, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(65, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_66, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(66, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_67, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(67, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_68, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(68, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_69, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(69, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_70, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(70, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_71, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(71, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_72, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(72, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_73, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(73, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_74, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(74, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_75, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(75, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_76, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(76, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_77, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(77, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_78, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(78, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_79, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(79, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_80, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(80, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_81, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(81, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_82, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(82, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_83, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(83, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_84, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(84, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_85, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(85, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_86, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(86, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_87, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(87, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_88, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(88, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_89, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(89, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_90, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(90, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_91, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(91, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_92, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(92, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_93, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(93, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_94, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(94, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_95, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(95, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_96, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(96, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_97, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(97, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_98, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(98, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_99, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(99, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_100, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(100, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_101, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(101, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_102, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(102, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_103, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(103, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_104, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(104, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_105, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(105, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_106, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(106, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_107, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(107, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_108, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(108, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_109, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(109, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_110, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(110, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_111, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(111, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_112, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(112, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_113, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(113, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_114, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(114, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_115, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(115, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_116, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(116, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_117, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(117, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_118, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(118, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_119, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(119, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_120, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(120, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_121, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(121, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_122, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(122, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_123, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(123, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_124, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(124, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_125, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(125, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_126, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(126, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_127, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(127, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_128, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(128, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_129, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(129, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_130, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(130, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_131, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(131, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_132, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(132, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_133, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(133, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_134, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(134, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_135, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(135, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_136, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(136, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_137, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(137, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_138, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(138, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_139, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(139, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_140, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(140, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_141, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(141, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_142, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(142, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_143, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(143, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_144, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(144, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_145, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(145, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_146, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(146, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_147, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(147, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_148, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(148, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_149, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(149, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_150, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(150, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_151, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(151, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_152, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(152, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_153, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(153, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_154, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(154, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_155, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(155, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_156, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(156, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_157, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(157, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_158, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(158, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_159, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(159, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_160, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(160, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_161, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(161, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_162, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(162, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_163, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(163, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_164, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(164, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_165, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(165, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_166, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(166, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_167, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(167, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_168, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(168, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_169, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(169, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_170, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(170, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_171, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(171, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_172, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(172, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_173, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(173, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_174, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(174, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_175, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(175, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_176, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(176, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_177, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(177, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_178, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(178, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_179, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(179, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_180, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(180, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_181, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(181, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_182, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(182, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_183, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(183, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_184, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(184, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_185, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(185, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_186, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(186, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_187, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(187, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_188, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(188, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_189, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(189, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_190, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(190, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_191, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(191, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_192, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(192, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_193, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(193, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_194, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(194, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_195, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(195, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_196, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(196, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_197, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(197, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_198, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(198, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_199, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(199, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_200, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(200, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_201, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(201, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_202, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(202, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_203, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(203, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_204, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(204, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_205, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(205, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_206, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(206, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_207, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(207, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_208, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(208, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_209, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(209, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_210, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(210, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_211, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(211, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_212, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(212, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_213, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(213, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_214, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(214, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_215, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(215, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_216, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(216, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_217, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(217, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_218, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(218, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_219, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(219, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_220, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(220, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_221, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(221, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_222, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(222, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_223, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(223, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_224, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(224, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_225, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(225, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_226, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(226, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_227, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(227, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_228, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(228, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_229, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(229, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_230, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(230, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_231, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(231, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_232, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(232, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_233, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(233, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_234, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(234, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_235, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(235, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_236, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(236, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_237, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(237, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_238, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(238, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_239, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(239, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_240, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(240, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_241, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(241, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_242, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(242, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_243, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(243, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_244, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(244, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_245, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(245, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_246, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(246, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_247, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(247, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_248, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(248, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_249, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(249, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_250, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(250, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_251, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(251, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_252, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(252, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_253, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(253, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_254, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(254, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_255, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(255, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_256, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(256, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n#    define BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, ss, sz) BOOST_PP_IF(BOOST_PP_DEC(sz), BOOST_PP_SEQ_FOLD_LEFT_I_257, BOOST_PP_SEQ_FOLD_LEFT_F)(op, op##(257, st, BOOST_PP_SEQ_HEAD(ss)), BOOST_PP_SEQ_TAIL(ss), BOOST_PP_DEC(sz))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/fold_right.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOLD_RIGHT_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOLD_RIGHT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/detail/auto_rec.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n# include <boost/preprocessor/seq/reverse.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n#\n# /* BOOST_PP_SEQ_FOLD_RIGHT */\n#\n# if 0\n#    define BOOST_PP_SEQ_FOLD_RIGHT(op, state, seq) ...\n# endif\n#\n# define BOOST_PP_SEQ_FOLD_RIGHT BOOST_PP_CAT(BOOST_PP_SEQ_FOLD_RIGHT_, BOOST_PP_AUTO_REC(BOOST_PP_SEQ_FOLD_LEFT_P, 256))\n#\n# define BOOST_PP_SEQ_FOLD_RIGHT_257(op, st, ss) BOOST_PP_ERROR(0x0005)\n#\n# define BOOST_PP_SEQ_FOLD_RIGHT_1(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_1(op, st, BOOST_PP_SEQ_REVERSE_S(2, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_2(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_2(op, st, BOOST_PP_SEQ_REVERSE_S(3, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_3(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_3(op, st, BOOST_PP_SEQ_REVERSE_S(4, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_4(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_4(op, st, BOOST_PP_SEQ_REVERSE_S(5, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_5(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_5(op, st, BOOST_PP_SEQ_REVERSE_S(6, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_6(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_6(op, st, BOOST_PP_SEQ_REVERSE_S(7, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_7(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_7(op, st, BOOST_PP_SEQ_REVERSE_S(8, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_8(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_8(op, st, BOOST_PP_SEQ_REVERSE_S(9, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_9(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_9(op, st, BOOST_PP_SEQ_REVERSE_S(10, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_10(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_10(op, st, BOOST_PP_SEQ_REVERSE_S(11, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_11(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_11(op, st, BOOST_PP_SEQ_REVERSE_S(12, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_12(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_12(op, st, BOOST_PP_SEQ_REVERSE_S(13, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_13(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_13(op, st, BOOST_PP_SEQ_REVERSE_S(14, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_14(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_14(op, st, BOOST_PP_SEQ_REVERSE_S(15, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_15(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_15(op, st, BOOST_PP_SEQ_REVERSE_S(16, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_16(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_16(op, st, BOOST_PP_SEQ_REVERSE_S(17, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_17(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_17(op, st, BOOST_PP_SEQ_REVERSE_S(18, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_18(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_18(op, st, BOOST_PP_SEQ_REVERSE_S(19, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_19(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_19(op, st, BOOST_PP_SEQ_REVERSE_S(20, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_20(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_20(op, st, BOOST_PP_SEQ_REVERSE_S(21, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_21(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_21(op, st, BOOST_PP_SEQ_REVERSE_S(22, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_22(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_22(op, st, BOOST_PP_SEQ_REVERSE_S(23, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_23(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_23(op, st, BOOST_PP_SEQ_REVERSE_S(24, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_24(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_24(op, st, BOOST_PP_SEQ_REVERSE_S(25, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_25(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_25(op, st, BOOST_PP_SEQ_REVERSE_S(26, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_26(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_26(op, st, BOOST_PP_SEQ_REVERSE_S(27, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_27(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_27(op, st, BOOST_PP_SEQ_REVERSE_S(28, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_28(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_28(op, st, BOOST_PP_SEQ_REVERSE_S(29, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_29(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_29(op, st, BOOST_PP_SEQ_REVERSE_S(30, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_30(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_30(op, st, BOOST_PP_SEQ_REVERSE_S(31, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_31(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_31(op, st, BOOST_PP_SEQ_REVERSE_S(32, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_32(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_32(op, st, BOOST_PP_SEQ_REVERSE_S(33, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_33(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_33(op, st, BOOST_PP_SEQ_REVERSE_S(34, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_34(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_34(op, st, BOOST_PP_SEQ_REVERSE_S(35, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_35(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_35(op, st, BOOST_PP_SEQ_REVERSE_S(36, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_36(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_36(op, st, BOOST_PP_SEQ_REVERSE_S(37, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_37(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_37(op, st, BOOST_PP_SEQ_REVERSE_S(38, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_38(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_38(op, st, BOOST_PP_SEQ_REVERSE_S(39, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_39(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_39(op, st, BOOST_PP_SEQ_REVERSE_S(40, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_40(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_40(op, st, BOOST_PP_SEQ_REVERSE_S(41, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_41(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_41(op, st, BOOST_PP_SEQ_REVERSE_S(42, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_42(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_42(op, st, BOOST_PP_SEQ_REVERSE_S(43, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_43(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_43(op, st, BOOST_PP_SEQ_REVERSE_S(44, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_44(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_44(op, st, BOOST_PP_SEQ_REVERSE_S(45, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_45(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_45(op, st, BOOST_PP_SEQ_REVERSE_S(46, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_46(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_46(op, st, BOOST_PP_SEQ_REVERSE_S(47, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_47(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_47(op, st, BOOST_PP_SEQ_REVERSE_S(48, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_48(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_48(op, st, BOOST_PP_SEQ_REVERSE_S(49, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_49(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_49(op, st, BOOST_PP_SEQ_REVERSE_S(50, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_50(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_50(op, st, BOOST_PP_SEQ_REVERSE_S(51, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_51(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_51(op, st, BOOST_PP_SEQ_REVERSE_S(52, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_52(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_52(op, st, BOOST_PP_SEQ_REVERSE_S(53, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_53(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_53(op, st, BOOST_PP_SEQ_REVERSE_S(54, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_54(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_54(op, st, BOOST_PP_SEQ_REVERSE_S(55, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_55(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_55(op, st, BOOST_PP_SEQ_REVERSE_S(56, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_56(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_56(op, st, BOOST_PP_SEQ_REVERSE_S(57, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_57(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_57(op, st, BOOST_PP_SEQ_REVERSE_S(58, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_58(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_58(op, st, BOOST_PP_SEQ_REVERSE_S(59, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_59(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_59(op, st, BOOST_PP_SEQ_REVERSE_S(60, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_60(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_60(op, st, BOOST_PP_SEQ_REVERSE_S(61, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_61(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_61(op, st, BOOST_PP_SEQ_REVERSE_S(62, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_62(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_62(op, st, BOOST_PP_SEQ_REVERSE_S(63, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_63(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_63(op, st, BOOST_PP_SEQ_REVERSE_S(64, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_64(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_64(op, st, BOOST_PP_SEQ_REVERSE_S(65, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_65(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_65(op, st, BOOST_PP_SEQ_REVERSE_S(66, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_66(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_66(op, st, BOOST_PP_SEQ_REVERSE_S(67, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_67(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_67(op, st, BOOST_PP_SEQ_REVERSE_S(68, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_68(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_68(op, st, BOOST_PP_SEQ_REVERSE_S(69, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_69(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_69(op, st, BOOST_PP_SEQ_REVERSE_S(70, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_70(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_70(op, st, BOOST_PP_SEQ_REVERSE_S(71, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_71(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_71(op, st, BOOST_PP_SEQ_REVERSE_S(72, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_72(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_72(op, st, BOOST_PP_SEQ_REVERSE_S(73, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_73(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_73(op, st, BOOST_PP_SEQ_REVERSE_S(74, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_74(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_74(op, st, BOOST_PP_SEQ_REVERSE_S(75, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_75(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_75(op, st, BOOST_PP_SEQ_REVERSE_S(76, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_76(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_76(op, st, BOOST_PP_SEQ_REVERSE_S(77, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_77(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_77(op, st, BOOST_PP_SEQ_REVERSE_S(78, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_78(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_78(op, st, BOOST_PP_SEQ_REVERSE_S(79, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_79(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_79(op, st, BOOST_PP_SEQ_REVERSE_S(80, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_80(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_80(op, st, BOOST_PP_SEQ_REVERSE_S(81, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_81(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_81(op, st, BOOST_PP_SEQ_REVERSE_S(82, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_82(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_82(op, st, BOOST_PP_SEQ_REVERSE_S(83, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_83(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_83(op, st, BOOST_PP_SEQ_REVERSE_S(84, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_84(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_84(op, st, BOOST_PP_SEQ_REVERSE_S(85, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_85(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_85(op, st, BOOST_PP_SEQ_REVERSE_S(86, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_86(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_86(op, st, BOOST_PP_SEQ_REVERSE_S(87, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_87(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_87(op, st, BOOST_PP_SEQ_REVERSE_S(88, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_88(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_88(op, st, BOOST_PP_SEQ_REVERSE_S(89, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_89(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_89(op, st, BOOST_PP_SEQ_REVERSE_S(90, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_90(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_90(op, st, BOOST_PP_SEQ_REVERSE_S(91, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_91(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_91(op, st, BOOST_PP_SEQ_REVERSE_S(92, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_92(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_92(op, st, BOOST_PP_SEQ_REVERSE_S(93, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_93(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_93(op, st, BOOST_PP_SEQ_REVERSE_S(94, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_94(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_94(op, st, BOOST_PP_SEQ_REVERSE_S(95, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_95(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_95(op, st, BOOST_PP_SEQ_REVERSE_S(96, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_96(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_96(op, st, BOOST_PP_SEQ_REVERSE_S(97, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_97(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_97(op, st, BOOST_PP_SEQ_REVERSE_S(98, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_98(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_98(op, st, BOOST_PP_SEQ_REVERSE_S(99, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_99(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_99(op, st, BOOST_PP_SEQ_REVERSE_S(100, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_100(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_100(op, st, BOOST_PP_SEQ_REVERSE_S(101, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_101(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_101(op, st, BOOST_PP_SEQ_REVERSE_S(102, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_102(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_102(op, st, BOOST_PP_SEQ_REVERSE_S(103, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_103(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_103(op, st, BOOST_PP_SEQ_REVERSE_S(104, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_104(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_104(op, st, BOOST_PP_SEQ_REVERSE_S(105, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_105(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_105(op, st, BOOST_PP_SEQ_REVERSE_S(106, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_106(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_106(op, st, BOOST_PP_SEQ_REVERSE_S(107, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_107(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_107(op, st, BOOST_PP_SEQ_REVERSE_S(108, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_108(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_108(op, st, BOOST_PP_SEQ_REVERSE_S(109, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_109(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_109(op, st, BOOST_PP_SEQ_REVERSE_S(110, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_110(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_110(op, st, BOOST_PP_SEQ_REVERSE_S(111, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_111(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_111(op, st, BOOST_PP_SEQ_REVERSE_S(112, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_112(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_112(op, st, BOOST_PP_SEQ_REVERSE_S(113, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_113(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_113(op, st, BOOST_PP_SEQ_REVERSE_S(114, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_114(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_114(op, st, BOOST_PP_SEQ_REVERSE_S(115, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_115(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_115(op, st, BOOST_PP_SEQ_REVERSE_S(116, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_116(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_116(op, st, BOOST_PP_SEQ_REVERSE_S(117, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_117(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_117(op, st, BOOST_PP_SEQ_REVERSE_S(118, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_118(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_118(op, st, BOOST_PP_SEQ_REVERSE_S(119, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_119(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_119(op, st, BOOST_PP_SEQ_REVERSE_S(120, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_120(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_120(op, st, BOOST_PP_SEQ_REVERSE_S(121, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_121(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_121(op, st, BOOST_PP_SEQ_REVERSE_S(122, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_122(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_122(op, st, BOOST_PP_SEQ_REVERSE_S(123, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_123(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_123(op, st, BOOST_PP_SEQ_REVERSE_S(124, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_124(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_124(op, st, BOOST_PP_SEQ_REVERSE_S(125, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_125(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_125(op, st, BOOST_PP_SEQ_REVERSE_S(126, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_126(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_126(op, st, BOOST_PP_SEQ_REVERSE_S(127, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_127(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_127(op, st, BOOST_PP_SEQ_REVERSE_S(128, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_128(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_128(op, st, BOOST_PP_SEQ_REVERSE_S(129, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_129(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_129(op, st, BOOST_PP_SEQ_REVERSE_S(130, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_130(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_130(op, st, BOOST_PP_SEQ_REVERSE_S(131, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_131(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_131(op, st, BOOST_PP_SEQ_REVERSE_S(132, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_132(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_132(op, st, BOOST_PP_SEQ_REVERSE_S(133, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_133(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_133(op, st, BOOST_PP_SEQ_REVERSE_S(134, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_134(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_134(op, st, BOOST_PP_SEQ_REVERSE_S(135, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_135(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_135(op, st, BOOST_PP_SEQ_REVERSE_S(136, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_136(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_136(op, st, BOOST_PP_SEQ_REVERSE_S(137, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_137(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_137(op, st, BOOST_PP_SEQ_REVERSE_S(138, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_138(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_138(op, st, BOOST_PP_SEQ_REVERSE_S(139, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_139(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_139(op, st, BOOST_PP_SEQ_REVERSE_S(140, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_140(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_140(op, st, BOOST_PP_SEQ_REVERSE_S(141, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_141(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_141(op, st, BOOST_PP_SEQ_REVERSE_S(142, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_142(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_142(op, st, BOOST_PP_SEQ_REVERSE_S(143, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_143(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_143(op, st, BOOST_PP_SEQ_REVERSE_S(144, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_144(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_144(op, st, BOOST_PP_SEQ_REVERSE_S(145, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_145(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_145(op, st, BOOST_PP_SEQ_REVERSE_S(146, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_146(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_146(op, st, BOOST_PP_SEQ_REVERSE_S(147, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_147(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_147(op, st, BOOST_PP_SEQ_REVERSE_S(148, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_148(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_148(op, st, BOOST_PP_SEQ_REVERSE_S(149, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_149(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_149(op, st, BOOST_PP_SEQ_REVERSE_S(150, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_150(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_150(op, st, BOOST_PP_SEQ_REVERSE_S(151, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_151(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_151(op, st, BOOST_PP_SEQ_REVERSE_S(152, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_152(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_152(op, st, BOOST_PP_SEQ_REVERSE_S(153, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_153(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_153(op, st, BOOST_PP_SEQ_REVERSE_S(154, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_154(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_154(op, st, BOOST_PP_SEQ_REVERSE_S(155, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_155(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_155(op, st, BOOST_PP_SEQ_REVERSE_S(156, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_156(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_156(op, st, BOOST_PP_SEQ_REVERSE_S(157, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_157(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_157(op, st, BOOST_PP_SEQ_REVERSE_S(158, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_158(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_158(op, st, BOOST_PP_SEQ_REVERSE_S(159, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_159(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_159(op, st, BOOST_PP_SEQ_REVERSE_S(160, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_160(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_160(op, st, BOOST_PP_SEQ_REVERSE_S(161, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_161(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_161(op, st, BOOST_PP_SEQ_REVERSE_S(162, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_162(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_162(op, st, BOOST_PP_SEQ_REVERSE_S(163, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_163(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_163(op, st, BOOST_PP_SEQ_REVERSE_S(164, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_164(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_164(op, st, BOOST_PP_SEQ_REVERSE_S(165, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_165(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_165(op, st, BOOST_PP_SEQ_REVERSE_S(166, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_166(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_166(op, st, BOOST_PP_SEQ_REVERSE_S(167, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_167(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_167(op, st, BOOST_PP_SEQ_REVERSE_S(168, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_168(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_168(op, st, BOOST_PP_SEQ_REVERSE_S(169, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_169(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_169(op, st, BOOST_PP_SEQ_REVERSE_S(170, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_170(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_170(op, st, BOOST_PP_SEQ_REVERSE_S(171, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_171(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_171(op, st, BOOST_PP_SEQ_REVERSE_S(172, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_172(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_172(op, st, BOOST_PP_SEQ_REVERSE_S(173, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_173(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_173(op, st, BOOST_PP_SEQ_REVERSE_S(174, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_174(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_174(op, st, BOOST_PP_SEQ_REVERSE_S(175, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_175(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_175(op, st, BOOST_PP_SEQ_REVERSE_S(176, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_176(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_176(op, st, BOOST_PP_SEQ_REVERSE_S(177, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_177(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_177(op, st, BOOST_PP_SEQ_REVERSE_S(178, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_178(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_178(op, st, BOOST_PP_SEQ_REVERSE_S(179, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_179(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_179(op, st, BOOST_PP_SEQ_REVERSE_S(180, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_180(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_180(op, st, BOOST_PP_SEQ_REVERSE_S(181, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_181(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_181(op, st, BOOST_PP_SEQ_REVERSE_S(182, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_182(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_182(op, st, BOOST_PP_SEQ_REVERSE_S(183, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_183(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_183(op, st, BOOST_PP_SEQ_REVERSE_S(184, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_184(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_184(op, st, BOOST_PP_SEQ_REVERSE_S(185, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_185(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_185(op, st, BOOST_PP_SEQ_REVERSE_S(186, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_186(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_186(op, st, BOOST_PP_SEQ_REVERSE_S(187, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_187(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_187(op, st, BOOST_PP_SEQ_REVERSE_S(188, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_188(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_188(op, st, BOOST_PP_SEQ_REVERSE_S(189, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_189(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_189(op, st, BOOST_PP_SEQ_REVERSE_S(190, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_190(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_190(op, st, BOOST_PP_SEQ_REVERSE_S(191, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_191(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_191(op, st, BOOST_PP_SEQ_REVERSE_S(192, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_192(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_192(op, st, BOOST_PP_SEQ_REVERSE_S(193, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_193(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_193(op, st, BOOST_PP_SEQ_REVERSE_S(194, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_194(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_194(op, st, BOOST_PP_SEQ_REVERSE_S(195, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_195(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_195(op, st, BOOST_PP_SEQ_REVERSE_S(196, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_196(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_196(op, st, BOOST_PP_SEQ_REVERSE_S(197, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_197(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_197(op, st, BOOST_PP_SEQ_REVERSE_S(198, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_198(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_198(op, st, BOOST_PP_SEQ_REVERSE_S(199, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_199(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_199(op, st, BOOST_PP_SEQ_REVERSE_S(200, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_200(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_200(op, st, BOOST_PP_SEQ_REVERSE_S(201, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_201(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_201(op, st, BOOST_PP_SEQ_REVERSE_S(202, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_202(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_202(op, st, BOOST_PP_SEQ_REVERSE_S(203, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_203(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_203(op, st, BOOST_PP_SEQ_REVERSE_S(204, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_204(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_204(op, st, BOOST_PP_SEQ_REVERSE_S(205, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_205(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_205(op, st, BOOST_PP_SEQ_REVERSE_S(206, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_206(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_206(op, st, BOOST_PP_SEQ_REVERSE_S(207, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_207(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_207(op, st, BOOST_PP_SEQ_REVERSE_S(208, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_208(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_208(op, st, BOOST_PP_SEQ_REVERSE_S(209, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_209(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_209(op, st, BOOST_PP_SEQ_REVERSE_S(210, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_210(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_210(op, st, BOOST_PP_SEQ_REVERSE_S(211, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_211(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_211(op, st, BOOST_PP_SEQ_REVERSE_S(212, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_212(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_212(op, st, BOOST_PP_SEQ_REVERSE_S(213, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_213(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_213(op, st, BOOST_PP_SEQ_REVERSE_S(214, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_214(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_214(op, st, BOOST_PP_SEQ_REVERSE_S(215, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_215(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_215(op, st, BOOST_PP_SEQ_REVERSE_S(216, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_216(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_216(op, st, BOOST_PP_SEQ_REVERSE_S(217, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_217(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_217(op, st, BOOST_PP_SEQ_REVERSE_S(218, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_218(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_218(op, st, BOOST_PP_SEQ_REVERSE_S(219, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_219(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_219(op, st, BOOST_PP_SEQ_REVERSE_S(220, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_220(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_220(op, st, BOOST_PP_SEQ_REVERSE_S(221, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_221(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_221(op, st, BOOST_PP_SEQ_REVERSE_S(222, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_222(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_222(op, st, BOOST_PP_SEQ_REVERSE_S(223, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_223(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_223(op, st, BOOST_PP_SEQ_REVERSE_S(224, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_224(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_224(op, st, BOOST_PP_SEQ_REVERSE_S(225, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_225(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_225(op, st, BOOST_PP_SEQ_REVERSE_S(226, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_226(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_226(op, st, BOOST_PP_SEQ_REVERSE_S(227, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_227(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_227(op, st, BOOST_PP_SEQ_REVERSE_S(228, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_228(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_228(op, st, BOOST_PP_SEQ_REVERSE_S(229, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_229(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_229(op, st, BOOST_PP_SEQ_REVERSE_S(230, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_230(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_230(op, st, BOOST_PP_SEQ_REVERSE_S(231, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_231(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_231(op, st, BOOST_PP_SEQ_REVERSE_S(232, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_232(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_232(op, st, BOOST_PP_SEQ_REVERSE_S(233, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_233(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_233(op, st, BOOST_PP_SEQ_REVERSE_S(234, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_234(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_234(op, st, BOOST_PP_SEQ_REVERSE_S(235, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_235(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_235(op, st, BOOST_PP_SEQ_REVERSE_S(236, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_236(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_236(op, st, BOOST_PP_SEQ_REVERSE_S(237, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_237(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_237(op, st, BOOST_PP_SEQ_REVERSE_S(238, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_238(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_238(op, st, BOOST_PP_SEQ_REVERSE_S(239, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_239(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_239(op, st, BOOST_PP_SEQ_REVERSE_S(240, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_240(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_240(op, st, BOOST_PP_SEQ_REVERSE_S(241, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_241(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_241(op, st, BOOST_PP_SEQ_REVERSE_S(242, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_242(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_242(op, st, BOOST_PP_SEQ_REVERSE_S(243, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_243(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_243(op, st, BOOST_PP_SEQ_REVERSE_S(244, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_244(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_244(op, st, BOOST_PP_SEQ_REVERSE_S(245, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_245(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_245(op, st, BOOST_PP_SEQ_REVERSE_S(246, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_246(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_246(op, st, BOOST_PP_SEQ_REVERSE_S(247, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_247(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_247(op, st, BOOST_PP_SEQ_REVERSE_S(248, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_248(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_248(op, st, BOOST_PP_SEQ_REVERSE_S(249, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_249(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_249(op, st, BOOST_PP_SEQ_REVERSE_S(250, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_250(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_250(op, st, BOOST_PP_SEQ_REVERSE_S(251, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_251(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_251(op, st, BOOST_PP_SEQ_REVERSE_S(252, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_252(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_252(op, st, BOOST_PP_SEQ_REVERSE_S(253, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_253(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_253(op, st, BOOST_PP_SEQ_REVERSE_S(254, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_254(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_254(op, st, BOOST_PP_SEQ_REVERSE_S(255, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_255(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_255(op, st, BOOST_PP_SEQ_REVERSE_S(256, ss), BOOST_PP_SEQ_SIZE(ss))\n# define BOOST_PP_SEQ_FOLD_RIGHT_256(op, st, ss) BOOST_PP_SEQ_FOLD_LEFT_I_256(op, st, BOOST_PP_SEQ_REVERSE_S(257, ss), BOOST_PP_SEQ_SIZE(ss))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/for_each.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/detail/is_empty.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FOR_EACH */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK(macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_D(macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_D(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK(macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC(macro, data, seq) BOOST_PP_FOR((macro, data, seq, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY(macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK(macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY \\\n\t\t\t) \\\n\t\t(macro, data, seq) \\\n/**/\n#\n# define BOOST_PP_SEQ_FOR_EACH_P(r, x) BOOST_PP_TUPLE_ELEM(4, 3, x)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_O(r, x) BOOST_PP_SEQ_FOR_EACH_O_I x\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_O(r, x) BOOST_PP_SEQ_FOR_EACH_O_I(BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_O_I(macro, data, seq, sz) \\\n\tBOOST_PP_SEQ_FOR_EACH_O_I_DEC(macro, data, seq, BOOST_PP_DEC(sz)) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_O_I_DEC(macro, data, seq, sz) \\\n\t( \\\n\tmacro, \\\n\tdata, \\\n\tBOOST_PP_IF \\\n\t\t( \\\n\t\tsz, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_O_I_TAIL, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_O_I_NIL \\\n\t\t) \\\n\t(seq), \\\n\tsz \\\n\t) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_O_I_TAIL(seq) BOOST_PP_SEQ_TAIL(seq)\n# define BOOST_PP_SEQ_FOR_EACH_O_I_NIL(seq) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_M(r, x) BOOST_PP_SEQ_FOR_EACH_M_IM(r, BOOST_PP_TUPLE_REM_4 x)\n#    define BOOST_PP_SEQ_FOR_EACH_M_IM(r, im) BOOST_PP_SEQ_FOR_EACH_M_I(r, im)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_M(r, x) BOOST_PP_SEQ_FOR_EACH_M_I(r, BOOST_PP_TUPLE_ELEM(4, 0, x), BOOST_PP_TUPLE_ELEM(4, 1, x), BOOST_PP_TUPLE_ELEM(4, 2, x), BOOST_PP_TUPLE_ELEM(4, 3, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_M_I(r, macro, data, seq, sz) macro(r, data, BOOST_PP_SEQ_HEAD(seq))\n#\n# /* BOOST_PP_SEQ_FOR_EACH_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_R(r, macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_R_I(r, macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_R_I(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_R(r, macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC_R(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_P, BOOST_PP_SEQ_FOR_EACH_O, BOOST_PP_SEQ_FOR_EACH_M)\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY_R(r, macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_R(r, macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EXEC_R, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_DETAIL_CHECK_EMPTY_R \\\n\t\t\t) \\\n\t\t(r, macro, data, seq) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/for_each_i.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_I_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_I_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/detail/is_empty.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FOR_EACH_I */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK(macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_I(macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_I_I(macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK(macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EXEC(macro, data, seq) BOOST_PP_FOR((macro, data, seq, 0, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)\n#    define BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EMPTY(macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK(macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EXEC, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_DETAIL_CHECK_EMPTY \\\n\t\t\t) \\\n\t\t(macro, data, seq) \\\n/**/\n#\n# define BOOST_PP_SEQ_FOR_EACH_I_P(r, x) BOOST_PP_TUPLE_ELEM(5, 4, x)\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_I_O(r, x) BOOST_PP_SEQ_FOR_EACH_I_O_I x\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I_O(r, x) BOOST_PP_SEQ_FOR_EACH_I_O_I(BOOST_PP_TUPLE_ELEM(5, 0, x), BOOST_PP_TUPLE_ELEM(5, 1, x), BOOST_PP_TUPLE_ELEM(5, 2, x), BOOST_PP_TUPLE_ELEM(5, 3, x), BOOST_PP_TUPLE_ELEM(5, 4, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I(macro, data, seq, i, sz) \\\n\tBOOST_PP_SEQ_FOR_EACH_I_O_I_DEC(macro, data, seq, i, BOOST_PP_DEC(sz)) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I_DEC(macro, data, seq, i, sz) \\\n\t( \\\n\tmacro, \\\n\tdata, \\\n\tBOOST_PP_IF \\\n\t\t( \\\n\t\tsz, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_I_O_I_TAIL, \\\n\t\tBOOST_PP_SEQ_FOR_EACH_I_O_I_NIL \\\n\t\t) \\\n\t(seq), \\\n\tBOOST_PP_INC(i), \\\n\tsz \\\n\t) \\\n/**/\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I_TAIL(seq) BOOST_PP_SEQ_TAIL(seq)\n# define BOOST_PP_SEQ_FOR_EACH_I_O_I_NIL(seq) BOOST_PP_NIL\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_I_M(r, x) BOOST_PP_SEQ_FOR_EACH_I_M_IM(r, BOOST_PP_TUPLE_REM_5 x)\n#    define BOOST_PP_SEQ_FOR_EACH_I_M_IM(r, im) BOOST_PP_SEQ_FOR_EACH_I_M_I(r, im)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I_M(r, x) BOOST_PP_SEQ_FOR_EACH_I_M_I(r, BOOST_PP_TUPLE_ELEM(5, 0, x), BOOST_PP_TUPLE_ELEM(5, 1, x), BOOST_PP_TUPLE_ELEM(5, 2, x), BOOST_PP_TUPLE_ELEM(5, 3, x), BOOST_PP_TUPLE_ELEM(5, 4, x))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_I_M_I(r, macro, data, seq, i, sz) macro(r, data, i, BOOST_PP_SEQ_HEAD(seq))\n#\n# /* BOOST_PP_SEQ_FOR_EACH_I_R */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_I_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK(r, macro, data, seq)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_I_R(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_I(r, macro, data, seq)\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_I(r, macro, data, seq) BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK(r, macro, data, seq)\n# endif\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EXEC(r, macro, data, seq) BOOST_PP_FOR_ ## r((macro, data, seq, 0, BOOST_PP_SEQ_SIZE(seq)), BOOST_PP_SEQ_FOR_EACH_I_P, BOOST_PP_SEQ_FOR_EACH_I_O, BOOST_PP_SEQ_FOR_EACH_I_M)\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EMPTY(r, macro, data, seq)\n#\n#    define BOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK(r, macro, data, seq) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY(seq), \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EXEC, \\\n\t\t\tBOOST_PP_SEQ_FOR_EACH_I_R_DETAIL_CHECK_EMPTY \\\n\t\t\t) \\\n\t\t(r, macro, data, seq) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/for_each_product.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_FOR_EACH_PRODUCT_HPP\n# define BOOST_PREPROCESSOR_SEQ_FOR_EACH_PRODUCT_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/if.hpp>\n# include <boost/preprocessor/repetition/for.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_FOR_EACH_PRODUCT */\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT(macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(BOOST_PP_FOR, macro, sets)\n#\n# /* BOOST_PP_SEQ_FOR_EACH_PRODUCT_R */\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_R(r, macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(BOOST_PP_FOR_ ## r, macro, sets)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(impl, macro, sets) impl((BOOST_PP_SEQ_HEAD(sets)(nil), BOOST_PP_SEQ_TAIL(sets)(nil), (nil), macro), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E(impl, macro, sets) BOOST_PP_SEQ_FOR_EACH_PRODUCT_E_I(impl, macro, sets)\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_E_I(impl, macro, sets) impl((BOOST_PP_SEQ_HEAD(sets)(nil), BOOST_PP_SEQ_TAIL(sets)(nil), (nil), macro), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0)\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_P_I data\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P_I(cset, rset, res, macro) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(cset))\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_P(r, data) BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 0, data)))\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_O_I data\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O_I(cset, rset, res, macro) (BOOST_PP_SEQ_TAIL(cset), rset, res, macro)\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_O(r, data) (BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(4, 0, data)), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, i) BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(4, 1, data))), BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_ ## i, BOOST_PP_SEQ_FOR_EACH_PRODUCT_I)\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, BOOST_PP_TUPLE_ELEM(4, 0, data), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_IM(r, BOOST_PP_TUPLE_REM_4 data)\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_IM(r, im) BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, im)\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_I_I(r, cset, rset, res, macro) macro(r, BOOST_PP_SEQ_TAIL(res (BOOST_PP_SEQ_HEAD(cset))))\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I data\n# else\n#    define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I(BOOST_PP_TUPLE_ELEM(4, 0, data), BOOST_PP_TUPLE_ELEM(4, 1, data), BOOST_PP_TUPLE_ELEM(4, 2, data), BOOST_PP_TUPLE_ELEM(4, 3, data))\n# endif\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_H_I(cset, rset, res, macro) (BOOST_PP_SEQ_HEAD(rset)(nil), BOOST_PP_SEQ_TAIL(rset), res (BOOST_PP_SEQ_HEAD(cset)), macro)\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_0(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 0)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_1(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 1)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_2(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 2)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_3(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 3)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_4(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 4)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_5(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 5)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_6(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 6)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_7(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 7)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_8(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 8)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_9(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 9)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_10(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 10)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_11(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 11)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_12(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 12)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_13(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 13)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_14(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 14)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_15(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 15)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_16(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 16)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_17(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 17)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_18(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 18)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_19(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 19)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_20(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 20)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_21(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 21)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_22(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 22)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_23(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 23)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_24(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 24)(r, data)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_25(r, data) BOOST_PP_SEQ_FOR_EACH_PRODUCT_C(data, 25)(r, data)\n#\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_0(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_1)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_1(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_2)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_2(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_3)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_3(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_4)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_4(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_5)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_5(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_6)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_6(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_7)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_7(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_8)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_8(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_9)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_9(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_10)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_10(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_11)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_11(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_12)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_12(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_13)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_13(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_14)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_14(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_15)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_15(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_16)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_16(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_17)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_17(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_18)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_18(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_19)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_19(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_20)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_20(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_21)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_21(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_22)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_22(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_23)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_23(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_24)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_24(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_25)\n# define BOOST_PP_SEQ_FOR_EACH_PRODUCT_N_25(r, data) BOOST_PP_FOR_ ## r(BOOST_PP_SEQ_FOR_EACH_PRODUCT_H(data), BOOST_PP_SEQ_FOR_EACH_PRODUCT_P, BOOST_PP_SEQ_FOR_EACH_PRODUCT_O, BOOST_PP_SEQ_FOR_EACH_PRODUCT_M_26)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/insert.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_INSERT_HPP\n# define BOOST_PREPROCESSOR_SEQ_INSERT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/rest_n.hpp>\n#\n# /* BOOST_PP_SEQ_INSERT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_INSERT(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REST_N(i, seq)\n# else\n#    define BOOST_PP_SEQ_INSERT(seq, i, elem) BOOST_PP_SEQ_INSERT_I(seq, i, elem)\n#    define BOOST_PP_SEQ_INSERT_I(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REST_N(i, seq)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/pop_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_POP_BACK_HPP\n# define BOOST_PREPROCESSOR_SEQ_POP_BACK_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_POP_BACK */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_POP_BACK(seq) BOOST_PP_SEQ_FIRST_N(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq)\n# else\n#    define BOOST_PP_SEQ_POP_BACK(seq) BOOST_PP_SEQ_POP_BACK_I(seq)\n#    define BOOST_PP_SEQ_POP_BACK_I(seq) BOOST_PP_SEQ_FIRST_N(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq)), seq)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/pop_front.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_POP_FRONT_HPP\n# define BOOST_PREPROCESSOR_SEQ_POP_FRONT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n#\n# /* BOOST_PP_SEQ_POP_FRONT */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_POP_FRONT(seq) BOOST_PP_SEQ_TAIL(seq)\n# else\n#    define BOOST_PP_SEQ_POP_FRONT(seq) BOOST_PP_SEQ_POP_FRONT_I(seq)\n#    define BOOST_PP_SEQ_POP_FRONT_I(seq) BOOST_PP_SEQ_TAIL(seq)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/push_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_PUSH_BACK_HPP\n# define BOOST_PREPROCESSOR_SEQ_PUSH_BACK_HPP\n#\n# /* BOOST_PP_SEQ_PUSH_BACK */\n#\n# define BOOST_PP_SEQ_PUSH_BACK(seq, elem) seq(elem)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/push_front.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_PUSH_FRONT_HPP\n# define BOOST_PREPROCESSOR_SEQ_PUSH_FRONT_HPP\n#\n# /* BOOST_PP_SEQ_PUSH_FRONT */\n#\n# define BOOST_PP_SEQ_PUSH_FRONT(seq, elem) (elem)seq\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/remove.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_REMOVE_HPP\n# define BOOST_PREPROCESSOR_SEQ_REMOVE_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/rest_n.hpp>\n#\n# /* BOOST_PP_SEQ_REMOVE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_REMOVE(seq, i) BOOST_PP_SEQ_FIRST_N(i, seq) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)\n# else\n#    define BOOST_PP_SEQ_REMOVE(seq, i) BOOST_PP_SEQ_REMOVE_I(seq, i)\n#    define BOOST_PP_SEQ_REMOVE_I(seq, i) BOOST_PP_SEQ_FIRST_N(i, seq) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/replace.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_REPLACE_HPP\n# define BOOST_PREPROCESSOR_SEQ_REPLACE_HPP\n#\n# include <boost/preprocessor/arithmetic/dec.hpp>\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/comparison/equal.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/rest_n.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_REPLACE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_REPLACE(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REPLACE_DETAIL_REST(seq, i)\n# else\n#    define BOOST_PP_SEQ_REPLACE(seq, i, elem) BOOST_PP_SEQ_REPLACE_I(seq, i, elem)\n#    define BOOST_PP_SEQ_REPLACE_I(seq, i, elem) BOOST_PP_SEQ_FIRST_N(i, seq) (elem) BOOST_PP_SEQ_REPLACE_DETAIL_REST(seq, i)\n# endif\n#\n#    define BOOST_PP_SEQ_REPLACE_DETAIL_REST_EMPTY(seq, i)\n#    define BOOST_PP_SEQ_REPLACE_DETAIL_REST_VALID(seq, i) BOOST_PP_SEQ_REST_N(BOOST_PP_INC(i), seq)\n#    define BOOST_PP_SEQ_REPLACE_DETAIL_REST(seq, i) \\\n\t\tBOOST_PP_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_EQUAL(i,BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(seq))), \\\n\t\t\tBOOST_PP_SEQ_REPLACE_DETAIL_REST_EMPTY, \\\n\t\t\tBOOST_PP_SEQ_REPLACE_DETAIL_REST_VALID \\\n\t\t\t) \\\n\t\t(seq, i) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/rest_n.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_REST_N_HPP\n# define BOOST_PREPROCESSOR_SEQ_REST_N_HPP\n#\n# include <boost/preprocessor/arithmetic/inc.hpp>\n# include <boost/preprocessor/comparison/not_equal.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/control/expr_iif.hpp>\n# include <boost/preprocessor/facilities/identity.hpp>\n# include <boost/preprocessor/logical/bitand.hpp>\n# include <boost/preprocessor/seq/detail/is_empty.hpp>\n# include <boost/preprocessor/seq/detail/split.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n#\n# /* BOOST_PP_SEQ_REST_N */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_SEQ_REST_N_DETAIL_EXEC(n, seq, BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq))\n# else\n#    define BOOST_PP_SEQ_REST_N(n, seq) BOOST_PP_SEQ_REST_N_I(n, seq)\n#    define BOOST_PP_SEQ_REST_N_I(n, seq) BOOST_PP_SEQ_REST_N_DETAIL_EXEC(n, seq, BOOST_PP_SEQ_DETAIL_EMPTY_SIZE(seq))\n# endif\n#\n#    define BOOST_PP_SEQ_REST_N_DETAIL_EXEC(n, seq, size) \\\n\t\tBOOST_PP_EXPR_IIF \\\n\t\t\t( \\\n\t\t\tBOOST_PP_BITAND \\\n\t\t\t\t( \\\n\t\t\t\tBOOST_PP_SEQ_DETAIL_IS_NOT_EMPTY_SIZE(size), \\\n\t\t\t\tBOOST_PP_NOT_EQUAL(n,size) \\\n\t\t\t\t), \\\n\t\t\tBOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_SPLIT(BOOST_PP_INC(n), BOOST_PP_IDENTITY( (nil) seq )))() \\\n\t\t\t) \\\n/**/\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/reverse.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_REVERSE_HPP\n# define BOOST_PREPROCESSOR_SEQ_REVERSE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/empty.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n#\n# /* BOOST_PP_SEQ_REVERSE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()\n# else\n#    define BOOST_PP_SEQ_REVERSE(seq) BOOST_PP_SEQ_REVERSE_I(seq)\n#    define BOOST_PP_SEQ_REVERSE_I(seq) BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()\n# endif\n#\n# define BOOST_PP_SEQ_REVERSE_O(s, state, elem) (elem) state\n#\n# /* BOOST_PP_SEQ_REVERSE_S */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()\n# else\n#    define BOOST_PP_SEQ_REVERSE_S(s, seq) BOOST_PP_SEQ_REVERSE_S_I(s, seq)\n#    define BOOST_PP_SEQ_REVERSE_S_I(s, seq) BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_REVERSE_O, BOOST_PP_EMPTY, seq)()\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_SEQ_HPP\n# define BOOST_PREPROCESSOR_SEQ_SEQ_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/elem.hpp>\n#\n# /* BOOST_PP_SEQ_HEAD */\n#\n# define BOOST_PP_SEQ_HEAD(seq) BOOST_PP_SEQ_ELEM(0, seq)\n#\n# /* BOOST_PP_SEQ_TAIL */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_1((seq))\n#    define BOOST_PP_SEQ_TAIL_1(par) BOOST_PP_SEQ_TAIL_2 ## par\n#    define BOOST_PP_SEQ_TAIL_2(seq) BOOST_PP_SEQ_TAIL_I ## seq\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_ID(BOOST_PP_SEQ_TAIL_I seq)\n#    define BOOST_PP_SEQ_TAIL_ID(id) id\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_D(seq)\n#    define BOOST_PP_SEQ_TAIL_D(seq) BOOST_PP_SEQ_TAIL_I seq\n# else\n#    define BOOST_PP_SEQ_TAIL(seq) BOOST_PP_SEQ_TAIL_I seq\n# endif\n#\n# define BOOST_PP_SEQ_TAIL_I(x)\n#\n# /* BOOST_PP_SEQ_NIL */\n#\n# define BOOST_PP_SEQ_NIL(x) (x)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_SIZE_HPP\n# define BOOST_PREPROCESSOR_SEQ_SIZE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_SEQ_SIZE_I((seq))\n#    define BOOST_PP_SEQ_SIZE_I(par) BOOST_PP_SEQ_SIZE_II ## par\n#    define BOOST_PP_SEQ_SIZE_II(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 ## seq)\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG() || BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_SEQ_SIZE_I(seq)\n#    define BOOST_PP_SEQ_SIZE_I(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)\n# elif defined(__IBMC__) || defined(__IBMCPP__)\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_0, seq))\n# else\n#    define BOOST_PP_SEQ_SIZE(seq) BOOST_PP_CAT(BOOST_PP_SEQ_SIZE_, BOOST_PP_SEQ_SIZE_0 seq)\n# endif\n#\n# define BOOST_PP_SEQ_SIZE_0(_) BOOST_PP_SEQ_SIZE_1\n# define BOOST_PP_SEQ_SIZE_1(_) BOOST_PP_SEQ_SIZE_2\n# define BOOST_PP_SEQ_SIZE_2(_) BOOST_PP_SEQ_SIZE_3\n# define BOOST_PP_SEQ_SIZE_3(_) BOOST_PP_SEQ_SIZE_4\n# define BOOST_PP_SEQ_SIZE_4(_) BOOST_PP_SEQ_SIZE_5\n# define BOOST_PP_SEQ_SIZE_5(_) BOOST_PP_SEQ_SIZE_6\n# define BOOST_PP_SEQ_SIZE_6(_) BOOST_PP_SEQ_SIZE_7\n# define BOOST_PP_SEQ_SIZE_7(_) BOOST_PP_SEQ_SIZE_8\n# define BOOST_PP_SEQ_SIZE_8(_) BOOST_PP_SEQ_SIZE_9\n# define BOOST_PP_SEQ_SIZE_9(_) BOOST_PP_SEQ_SIZE_10\n# define BOOST_PP_SEQ_SIZE_10(_) BOOST_PP_SEQ_SIZE_11\n# define BOOST_PP_SEQ_SIZE_11(_) BOOST_PP_SEQ_SIZE_12\n# define BOOST_PP_SEQ_SIZE_12(_) BOOST_PP_SEQ_SIZE_13\n# define BOOST_PP_SEQ_SIZE_13(_) BOOST_PP_SEQ_SIZE_14\n# define BOOST_PP_SEQ_SIZE_14(_) BOOST_PP_SEQ_SIZE_15\n# define BOOST_PP_SEQ_SIZE_15(_) BOOST_PP_SEQ_SIZE_16\n# define BOOST_PP_SEQ_SIZE_16(_) BOOST_PP_SEQ_SIZE_17\n# define BOOST_PP_SEQ_SIZE_17(_) BOOST_PP_SEQ_SIZE_18\n# define BOOST_PP_SEQ_SIZE_18(_) BOOST_PP_SEQ_SIZE_19\n# define BOOST_PP_SEQ_SIZE_19(_) BOOST_PP_SEQ_SIZE_20\n# define BOOST_PP_SEQ_SIZE_20(_) BOOST_PP_SEQ_SIZE_21\n# define BOOST_PP_SEQ_SIZE_21(_) BOOST_PP_SEQ_SIZE_22\n# define BOOST_PP_SEQ_SIZE_22(_) BOOST_PP_SEQ_SIZE_23\n# define BOOST_PP_SEQ_SIZE_23(_) BOOST_PP_SEQ_SIZE_24\n# define BOOST_PP_SEQ_SIZE_24(_) BOOST_PP_SEQ_SIZE_25\n# define BOOST_PP_SEQ_SIZE_25(_) BOOST_PP_SEQ_SIZE_26\n# define BOOST_PP_SEQ_SIZE_26(_) BOOST_PP_SEQ_SIZE_27\n# define BOOST_PP_SEQ_SIZE_27(_) BOOST_PP_SEQ_SIZE_28\n# define BOOST_PP_SEQ_SIZE_28(_) BOOST_PP_SEQ_SIZE_29\n# define BOOST_PP_SEQ_SIZE_29(_) BOOST_PP_SEQ_SIZE_30\n# define BOOST_PP_SEQ_SIZE_30(_) BOOST_PP_SEQ_SIZE_31\n# define BOOST_PP_SEQ_SIZE_31(_) BOOST_PP_SEQ_SIZE_32\n# define BOOST_PP_SEQ_SIZE_32(_) BOOST_PP_SEQ_SIZE_33\n# define BOOST_PP_SEQ_SIZE_33(_) BOOST_PP_SEQ_SIZE_34\n# define BOOST_PP_SEQ_SIZE_34(_) BOOST_PP_SEQ_SIZE_35\n# define BOOST_PP_SEQ_SIZE_35(_) BOOST_PP_SEQ_SIZE_36\n# define BOOST_PP_SEQ_SIZE_36(_) BOOST_PP_SEQ_SIZE_37\n# define BOOST_PP_SEQ_SIZE_37(_) BOOST_PP_SEQ_SIZE_38\n# define BOOST_PP_SEQ_SIZE_38(_) BOOST_PP_SEQ_SIZE_39\n# define BOOST_PP_SEQ_SIZE_39(_) BOOST_PP_SEQ_SIZE_40\n# define BOOST_PP_SEQ_SIZE_40(_) BOOST_PP_SEQ_SIZE_41\n# define BOOST_PP_SEQ_SIZE_41(_) BOOST_PP_SEQ_SIZE_42\n# define BOOST_PP_SEQ_SIZE_42(_) BOOST_PP_SEQ_SIZE_43\n# define BOOST_PP_SEQ_SIZE_43(_) BOOST_PP_SEQ_SIZE_44\n# define BOOST_PP_SEQ_SIZE_44(_) BOOST_PP_SEQ_SIZE_45\n# define BOOST_PP_SEQ_SIZE_45(_) BOOST_PP_SEQ_SIZE_46\n# define BOOST_PP_SEQ_SIZE_46(_) BOOST_PP_SEQ_SIZE_47\n# define BOOST_PP_SEQ_SIZE_47(_) BOOST_PP_SEQ_SIZE_48\n# define BOOST_PP_SEQ_SIZE_48(_) BOOST_PP_SEQ_SIZE_49\n# define BOOST_PP_SEQ_SIZE_49(_) BOOST_PP_SEQ_SIZE_50\n# define BOOST_PP_SEQ_SIZE_50(_) BOOST_PP_SEQ_SIZE_51\n# define BOOST_PP_SEQ_SIZE_51(_) BOOST_PP_SEQ_SIZE_52\n# define BOOST_PP_SEQ_SIZE_52(_) BOOST_PP_SEQ_SIZE_53\n# define BOOST_PP_SEQ_SIZE_53(_) BOOST_PP_SEQ_SIZE_54\n# define BOOST_PP_SEQ_SIZE_54(_) BOOST_PP_SEQ_SIZE_55\n# define BOOST_PP_SEQ_SIZE_55(_) BOOST_PP_SEQ_SIZE_56\n# define BOOST_PP_SEQ_SIZE_56(_) BOOST_PP_SEQ_SIZE_57\n# define BOOST_PP_SEQ_SIZE_57(_) BOOST_PP_SEQ_SIZE_58\n# define BOOST_PP_SEQ_SIZE_58(_) BOOST_PP_SEQ_SIZE_59\n# define BOOST_PP_SEQ_SIZE_59(_) BOOST_PP_SEQ_SIZE_60\n# define BOOST_PP_SEQ_SIZE_60(_) BOOST_PP_SEQ_SIZE_61\n# define BOOST_PP_SEQ_SIZE_61(_) BOOST_PP_SEQ_SIZE_62\n# define BOOST_PP_SEQ_SIZE_62(_) BOOST_PP_SEQ_SIZE_63\n# define BOOST_PP_SEQ_SIZE_63(_) BOOST_PP_SEQ_SIZE_64\n# define BOOST_PP_SEQ_SIZE_64(_) BOOST_PP_SEQ_SIZE_65\n# define BOOST_PP_SEQ_SIZE_65(_) BOOST_PP_SEQ_SIZE_66\n# define BOOST_PP_SEQ_SIZE_66(_) BOOST_PP_SEQ_SIZE_67\n# define BOOST_PP_SEQ_SIZE_67(_) BOOST_PP_SEQ_SIZE_68\n# define BOOST_PP_SEQ_SIZE_68(_) BOOST_PP_SEQ_SIZE_69\n# define BOOST_PP_SEQ_SIZE_69(_) BOOST_PP_SEQ_SIZE_70\n# define BOOST_PP_SEQ_SIZE_70(_) BOOST_PP_SEQ_SIZE_71\n# define BOOST_PP_SEQ_SIZE_71(_) BOOST_PP_SEQ_SIZE_72\n# define BOOST_PP_SEQ_SIZE_72(_) BOOST_PP_SEQ_SIZE_73\n# define BOOST_PP_SEQ_SIZE_73(_) BOOST_PP_SEQ_SIZE_74\n# define BOOST_PP_SEQ_SIZE_74(_) BOOST_PP_SEQ_SIZE_75\n# define BOOST_PP_SEQ_SIZE_75(_) BOOST_PP_SEQ_SIZE_76\n# define BOOST_PP_SEQ_SIZE_76(_) BOOST_PP_SEQ_SIZE_77\n# define BOOST_PP_SEQ_SIZE_77(_) BOOST_PP_SEQ_SIZE_78\n# define BOOST_PP_SEQ_SIZE_78(_) BOOST_PP_SEQ_SIZE_79\n# define BOOST_PP_SEQ_SIZE_79(_) BOOST_PP_SEQ_SIZE_80\n# define BOOST_PP_SEQ_SIZE_80(_) BOOST_PP_SEQ_SIZE_81\n# define BOOST_PP_SEQ_SIZE_81(_) BOOST_PP_SEQ_SIZE_82\n# define BOOST_PP_SEQ_SIZE_82(_) BOOST_PP_SEQ_SIZE_83\n# define BOOST_PP_SEQ_SIZE_83(_) BOOST_PP_SEQ_SIZE_84\n# define BOOST_PP_SEQ_SIZE_84(_) BOOST_PP_SEQ_SIZE_85\n# define BOOST_PP_SEQ_SIZE_85(_) BOOST_PP_SEQ_SIZE_86\n# define BOOST_PP_SEQ_SIZE_86(_) BOOST_PP_SEQ_SIZE_87\n# define BOOST_PP_SEQ_SIZE_87(_) BOOST_PP_SEQ_SIZE_88\n# define BOOST_PP_SEQ_SIZE_88(_) BOOST_PP_SEQ_SIZE_89\n# define BOOST_PP_SEQ_SIZE_89(_) BOOST_PP_SEQ_SIZE_90\n# define BOOST_PP_SEQ_SIZE_90(_) BOOST_PP_SEQ_SIZE_91\n# define BOOST_PP_SEQ_SIZE_91(_) BOOST_PP_SEQ_SIZE_92\n# define BOOST_PP_SEQ_SIZE_92(_) BOOST_PP_SEQ_SIZE_93\n# define BOOST_PP_SEQ_SIZE_93(_) BOOST_PP_SEQ_SIZE_94\n# define BOOST_PP_SEQ_SIZE_94(_) BOOST_PP_SEQ_SIZE_95\n# define BOOST_PP_SEQ_SIZE_95(_) BOOST_PP_SEQ_SIZE_96\n# define BOOST_PP_SEQ_SIZE_96(_) BOOST_PP_SEQ_SIZE_97\n# define BOOST_PP_SEQ_SIZE_97(_) BOOST_PP_SEQ_SIZE_98\n# define BOOST_PP_SEQ_SIZE_98(_) BOOST_PP_SEQ_SIZE_99\n# define BOOST_PP_SEQ_SIZE_99(_) BOOST_PP_SEQ_SIZE_100\n# define BOOST_PP_SEQ_SIZE_100(_) BOOST_PP_SEQ_SIZE_101\n# define BOOST_PP_SEQ_SIZE_101(_) BOOST_PP_SEQ_SIZE_102\n# define BOOST_PP_SEQ_SIZE_102(_) BOOST_PP_SEQ_SIZE_103\n# define BOOST_PP_SEQ_SIZE_103(_) BOOST_PP_SEQ_SIZE_104\n# define BOOST_PP_SEQ_SIZE_104(_) BOOST_PP_SEQ_SIZE_105\n# define BOOST_PP_SEQ_SIZE_105(_) BOOST_PP_SEQ_SIZE_106\n# define BOOST_PP_SEQ_SIZE_106(_) BOOST_PP_SEQ_SIZE_107\n# define BOOST_PP_SEQ_SIZE_107(_) BOOST_PP_SEQ_SIZE_108\n# define BOOST_PP_SEQ_SIZE_108(_) BOOST_PP_SEQ_SIZE_109\n# define BOOST_PP_SEQ_SIZE_109(_) BOOST_PP_SEQ_SIZE_110\n# define BOOST_PP_SEQ_SIZE_110(_) BOOST_PP_SEQ_SIZE_111\n# define BOOST_PP_SEQ_SIZE_111(_) BOOST_PP_SEQ_SIZE_112\n# define BOOST_PP_SEQ_SIZE_112(_) BOOST_PP_SEQ_SIZE_113\n# define BOOST_PP_SEQ_SIZE_113(_) BOOST_PP_SEQ_SIZE_114\n# define BOOST_PP_SEQ_SIZE_114(_) BOOST_PP_SEQ_SIZE_115\n# define BOOST_PP_SEQ_SIZE_115(_) BOOST_PP_SEQ_SIZE_116\n# define BOOST_PP_SEQ_SIZE_116(_) BOOST_PP_SEQ_SIZE_117\n# define BOOST_PP_SEQ_SIZE_117(_) BOOST_PP_SEQ_SIZE_118\n# define BOOST_PP_SEQ_SIZE_118(_) BOOST_PP_SEQ_SIZE_119\n# define BOOST_PP_SEQ_SIZE_119(_) BOOST_PP_SEQ_SIZE_120\n# define BOOST_PP_SEQ_SIZE_120(_) BOOST_PP_SEQ_SIZE_121\n# define BOOST_PP_SEQ_SIZE_121(_) BOOST_PP_SEQ_SIZE_122\n# define BOOST_PP_SEQ_SIZE_122(_) BOOST_PP_SEQ_SIZE_123\n# define BOOST_PP_SEQ_SIZE_123(_) BOOST_PP_SEQ_SIZE_124\n# define BOOST_PP_SEQ_SIZE_124(_) BOOST_PP_SEQ_SIZE_125\n# define BOOST_PP_SEQ_SIZE_125(_) BOOST_PP_SEQ_SIZE_126\n# define BOOST_PP_SEQ_SIZE_126(_) BOOST_PP_SEQ_SIZE_127\n# define BOOST_PP_SEQ_SIZE_127(_) BOOST_PP_SEQ_SIZE_128\n# define BOOST_PP_SEQ_SIZE_128(_) BOOST_PP_SEQ_SIZE_129\n# define BOOST_PP_SEQ_SIZE_129(_) BOOST_PP_SEQ_SIZE_130\n# define BOOST_PP_SEQ_SIZE_130(_) BOOST_PP_SEQ_SIZE_131\n# define BOOST_PP_SEQ_SIZE_131(_) BOOST_PP_SEQ_SIZE_132\n# define BOOST_PP_SEQ_SIZE_132(_) BOOST_PP_SEQ_SIZE_133\n# define BOOST_PP_SEQ_SIZE_133(_) BOOST_PP_SEQ_SIZE_134\n# define BOOST_PP_SEQ_SIZE_134(_) BOOST_PP_SEQ_SIZE_135\n# define BOOST_PP_SEQ_SIZE_135(_) BOOST_PP_SEQ_SIZE_136\n# define BOOST_PP_SEQ_SIZE_136(_) BOOST_PP_SEQ_SIZE_137\n# define BOOST_PP_SEQ_SIZE_137(_) BOOST_PP_SEQ_SIZE_138\n# define BOOST_PP_SEQ_SIZE_138(_) BOOST_PP_SEQ_SIZE_139\n# define BOOST_PP_SEQ_SIZE_139(_) BOOST_PP_SEQ_SIZE_140\n# define BOOST_PP_SEQ_SIZE_140(_) BOOST_PP_SEQ_SIZE_141\n# define BOOST_PP_SEQ_SIZE_141(_) BOOST_PP_SEQ_SIZE_142\n# define BOOST_PP_SEQ_SIZE_142(_) BOOST_PP_SEQ_SIZE_143\n# define BOOST_PP_SEQ_SIZE_143(_) BOOST_PP_SEQ_SIZE_144\n# define BOOST_PP_SEQ_SIZE_144(_) BOOST_PP_SEQ_SIZE_145\n# define BOOST_PP_SEQ_SIZE_145(_) BOOST_PP_SEQ_SIZE_146\n# define BOOST_PP_SEQ_SIZE_146(_) BOOST_PP_SEQ_SIZE_147\n# define BOOST_PP_SEQ_SIZE_147(_) BOOST_PP_SEQ_SIZE_148\n# define BOOST_PP_SEQ_SIZE_148(_) BOOST_PP_SEQ_SIZE_149\n# define BOOST_PP_SEQ_SIZE_149(_) BOOST_PP_SEQ_SIZE_150\n# define BOOST_PP_SEQ_SIZE_150(_) BOOST_PP_SEQ_SIZE_151\n# define BOOST_PP_SEQ_SIZE_151(_) BOOST_PP_SEQ_SIZE_152\n# define BOOST_PP_SEQ_SIZE_152(_) BOOST_PP_SEQ_SIZE_153\n# define BOOST_PP_SEQ_SIZE_153(_) BOOST_PP_SEQ_SIZE_154\n# define BOOST_PP_SEQ_SIZE_154(_) BOOST_PP_SEQ_SIZE_155\n# define BOOST_PP_SEQ_SIZE_155(_) BOOST_PP_SEQ_SIZE_156\n# define BOOST_PP_SEQ_SIZE_156(_) BOOST_PP_SEQ_SIZE_157\n# define BOOST_PP_SEQ_SIZE_157(_) BOOST_PP_SEQ_SIZE_158\n# define BOOST_PP_SEQ_SIZE_158(_) BOOST_PP_SEQ_SIZE_159\n# define BOOST_PP_SEQ_SIZE_159(_) BOOST_PP_SEQ_SIZE_160\n# define BOOST_PP_SEQ_SIZE_160(_) BOOST_PP_SEQ_SIZE_161\n# define BOOST_PP_SEQ_SIZE_161(_) BOOST_PP_SEQ_SIZE_162\n# define BOOST_PP_SEQ_SIZE_162(_) BOOST_PP_SEQ_SIZE_163\n# define BOOST_PP_SEQ_SIZE_163(_) BOOST_PP_SEQ_SIZE_164\n# define BOOST_PP_SEQ_SIZE_164(_) BOOST_PP_SEQ_SIZE_165\n# define BOOST_PP_SEQ_SIZE_165(_) BOOST_PP_SEQ_SIZE_166\n# define BOOST_PP_SEQ_SIZE_166(_) BOOST_PP_SEQ_SIZE_167\n# define BOOST_PP_SEQ_SIZE_167(_) BOOST_PP_SEQ_SIZE_168\n# define BOOST_PP_SEQ_SIZE_168(_) BOOST_PP_SEQ_SIZE_169\n# define BOOST_PP_SEQ_SIZE_169(_) BOOST_PP_SEQ_SIZE_170\n# define BOOST_PP_SEQ_SIZE_170(_) BOOST_PP_SEQ_SIZE_171\n# define BOOST_PP_SEQ_SIZE_171(_) BOOST_PP_SEQ_SIZE_172\n# define BOOST_PP_SEQ_SIZE_172(_) BOOST_PP_SEQ_SIZE_173\n# define BOOST_PP_SEQ_SIZE_173(_) BOOST_PP_SEQ_SIZE_174\n# define BOOST_PP_SEQ_SIZE_174(_) BOOST_PP_SEQ_SIZE_175\n# define BOOST_PP_SEQ_SIZE_175(_) BOOST_PP_SEQ_SIZE_176\n# define BOOST_PP_SEQ_SIZE_176(_) BOOST_PP_SEQ_SIZE_177\n# define BOOST_PP_SEQ_SIZE_177(_) BOOST_PP_SEQ_SIZE_178\n# define BOOST_PP_SEQ_SIZE_178(_) BOOST_PP_SEQ_SIZE_179\n# define BOOST_PP_SEQ_SIZE_179(_) BOOST_PP_SEQ_SIZE_180\n# define BOOST_PP_SEQ_SIZE_180(_) BOOST_PP_SEQ_SIZE_181\n# define BOOST_PP_SEQ_SIZE_181(_) BOOST_PP_SEQ_SIZE_182\n# define BOOST_PP_SEQ_SIZE_182(_) BOOST_PP_SEQ_SIZE_183\n# define BOOST_PP_SEQ_SIZE_183(_) BOOST_PP_SEQ_SIZE_184\n# define BOOST_PP_SEQ_SIZE_184(_) BOOST_PP_SEQ_SIZE_185\n# define BOOST_PP_SEQ_SIZE_185(_) BOOST_PP_SEQ_SIZE_186\n# define BOOST_PP_SEQ_SIZE_186(_) BOOST_PP_SEQ_SIZE_187\n# define BOOST_PP_SEQ_SIZE_187(_) BOOST_PP_SEQ_SIZE_188\n# define BOOST_PP_SEQ_SIZE_188(_) BOOST_PP_SEQ_SIZE_189\n# define BOOST_PP_SEQ_SIZE_189(_) BOOST_PP_SEQ_SIZE_190\n# define BOOST_PP_SEQ_SIZE_190(_) BOOST_PP_SEQ_SIZE_191\n# define BOOST_PP_SEQ_SIZE_191(_) BOOST_PP_SEQ_SIZE_192\n# define BOOST_PP_SEQ_SIZE_192(_) BOOST_PP_SEQ_SIZE_193\n# define BOOST_PP_SEQ_SIZE_193(_) BOOST_PP_SEQ_SIZE_194\n# define BOOST_PP_SEQ_SIZE_194(_) BOOST_PP_SEQ_SIZE_195\n# define BOOST_PP_SEQ_SIZE_195(_) BOOST_PP_SEQ_SIZE_196\n# define BOOST_PP_SEQ_SIZE_196(_) BOOST_PP_SEQ_SIZE_197\n# define BOOST_PP_SEQ_SIZE_197(_) BOOST_PP_SEQ_SIZE_198\n# define BOOST_PP_SEQ_SIZE_198(_) BOOST_PP_SEQ_SIZE_199\n# define BOOST_PP_SEQ_SIZE_199(_) BOOST_PP_SEQ_SIZE_200\n# define BOOST_PP_SEQ_SIZE_200(_) BOOST_PP_SEQ_SIZE_201\n# define BOOST_PP_SEQ_SIZE_201(_) BOOST_PP_SEQ_SIZE_202\n# define BOOST_PP_SEQ_SIZE_202(_) BOOST_PP_SEQ_SIZE_203\n# define BOOST_PP_SEQ_SIZE_203(_) BOOST_PP_SEQ_SIZE_204\n# define BOOST_PP_SEQ_SIZE_204(_) BOOST_PP_SEQ_SIZE_205\n# define BOOST_PP_SEQ_SIZE_205(_) BOOST_PP_SEQ_SIZE_206\n# define BOOST_PP_SEQ_SIZE_206(_) BOOST_PP_SEQ_SIZE_207\n# define BOOST_PP_SEQ_SIZE_207(_) BOOST_PP_SEQ_SIZE_208\n# define BOOST_PP_SEQ_SIZE_208(_) BOOST_PP_SEQ_SIZE_209\n# define BOOST_PP_SEQ_SIZE_209(_) BOOST_PP_SEQ_SIZE_210\n# define BOOST_PP_SEQ_SIZE_210(_) BOOST_PP_SEQ_SIZE_211\n# define BOOST_PP_SEQ_SIZE_211(_) BOOST_PP_SEQ_SIZE_212\n# define BOOST_PP_SEQ_SIZE_212(_) BOOST_PP_SEQ_SIZE_213\n# define BOOST_PP_SEQ_SIZE_213(_) BOOST_PP_SEQ_SIZE_214\n# define BOOST_PP_SEQ_SIZE_214(_) BOOST_PP_SEQ_SIZE_215\n# define BOOST_PP_SEQ_SIZE_215(_) BOOST_PP_SEQ_SIZE_216\n# define BOOST_PP_SEQ_SIZE_216(_) BOOST_PP_SEQ_SIZE_217\n# define BOOST_PP_SEQ_SIZE_217(_) BOOST_PP_SEQ_SIZE_218\n# define BOOST_PP_SEQ_SIZE_218(_) BOOST_PP_SEQ_SIZE_219\n# define BOOST_PP_SEQ_SIZE_219(_) BOOST_PP_SEQ_SIZE_220\n# define BOOST_PP_SEQ_SIZE_220(_) BOOST_PP_SEQ_SIZE_221\n# define BOOST_PP_SEQ_SIZE_221(_) BOOST_PP_SEQ_SIZE_222\n# define BOOST_PP_SEQ_SIZE_222(_) BOOST_PP_SEQ_SIZE_223\n# define BOOST_PP_SEQ_SIZE_223(_) BOOST_PP_SEQ_SIZE_224\n# define BOOST_PP_SEQ_SIZE_224(_) BOOST_PP_SEQ_SIZE_225\n# define BOOST_PP_SEQ_SIZE_225(_) BOOST_PP_SEQ_SIZE_226\n# define BOOST_PP_SEQ_SIZE_226(_) BOOST_PP_SEQ_SIZE_227\n# define BOOST_PP_SEQ_SIZE_227(_) BOOST_PP_SEQ_SIZE_228\n# define BOOST_PP_SEQ_SIZE_228(_) BOOST_PP_SEQ_SIZE_229\n# define BOOST_PP_SEQ_SIZE_229(_) BOOST_PP_SEQ_SIZE_230\n# define BOOST_PP_SEQ_SIZE_230(_) BOOST_PP_SEQ_SIZE_231\n# define BOOST_PP_SEQ_SIZE_231(_) BOOST_PP_SEQ_SIZE_232\n# define BOOST_PP_SEQ_SIZE_232(_) BOOST_PP_SEQ_SIZE_233\n# define BOOST_PP_SEQ_SIZE_233(_) BOOST_PP_SEQ_SIZE_234\n# define BOOST_PP_SEQ_SIZE_234(_) BOOST_PP_SEQ_SIZE_235\n# define BOOST_PP_SEQ_SIZE_235(_) BOOST_PP_SEQ_SIZE_236\n# define BOOST_PP_SEQ_SIZE_236(_) BOOST_PP_SEQ_SIZE_237\n# define BOOST_PP_SEQ_SIZE_237(_) BOOST_PP_SEQ_SIZE_238\n# define BOOST_PP_SEQ_SIZE_238(_) BOOST_PP_SEQ_SIZE_239\n# define BOOST_PP_SEQ_SIZE_239(_) BOOST_PP_SEQ_SIZE_240\n# define BOOST_PP_SEQ_SIZE_240(_) BOOST_PP_SEQ_SIZE_241\n# define BOOST_PP_SEQ_SIZE_241(_) BOOST_PP_SEQ_SIZE_242\n# define BOOST_PP_SEQ_SIZE_242(_) BOOST_PP_SEQ_SIZE_243\n# define BOOST_PP_SEQ_SIZE_243(_) BOOST_PP_SEQ_SIZE_244\n# define BOOST_PP_SEQ_SIZE_244(_) BOOST_PP_SEQ_SIZE_245\n# define BOOST_PP_SEQ_SIZE_245(_) BOOST_PP_SEQ_SIZE_246\n# define BOOST_PP_SEQ_SIZE_246(_) BOOST_PP_SEQ_SIZE_247\n# define BOOST_PP_SEQ_SIZE_247(_) BOOST_PP_SEQ_SIZE_248\n# define BOOST_PP_SEQ_SIZE_248(_) BOOST_PP_SEQ_SIZE_249\n# define BOOST_PP_SEQ_SIZE_249(_) BOOST_PP_SEQ_SIZE_250\n# define BOOST_PP_SEQ_SIZE_250(_) BOOST_PP_SEQ_SIZE_251\n# define BOOST_PP_SEQ_SIZE_251(_) BOOST_PP_SEQ_SIZE_252\n# define BOOST_PP_SEQ_SIZE_252(_) BOOST_PP_SEQ_SIZE_253\n# define BOOST_PP_SEQ_SIZE_253(_) BOOST_PP_SEQ_SIZE_254\n# define BOOST_PP_SEQ_SIZE_254(_) BOOST_PP_SEQ_SIZE_255\n# define BOOST_PP_SEQ_SIZE_255(_) BOOST_PP_SEQ_SIZE_256\n# define BOOST_PP_SEQ_SIZE_256(_) BOOST_PP_SEQ_SIZE_257\n#\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_0 0\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_1 1\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_2 2\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_3 3\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_4 4\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_5 5\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_6 6\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_7 7\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_8 8\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_9 9\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_10 10\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_11 11\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_12 12\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_13 13\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_14 14\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_15 15\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_16 16\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_17 17\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_18 18\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_19 19\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_20 20\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_21 21\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_22 22\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_23 23\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_24 24\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_25 25\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_26 26\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_27 27\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_28 28\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_29 29\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_30 30\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_31 31\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_32 32\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_33 33\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_34 34\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_35 35\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_36 36\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_37 37\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_38 38\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_39 39\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_40 40\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_41 41\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_42 42\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_43 43\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_44 44\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_45 45\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_46 46\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_47 47\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_48 48\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_49 49\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_50 50\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_51 51\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_52 52\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_53 53\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_54 54\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_55 55\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_56 56\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_57 57\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_58 58\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_59 59\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_60 60\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_61 61\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_62 62\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_63 63\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_64 64\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_65 65\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_66 66\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_67 67\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_68 68\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_69 69\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_70 70\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_71 71\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_72 72\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_73 73\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_74 74\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_75 75\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_76 76\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_77 77\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_78 78\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_79 79\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_80 80\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_81 81\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_82 82\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_83 83\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_84 84\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_85 85\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_86 86\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_87 87\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_88 88\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_89 89\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_90 90\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_91 91\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_92 92\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_93 93\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_94 94\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_95 95\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_96 96\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_97 97\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_98 98\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_99 99\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_100 100\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_101 101\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_102 102\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_103 103\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_104 104\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_105 105\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_106 106\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_107 107\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_108 108\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_109 109\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_110 110\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_111 111\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_112 112\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_113 113\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_114 114\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_115 115\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_116 116\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_117 117\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_118 118\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_119 119\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_120 120\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_121 121\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_122 122\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_123 123\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_124 124\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_125 125\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_126 126\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_127 127\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_128 128\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_129 129\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_130 130\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_131 131\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_132 132\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_133 133\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_134 134\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_135 135\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_136 136\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_137 137\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_138 138\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_139 139\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_140 140\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_141 141\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_142 142\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_143 143\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_144 144\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_145 145\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_146 146\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_147 147\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_148 148\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_149 149\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_150 150\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_151 151\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_152 152\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_153 153\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_154 154\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_155 155\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_156 156\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_157 157\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_158 158\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_159 159\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_160 160\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_161 161\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_162 162\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_163 163\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_164 164\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_165 165\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_166 166\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_167 167\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_168 168\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_169 169\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_170 170\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_171 171\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_172 172\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_173 173\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_174 174\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_175 175\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_176 176\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_177 177\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_178 178\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_179 179\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_180 180\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_181 181\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_182 182\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_183 183\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_184 184\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_185 185\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_186 186\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_187 187\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_188 188\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_189 189\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_190 190\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_191 191\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_192 192\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_193 193\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_194 194\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_195 195\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_196 196\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_197 197\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_198 198\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_199 199\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_200 200\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_201 201\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_202 202\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_203 203\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_204 204\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_205 205\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_206 206\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_207 207\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_208 208\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_209 209\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_210 210\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_211 211\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_212 212\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_213 213\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_214 214\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_215 215\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_216 216\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_217 217\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_218 218\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_219 219\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_220 220\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_221 221\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_222 222\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_223 223\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_224 224\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_225 225\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_226 226\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_227 227\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_228 228\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_229 229\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_230 230\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_231 231\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_232 232\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_233 233\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_234 234\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_235 235\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_236 236\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_237 237\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_238 238\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_239 239\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_240 240\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_241 241\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_242 242\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_243 243\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_244 244\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_245 245\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_246 246\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_247 247\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_248 248\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_249 249\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_250 250\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_251 251\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_252 252\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_253 253\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_254 254\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_255 255\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_256 256\n# define BOOST_PP_SEQ_SIZE_BOOST_PP_SEQ_SIZE_257 257\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/subseq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_SUBSEQ_HPP\n# define BOOST_PREPROCESSOR_SEQ_SUBSEQ_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/rest_n.hpp>\n#\n# /* BOOST_PP_SEQ_SUBSEQ */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_SUBSEQ(seq, i, len) BOOST_PP_SEQ_FIRST_N(len, BOOST_PP_SEQ_REST_N(i, seq))\n# else\n#    define BOOST_PP_SEQ_SUBSEQ(seq, i, len) BOOST_PP_SEQ_SUBSEQ_I(seq, i, len)\n#    define BOOST_PP_SEQ_SUBSEQ_I(seq, i, len) BOOST_PP_SEQ_FIRST_N(len, BOOST_PP_SEQ_REST_N(i, seq))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/to_array.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_TO_ARRAY_HPP\n# define BOOST_PREPROCESSOR_SEQ_TO_ARRAY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/enum.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n#\n# /* BOOST_PP_SEQ_TO_ARRAY */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_TO_ARRAY(seq) (BOOST_PP_SEQ_SIZE(seq), (BOOST_PP_SEQ_ENUM(seq)))\n# else\n#    define BOOST_PP_SEQ_TO_ARRAY(seq) BOOST_PP_SEQ_TO_ARRAY_I(seq)\n#    define BOOST_PP_SEQ_TO_ARRAY_I(seq) (BOOST_PP_SEQ_SIZE(seq), (BOOST_PP_SEQ_ENUM(seq)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/to_list.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_TO_LIST_HPP\n# define BOOST_PREPROCESSOR_SEQ_TO_LIST_HPP\n#\n# include <boost/preprocessor/punctuation/comma.hpp>\n# include <boost/preprocessor/punctuation/paren.hpp>\n# include <boost/preprocessor/seq/detail/binary_transform.hpp>\n#\n# /* BOOST_PP_SEQ_TO_LIST */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/detail/to_list_msvc.hpp>\n# define BOOST_PP_SEQ_TO_LIST(seq) \\\n    BOOST_PP_SEQ_DETAIL_TO_LIST_MSVC \\\n        ( \\\n        BOOST_PP_SEQ_TO_LIST_I(BOOST_PP_SEQ_BINARY_TRANSFORM(seq)), \\\n        BOOST_PP_SEQ_SIZE(seq) \\\n        ) \\\n/**/\n# else\n# define BOOST_PP_SEQ_TO_LIST(seq) BOOST_PP_SEQ_TO_LIST_I(BOOST_PP_SEQ_BINARY_TRANSFORM(seq))\n# endif\n# define BOOST_PP_SEQ_TO_LIST_I(bseq) BOOST_PP_SEQ_TO_LIST_A bseq BOOST_PP_NIL BOOST_PP_SEQ_TO_LIST_B bseq\n# define BOOST_PP_SEQ_TO_LIST_A(m, e) m(BOOST_PP_LPAREN() e BOOST_PP_COMMA() BOOST_PP_SEQ_TO_LIST_A_ID)\n# define BOOST_PP_SEQ_TO_LIST_A_ID() BOOST_PP_SEQ_TO_LIST_A\n# define BOOST_PP_SEQ_TO_LIST_B(m, e) m(BOOST_PP_RPAREN() BOOST_PP_SEQ_TO_LIST_B_ID)\n# define BOOST_PP_SEQ_TO_LIST_B_ID() BOOST_PP_SEQ_TO_LIST_B\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/to_tuple.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_TO_TUPLE_HPP\n# define BOOST_PREPROCESSOR_SEQ_TO_TUPLE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/enum.hpp>\n#\n# /* BOOST_PP_SEQ_TO_TUPLE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_TO_TUPLE(seq) (BOOST_PP_SEQ_ENUM(seq))\n# else\n#    define BOOST_PP_SEQ_TO_TUPLE(seq) BOOST_PP_SEQ_TO_TUPLE_I(seq)\n#    define BOOST_PP_SEQ_TO_TUPLE_I(seq) (BOOST_PP_SEQ_ENUM(seq))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/transform.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_TRANSFORM_HPP\n# define BOOST_PREPROCESSOR_SEQ_TRANSFORM_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_SEQ_TRANSFORM */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_TRANSFORM(op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))\n# else\n#    define BOOST_PP_SEQ_TRANSFORM(op, data, seq) BOOST_PP_SEQ_TRANSFORM_I(op, data, seq)\n#    define BOOST_PP_SEQ_TRANSFORM_I(op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))\n# endif\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_STRICT()\n#    define BOOST_PP_SEQ_TRANSFORM_O(s, state, elem) BOOST_PP_SEQ_TRANSFORM_O_IM(s, BOOST_PP_TUPLE_REM_3 state, elem)\n#    define BOOST_PP_SEQ_TRANSFORM_O_IM(s, im, elem) BOOST_PP_SEQ_TRANSFORM_O_I(s, im, elem)\n# else\n#    define BOOST_PP_SEQ_TRANSFORM_O(s, state, elem) BOOST_PP_SEQ_TRANSFORM_O_I(s, BOOST_PP_TUPLE_ELEM(3, 0, state), BOOST_PP_TUPLE_ELEM(3, 1, state), BOOST_PP_TUPLE_ELEM(3, 2, state), elem)\n# endif\n#\n# define BOOST_PP_SEQ_TRANSFORM_O_I(s, op, data, res, elem) (op, data, res (op(s, data, elem)))\n#\n# /* BOOST_PP_SEQ_TRANSFORM_S */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#    define BOOST_PP_SEQ_TRANSFORM_S(s, op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))\n# else\n#    define BOOST_PP_SEQ_TRANSFORM_S(s, op, data, seq) BOOST_PP_SEQ_TRANSFORM_S_I(s, op, data, seq)\n#    define BOOST_PP_SEQ_TRANSFORM_S_I(s, op, data, seq) BOOST_PP_SEQ_TAIL(BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_FOLD_LEFT_ ## s(BOOST_PP_SEQ_TRANSFORM_O, (op, data, (nil)), seq)))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq/variadic_seq_to_seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2012.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_VARIADIC_SEQ_TO_SEQ_HPP\n# define BOOST_PREPROCESSOR_SEQ_VARIADIC_SEQ_TO_SEQ_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_SEQ_TO_SEQ */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ(vseq) BOOST_PP_CAT(BOOST_PP_VARIADIC_SEQ_TO_SEQ_A vseq, 0)\n#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_A(...) ((__VA_ARGS__)) BOOST_PP_VARIADIC_SEQ_TO_SEQ_B\n#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_B(...) ((__VA_ARGS__)) BOOST_PP_VARIADIC_SEQ_TO_SEQ_A\n#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_A0\n#    define BOOST_PP_VARIADIC_SEQ_TO_SEQ_B0\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SEQ_HPP\n# define BOOST_PREPROCESSOR_SEQ_HPP\n#\n# include <boost/preprocessor/seq/cat.hpp>\n# include <boost/preprocessor/seq/elem.hpp>\n# include <boost/preprocessor/seq/enum.hpp>\n# include <boost/preprocessor/seq/filter.hpp>\n# include <boost/preprocessor/seq/first_n.hpp>\n# include <boost/preprocessor/seq/fold_left.hpp>\n# include <boost/preprocessor/seq/fold_right.hpp>\n# include <boost/preprocessor/seq/for_each.hpp>\n# include <boost/preprocessor/seq/for_each_i.hpp>\n# include <boost/preprocessor/seq/for_each_product.hpp>\n# include <boost/preprocessor/seq/insert.hpp>\n# include <boost/preprocessor/seq/pop_back.hpp>\n# include <boost/preprocessor/seq/pop_front.hpp>\n# include <boost/preprocessor/seq/push_back.hpp>\n# include <boost/preprocessor/seq/push_front.hpp>\n# include <boost/preprocessor/seq/remove.hpp>\n# include <boost/preprocessor/seq/replace.hpp>\n# include <boost/preprocessor/seq/rest_n.hpp>\n# include <boost/preprocessor/seq/reverse.hpp>\n# include <boost/preprocessor/seq/seq.hpp>\n# include <boost/preprocessor/seq/size.hpp>\n# include <boost/preprocessor/seq/subseq.hpp>\n# include <boost/preprocessor/seq/to_array.hpp>\n# include <boost/preprocessor/seq/to_list.hpp>\n# include <boost/preprocessor/seq/to_tuple.hpp>\n# include <boost/preprocessor/seq/transform.hpp>\n# include <boost/preprocessor/seq/variadic_seq_to_seq.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/counter.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2005.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SLOT_COUNTER_HPP\n# define BOOST_PREPROCESSOR_SLOT_COUNTER_HPP\n#\n# include <boost/preprocessor/slot/detail/def.hpp>\n#\n# /* BOOST_PP_COUNTER */\n#\n# define BOOST_PP_COUNTER 0\n#\n# /* BOOST_PP_UPDATE_COUNTER */\n#\n# define BOOST_PP_UPDATE_COUNTER() <boost/preprocessor/slot/detail/counter.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/counter.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2005.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# define BOOST_PP_VALUE BOOST_PP_COUNTER + 1\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_COUNTER\n#\n# undef BOOST_PP_COUNTER_DIGIT_1\n# undef BOOST_PP_COUNTER_DIGIT_2\n# undef BOOST_PP_COUNTER_DIGIT_3\n# undef BOOST_PP_COUNTER_DIGIT_4\n# undef BOOST_PP_COUNTER_DIGIT_5\n# undef BOOST_PP_COUNTER_DIGIT_6\n# undef BOOST_PP_COUNTER_DIGIT_7\n# undef BOOST_PP_COUNTER_DIGIT_8\n# undef BOOST_PP_COUNTER_DIGIT_9\n# undef BOOST_PP_COUNTER_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_COUNTER_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_COUNTER_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_COUNTER_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_COUNTER_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_COUNTER_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_COUNTER_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_COUNTER_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_COUNTER_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_COUNTER_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_COUNTER_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_COUNTER_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_COUNTER_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_COUNTER_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_COUNTER_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_COUNTER_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_COUNTER_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_COUNTER_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_COUNTER_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_COUNTER_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_COUNTER_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_COUNTER_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_COUNTER_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_COUNTER_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_COUNTER_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_COUNTER_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_COUNTER_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_COUNTER_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_COUNTER_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_COUNTER_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_COUNTER_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_COUNTER_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_COUNTER_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_COUNTER_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_COUNTER_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_COUNTER_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_COUNTER_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_COUNTER_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_COUNTER_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_COUNTER_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_COUNTER_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_COUNTER_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_COUNTER_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_COUNTER_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_COUNTER_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_COUNTER_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_COUNTER_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_COUNTER_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_COUNTER_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_COUNTER_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_COUNTER_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_COUNTER_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_COUNTER_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_COUNTER_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_COUNTER_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_COUNTER_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_COUNTER_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_COUNTER_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_COUNTER_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_COUNTER_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_COUNTER_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_COUNTER_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_COUNTER_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_COUNTER_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_COUNTER_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_COUNTER_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_COUNTER_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_COUNTER_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_COUNTER_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_COUNTER_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_COUNTER_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_COUNTER_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_COUNTER_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_COUNTER_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_COUNTER_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_COUNTER_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_COUNTER_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_COUNTER_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_COUNTER_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_COUNTER_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_COUNTER_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_COUNTER_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_COUNTER_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_COUNTER_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_COUNTER_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_COUNTER_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_COUNTER_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_COUNTER_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_COUNTER_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_COUNTER_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_COUNTER_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_COUNTER_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_COUNTER_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_COUNTER_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_COUNTER_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_COUNTER_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_COUNTER_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_COUNTER_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_COUNTER_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_COUNTER_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_COUNTER_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_COUNTER_DIGIT_10\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_10(BOOST_PP_COUNTER_DIGIT_10, BOOST_PP_COUNTER_DIGIT_9, BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_9\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_9(BOOST_PP_COUNTER_DIGIT_9, BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_8\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_8(BOOST_PP_COUNTER_DIGIT_8, BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_7\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_7(BOOST_PP_COUNTER_DIGIT_7, BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_6\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_6(BOOST_PP_COUNTER_DIGIT_6, BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_5\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_5(BOOST_PP_COUNTER_DIGIT_5, BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_4\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_4(BOOST_PP_COUNTER_DIGIT_4, BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_3\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_3(BOOST_PP_COUNTER_DIGIT_3, BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# elif BOOST_PP_COUNTER_DIGIT_2\n#    define BOOST_PP_COUNTER BOOST_PP_SLOT_CC_2(BOOST_PP_COUNTER_DIGIT_2, BOOST_PP_COUNTER_DIGIT_1)\n# else\n#    define BOOST_PP_COUNTER BOOST_PP_COUNTER_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/def.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SLOT_DETAIL_DEF_HPP\n# define BOOST_PREPROCESSOR_SLOT_DETAIL_DEF_HPP\n#\n# /* BOOST_PP_SLOT_OFFSET_x */\n#\n# define BOOST_PP_SLOT_OFFSET_10(x) (x) % 1000000000UL\n# define BOOST_PP_SLOT_OFFSET_9(x) BOOST_PP_SLOT_OFFSET_10(x) % 100000000UL\n# define BOOST_PP_SLOT_OFFSET_8(x) BOOST_PP_SLOT_OFFSET_9(x) % 10000000UL\n# define BOOST_PP_SLOT_OFFSET_7(x) BOOST_PP_SLOT_OFFSET_8(x) % 1000000UL\n# define BOOST_PP_SLOT_OFFSET_6(x) BOOST_PP_SLOT_OFFSET_7(x) % 100000UL\n# define BOOST_PP_SLOT_OFFSET_5(x) BOOST_PP_SLOT_OFFSET_6(x) % 10000UL\n# define BOOST_PP_SLOT_OFFSET_4(x) BOOST_PP_SLOT_OFFSET_5(x) % 1000UL\n# define BOOST_PP_SLOT_OFFSET_3(x) BOOST_PP_SLOT_OFFSET_4(x) % 100UL\n# define BOOST_PP_SLOT_OFFSET_2(x) BOOST_PP_SLOT_OFFSET_3(x) % 10UL\n#\n# /* BOOST_PP_SLOT_CC_x */\n#\n# define BOOST_PP_SLOT_CC_2(a, b) BOOST_PP_SLOT_CC_2_D(a, b)\n# define BOOST_PP_SLOT_CC_3(a, b, c) BOOST_PP_SLOT_CC_3_D(a, b, c)\n# define BOOST_PP_SLOT_CC_4(a, b, c, d) BOOST_PP_SLOT_CC_4_D(a, b, c, d)\n# define BOOST_PP_SLOT_CC_5(a, b, c, d, e) BOOST_PP_SLOT_CC_5_D(a, b, c, d, e)\n# define BOOST_PP_SLOT_CC_6(a, b, c, d, e, f) BOOST_PP_SLOT_CC_6_D(a, b, c, d, e, f)\n# define BOOST_PP_SLOT_CC_7(a, b, c, d, e, f, g) BOOST_PP_SLOT_CC_7_D(a, b, c, d, e, f, g)\n# define BOOST_PP_SLOT_CC_8(a, b, c, d, e, f, g, h) BOOST_PP_SLOT_CC_8_D(a, b, c, d, e, f, g, h)\n# define BOOST_PP_SLOT_CC_9(a, b, c, d, e, f, g, h, i) BOOST_PP_SLOT_CC_9_D(a, b, c, d, e, f, g, h, i)\n# define BOOST_PP_SLOT_CC_10(a, b, c, d, e, f, g, h, i, j) BOOST_PP_SLOT_CC_10_D(a, b, c, d, e, f, g, h, i, j)\n#\n# define BOOST_PP_SLOT_CC_2_D(a, b) a ## b\n# define BOOST_PP_SLOT_CC_3_D(a, b, c) a ## b ## c\n# define BOOST_PP_SLOT_CC_4_D(a, b, c, d) a ## b ## c ## d\n# define BOOST_PP_SLOT_CC_5_D(a, b, c, d, e) a ## b ## c ## d ## e\n# define BOOST_PP_SLOT_CC_6_D(a, b, c, d, e, f) a ## b ## c ## d ## e ## f\n# define BOOST_PP_SLOT_CC_7_D(a, b, c, d, e, f, g) a ## b ## c ## d ## e ## f ## g\n# define BOOST_PP_SLOT_CC_8_D(a, b, c, d, e, f, g, h) a ## b ## c ## d ## e ## f ## g ## h\n# define BOOST_PP_SLOT_CC_9_D(a, b, c, d, e, f, g, h, i) a ## b ## c ## d ## e ## f ## g ## h ## i\n# define BOOST_PP_SLOT_CC_10_D(a, b, c, d, e, f, g, h, i, j) a ## b ## c ## d ## e ## f ## g ## h ## i ## j\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/shared.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PP_VALUE\n#    error BOOST_PP_ERROR:  BOOST_PP_VALUE is not defined\n# endif\n#\n# undef BOOST_PP_SLOT_TEMP_1\n# undef BOOST_PP_SLOT_TEMP_2\n# undef BOOST_PP_SLOT_TEMP_3\n# undef BOOST_PP_SLOT_TEMP_4\n# undef BOOST_PP_SLOT_TEMP_5\n# undef BOOST_PP_SLOT_TEMP_6\n# undef BOOST_PP_SLOT_TEMP_7\n# undef BOOST_PP_SLOT_TEMP_8\n# undef BOOST_PP_SLOT_TEMP_9\n# undef BOOST_PP_SLOT_TEMP_10\n#\n# if (BOOST_PP_VALUE) / 1000000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_10 0\n# elif (BOOST_PP_VALUE) / 1000000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_10 1\n# elif (BOOST_PP_VALUE) / 1000000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_10 2\n# elif (BOOST_PP_VALUE) / 1000000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_10 3\n# elif (BOOST_PP_VALUE) / 1000000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_10 4\n# elif (BOOST_PP_VALUE) / 1000000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_10 5\n# elif (BOOST_PP_VALUE) / 1000000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_10 6\n# elif (BOOST_PP_VALUE) / 1000000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_10 7\n# elif (BOOST_PP_VALUE) / 1000000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_10 8\n# elif (BOOST_PP_VALUE) / 1000000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_10 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_9 0\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_9 1\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_9 2\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_9 3\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_9 4\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_9 5\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_9 6\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_9 7\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_9 8\n# elif BOOST_PP_SLOT_OFFSET_10(BOOST_PP_VALUE) / 100000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_9 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_8 0\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_8 1\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_8 2\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_8 3\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_8 4\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_8 5\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_8 6\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_8 7\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_8 8\n# elif BOOST_PP_SLOT_OFFSET_9(BOOST_PP_VALUE) / 10000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_8 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 0\n#    define BOOST_PP_SLOT_TEMP_7 0\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 1\n#    define BOOST_PP_SLOT_TEMP_7 1\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 2\n#    define BOOST_PP_SLOT_TEMP_7 2\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 3\n#    define BOOST_PP_SLOT_TEMP_7 3\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 4\n#    define BOOST_PP_SLOT_TEMP_7 4\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 5\n#    define BOOST_PP_SLOT_TEMP_7 5\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 6\n#    define BOOST_PP_SLOT_TEMP_7 6\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 7\n#    define BOOST_PP_SLOT_TEMP_7 7\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 8\n#    define BOOST_PP_SLOT_TEMP_7 8\n# elif BOOST_PP_SLOT_OFFSET_8(BOOST_PP_VALUE) / 1000000UL == 9\n#    define BOOST_PP_SLOT_TEMP_7 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 0\n#    define BOOST_PP_SLOT_TEMP_6 0\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 1\n#    define BOOST_PP_SLOT_TEMP_6 1\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 2\n#    define BOOST_PP_SLOT_TEMP_6 2\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 3\n#    define BOOST_PP_SLOT_TEMP_6 3\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 4\n#    define BOOST_PP_SLOT_TEMP_6 4\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 5\n#    define BOOST_PP_SLOT_TEMP_6 5\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 6\n#    define BOOST_PP_SLOT_TEMP_6 6\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 7\n#    define BOOST_PP_SLOT_TEMP_6 7\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 8\n#    define BOOST_PP_SLOT_TEMP_6 8\n# elif BOOST_PP_SLOT_OFFSET_7(BOOST_PP_VALUE) / 100000UL == 9\n#    define BOOST_PP_SLOT_TEMP_6 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 0\n#    define BOOST_PP_SLOT_TEMP_5 0\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 1\n#    define BOOST_PP_SLOT_TEMP_5 1\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 2\n#    define BOOST_PP_SLOT_TEMP_5 2\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 3\n#    define BOOST_PP_SLOT_TEMP_5 3\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 4\n#    define BOOST_PP_SLOT_TEMP_5 4\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 5\n#    define BOOST_PP_SLOT_TEMP_5 5\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 6\n#    define BOOST_PP_SLOT_TEMP_5 6\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 7\n#    define BOOST_PP_SLOT_TEMP_5 7\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 8\n#    define BOOST_PP_SLOT_TEMP_5 8\n# elif BOOST_PP_SLOT_OFFSET_6(BOOST_PP_VALUE) / 10000UL == 9\n#    define BOOST_PP_SLOT_TEMP_5 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 0\n#    define BOOST_PP_SLOT_TEMP_4 0\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 1\n#    define BOOST_PP_SLOT_TEMP_4 1\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 2\n#    define BOOST_PP_SLOT_TEMP_4 2\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 3\n#    define BOOST_PP_SLOT_TEMP_4 3\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 4\n#    define BOOST_PP_SLOT_TEMP_4 4\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 5\n#    define BOOST_PP_SLOT_TEMP_4 5\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 6\n#    define BOOST_PP_SLOT_TEMP_4 6\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 7\n#    define BOOST_PP_SLOT_TEMP_4 7\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 8\n#    define BOOST_PP_SLOT_TEMP_4 8\n# elif BOOST_PP_SLOT_OFFSET_5(BOOST_PP_VALUE) / 1000UL == 9\n#    define BOOST_PP_SLOT_TEMP_4 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 0\n#    define BOOST_PP_SLOT_TEMP_3 0\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 1\n#    define BOOST_PP_SLOT_TEMP_3 1\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 2\n#    define BOOST_PP_SLOT_TEMP_3 2\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 3\n#    define BOOST_PP_SLOT_TEMP_3 3\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 4\n#    define BOOST_PP_SLOT_TEMP_3 4\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 5\n#    define BOOST_PP_SLOT_TEMP_3 5\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 6\n#    define BOOST_PP_SLOT_TEMP_3 6\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 7\n#    define BOOST_PP_SLOT_TEMP_3 7\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 8\n#    define BOOST_PP_SLOT_TEMP_3 8\n# elif BOOST_PP_SLOT_OFFSET_4(BOOST_PP_VALUE) / 100UL == 9\n#    define BOOST_PP_SLOT_TEMP_3 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 0\n#    define BOOST_PP_SLOT_TEMP_2 0\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 1\n#    define BOOST_PP_SLOT_TEMP_2 1\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 2\n#    define BOOST_PP_SLOT_TEMP_2 2\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 3\n#    define BOOST_PP_SLOT_TEMP_2 3\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 4\n#    define BOOST_PP_SLOT_TEMP_2 4\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 5\n#    define BOOST_PP_SLOT_TEMP_2 5\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 6\n#    define BOOST_PP_SLOT_TEMP_2 6\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 7\n#    define BOOST_PP_SLOT_TEMP_2 7\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 8\n#    define BOOST_PP_SLOT_TEMP_2 8\n# elif BOOST_PP_SLOT_OFFSET_3(BOOST_PP_VALUE) / 10UL == 9\n#    define BOOST_PP_SLOT_TEMP_2 9\n# endif\n#\n# if BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 0\n#    define BOOST_PP_SLOT_TEMP_1 0\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 1\n#    define BOOST_PP_SLOT_TEMP_1 1\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 2\n#    define BOOST_PP_SLOT_TEMP_1 2\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 3\n#    define BOOST_PP_SLOT_TEMP_1 3\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 4\n#    define BOOST_PP_SLOT_TEMP_1 4\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 5\n#    define BOOST_PP_SLOT_TEMP_1 5\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 6\n#    define BOOST_PP_SLOT_TEMP_1 6\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 7\n#    define BOOST_PP_SLOT_TEMP_1 7\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 8\n#    define BOOST_PP_SLOT_TEMP_1 8\n# elif BOOST_PP_SLOT_OFFSET_2(BOOST_PP_VALUE) == 9\n#    define BOOST_PP_SLOT_TEMP_1 9\n# endif\n#\n# undef BOOST_PP_VALUE\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/slot1.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_1\n#\n# undef BOOST_PP_SLOT_1_DIGIT_1\n# undef BOOST_PP_SLOT_1_DIGIT_2\n# undef BOOST_PP_SLOT_1_DIGIT_3\n# undef BOOST_PP_SLOT_1_DIGIT_4\n# undef BOOST_PP_SLOT_1_DIGIT_5\n# undef BOOST_PP_SLOT_1_DIGIT_6\n# undef BOOST_PP_SLOT_1_DIGIT_7\n# undef BOOST_PP_SLOT_1_DIGIT_8\n# undef BOOST_PP_SLOT_1_DIGIT_9\n# undef BOOST_PP_SLOT_1_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_1_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_1_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_1_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_1_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_1_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_1_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_1_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_1_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_1_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_1_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_1_DIGIT_10\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_1_DIGIT_10, BOOST_PP_SLOT_1_DIGIT_9, BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_9\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_1_DIGIT_9, BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_8\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_1_DIGIT_8, BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_7\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_1_DIGIT_7, BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_6\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_1_DIGIT_6, BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_5\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_1_DIGIT_5, BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_4\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_1_DIGIT_4, BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_3\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_1_DIGIT_3, BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# elif BOOST_PP_SLOT_1_DIGIT_2\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_1_DIGIT_2, BOOST_PP_SLOT_1_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_1() BOOST_PP_SLOT_1_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/slot2.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_2\n#\n# undef BOOST_PP_SLOT_2_DIGIT_1\n# undef BOOST_PP_SLOT_2_DIGIT_2\n# undef BOOST_PP_SLOT_2_DIGIT_3\n# undef BOOST_PP_SLOT_2_DIGIT_4\n# undef BOOST_PP_SLOT_2_DIGIT_5\n# undef BOOST_PP_SLOT_2_DIGIT_6\n# undef BOOST_PP_SLOT_2_DIGIT_7\n# undef BOOST_PP_SLOT_2_DIGIT_8\n# undef BOOST_PP_SLOT_2_DIGIT_9\n# undef BOOST_PP_SLOT_2_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_2_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_2_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_2_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_2_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_2_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_2_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_2_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_2_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_2_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_2_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_2_DIGIT_10\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_2_DIGIT_10, BOOST_PP_SLOT_2_DIGIT_9, BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_9\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_2_DIGIT_9, BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_8\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_2_DIGIT_8, BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_7\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_2_DIGIT_7, BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_6\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_2_DIGIT_6, BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_5\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_2_DIGIT_5, BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_4\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_2_DIGIT_4, BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_3\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_2_DIGIT_3, BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# elif BOOST_PP_SLOT_2_DIGIT_2\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_2_DIGIT_2, BOOST_PP_SLOT_2_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_2() BOOST_PP_SLOT_2_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/slot3.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_3\n#\n# undef BOOST_PP_SLOT_3_DIGIT_1\n# undef BOOST_PP_SLOT_3_DIGIT_2\n# undef BOOST_PP_SLOT_3_DIGIT_3\n# undef BOOST_PP_SLOT_3_DIGIT_4\n# undef BOOST_PP_SLOT_3_DIGIT_5\n# undef BOOST_PP_SLOT_3_DIGIT_6\n# undef BOOST_PP_SLOT_3_DIGIT_7\n# undef BOOST_PP_SLOT_3_DIGIT_8\n# undef BOOST_PP_SLOT_3_DIGIT_9\n# undef BOOST_PP_SLOT_3_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_3_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_3_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_3_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_3_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_3_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_3_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_3_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_3_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_3_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_3_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_3_DIGIT_10\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_3_DIGIT_10, BOOST_PP_SLOT_3_DIGIT_9, BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_9\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_3_DIGIT_9, BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_8\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_3_DIGIT_8, BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_7\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_3_DIGIT_7, BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_6\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_3_DIGIT_6, BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_5\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_3_DIGIT_5, BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_4\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_3_DIGIT_4, BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_3\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_3_DIGIT_3, BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# elif BOOST_PP_SLOT_3_DIGIT_2\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_3_DIGIT_2, BOOST_PP_SLOT_3_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_3() BOOST_PP_SLOT_3_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/slot4.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_4\n#\n# undef BOOST_PP_SLOT_4_DIGIT_1\n# undef BOOST_PP_SLOT_4_DIGIT_2\n# undef BOOST_PP_SLOT_4_DIGIT_3\n# undef BOOST_PP_SLOT_4_DIGIT_4\n# undef BOOST_PP_SLOT_4_DIGIT_5\n# undef BOOST_PP_SLOT_4_DIGIT_6\n# undef BOOST_PP_SLOT_4_DIGIT_7\n# undef BOOST_PP_SLOT_4_DIGIT_8\n# undef BOOST_PP_SLOT_4_DIGIT_9\n# undef BOOST_PP_SLOT_4_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_4_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_4_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_4_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_4_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_4_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_4_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_4_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_4_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_4_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_4_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_4_DIGIT_10\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_4_DIGIT_10, BOOST_PP_SLOT_4_DIGIT_9, BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_9\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_4_DIGIT_9, BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_8\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_4_DIGIT_8, BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_7\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_4_DIGIT_7, BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_6\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_4_DIGIT_6, BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_5\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_4_DIGIT_5, BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_4\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_4_DIGIT_4, BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_3\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_4_DIGIT_3, BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# elif BOOST_PP_SLOT_4_DIGIT_2\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_4_DIGIT_2, BOOST_PP_SLOT_4_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_4() BOOST_PP_SLOT_4_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/detail/slot5.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# include <boost/preprocessor/slot/detail/shared.hpp>\n#\n# undef BOOST_PP_SLOT_5\n#\n# undef BOOST_PP_SLOT_5_DIGIT_1\n# undef BOOST_PP_SLOT_5_DIGIT_2\n# undef BOOST_PP_SLOT_5_DIGIT_3\n# undef BOOST_PP_SLOT_5_DIGIT_4\n# undef BOOST_PP_SLOT_5_DIGIT_5\n# undef BOOST_PP_SLOT_5_DIGIT_6\n# undef BOOST_PP_SLOT_5_DIGIT_7\n# undef BOOST_PP_SLOT_5_DIGIT_8\n# undef BOOST_PP_SLOT_5_DIGIT_9\n# undef BOOST_PP_SLOT_5_DIGIT_10\n#\n# if BOOST_PP_SLOT_TEMP_10 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_10 0\n# elif BOOST_PP_SLOT_TEMP_10 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_10 1\n# elif BOOST_PP_SLOT_TEMP_10 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_10 2\n# elif BOOST_PP_SLOT_TEMP_10 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_10 3\n# elif BOOST_PP_SLOT_TEMP_10 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_10 4\n# elif BOOST_PP_SLOT_TEMP_10 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_10 5\n# elif BOOST_PP_SLOT_TEMP_10 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_10 6\n# elif BOOST_PP_SLOT_TEMP_10 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_10 7\n# elif BOOST_PP_SLOT_TEMP_10 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_10 8\n# elif BOOST_PP_SLOT_TEMP_10 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_10 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_9 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_9 0\n# elif BOOST_PP_SLOT_TEMP_9 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_9 1\n# elif BOOST_PP_SLOT_TEMP_9 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_9 2\n# elif BOOST_PP_SLOT_TEMP_9 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_9 3\n# elif BOOST_PP_SLOT_TEMP_9 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_9 4\n# elif BOOST_PP_SLOT_TEMP_9 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_9 5\n# elif BOOST_PP_SLOT_TEMP_9 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_9 6\n# elif BOOST_PP_SLOT_TEMP_9 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_9 7\n# elif BOOST_PP_SLOT_TEMP_9 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_9 8\n# elif BOOST_PP_SLOT_TEMP_9 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_9 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_8 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_8 0\n# elif BOOST_PP_SLOT_TEMP_8 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_8 1\n# elif BOOST_PP_SLOT_TEMP_8 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_8 2\n# elif BOOST_PP_SLOT_TEMP_8 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_8 3\n# elif BOOST_PP_SLOT_TEMP_8 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_8 4\n# elif BOOST_PP_SLOT_TEMP_8 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_8 5\n# elif BOOST_PP_SLOT_TEMP_8 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_8 6\n# elif BOOST_PP_SLOT_TEMP_8 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_8 7\n# elif BOOST_PP_SLOT_TEMP_8 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_8 8\n# elif BOOST_PP_SLOT_TEMP_8 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_8 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_7 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_7 0\n# elif BOOST_PP_SLOT_TEMP_7 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_7 1\n# elif BOOST_PP_SLOT_TEMP_7 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_7 2\n# elif BOOST_PP_SLOT_TEMP_7 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_7 3\n# elif BOOST_PP_SLOT_TEMP_7 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_7 4\n# elif BOOST_PP_SLOT_TEMP_7 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_7 5\n# elif BOOST_PP_SLOT_TEMP_7 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_7 6\n# elif BOOST_PP_SLOT_TEMP_7 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_7 7\n# elif BOOST_PP_SLOT_TEMP_7 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_7 8\n# elif BOOST_PP_SLOT_TEMP_7 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_7 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_6 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_6 0\n# elif BOOST_PP_SLOT_TEMP_6 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_6 1\n# elif BOOST_PP_SLOT_TEMP_6 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_6 2\n# elif BOOST_PP_SLOT_TEMP_6 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_6 3\n# elif BOOST_PP_SLOT_TEMP_6 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_6 4\n# elif BOOST_PP_SLOT_TEMP_6 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_6 5\n# elif BOOST_PP_SLOT_TEMP_6 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_6 6\n# elif BOOST_PP_SLOT_TEMP_6 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_6 7\n# elif BOOST_PP_SLOT_TEMP_6 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_6 8\n# elif BOOST_PP_SLOT_TEMP_6 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_6 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_5 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_5 0\n# elif BOOST_PP_SLOT_TEMP_5 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_5 1\n# elif BOOST_PP_SLOT_TEMP_5 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_5 2\n# elif BOOST_PP_SLOT_TEMP_5 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_5 3\n# elif BOOST_PP_SLOT_TEMP_5 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_5 4\n# elif BOOST_PP_SLOT_TEMP_5 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_5 5\n# elif BOOST_PP_SLOT_TEMP_5 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_5 6\n# elif BOOST_PP_SLOT_TEMP_5 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_5 7\n# elif BOOST_PP_SLOT_TEMP_5 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_5 8\n# elif BOOST_PP_SLOT_TEMP_5 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_5 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_4 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_4 0\n# elif BOOST_PP_SLOT_TEMP_4 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_4 1\n# elif BOOST_PP_SLOT_TEMP_4 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_4 2\n# elif BOOST_PP_SLOT_TEMP_4 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_4 3\n# elif BOOST_PP_SLOT_TEMP_4 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_4 4\n# elif BOOST_PP_SLOT_TEMP_4 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_4 5\n# elif BOOST_PP_SLOT_TEMP_4 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_4 6\n# elif BOOST_PP_SLOT_TEMP_4 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_4 7\n# elif BOOST_PP_SLOT_TEMP_4 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_4 8\n# elif BOOST_PP_SLOT_TEMP_4 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_4 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_3 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_3 0\n# elif BOOST_PP_SLOT_TEMP_3 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_3 1\n# elif BOOST_PP_SLOT_TEMP_3 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_3 2\n# elif BOOST_PP_SLOT_TEMP_3 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_3 3\n# elif BOOST_PP_SLOT_TEMP_3 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_3 4\n# elif BOOST_PP_SLOT_TEMP_3 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_3 5\n# elif BOOST_PP_SLOT_TEMP_3 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_3 6\n# elif BOOST_PP_SLOT_TEMP_3 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_3 7\n# elif BOOST_PP_SLOT_TEMP_3 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_3 8\n# elif BOOST_PP_SLOT_TEMP_3 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_3 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_2 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_2 0\n# elif BOOST_PP_SLOT_TEMP_2 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_2 1\n# elif BOOST_PP_SLOT_TEMP_2 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_2 2\n# elif BOOST_PP_SLOT_TEMP_2 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_2 3\n# elif BOOST_PP_SLOT_TEMP_2 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_2 4\n# elif BOOST_PP_SLOT_TEMP_2 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_2 5\n# elif BOOST_PP_SLOT_TEMP_2 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_2 6\n# elif BOOST_PP_SLOT_TEMP_2 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_2 7\n# elif BOOST_PP_SLOT_TEMP_2 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_2 8\n# elif BOOST_PP_SLOT_TEMP_2 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_2 9\n# endif\n#\n# if BOOST_PP_SLOT_TEMP_1 == 0\n#    define BOOST_PP_SLOT_5_DIGIT_1 0\n# elif BOOST_PP_SLOT_TEMP_1 == 1\n#    define BOOST_PP_SLOT_5_DIGIT_1 1\n# elif BOOST_PP_SLOT_TEMP_1 == 2\n#    define BOOST_PP_SLOT_5_DIGIT_1 2\n# elif BOOST_PP_SLOT_TEMP_1 == 3\n#    define BOOST_PP_SLOT_5_DIGIT_1 3\n# elif BOOST_PP_SLOT_TEMP_1 == 4\n#    define BOOST_PP_SLOT_5_DIGIT_1 4\n# elif BOOST_PP_SLOT_TEMP_1 == 5\n#    define BOOST_PP_SLOT_5_DIGIT_1 5\n# elif BOOST_PP_SLOT_TEMP_1 == 6\n#    define BOOST_PP_SLOT_5_DIGIT_1 6\n# elif BOOST_PP_SLOT_TEMP_1 == 7\n#    define BOOST_PP_SLOT_5_DIGIT_1 7\n# elif BOOST_PP_SLOT_TEMP_1 == 8\n#    define BOOST_PP_SLOT_5_DIGIT_1 8\n# elif BOOST_PP_SLOT_TEMP_1 == 9\n#    define BOOST_PP_SLOT_5_DIGIT_1 9\n# endif\n#\n# if BOOST_PP_SLOT_5_DIGIT_10\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_10(BOOST_PP_SLOT_5_DIGIT_10, BOOST_PP_SLOT_5_DIGIT_9, BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_9\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_9(BOOST_PP_SLOT_5_DIGIT_9, BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_8\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_8(BOOST_PP_SLOT_5_DIGIT_8, BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_7\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_7(BOOST_PP_SLOT_5_DIGIT_7, BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_6\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_6(BOOST_PP_SLOT_5_DIGIT_6, BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_5\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_5(BOOST_PP_SLOT_5_DIGIT_5, BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_4\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_4(BOOST_PP_SLOT_5_DIGIT_4, BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_3\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_3(BOOST_PP_SLOT_5_DIGIT_3, BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# elif BOOST_PP_SLOT_5_DIGIT_2\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_CC_2(BOOST_PP_SLOT_5_DIGIT_2, BOOST_PP_SLOT_5_DIGIT_1)\n# else\n#    define BOOST_PP_SLOT_5() BOOST_PP_SLOT_5_DIGIT_1\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot/slot.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SLOT_SLOT_HPP\n# define BOOST_PREPROCESSOR_SLOT_SLOT_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/slot/detail/def.hpp>\n#\n# /* BOOST_PP_ASSIGN_SLOT */\n#\n# define BOOST_PP_ASSIGN_SLOT(i) BOOST_PP_CAT(BOOST_PP_ASSIGN_SLOT_, i)\n#\n# define BOOST_PP_ASSIGN_SLOT_1 <boost/preprocessor/slot/detail/slot1.hpp>\n# define BOOST_PP_ASSIGN_SLOT_2 <boost/preprocessor/slot/detail/slot2.hpp>\n# define BOOST_PP_ASSIGN_SLOT_3 <boost/preprocessor/slot/detail/slot3.hpp>\n# define BOOST_PP_ASSIGN_SLOT_4 <boost/preprocessor/slot/detail/slot4.hpp>\n# define BOOST_PP_ASSIGN_SLOT_5 <boost/preprocessor/slot/detail/slot5.hpp>\n#\n# /* BOOST_PP_SLOT */\n#\n# define BOOST_PP_SLOT(i) BOOST_PP_CAT(BOOST_PP_SLOT_, i)()\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/slot.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_SLOT_HPP\n# define BOOST_PREPROCESSOR_SLOT_HPP\n#\n# include <boost/preprocessor/slot/slot.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/stringize.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_STRINGIZE_HPP\n# define BOOST_PREPROCESSOR_STRINGIZE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_STRINGIZE */\n#\n# if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_A((text))\n#    define BOOST_PP_STRINGIZE_A(arg) BOOST_PP_STRINGIZE_I arg\n# elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_OO((text))\n#    define BOOST_PP_STRINGIZE_OO(par) BOOST_PP_STRINGIZE_I ## par\n# else\n#    define BOOST_PP_STRINGIZE(text) BOOST_PP_STRINGIZE_I(text)\n# endif\n#\n# define BOOST_PP_STRINGIZE_I(text) #text\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/detail/is_single_return.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP\n# define BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_TUPLE_IS_SINGLE_RETURN */\n#\n# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/facilities/is_1.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# define BOOST_PP_TUPLE_IS_SINGLE_RETURN(sr,nsr,tuple)\t\\\n\tBOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_TUPLE_SIZE(tuple)),sr,nsr) \\\n\t/**/\n# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */\n#\n# endif /* BOOST_PREPROCESSOR_TUPLE_DETAIL_IS_SINGLE_RETURN_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/eat.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011,2015) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_EAT_HPP\n# define BOOST_PREPROCESSOR_TUPLE_EAT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_EAT */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_EAT(...)\n# else\n#    define BOOST_PP_EAT(x)\n# endif\n#\n# /* BOOST_PP_TUPLE_EAT */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_TUPLE_EAT(size) BOOST_PP_EAT\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_EAT(size) BOOST_PP_TUPLE_EAT_I(size)\n#    else\n#        define BOOST_PP_TUPLE_EAT(size) BOOST_PP_TUPLE_EAT_OO((size))\n#        define BOOST_PP_TUPLE_EAT_OO(par) BOOST_PP_TUPLE_EAT_I ## par\n#    endif\n#    define BOOST_PP_TUPLE_EAT_I(size) BOOST_PP_TUPLE_EAT_ ## size\n# endif\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#     define BOOST_PP_TUPLE_EAT_N(size) BOOST_PP_TUPLE_EAT_N_I(size)\n# else\n#     define BOOST_PP_TUPLE_EAT_N(size) BOOST_PP_TUPLE_EAT_N_OO((size))\n#     define BOOST_PP_TUPLE_EAT_N_OO(par) BOOST_PP_TUPLE_EAT_N_I ## par\n# endif\n# define BOOST_PP_TUPLE_EAT_N_I(size) BOOST_PP_TUPLE_EAT_ ## size\n#\n# define BOOST_PP_TUPLE_EAT_1(e0)\n# define BOOST_PP_TUPLE_EAT_2(e0, e1)\n# define BOOST_PP_TUPLE_EAT_3(e0, e1, e2)\n# define BOOST_PP_TUPLE_EAT_4(e0, e1, e2, e3)\n# define BOOST_PP_TUPLE_EAT_5(e0, e1, e2, e3, e4)\n# define BOOST_PP_TUPLE_EAT_6(e0, e1, e2, e3, e4, e5)\n# define BOOST_PP_TUPLE_EAT_7(e0, e1, e2, e3, e4, e5, e6)\n# define BOOST_PP_TUPLE_EAT_8(e0, e1, e2, e3, e4, e5, e6, e7)\n# define BOOST_PP_TUPLE_EAT_9(e0, e1, e2, e3, e4, e5, e6, e7, e8)\n# define BOOST_PP_TUPLE_EAT_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)\n# define BOOST_PP_TUPLE_EAT_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10)\n# define BOOST_PP_TUPLE_EAT_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11)\n# define BOOST_PP_TUPLE_EAT_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12)\n# define BOOST_PP_TUPLE_EAT_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13)\n# define BOOST_PP_TUPLE_EAT_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14)\n# define BOOST_PP_TUPLE_EAT_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15)\n# define BOOST_PP_TUPLE_EAT_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16)\n# define BOOST_PP_TUPLE_EAT_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17)\n# define BOOST_PP_TUPLE_EAT_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18)\n# define BOOST_PP_TUPLE_EAT_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19)\n# define BOOST_PP_TUPLE_EAT_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20)\n# define BOOST_PP_TUPLE_EAT_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21)\n# define BOOST_PP_TUPLE_EAT_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22)\n# define BOOST_PP_TUPLE_EAT_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23)\n# define BOOST_PP_TUPLE_EAT_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24)\n# define BOOST_PP_TUPLE_EAT_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25)\n# define BOOST_PP_TUPLE_EAT_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26)\n# define BOOST_PP_TUPLE_EAT_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27)\n# define BOOST_PP_TUPLE_EAT_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28)\n# define BOOST_PP_TUPLE_EAT_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29)\n# define BOOST_PP_TUPLE_EAT_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30)\n# define BOOST_PP_TUPLE_EAT_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31)\n# define BOOST_PP_TUPLE_EAT_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32)\n# define BOOST_PP_TUPLE_EAT_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33)\n# define BOOST_PP_TUPLE_EAT_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34)\n# define BOOST_PP_TUPLE_EAT_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35)\n# define BOOST_PP_TUPLE_EAT_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36)\n# define BOOST_PP_TUPLE_EAT_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37)\n# define BOOST_PP_TUPLE_EAT_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38)\n# define BOOST_PP_TUPLE_EAT_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39)\n# define BOOST_PP_TUPLE_EAT_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40)\n# define BOOST_PP_TUPLE_EAT_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41)\n# define BOOST_PP_TUPLE_EAT_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42)\n# define BOOST_PP_TUPLE_EAT_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43)\n# define BOOST_PP_TUPLE_EAT_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44)\n# define BOOST_PP_TUPLE_EAT_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45)\n# define BOOST_PP_TUPLE_EAT_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46)\n# define BOOST_PP_TUPLE_EAT_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47)\n# define BOOST_PP_TUPLE_EAT_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48)\n# define BOOST_PP_TUPLE_EAT_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49)\n# define BOOST_PP_TUPLE_EAT_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50)\n# define BOOST_PP_TUPLE_EAT_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51)\n# define BOOST_PP_TUPLE_EAT_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52)\n# define BOOST_PP_TUPLE_EAT_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53)\n# define BOOST_PP_TUPLE_EAT_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54)\n# define BOOST_PP_TUPLE_EAT_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55)\n# define BOOST_PP_TUPLE_EAT_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56)\n# define BOOST_PP_TUPLE_EAT_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57)\n# define BOOST_PP_TUPLE_EAT_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58)\n# define BOOST_PP_TUPLE_EAT_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59)\n# define BOOST_PP_TUPLE_EAT_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60)\n# define BOOST_PP_TUPLE_EAT_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61)\n# define BOOST_PP_TUPLE_EAT_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62)\n# define BOOST_PP_TUPLE_EAT_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/elem.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011,2014) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_ELEM_HPP\n# define BOOST_PREPROCESSOR_TUPLE_ELEM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/expand.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/variadic/elem.hpp>\n# include <boost/preprocessor/tuple/detail/is_single_return.hpp>\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)\n#        define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)\n/*\n  Use BOOST_PP_REM_CAT if it is a single element tuple ( which might be empty )\n  else use BOOST_PP_REM. This fixes a VC++ problem with an empty tuple and BOOST_PP_TUPLE_ELEM\n  functionality. See tuple_elem_bug_test.cxx.\n*/\n#    \t define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) \\\n\t\t\tBOOST_PP_VARIADIC_ELEM(n, BOOST_PP_EXPAND(BOOST_PP_TUPLE_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,tuple) tuple)) \\\n\t\t\t/**/\n#    else\n#        define BOOST_PP_TUPLE_ELEM(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_ELEM_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_ELEM_O_2(n, tuple) BOOST_PP_VARIADIC_ELEM(n, BOOST_PP_REM tuple)\n#    endif\n#    define BOOST_PP_TUPLE_ELEM_O_3(size, n, tuple) BOOST_PP_TUPLE_ELEM_O_2(n, tuple)\n# else\n#    if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_, n), BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_E_, size), tuple))\n#        define BOOST_PP_TUPLE_ELEM_I(m, args) BOOST_PP_TUPLE_ELEM_II(m, args)\n#        define BOOST_PP_TUPLE_ELEM_II(m, args) BOOST_PP_CAT(m ## args,)\n#    elif BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I_OO((size, n, tuple))\n#        define BOOST_PP_TUPLE_ELEM_I_OO(par) BOOST_PP_TUPLE_ELEM_I ## par\n#        define BOOST_PP_TUPLE_ELEM_I(size, n, tuple) BOOST_PP_TUPLE_ELEM_II((n, BOOST_PP_TUPLE_ELEM_E_ ## size ## tuple))\n#        define BOOST_PP_TUPLE_ELEM_II(par) BOOST_PP_TUPLE_ELEM_III_OO(par)\n#        define BOOST_PP_TUPLE_ELEM_III_OO(par) BOOST_PP_TUPLE_ELEM_III ## par\n#        define BOOST_PP_TUPLE_ELEM_III(n, etuple) BOOST_PP_TUPLE_ELEM_ ## n ## etuple\n#    else\n#        define BOOST_PP_TUPLE_ELEM(size, n, tuple) BOOST_PP_TUPLE_ELEM_I(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_, n) BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM_E_, size) tuple)\n#        define BOOST_PP_TUPLE_ELEM_I(x) x\n#    endif\n#    define BOOST_PP_TUPLE_ELEM_E_1(e0) (e0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_2(e0, e1) (e0, e1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_3(e0, e1, e2) (e0, e1, e2, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_4(e0, e1, e2, e3) (e0, e1, e2, e3, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_5(e0, e1, e2, e3, e4) (e0, e1, e2, e3, e4, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_6(e0, e1, e2, e3, e4, e5) (e0, e1, e2, e3, e4, e5, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_7(e0, e1, e2, e3, e4, e5, e6) (e0, e1, e2, e3, e4, e5, e6, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0, e1, e2, e3, e4, e5, e6, e7, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, e1, e2, e3, e4, e5, e6, e7, e8, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, ?, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, ?, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, ?, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, ?, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, ?, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, ?, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, ?, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, ?)\n#    define BOOST_PP_TUPLE_ELEM_E_64\n#    define BOOST_PP_TUPLE_ELEM_0(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e0\n#    define BOOST_PP_TUPLE_ELEM_1(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e1\n#    define BOOST_PP_TUPLE_ELEM_2(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e2\n#    define BOOST_PP_TUPLE_ELEM_3(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e3\n#    define BOOST_PP_TUPLE_ELEM_4(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e4\n#    define BOOST_PP_TUPLE_ELEM_5(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e5\n#    define BOOST_PP_TUPLE_ELEM_6(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e6\n#    define BOOST_PP_TUPLE_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e7\n#    define BOOST_PP_TUPLE_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e8\n#    define BOOST_PP_TUPLE_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e9\n#    define BOOST_PP_TUPLE_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e10\n#    define BOOST_PP_TUPLE_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e11\n#    define BOOST_PP_TUPLE_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e12\n#    define BOOST_PP_TUPLE_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e13\n#    define BOOST_PP_TUPLE_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e14\n#    define BOOST_PP_TUPLE_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e15\n#    define BOOST_PP_TUPLE_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e16\n#    define BOOST_PP_TUPLE_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e17\n#    define BOOST_PP_TUPLE_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e18\n#    define BOOST_PP_TUPLE_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e19\n#    define BOOST_PP_TUPLE_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e20\n#    define BOOST_PP_TUPLE_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e21\n#    define BOOST_PP_TUPLE_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e22\n#    define BOOST_PP_TUPLE_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e23\n#    define BOOST_PP_TUPLE_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e24\n#    define BOOST_PP_TUPLE_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e25\n#    define BOOST_PP_TUPLE_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e26\n#    define BOOST_PP_TUPLE_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e27\n#    define BOOST_PP_TUPLE_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e28\n#    define BOOST_PP_TUPLE_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e29\n#    define BOOST_PP_TUPLE_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e30\n#    define BOOST_PP_TUPLE_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e31\n#    define BOOST_PP_TUPLE_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e32\n#    define BOOST_PP_TUPLE_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e33\n#    define BOOST_PP_TUPLE_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e34\n#    define BOOST_PP_TUPLE_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e35\n#    define BOOST_PP_TUPLE_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e36\n#    define BOOST_PP_TUPLE_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e37\n#    define BOOST_PP_TUPLE_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e38\n#    define BOOST_PP_TUPLE_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e39\n#    define BOOST_PP_TUPLE_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e40\n#    define BOOST_PP_TUPLE_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e41\n#    define BOOST_PP_TUPLE_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e42\n#    define BOOST_PP_TUPLE_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e43\n#    define BOOST_PP_TUPLE_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e44\n#    define BOOST_PP_TUPLE_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e45\n#    define BOOST_PP_TUPLE_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e46\n#    define BOOST_PP_TUPLE_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e47\n#    define BOOST_PP_TUPLE_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e48\n#    define BOOST_PP_TUPLE_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e49\n#    define BOOST_PP_TUPLE_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e50\n#    define BOOST_PP_TUPLE_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e51\n#    define BOOST_PP_TUPLE_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e52\n#    define BOOST_PP_TUPLE_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e53\n#    define BOOST_PP_TUPLE_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e54\n#    define BOOST_PP_TUPLE_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e55\n#    define BOOST_PP_TUPLE_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e56\n#    define BOOST_PP_TUPLE_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e57\n#    define BOOST_PP_TUPLE_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e58\n#    define BOOST_PP_TUPLE_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e59\n#    define BOOST_PP_TUPLE_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e60\n#    define BOOST_PP_TUPLE_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e61\n#    define BOOST_PP_TUPLE_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e62\n#    define BOOST_PP_TUPLE_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e63\n# endif\n#\n# /* directly used elsewhere in Boost... */\n#\n# define BOOST_PP_TUPLE_ELEM_1_0(a) a\n#\n# define BOOST_PP_TUPLE_ELEM_2_0(a, b) a\n# define BOOST_PP_TUPLE_ELEM_2_1(a, b) b\n#\n# define BOOST_PP_TUPLE_ELEM_3_0(a, b, c) a\n# define BOOST_PP_TUPLE_ELEM_3_1(a, b, c) b\n# define BOOST_PP_TUPLE_ELEM_3_2(a, b, c) c\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/enum.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_ENUM_HPP\n# define BOOST_PREPROCESSOR_TUPLE_ENUM_HPP\n#\n# include <boost/preprocessor/tuple/rem.hpp>\n#\n# /* BOOST_PP_TUPLE_ENUM */\n#\n# define BOOST_PP_TUPLE_ENUM BOOST_PP_TUPLE_REM_CTOR\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/insert.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_INSERT_HPP\n# define BOOST_PREPROCESSOR_TUPLE_INSERT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/insert.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n# /* BOOST_PP_TUPLE_INSERT */\n#\n# define BOOST_PP_TUPLE_INSERT(tuple, i, elem) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_INSERT(BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \\\n/**/\n#\n# /* BOOST_PP_TUPLE_INSERT_D */\n#\n# define BOOST_PP_TUPLE_INSERT_D(d, tuple, i, elem) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_INSERT_D(d, BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \\\n/**/\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_INSERT_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/pop_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_POP_BACK_HPP\n# define BOOST_PREPROCESSOR_TUPLE_POP_BACK_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/pop_back.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/comparison/greater.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n# /* BOOST_PP_TUPLE_POP_BACK */\n#\n# define BOOST_PP_TUPLE_POP_BACK(tuple) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \\\n\t\tBOOST_PP_TUPLE_POP_BACK_EXEC, \\\n\t\tBOOST_PP_TUPLE_POP_BACK_RETURN \\\n\t\t) \\\n\t(tuple) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_BACK_EXEC(tuple) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_BACK(BOOST_PP_TUPLE_TO_ARRAY(tuple))) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_BACK_RETURN(tuple) tuple\n#\n# /* BOOST_PP_TUPLE_POP_BACK_Z */\n#\n# define BOOST_PP_TUPLE_POP_BACK_Z(z, tuple) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \\\n\t\tBOOST_PP_TUPLE_POP_BACK_Z_EXEC, \\\n\t\tBOOST_PP_TUPLE_POP_BACK_Z_RETURN \\\n\t\t) \\\n\t(z, tuple) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_BACK_Z_EXEC(z, tuple) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_BACK_Z(z, BOOST_PP_TUPLE_TO_ARRAY(tuple))) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_BACK_Z_RETURN(z, tuple) tuple\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_POP_BACK_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/pop_front.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_POP_FRONT_HPP\n# define BOOST_PREPROCESSOR_TUPLE_POP_FRONT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/pop_front.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/comparison/greater.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n#\n# /* BOOST_PP_TUPLE_POP_FRONT */\n#\n# define BOOST_PP_TUPLE_POP_FRONT(tuple) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \\\n\t\tBOOST_PP_TUPLE_POP_FRONT_EXEC, \\\n\t\tBOOST_PP_TUPLE_POP_FRONT_RETURN \\\n\t\t) \\\n\t(tuple) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_FRONT_EXEC(tuple) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_FRONT(BOOST_PP_TUPLE_TO_ARRAY(tuple))) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_FRONT_RETURN(tuple) tuple\n#\n# /* BOOST_PP_TUPLE_POP_FRONT_Z */\n#\n# define BOOST_PP_TUPLE_POP_FRONT_Z(z, tuple) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \\\n\t\tBOOST_PP_TUPLE_POP_FRONT_Z_EXEC, \\\n\t\tBOOST_PP_TUPLE_POP_FRONT_Z_RETURN \\\n\t\t) \\\n\t(z, tuple) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_FRONT_Z_EXEC(z, tuple) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_POP_FRONT_Z(z, BOOST_PP_TUPLE_TO_ARRAY(tuple))) \\\n/**/\n#\n# define BOOST_PP_TUPLE_POP_FRONT_Z_RETURN(z, tuple) tuple\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_POP_FRONT_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/push_back.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_PUSH_BACK_HPP\n# define BOOST_PREPROCESSOR_TUPLE_PUSH_BACK_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/push_back.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n# /* BOOST_PP_TUPLE_PUSH_BACK */\n#\n# define BOOST_PP_TUPLE_PUSH_BACK(tuple, elem) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_PUSH_BACK(BOOST_PP_TUPLE_TO_ARRAY(tuple), elem)) \\\n/**/\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_PUSH_BACK_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/push_front.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_PUSH_FRONT_HPP\n# define BOOST_PREPROCESSOR_TUPLE_PUSH_FRONT_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/push_front.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n#\n# /* BOOST_PP_TUPLE_PUSH_FRONT */\n#\n# define BOOST_PP_TUPLE_PUSH_FRONT(tuple, elem) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_PUSH_FRONT(BOOST_PP_TUPLE_TO_ARRAY(tuple), elem)) \\\n/**/\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_PUSH_FRONT_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/rem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011,2013.                               *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_REM_HPP\n# define BOOST_PREPROCESSOR_TUPLE_REM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/expand.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/detail/is_single_return.hpp>\n#\n# /* BOOST_PP_REM */\n#\n# if BOOST_PP_VARIADICS\n# \t if BOOST_PP_VARIADICS_MSVC\n\t\t/* To be used internally when __VA_ARGS__ could be empty ( or is a single element ) */\n#    \tdefine BOOST_PP_REM_CAT(...) BOOST_PP_CAT(__VA_ARGS__,)\n# \t endif\n#    define BOOST_PP_REM(...) __VA_ARGS__\n# else\n#    define BOOST_PP_REM(x) x\n# endif\n#\n# /* BOOST_PP_TUPLE_REM */\n#\n/*\n  VC++8.0 cannot handle the variadic version of BOOST_PP_TUPLE_REM(size)\n*/\n# if BOOST_PP_VARIADICS && !(BOOST_PP_VARIADICS_MSVC && _MSC_VER <= 1400)\n# \t if BOOST_PP_VARIADICS_MSVC\n\t\t/* To be used internally when the size could be 0 ( or 1 ) */\n#    \tdefine BOOST_PP_TUPLE_REM_CAT(size) BOOST_PP_REM_CAT\n# \t endif\n#    define BOOST_PP_TUPLE_REM(size) BOOST_PP_REM\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_REM(size) BOOST_PP_TUPLE_REM_I(size)\n#    else\n#        define BOOST_PP_TUPLE_REM(size) BOOST_PP_TUPLE_REM_OO((size))\n#        define BOOST_PP_TUPLE_REM_OO(par) BOOST_PP_TUPLE_REM_I ## par\n#    endif\n#    define BOOST_PP_TUPLE_REM_I(size) BOOST_PP_TUPLE_REM_ ## size\n# endif\n# define BOOST_PP_TUPLE_REM_0()\n# define BOOST_PP_TUPLE_REM_1(e0) e0\n# define BOOST_PP_TUPLE_REM_2(e0, e1) e0, e1\n# define BOOST_PP_TUPLE_REM_3(e0, e1, e2) e0, e1, e2\n# define BOOST_PP_TUPLE_REM_4(e0, e1, e2, e3) e0, e1, e2, e3\n# define BOOST_PP_TUPLE_REM_5(e0, e1, e2, e3, e4) e0, e1, e2, e3, e4\n# define BOOST_PP_TUPLE_REM_6(e0, e1, e2, e3, e4, e5) e0, e1, e2, e3, e4, e5\n# define BOOST_PP_TUPLE_REM_7(e0, e1, e2, e3, e4, e5, e6) e0, e1, e2, e3, e4, e5, e6\n# define BOOST_PP_TUPLE_REM_8(e0, e1, e2, e3, e4, e5, e6, e7) e0, e1, e2, e3, e4, e5, e6, e7\n# define BOOST_PP_TUPLE_REM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) e0, e1, e2, e3, e4, e5, e6, e7, e8\n# define BOOST_PP_TUPLE_REM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9\n# define BOOST_PP_TUPLE_REM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10\n# define BOOST_PP_TUPLE_REM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11\n# define BOOST_PP_TUPLE_REM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12\n# define BOOST_PP_TUPLE_REM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13\n# define BOOST_PP_TUPLE_REM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14\n# define BOOST_PP_TUPLE_REM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15\n# define BOOST_PP_TUPLE_REM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16\n# define BOOST_PP_TUPLE_REM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17\n# define BOOST_PP_TUPLE_REM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18\n# define BOOST_PP_TUPLE_REM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19\n# define BOOST_PP_TUPLE_REM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20\n# define BOOST_PP_TUPLE_REM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21\n# define BOOST_PP_TUPLE_REM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22\n# define BOOST_PP_TUPLE_REM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23\n# define BOOST_PP_TUPLE_REM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24\n# define BOOST_PP_TUPLE_REM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25\n# define BOOST_PP_TUPLE_REM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26\n# define BOOST_PP_TUPLE_REM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27\n# define BOOST_PP_TUPLE_REM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28\n# define BOOST_PP_TUPLE_REM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29\n# define BOOST_PP_TUPLE_REM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30\n# define BOOST_PP_TUPLE_REM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31\n# define BOOST_PP_TUPLE_REM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32\n# define BOOST_PP_TUPLE_REM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33\n# define BOOST_PP_TUPLE_REM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34\n# define BOOST_PP_TUPLE_REM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35\n# define BOOST_PP_TUPLE_REM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36\n# define BOOST_PP_TUPLE_REM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37\n# define BOOST_PP_TUPLE_REM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38\n# define BOOST_PP_TUPLE_REM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39\n# define BOOST_PP_TUPLE_REM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40\n# define BOOST_PP_TUPLE_REM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41\n# define BOOST_PP_TUPLE_REM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42\n# define BOOST_PP_TUPLE_REM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43\n# define BOOST_PP_TUPLE_REM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44\n# define BOOST_PP_TUPLE_REM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45\n# define BOOST_PP_TUPLE_REM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46\n# define BOOST_PP_TUPLE_REM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47\n# define BOOST_PP_TUPLE_REM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48\n# define BOOST_PP_TUPLE_REM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49\n# define BOOST_PP_TUPLE_REM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50\n# define BOOST_PP_TUPLE_REM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51\n# define BOOST_PP_TUPLE_REM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52\n# define BOOST_PP_TUPLE_REM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53\n# define BOOST_PP_TUPLE_REM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54\n# define BOOST_PP_TUPLE_REM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55\n# define BOOST_PP_TUPLE_REM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56\n# define BOOST_PP_TUPLE_REM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57\n# define BOOST_PP_TUPLE_REM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58\n# define BOOST_PP_TUPLE_REM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59\n# define BOOST_PP_TUPLE_REM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60\n# define BOOST_PP_TUPLE_REM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61\n# define BOOST_PP_TUPLE_REM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62\n# define BOOST_PP_TUPLE_REM_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63\n#\n# /* BOOST_PP_TUPLE_REM_CTOR */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_REM_CTOR_I(m, args) BOOST_PP_TUPLE_REM_CTOR_II(m, args)\n#        define BOOST_PP_TUPLE_REM_CTOR_II(m, args) BOOST_PP_CAT(m ## args,)\n#    \t define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_EXPAND(BOOST_PP_TUPLE_IS_SINGLE_RETURN(BOOST_PP_REM_CAT,BOOST_PP_REM,tuple) tuple)\n#    else\n#        define BOOST_PP_TUPLE_REM_CTOR(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REM_CTOR_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_REM_CTOR_O_1(tuple) BOOST_PP_REM tuple\n#    endif\n#    define BOOST_PP_TUPLE_REM_CTOR_O_2(size, tuple) BOOST_PP_TUPLE_REM_CTOR_O_1(tuple)\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_EDG()\n#        define BOOST_PP_TUPLE_REM_CTOR(size, tuple) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_TUPLE_REM(size), tuple)\n#    else\n#        define BOOST_PP_TUPLE_REM_CTOR(size, tuple) BOOST_PP_TUPLE_REM_CTOR_D(size, tuple)\n#        define BOOST_PP_TUPLE_REM_CTOR_D(size, tuple) BOOST_PP_TUPLE_REM_CTOR_I(BOOST_PP_TUPLE_REM(size), tuple)\n#    endif\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_REM_CTOR_I(ext, tuple) ext tuple\n#    else\n#        define BOOST_PP_TUPLE_REM_CTOR_I(ext, tuple) BOOST_PP_TUPLE_REM_CTOR_OO((ext, tuple))\n#        define BOOST_PP_TUPLE_REM_CTOR_OO(par) BOOST_PP_TUPLE_REM_CTOR_II ## par\n#        define BOOST_PP_TUPLE_REM_CTOR_II(ext, tuple) ext ## tuple\n#    endif\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/remove.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_REMOVE_HPP\n# define BOOST_PREPROCESSOR_TUPLE_REMOVE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/remove.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/comparison/greater.hpp>\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n# /* BOOST_PP_TUPLE_REMOVE */\n#\n# define BOOST_PP_TUPLE_REMOVE(tuple, i) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_GREATER(BOOST_PP_TUPLE_SIZE(tuple),1), \\\n\t\tBOOST_PP_TUPLE_REMOVE_EXEC, \\\n\t\tBOOST_PP_TUPLE_REMOVE_RETURN \\\n\t\t) \\\n\t(tuple, i) \\\n/**/\n#\n# define BOOST_PP_TUPLE_REMOVE_EXEC(tuple, i) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REMOVE(BOOST_PP_TUPLE_TO_ARRAY(tuple), i)) \\\n/**/\n#\n# define BOOST_PP_TUPLE_REMOVE_RETURN(tuple, i) tuple\n#\n# /* BOOST_PP_TUPLE_REMOVE_D */\n#\n# define BOOST_PP_TUPLE_REMOVE_D(d, tuple, i) \\\n\tBOOST_PP_IIF \\\n\t\t( \\\n\t\tBOOST_PP_GREATER_D(d, BOOST_PP_TUPLE_SIZE(tuple), 1), \\\n\t\tBOOST_PP_TUPLE_REMOVE_D_EXEC, \\\n\t\tBOOST_PP_TUPLE_REMOVE_D_RETURN \\\n\t\t) \\\n\t(d, tuple, i) \\\n/**/\n#\n# define BOOST_PP_TUPLE_REMOVE_D_EXEC(d, tuple, i) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REMOVE_D(d, BOOST_PP_TUPLE_TO_ARRAY(tuple), i)) \\\n/**/\n#\n# define BOOST_PP_TUPLE_REMOVE_D_RETURN(d, tuple, i) tuple\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_REMOVE_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/replace.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2013.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_REPLACE_HPP\n# define BOOST_PREPROCESSOR_TUPLE_REPLACE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# if BOOST_PP_VARIADICS\n#\n# include <boost/preprocessor/array/replace.hpp>\n# include <boost/preprocessor/array/to_tuple.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n#\n# /* BOOST_PP_TUPLE_REPLACE */\n#\n# define BOOST_PP_TUPLE_REPLACE(tuple, i, elem) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REPLACE(BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \\\n/**/\n#\n# /* BOOST_PP_TUPLE_REPLACE_D */\n#\n# define BOOST_PP_TUPLE_REPLACE_D(d, tuple, i, elem) \\\n\tBOOST_PP_ARRAY_TO_TUPLE(BOOST_PP_ARRAY_REPLACE_D(d, BOOST_PP_TUPLE_TO_ARRAY(tuple), i, elem)) \\\n/**/\n#\n# endif // BOOST_PP_VARIADICS\n#\n# endif // BOOST_PREPROCESSOR_TUPLE_REPLACE_HPP\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/reverse.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_REVERSE_HPP\n# define BOOST_PREPROCESSOR_TUPLE_REVERSE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_TUPLE_REVERSE */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_REVERSE(...) BOOST_PP_TUPLE_REVERSE_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REVERSE_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_REVERSE_I(m, args) BOOST_PP_TUPLE_REVERSE_II(m, args)\n#        define BOOST_PP_TUPLE_REVERSE_II(m, args) BOOST_PP_CAT(m ## args,)\n#    \t define BOOST_PP_TUPLE_REVERSE_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_REVERSE_, BOOST_PP_TUPLE_SIZE(tuple)) tuple\n#    else\n#        define BOOST_PP_TUPLE_REVERSE(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_REVERSE_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_REVERSE_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_REVERSE_, BOOST_PP_VARIADIC_SIZE tuple) tuple\n#    endif\n#    define BOOST_PP_TUPLE_REVERSE_O_2(size, tuple) BOOST_PP_TUPLE_REVERSE_O_1(tuple)\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_REVERSE(size, tuple) BOOST_PP_TUPLE_REVERSE_I(size, tuple)\n#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#            define BOOST_PP_TUPLE_REVERSE_I(s, t) BOOST_PP_TUPLE_REVERSE_ ## s t\n#        else\n#            define BOOST_PP_TUPLE_REVERSE_I(s, t) BOOST_PP_TUPLE_REVERSE_II(BOOST_PP_TUPLE_REVERSE_ ## s t)\n#            define BOOST_PP_TUPLE_REVERSE_II(res) res\n#        endif\n#    else\n#        define BOOST_PP_TUPLE_REVERSE(size, tuple) BOOST_PP_TUPLE_REVERSE_OO((size, tuple))\n#        define BOOST_PP_TUPLE_REVERSE_OO(par) BOOST_PP_TUPLE_REVERSE_I ## par\n#        define BOOST_PP_TUPLE_REVERSE_I(s, t) BOOST_PP_TUPLE_REVERSE_ ## s ## t\n#    endif\n# endif\n# define BOOST_PP_TUPLE_REVERSE_1(e0) (e0)\n# define BOOST_PP_TUPLE_REVERSE_2(e0, e1) (e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_3(e0, e1, e2) (e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_4(e0, e1, e2, e3) (e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_5(e0, e1, e2, e3, e4) (e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_6(e0, e1, e2, e3, e4, e5) (e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_7(e0, e1, e2, e3, e4, e5, e6) (e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_8(e0, e1, e2, e3, e4, e5, e6, e7) (e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e62, e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n# define BOOST_PP_TUPLE_REVERSE_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e63, e62, e61, e60, e59, e58, e57, e56, e55, e54, e53, e52, e51, e50, e49, e48, e47, e46, e45, e44, e43, e42, e41, e40, e39, e38, e37, e36, e35, e34, e33, e32, e31, e30, e29, e28, e27, e26, e25, e24, e23, e22, e21, e20, e19, e18, e17, e16, e15, e14, e13, e12, e11, e10, e9, e8, e7, e6, e5, e4, e3, e2, e1, e0)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_SIZE_HPP\n# define BOOST_PREPROCESSOR_TUPLE_SIZE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_SIZE(tuple) BOOST_PP_CAT(BOOST_PP_VARIADIC_SIZE tuple,)\n#    else\n#        define BOOST_PP_TUPLE_SIZE(tuple) BOOST_PP_VARIADIC_SIZE tuple\n#    endif\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/to_array.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_TO_ARRAY_HPP\n# define BOOST_PREPROCESSOR_TUPLE_TO_ARRAY_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_TUPLE_TO_ARRAY */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_ARRAY_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_TO_ARRAY_I(m, args) BOOST_PP_TUPLE_TO_ARRAY_II(m, args)\n#        define BOOST_PP_TUPLE_TO_ARRAY_II(m, args) BOOST_PP_CAT(m ## args,)\n#        define BOOST_PP_TUPLE_TO_ARRAY_1(tuple) (BOOST_PP_TUPLE_SIZE(tuple), tuple)\n#    else\n#        define BOOST_PP_TUPLE_TO_ARRAY(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_ARRAY_, __VA_ARGS__)(__VA_ARGS__)\n#        define BOOST_PP_TUPLE_TO_ARRAY_1(tuple) (BOOST_PP_VARIADIC_SIZE tuple, tuple)\n#    endif\n#    define BOOST_PP_TUPLE_TO_ARRAY_2(size, tuple) (size, tuple)\n# else\n#    define BOOST_PP_TUPLE_TO_ARRAY(size, tuple) (size, tuple)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/to_list.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002-2011) */\n# /* Revised by Edward Diener (2011) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_TO_LIST_HPP\n# define BOOST_PREPROCESSOR_TUPLE_TO_LIST_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_TUPLE_TO_LIST */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_TO_LIST(...) BOOST_PP_TUPLE_TO_LIST_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_LIST_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_TO_LIST_I(m, args) BOOST_PP_TUPLE_TO_LIST_II(m, args)\n#        define BOOST_PP_TUPLE_TO_LIST_II(m, args) BOOST_PP_CAT(m ## args,)\n#    \t define BOOST_PP_TUPLE_TO_LIST_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_LIST_, BOOST_PP_TUPLE_SIZE(tuple)) tuple\n#    else\n#        define BOOST_PP_TUPLE_TO_LIST(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_LIST_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_TO_LIST_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_LIST_, BOOST_PP_VARIADIC_SIZE tuple) tuple\n#    endif\n#    define BOOST_PP_TUPLE_TO_LIST_O_2(size, tuple) BOOST_PP_TUPLE_TO_LIST_O_1(tuple)\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_TO_LIST(size, tuple) BOOST_PP_TUPLE_TO_LIST_I(size, tuple)\n#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#            define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_ ## s t\n#        else\n#            define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_II(BOOST_PP_TUPLE_TO_LIST_ ## s t)\n#            define BOOST_PP_TUPLE_TO_LIST_II(res) res\n#        endif\n#    else\n#        define BOOST_PP_TUPLE_TO_LIST(size, tuple) BOOST_PP_TUPLE_TO_LIST_OO((size, tuple))\n#        define BOOST_PP_TUPLE_TO_LIST_OO(par) BOOST_PP_TUPLE_TO_LIST_I ## par\n#        define BOOST_PP_TUPLE_TO_LIST_I(s, t) BOOST_PP_TUPLE_TO_LIST_ ## s ## t\n#    endif\n# endif\n#\n# define BOOST_PP_TUPLE_TO_LIST_1(e0) (e0, BOOST_PP_NIL)\n# define BOOST_PP_TUPLE_TO_LIST_2(e0, e1) (e0, (e1, BOOST_PP_NIL))\n# define BOOST_PP_TUPLE_TO_LIST_3(e0, e1, e2) (e0, (e1, (e2, BOOST_PP_NIL)))\n# define BOOST_PP_TUPLE_TO_LIST_4(e0, e1, e2, e3) (e0, (e1, (e2, (e3, BOOST_PP_NIL))))\n# define BOOST_PP_TUPLE_TO_LIST_5(e0, e1, e2, e3, e4) (e0, (e1, (e2, (e3, (e4, BOOST_PP_NIL)))))\n# define BOOST_PP_TUPLE_TO_LIST_6(e0, e1, e2, e3, e4, e5) (e0, (e1, (e2, (e3, (e4, (e5, BOOST_PP_NIL))))))\n# define BOOST_PP_TUPLE_TO_LIST_7(e0, e1, e2, e3, e4, e5, e6) (e0, (e1, (e2, (e3, (e4, (e5, (e6, BOOST_PP_NIL)))))))\n# define BOOST_PP_TUPLE_TO_LIST_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, BOOST_PP_NIL))))))))\n# define BOOST_PP_TUPLE_TO_LIST_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, BOOST_PP_NIL)))))))))\n# define BOOST_PP_TUPLE_TO_LIST_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, BOOST_PP_NIL))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, BOOST_PP_NIL)))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, BOOST_PP_NIL))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, BOOST_PP_NIL)))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, BOOST_PP_NIL))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, BOOST_PP_NIL)))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, BOOST_PP_NIL))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, BOOST_PP_NIL)))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, BOOST_PP_NIL))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, BOOST_PP_NIL)))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, BOOST_PP_NIL))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, BOOST_PP_NIL)))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, BOOST_PP_NIL))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, BOOST_PP_NIL)))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, BOOST_PP_NIL))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, BOOST_PP_NIL)))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, BOOST_PP_NIL))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, BOOST_PP_NIL)))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, BOOST_PP_NIL))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, BOOST_PP_NIL)))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, BOOST_PP_NIL))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, BOOST_PP_NIL)))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, BOOST_PP_NIL))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, BOOST_PP_NIL)))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, BOOST_PP_NIL))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, (e61, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, (e61, (e62, BOOST_PP_NIL)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n# define BOOST_PP_TUPLE_TO_LIST_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e0, (e1, (e2, (e3, (e4, (e5, (e6, (e7, (e8, (e9, (e10, (e11, (e12, (e13, (e14, (e15, (e16, (e17, (e18, (e19, (e20, (e21, (e22, (e23, (e24, (e25, (e26, (e27, (e28, (e29, (e30, (e31, (e32, (e33, (e34, (e35, (e36, (e37, (e38, (e39, (e40, (e41, (e42, (e43, (e44, (e45, (e46, (e47, (e48, (e49, (e50, (e51, (e52, (e53, (e54, (e55, (e56, (e57, (e58, (e59, (e60, (e61, (e62, (e63, BOOST_PP_NIL))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple/to_seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002-2011.                             *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_TO_SEQ_HPP\n# define BOOST_PREPROCESSOR_TUPLE_TO_SEQ_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/facilities/overload.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n#\n# /* BOOST_PP_TUPLE_TO_SEQ */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_TUPLE_TO_SEQ(...) BOOST_PP_TUPLE_TO_SEQ_I(BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_SEQ_O_, __VA_ARGS__), (__VA_ARGS__))\n#        define BOOST_PP_TUPLE_TO_SEQ_I(m, args) BOOST_PP_TUPLE_TO_SEQ_II(m, args)\n#        define BOOST_PP_TUPLE_TO_SEQ_II(m, args) BOOST_PP_CAT(m ## args,)\n#    \t define BOOST_PP_TUPLE_TO_SEQ_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_SEQ_, BOOST_PP_TUPLE_SIZE(tuple)) tuple\n#    else\n#        define BOOST_PP_TUPLE_TO_SEQ(...) BOOST_PP_OVERLOAD(BOOST_PP_TUPLE_TO_SEQ_O_, __VA_ARGS__)(__VA_ARGS__)\n#    \t define BOOST_PP_TUPLE_TO_SEQ_O_1(tuple) BOOST_PP_CAT(BOOST_PP_TUPLE_TO_SEQ_, BOOST_PP_VARIADIC_SIZE tuple) tuple\n#    endif\n#    define BOOST_PP_TUPLE_TO_SEQ_O_2(size, tuple) BOOST_PP_TUPLE_TO_SEQ_O_1(tuple)\n# else\n#    if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#        define BOOST_PP_TUPLE_TO_SEQ(size, tuple) BOOST_PP_TUPLE_TO_SEQ_I(size, tuple)\n#        if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()\n#            define BOOST_PP_TUPLE_TO_SEQ_I(s, t) BOOST_PP_TUPLE_TO_SEQ_ ## s t\n#        else\n#            define BOOST_PP_TUPLE_TO_SEQ_I(s, t) BOOST_PP_TUPLE_TO_SEQ_II(BOOST_PP_TUPLE_TO_SEQ_ ## s t)\n#            define BOOST_PP_TUPLE_TO_SEQ_II(res) res\n#        endif\n#    else\n#        define BOOST_PP_TUPLE_TO_SEQ(size, tuple) BOOST_PP_TUPLE_TO_SEQ_OO((size, tuple))\n#        define BOOST_PP_TUPLE_TO_SEQ_OO(par) BOOST_PP_TUPLE_TO_SEQ_I ## par\n#        define BOOST_PP_TUPLE_TO_SEQ_I(s, t) BOOST_PP_TUPLE_TO_SEQ_ ## s ## t\n#    endif\n# endif\n#\n/* An empty array can be passed */\n# define BOOST_PP_TUPLE_TO_SEQ_0() ()\n#\n# define BOOST_PP_TUPLE_TO_SEQ_1(e0) (e0)\n# define BOOST_PP_TUPLE_TO_SEQ_2(e0, e1) (e0)(e1)\n# define BOOST_PP_TUPLE_TO_SEQ_3(e0, e1, e2) (e0)(e1)(e2)\n# define BOOST_PP_TUPLE_TO_SEQ_4(e0, e1, e2, e3) (e0)(e1)(e2)(e3)\n# define BOOST_PP_TUPLE_TO_SEQ_5(e0, e1, e2, e3, e4) (e0)(e1)(e2)(e3)(e4)\n# define BOOST_PP_TUPLE_TO_SEQ_6(e0, e1, e2, e3, e4, e5) (e0)(e1)(e2)(e3)(e4)(e5)\n# define BOOST_PP_TUPLE_TO_SEQ_7(e0, e1, e2, e3, e4, e5, e6) (e0)(e1)(e2)(e3)(e4)(e5)(e6)\n# define BOOST_PP_TUPLE_TO_SEQ_8(e0, e1, e2, e3, e4, e5, e6, e7) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)\n# define BOOST_PP_TUPLE_TO_SEQ_9(e0, e1, e2, e3, e4, e5, e6, e7, e8) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)\n# define BOOST_PP_TUPLE_TO_SEQ_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)\n# define BOOST_PP_TUPLE_TO_SEQ_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)\n# define BOOST_PP_TUPLE_TO_SEQ_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)\n# define BOOST_PP_TUPLE_TO_SEQ_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)\n# define BOOST_PP_TUPLE_TO_SEQ_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)\n# define BOOST_PP_TUPLE_TO_SEQ_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)\n# define BOOST_PP_TUPLE_TO_SEQ_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)\n# define BOOST_PP_TUPLE_TO_SEQ_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)\n# define BOOST_PP_TUPLE_TO_SEQ_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)\n# define BOOST_PP_TUPLE_TO_SEQ_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)\n# define BOOST_PP_TUPLE_TO_SEQ_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)\n# define BOOST_PP_TUPLE_TO_SEQ_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)\n# define BOOST_PP_TUPLE_TO_SEQ_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)\n# define BOOST_PP_TUPLE_TO_SEQ_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)\n# define BOOST_PP_TUPLE_TO_SEQ_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)\n# define BOOST_PP_TUPLE_TO_SEQ_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)\n# define BOOST_PP_TUPLE_TO_SEQ_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)\n# define BOOST_PP_TUPLE_TO_SEQ_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)\n# define BOOST_PP_TUPLE_TO_SEQ_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)\n# define BOOST_PP_TUPLE_TO_SEQ_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)\n# define BOOST_PP_TUPLE_TO_SEQ_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)\n# define BOOST_PP_TUPLE_TO_SEQ_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)\n# define BOOST_PP_TUPLE_TO_SEQ_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)\n# define BOOST_PP_TUPLE_TO_SEQ_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)\n# define BOOST_PP_TUPLE_TO_SEQ_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)\n# define BOOST_PP_TUPLE_TO_SEQ_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)\n# define BOOST_PP_TUPLE_TO_SEQ_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)\n# define BOOST_PP_TUPLE_TO_SEQ_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)\n# define BOOST_PP_TUPLE_TO_SEQ_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)\n# define BOOST_PP_TUPLE_TO_SEQ_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)\n# define BOOST_PP_TUPLE_TO_SEQ_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)\n# define BOOST_PP_TUPLE_TO_SEQ_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)\n# define BOOST_PP_TUPLE_TO_SEQ_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)\n# define BOOST_PP_TUPLE_TO_SEQ_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)\n# define BOOST_PP_TUPLE_TO_SEQ_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)\n# define BOOST_PP_TUPLE_TO_SEQ_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)\n# define BOOST_PP_TUPLE_TO_SEQ_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)\n# define BOOST_PP_TUPLE_TO_SEQ_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)\n# define BOOST_PP_TUPLE_TO_SEQ_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)\n# define BOOST_PP_TUPLE_TO_SEQ_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)\n# define BOOST_PP_TUPLE_TO_SEQ_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)\n# define BOOST_PP_TUPLE_TO_SEQ_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)\n# define BOOST_PP_TUPLE_TO_SEQ_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)\n# define BOOST_PP_TUPLE_TO_SEQ_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)\n# define BOOST_PP_TUPLE_TO_SEQ_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)\n# define BOOST_PP_TUPLE_TO_SEQ_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)\n# define BOOST_PP_TUPLE_TO_SEQ_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)\n# define BOOST_PP_TUPLE_TO_SEQ_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)\n# define BOOST_PP_TUPLE_TO_SEQ_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)\n# define BOOST_PP_TUPLE_TO_SEQ_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)(e58)\n# define BOOST_PP_TUPLE_TO_SEQ_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)(e58)(e59)\n# define BOOST_PP_TUPLE_TO_SEQ_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)(e58)(e59)(e60)\n# define BOOST_PP_TUPLE_TO_SEQ_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)(e58)(e59)(e60)(e61)\n# define BOOST_PP_TUPLE_TO_SEQ_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)(e58)(e59)(e60)(e61)(e62)\n# define BOOST_PP_TUPLE_TO_SEQ_64(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63) (e0)(e1)(e2)(e3)(e4)(e5)(e6)(e7)(e8)(e9)(e10)(e11)(e12)(e13)(e14)(e15)(e16)(e17)(e18)(e19)(e20)(e21)(e22)(e23)(e24)(e25)(e26)(e27)(e28)(e29)(e30)(e31)(e32)(e33)(e34)(e35)(e36)(e37)(e38)(e39)(e40)(e41)(e42)(e43)(e44)(e45)(e46)(e47)(e48)(e49)(e50)(e51)(e52)(e53)(e54)(e55)(e56)(e57)(e58)(e59)(e60)(e61)(e62)(e63)\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/tuple.hpp",
    "content": "# /* Copyright (C) 2001\n#  * Housemarque Oy\n#  * http://www.housemarque.com\n#  *\n#  * Distributed under the Boost Software License, Version 1.0. (See\n#  * accompanying file LICENSE_1_0.txt or copy at\n#  * http://www.boost.org/LICENSE_1_0.txt)\n#  */\n#\n# /* Revised by Paul Mensonides (2002) */\n# /* Revised by Edward Diener (2011,2013) */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_TUPLE_HPP\n# define BOOST_PREPROCESSOR_TUPLE_HPP\n#\n# include <boost/preprocessor/tuple/eat.hpp>\n# include <boost/preprocessor/tuple/elem.hpp>\n# include <boost/preprocessor/tuple/enum.hpp>\n# include <boost/preprocessor/tuple/insert.hpp>\n# include <boost/preprocessor/tuple/pop_back.hpp>\n# include <boost/preprocessor/tuple/pop_front.hpp>\n# include <boost/preprocessor/tuple/push_back.hpp>\n# include <boost/preprocessor/tuple/push_front.hpp>\n# include <boost/preprocessor/tuple/rem.hpp>\n# include <boost/preprocessor/tuple/remove.hpp>\n# include <boost/preprocessor/tuple/replace.hpp>\n# include <boost/preprocessor/tuple/reverse.hpp>\n# include <boost/preprocessor/tuple/size.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n# include <boost/preprocessor/tuple/to_list.hpp>\n# include <boost/preprocessor/tuple/to_seq.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/detail/is_single_return.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2014.                                    *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_IS_SINGLE_RETURN */\n#\n# if BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC\n# include <boost/preprocessor/control/iif.hpp>\n# include <boost/preprocessor/facilities/is_1.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n# define BOOST_PP_VARIADIC_IS_SINGLE_RETURN(sr,nsr,...)\t\\\n\tBOOST_PP_IIF(BOOST_PP_IS_1(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__)),sr,nsr) \\\n\t/**/\n# endif /* BOOST_PP_VARIADICS && BOOST_PP_VARIADICS_MSVC */\n#\n# endif /* BOOST_PREPROCESSOR_VARIADIC_DETAIL_IS_SINGLE_RETURN_HPP */\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/elem.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_ELEM_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_ELEM_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_ELEM */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADIC_ELEM(n, ...) BOOST_PP_VARIADIC_ELEM_I(n,__VA_ARGS__)\n#        define BOOST_PP_VARIADIC_ELEM_I(n, ...) BOOST_PP_CAT(BOOST_PP_CAT(BOOST_PP_VARIADIC_ELEM_, n)(__VA_ARGS__,),)\n#    else\n#        define BOOST_PP_VARIADIC_ELEM(n, ...) BOOST_PP_CAT(BOOST_PP_VARIADIC_ELEM_, n)(__VA_ARGS__,)\n#    endif\n#    define BOOST_PP_VARIADIC_ELEM_0(e0, ...) e0\n#    define BOOST_PP_VARIADIC_ELEM_1(e0, e1, ...) e1\n#    define BOOST_PP_VARIADIC_ELEM_2(e0, e1, e2, ...) e2\n#    define BOOST_PP_VARIADIC_ELEM_3(e0, e1, e2, e3, ...) e3\n#    define BOOST_PP_VARIADIC_ELEM_4(e0, e1, e2, e3, e4, ...) e4\n#    define BOOST_PP_VARIADIC_ELEM_5(e0, e1, e2, e3, e4, e5, ...) e5\n#    define BOOST_PP_VARIADIC_ELEM_6(e0, e1, e2, e3, e4, e5, e6, ...) e6\n#    define BOOST_PP_VARIADIC_ELEM_7(e0, e1, e2, e3, e4, e5, e6, e7, ...) e7\n#    define BOOST_PP_VARIADIC_ELEM_8(e0, e1, e2, e3, e4, e5, e6, e7, e8, ...) e8\n#    define BOOST_PP_VARIADIC_ELEM_9(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ...) e9\n#    define BOOST_PP_VARIADIC_ELEM_10(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, ...) e10\n#    define BOOST_PP_VARIADIC_ELEM_11(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, ...) e11\n#    define BOOST_PP_VARIADIC_ELEM_12(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, ...) e12\n#    define BOOST_PP_VARIADIC_ELEM_13(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, ...) e13\n#    define BOOST_PP_VARIADIC_ELEM_14(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, ...) e14\n#    define BOOST_PP_VARIADIC_ELEM_15(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, ...) e15\n#    define BOOST_PP_VARIADIC_ELEM_16(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, ...) e16\n#    define BOOST_PP_VARIADIC_ELEM_17(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, ...) e17\n#    define BOOST_PP_VARIADIC_ELEM_18(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, ...) e18\n#    define BOOST_PP_VARIADIC_ELEM_19(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, ...) e19\n#    define BOOST_PP_VARIADIC_ELEM_20(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, ...) e20\n#    define BOOST_PP_VARIADIC_ELEM_21(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, ...) e21\n#    define BOOST_PP_VARIADIC_ELEM_22(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, ...) e22\n#    define BOOST_PP_VARIADIC_ELEM_23(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, ...) e23\n#    define BOOST_PP_VARIADIC_ELEM_24(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, ...) e24\n#    define BOOST_PP_VARIADIC_ELEM_25(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, ...) e25\n#    define BOOST_PP_VARIADIC_ELEM_26(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, ...) e26\n#    define BOOST_PP_VARIADIC_ELEM_27(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, ...) e27\n#    define BOOST_PP_VARIADIC_ELEM_28(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, ...) e28\n#    define BOOST_PP_VARIADIC_ELEM_29(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, ...) e29\n#    define BOOST_PP_VARIADIC_ELEM_30(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, ...) e30\n#    define BOOST_PP_VARIADIC_ELEM_31(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, ...) e31\n#    define BOOST_PP_VARIADIC_ELEM_32(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, ...) e32\n#    define BOOST_PP_VARIADIC_ELEM_33(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, ...) e33\n#    define BOOST_PP_VARIADIC_ELEM_34(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, ...) e34\n#    define BOOST_PP_VARIADIC_ELEM_35(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, ...) e35\n#    define BOOST_PP_VARIADIC_ELEM_36(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, ...) e36\n#    define BOOST_PP_VARIADIC_ELEM_37(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, ...) e37\n#    define BOOST_PP_VARIADIC_ELEM_38(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, ...) e38\n#    define BOOST_PP_VARIADIC_ELEM_39(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, ...) e39\n#    define BOOST_PP_VARIADIC_ELEM_40(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, ...) e40\n#    define BOOST_PP_VARIADIC_ELEM_41(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, ...) e41\n#    define BOOST_PP_VARIADIC_ELEM_42(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, ...) e42\n#    define BOOST_PP_VARIADIC_ELEM_43(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, ...) e43\n#    define BOOST_PP_VARIADIC_ELEM_44(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, ...) e44\n#    define BOOST_PP_VARIADIC_ELEM_45(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, ...) e45\n#    define BOOST_PP_VARIADIC_ELEM_46(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, ...) e46\n#    define BOOST_PP_VARIADIC_ELEM_47(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, ...) e47\n#    define BOOST_PP_VARIADIC_ELEM_48(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, ...) e48\n#    define BOOST_PP_VARIADIC_ELEM_49(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, ...) e49\n#    define BOOST_PP_VARIADIC_ELEM_50(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, ...) e50\n#    define BOOST_PP_VARIADIC_ELEM_51(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, ...) e51\n#    define BOOST_PP_VARIADIC_ELEM_52(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, ...) e52\n#    define BOOST_PP_VARIADIC_ELEM_53(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, ...) e53\n#    define BOOST_PP_VARIADIC_ELEM_54(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, ...) e54\n#    define BOOST_PP_VARIADIC_ELEM_55(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, ...) e55\n#    define BOOST_PP_VARIADIC_ELEM_56(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, ...) e56\n#    define BOOST_PP_VARIADIC_ELEM_57(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, ...) e57\n#    define BOOST_PP_VARIADIC_ELEM_58(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, ...) e58\n#    define BOOST_PP_VARIADIC_ELEM_59(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, ...) e59\n#    define BOOST_PP_VARIADIC_ELEM_60(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, ...) e60\n#    define BOOST_PP_VARIADIC_ELEM_61(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, ...) e61\n#    define BOOST_PP_VARIADIC_ELEM_62(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, ...) e62\n#    define BOOST_PP_VARIADIC_ELEM_63(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, ...) e63\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/size.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_SIZE_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_SIZE_HPP\n#\n# include <boost/preprocessor/cat.hpp>\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_SIZE */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADIC_SIZE(...) BOOST_PP_CAT(BOOST_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,),)\n#    else\n#        define BOOST_PP_VARIADIC_SIZE(...) BOOST_PP_VARIADIC_SIZE_I(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,)\n#    endif\n#    define BOOST_PP_VARIADIC_SIZE_I(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/to_array.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_ARRAY_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_TO_ARRAY_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/to_array.hpp>\n# if BOOST_PP_VARIADICS_MSVC\n#    include <boost/preprocessor/variadic/size.hpp>\n# endif\n#\n# /* BOOST_PP_VARIADIC_TO_ARRAY */\n#\n# if BOOST_PP_VARIADICS\n#    if BOOST_PP_VARIADICS_MSVC\n#        define BOOST_PP_VARIADIC_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY_2(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),(__VA_ARGS__))\n#    else\n#        define BOOST_PP_VARIADIC_TO_ARRAY(...) BOOST_PP_TUPLE_TO_ARRAY((__VA_ARGS__))\n#    endif\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/to_list.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_LIST_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_TO_LIST_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/to_list.hpp>\n#\n# /* BOOST_PP_VARIADIC_TO_LIST */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADIC_TO_LIST(...) BOOST_PP_TUPLE_TO_LIST((__VA_ARGS__))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/to_seq.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_SEQ_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_TO_SEQ_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n# include <boost/preprocessor/tuple/to_seq.hpp>\n#\n# /* BOOST_PP_VARIADIC_TO_SEQ */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADIC_TO_SEQ(...) BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__))\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic/to_tuple.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_TO_TUPLE_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_TO_TUPLE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_VARIADIC_TO_TUPLE */\n#\n# if BOOST_PP_VARIADICS\n#    define BOOST_PP_VARIADIC_TO_TUPLE(...) (__VA_ARGS__)\n# endif\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/variadic.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Edward Diener 2011.                                    *\n#  *     (C) Copyright Paul Mensonides 2011.                                  *\n#  *     Distributed under the Boost Software License, Version 1.0. (See      *\n#  *     accompanying file LICENSE_1_0.txt or copy at                         *\n#  *     http://www.boost.org/LICENSE_1_0.txt)                                *\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_VARIADIC_HPP\n# define BOOST_PREPROCESSOR_VARIADIC_HPP\n#\n# include <boost/preprocessor/variadic/elem.hpp>\n# include <boost/preprocessor/variadic/size.hpp>\n# include <boost/preprocessor/variadic/to_array.hpp>\n# include <boost/preprocessor/variadic/to_list.hpp>\n# include <boost/preprocessor/variadic/to_seq.hpp>\n# include <boost/preprocessor/variadic/to_tuple.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/while.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_WHILE_HPP\n# define BOOST_PREPROCESSOR_WHILE_HPP\n#\n# include <boost/preprocessor/control/while.hpp>\n#\n# endif\n"
  },
  {
    "path": "external/boost-1.67/boost/preprocessor/wstringize.hpp",
    "content": "# /* **************************************************************************\n#  *                                                                          *\n#  *     (C) Copyright Paul Mensonides 2002.\n#  *     Distributed under the Boost Software License, Version 1.0. (See\n#  *     accompanying file LICENSE_1_0.txt or copy at\n#  *     http://www.boost.org/LICENSE_1_0.txt)\n#  *                                                                          *\n#  ************************************************************************** */\n#\n# /* See http://www.boost.org for most recent version. */\n#\n# ifndef BOOST_PREPROCESSOR_WSTRINGIZE_HPP\n# define BOOST_PREPROCESSOR_WSTRINGIZE_HPP\n#\n# include <boost/preprocessor/config/config.hpp>\n#\n# /* BOOST_PP_WSTRINGIZE */\n#\n# if ~BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MWCC()\n#    define BOOST_PP_WSTRINGIZE(text) BOOST_PP_WSTRINGIZE_I(text)\n# else\n#    define BOOST_PP_WSTRINGIZE(text) BOOST_PP_WSTRINGIZE_OO((text))\n#    define BOOST_PP_WSTRINGIZE_OO(par) BOOST_PP_WSTRINGIZE_I ## par\n# endif\n#\n# define BOOST_PP_WSTRINGIZE_I(text) BOOST_PP_WSTRINGIZE_II(#text)\n# define BOOST_PP_WSTRINGIZE_II(str) L ## str\n#\n# endif\n"
  },
  {
    "path": "include/xloil/AppObjects.h",
    "content": "#pragma once\n#include <xloil/ExportMacro.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/Range.h>\n#include <xloil/ExcelRef.h>\n#include <string>\n#include <memory>\n#include <vector>\n#include <set>\n\n// Forward Declarations from Typelib\nstruct IDispatch;\nstruct IUnknown;\nstruct IEnumUnknown;\nstruct IEnumVARIANT;\n\nnamespace Excel \n{\n  struct _Application;\n  struct Window;\n  struct _Workbook;\n  struct _Worksheet;\n  struct Range;\n  struct Windows;\n  struct Workbooks;\n  struct Sheets;\n  struct Areas;\n}\n\nnamespace xloil\n{\n  class ExcelWindow;\n  class ExcelWorksheet;\n  class Windows;\n  class Workbooks;\n  class Worksheets;\n  class ExcelWorkbook;\n  class ExcelRange;\n  class Application;\n  class Ranges;\n}\n\nnamespace xloil\n{\n  class ComConnectException : public std::runtime_error\n  {\n  public:\n    ComConnectException(const char* message)\n      : std::runtime_error(message)\n    {}\n  };\n\n  /// <summary>\n  /// Thrown if an AppObject has a null underlying pointer.  Currently\n  /// only the Application object checks this\n  /// </summary>\n  class NullComObjectException : public std::exception\n  {\n  public:\n    NullComObjectException(const char* message)\n      : std::exception(message)\n    {}\n    NullComObjectException()\n      : std::exception()\n    {}\n  };\n\n  namespace detail\n  {\n    /// <summary>\n    /// IUnknown ptr holder. Used internally.\n    /// </summary>\n    class UnknownObject\n    {\n    public:\n      UnknownObject(IUnknown* ptr = nullptr, bool steal = false)\n      {\n        init(ptr, steal);\n      }\n\n      UnknownObject(UnknownObject&& that) noexcept\n        : _ptr(nullptr)\n      {\n        std::swap(_ptr, that._ptr);\n      }\n\n      UnknownObject(const UnknownObject& that) \n        : UnknownObject(that._ptr, false) \n      {}\n\n      UnknownObject& operator=(const UnknownObject& that) noexcept\n      {\n        release();\n        init(that._ptr);\n        return *this;\n      }\n\n      UnknownObject& operator=(UnknownObject&& that) noexcept\n      {\n        release();\n        std::swap(_ptr, that._ptr);\n        return *this;\n      }\n\n      ~UnknownObject()\n      {\n        release();\n      }\n\n      IUnknown* ptr() const { return _ptr; }\n      bool valid() const { return _ptr; }\n      XLOIL_EXPORT void release();\n\n    private:\n      IUnknown* _ptr;\n\n      XLOIL_EXPORT void init(IUnknown* ptr, bool steal = false);\n    };\n\n    template <typename T,\n#ifdef NDEBUG\n      bool TCheck = false>\n#else\n      bool TCheck = true >\n#endif\n    class AppObject : public UnknownObject\n    {\n    public:\n      AppObject(T* ptr = nullptr, bool steal = false)\n        : UnknownObject((IUnknown*)(ptr), steal)\n      {}\n\n      AppObject(const UnknownObject& obj)\n        : UnknownObject(obj)\n      {}\n\n      AppObject(UnknownObject&& obj)\n        : UnknownObject(obj)\n      {}\n\n      void check() const\n      {\n        if constexpr (TCheck)\n        {\n          if (!valid())\n            throw new NullComObjectException();\n        }\n      }\n\n      T& com() const { check(); return *(T*)ptr(); }\n    };\n \n    // C4661: no suitable definition provided for explicit template instantiation request\n    #pragma warning(disable: 4661)\n\n    class XLOIL_EXPORT ComIteratorBase : public AppObject<IEnumVARIANT>\n    {\n    public:\n      ComIteratorBase(IUnknown* ptr, UnknownObject next);\n      ComIteratorBase(IUnknown* ptr)\n        : ComIteratorBase(ptr, UnknownObject())\n      {\n        increment();\n      }\n      ComIteratorBase()\n        : AppObject(nullptr)\n        , _next(nullptr)\n      {}\n\n      UnknownObject get();\n      void increment();\n      ComIteratorBase excrement();\n      bool operator==(const ComIteratorBase& other) const;\n\n      void getMany(size_t n, std::vector<UnknownObject>& result);\n\n    private:\n      UnknownObject _next;\n    };\n  }\n\n  template<class T>\n  class ComIterator : private detail::ComIteratorBase\n  {\n  public:\n    using detail::ComIteratorBase::ComIteratorBase;\n\n    T operator*()\n    {\n      return T(get());\n    }\n    ComIterator& operator++()\n    {\n      increment();\n      return *this;\n    }\n    ComIterator operator++(int)\n    {\n      return (ComIterator)excrement();\n    }\n    std::vector<T> getMany(size_t n)\n    {\n      std::vector<UnknownObject> objects;\n      std::vector<T> result;\n      detail::ComIteratorBase::getMany(n, objects);\n      std::transform(objects.cbegin(), objects.cend(), std::back_inserter(result),\n        [](auto x) { return T(x); });\n      return result;\n    }\n    bool operator==(const ComIterator<T>& that) const\n    {\n      return detail::ComIteratorBase::operator==(that);\n    }\n  };\n\n\n  template<class T, class Ptr>\n  class Collection : public detail::AppObject<Ptr>\n  {\n  public:\n    Collection(Ptr* ptr)\n      : AppObject(ptr, true)\n    {}\n\n    T get(const std::wstring_view& name) const;\n    T get(const size_t index) const;\n    bool tryGet(const std::wstring_view& name, T& wb) const;\n    bool tryGet(const size_t index, T& wb) const;\n\n    auto operator[](const std::wstring_view& name) const\n    {\n      return get(name);\n    };\n\n    std::vector<T> list() const;\n    size_t count() const;\n\n    Application app() const;\n\n    ComIterator<T> begin() const;\n    ComIterator<T> end() const\n    {\n      return ComIterator<T>();\n    }\n  };\n\n\n  class XLOIL_EXPORT Application : public detail::AppObject<Excel::_Application, true>\n  {\n  public:\n    /// <summary>\n    /// Construct an application object from a ptr to the underlying COM object.\n    /// If no ptr is provided, a new instance of Excel is created. Always steals\n    /// a reference, i.e. does not call AddRef.\n    /// </summary>\n    Application(Excel::_Application* app = nullptr);\n    /// <summary>\n    /// Construct an application object from a window handle to the top level\n    /// Excel window (which has window class XLMAIN)\n    /// </summary>\n    Application(size_t hWnd);\n    /// <summary>\n    /// Construct an application object from a workbook name. This searches all\n    /// open Excel instances for the one which has opened the workbook. It will\n    /// fail if the workbook is not open\n    /// </summary>\n    Application(const wchar_t* workbook);\n\n    std::wstring name() const;\n\n    /// <summary>\n    /// Calculates\n    /// </summary>\n    void calculate(const bool full=false, const bool rebuild=false);\n\n    Workbooks workbooks() const;\n    Windows windows() const;\n    ExcelWorksheet activeWorksheet() const;\n    ExcelRange activeCell() const;\n\n    ExcelObj run(const std::wstring& func, const size_t nArgs, const ExcelObj* args[]);\n\n    ExcelWorkbook open(\n      const std::wstring& filepath, \n      bool updateLinks=true, \n      bool readOnly=false,\n      wchar_t delimiter = 0);\n\n    /// <summary>\n    /// The set of full path names of all open workbooks\n    /// </summary>\n    const std::set<std::wstring>& workbookPaths();\n\n    /// <summary>\n    /// Calls Application.Quit to close the Excel instance and frees the COM resources.\n    /// This invalidates the Application object: any further calls to methods other \n    /// than quit() will raise an exception.\n    /// </summary>\n    /// <param name=\"silent\">\n    ///   If true, supresses save file dialogs: unsaved changes to workbooks will be discarded.\n    /// </param>\n    void quit(bool silent=true);\n\n    bool getVisible() const;\n    void setVisible(bool x);\n\n    bool getEnableEvents() const;\n    bool setEnableEvents(bool value);\n\n    bool getDisplayAlerts() const;\n    bool setDisplayAlerts(bool value);\n\n    bool getScreenUpdating() const;\n    bool setScreenUpdating(bool value);\n\n    enum CalculationMode\n    {\n      Automatic = -4105,\n      Manual = -4135,\n      Semiautomatic = 2\n    };\n\n    CalculationMode Application::getCalculationMode() const;\n    CalculationMode Application::setCalculationMode(CalculationMode value);\n\n    /// <summary>\n    /// Returns an invalid ExcelRange is the selection is not a range\n    /// </summary>\n    ExcelRange selection();\n  };\n\n  /// <summary>\n  /// Gets the Excel.Application object which is the root of the COM API \n  /// </summary>\n  XLOIL_EXPORT Application& thisApp();\n\n  enum class SpecialCells : int\n  {\n    Blanks = 4,\n    Constants = 2,\n    Formulas = -4123,\n    LastCell = 11,\n    Comments = -4144,\n    Visible = 12,\n    AllFormatConditions = -4172,\n    SameFormatConditions = -4173,\n    AllValidation = -4174,\n    SameValidation = -4175\n  };\n\n  class XLOIL_EXPORT ExcelRange : public Range, public detail::AppObject<Excel::Range>\n  {\n  public:\n    /// <summary>\n    /// Constructs a Range from a address. A local address (not qualified with\n    /// a workbook name) will refer to the active workbook\n    /// </summary>\n    explicit ExcelRange(\n      const std::wstring_view& address,\n      const Application& app = thisApp());\n\n    ExcelRange(const Range& range);\n    ExcelRange(const ExcelRef& ref) : ExcelRange(ref.address()) {}\n\n    using detail::AppObject<Excel::Range>::AppObject;\n\n    std::unique_ptr<Range> range(\n      int fromRow, int fromCol,\n      int toRow = TO_END, int toCol = TO_END) const final override;\n\n    std::unique_ptr<Range> trim() const final override;\n\n    std::tuple<row_t, col_t> shape() const final override;\n\n    std::tuple<row_t, col_t, row_t, col_t> bounds() const final override;\n\n    std::wstring address(AddressStyle style = AddressStyle::A1) const final override;\n\n    size_t nAreas() const;\n\n    ExcelObj value() const final override;\n\n    ExcelObj value(row_t i, col_t j) const final override;\n\n    void set(const ExcelObj& value) final override;\n\n    ExcelObj formula() const final override;\n\n    std::optional<bool> hasFormula() const final override;\n\n    void clear() final override;\n\n    virtual Excel::Range* asComPtr() const final override\n    {\n      return &com();\n    }\n\n    enum SetFormulaMode\n    {\n      ARRAY_FORMULA,\n      DYNAMIC_ARRAY,\n      OLD_ARRAY\n    };\n\n    /// <summary>\n    /// Sets the forumula for the range to the specified string. The `mode` \n    /// parameter determines how this function differs from the *Formula2* \n    /// property of COM/VBA Range:\n    ///\n    ///   * *DYNAMIC_ARRAY*: (default) identical the `Formula2` property, formulae\n    ///    which return arrays will spill.  If the range is larger than one cell and \n    ///    a single value is passed that value is filled into each cell.\n    ///   * *ARRAY_FORMULA*: if the target range is larger than one cell and a single \n    ///    string is passed, the string is set as an array formula for the range\n    ///   * *OLD_ARRAY*: formulae which return arrays will not spill see \"Formula vs Formula2\" \n    ///    on MSDN\n    /// \n    /// </summary>\n    /// <param name=\"formula\"></param>\n    /// \n    void setFormula(const std::wstring_view& formula, const SetFormulaMode mode = DYNAMIC_ARRAY);\n    \n    /// <summary>\n    /// Instead of taking only a string formula, takes an *ExcelObj* which can contain a string\n    /// or an array of equal dimensions to the *Range* being set.\n    /// </summary>\n    void setFormula(const ExcelObj& formula, const SetFormulaMode mode = DYNAMIC_ARRAY);\n\n    /// <summary>\n    /// The range address\n    /// </summary>\n    std::wstring name() const;\n\n    /// <summary>\n    /// The worksheet which contains this range\n    /// </summary>\n    ExcelWorksheet parent() const;\n\n    /// <summary>\n    /// Returns the Application object which owns this Range\n    /// </summary>\n    Application app() const;\n\n    ExcelRange specialCells(SpecialCells type, \n                            ExcelType values = ExcelType(0)) const;\n\n    Ranges areas() const;\n\n\n    ComIterator<ExcelRange> begin() const;\n    ComIterator<ExcelRange> end() const\n    {\n      return ComIterator<ExcelRange>();\n    }\n  };\n\n\n  /// <summary>\n  /// Wraps an COM Excel::Window object to avoid exposing the COM typelib\n  /// </summary>\n  class XLOIL_EXPORT ExcelWorksheet : public detail::AppObject<Excel::_Worksheet>\n  {\n  public:\n    using detail::AppObject<Excel::_Worksheet>::AppObject;\n\n    /// <summary>\n    /// Returns the window title\n    /// </summary>\n    /// <returns></returns>\n    std::wstring name() const;\n\n    /// <summary>\n    /// Gives the name of the workbook which owns this sheet\n    /// </summary>\n    ExcelWorkbook parent() const;\n\n    /// <summary>\n    /// Returns the underlying Application object, the ultimate parent \n    /// of this object\n    /// </summary>\n    Application app() const;\n\n    /// <summary>\n    /// Returns a range on this worksheet given a (local) address\n    /// </summary>\n    ExcelRange range(const std::wstring_view& address) const;\n\n    /// <summary>\n    /// Returns the range on this worksheet starting and ending at the specified\n    /// rows and columns.  Includes the start row and columns and the end row and \n    /// column, just as Excel's Worksheet.Range behaves.\n    /// </summary>\n    ExcelRange range(int fromRow, int fromCol,\n      int toRow = ExcelRange::TO_END, int toCol = ExcelRange::TO_END) const;\n\n    /// <summary>\n    /// Returns a Range referring to the single cell (i, j) (zero-based indexing)\n    /// </summary>\n    ExcelRange cell(int i, int j) const\n    {\n      return range(i, j, i, j);\n    }\n\n    /// <summary>\n    /// Convenience wrapper for cell(i,j)->value()\n    /// </summary>\n    ExcelObj value(Range::row_t i, Range::col_t j) const;\n\n    /// <summary>\n    /// Returns a ExcelRange object that represents the used range on the worksheet.\n    /// </summary>\n    ExcelRange usedRange() const;\n\n    /// <summary>\n    /// Returns the size of the worksheet, which is always (MaxRows, MaxCols).\n    /// This function exists mainly to provide some polymorphism with Range.\n    /// </summary>\n    std::tuple<Range::row_t, Range::col_t> shape() const\n    {\n      return std::make_tuple(XL_MAX_ROWS, XL_MAX_COLS);\n    }\n\n    /// <summary>\n    /// Makes this worksheet the active one in its workbook\n    /// </summary>\n    void activate();\n\n    /// <summary>\n    /// Calculates this worksheet\n    /// </summary>\n    void calculate();\n\n    /// <summary>\n    /// Sets the worksheet name (note 31 char limit)\n    /// </summary>\n    void setName(const std::wstring_view& name);\n  };\n\n\n  /// <summary>\n  /// Wraps a Workbook (https://docs.microsoft.com/en-us/office/vba/api/excel.workbook) in\n  /// Excel's object model but with very limited functionality at present\n  /// </summary>\n  class XLOIL_EXPORT ExcelWorkbook : public detail::AppObject<Excel::_Workbook>\n  {\n  public:\n    /// <summary>\n    /// Gives the ExcelWorkbook object associated with the given workbookb name, or the active workbook\n    /// </summary>\n    /// <param name=\"name\">The name of the workbook to find, or the active workbook if null</param>\n    explicit ExcelWorkbook(\n      const std::wstring_view& name = std::wstring_view(), \n      Application app = thisApp());\n    \n    using detail::AppObject<Excel::_Workbook>::AppObject;\n\n    std::wstring name() const;\n\n    /// <summary>\n    /// Returns the full file path and file name for this workbook\n    /// </summary>\n    std::wstring path() const;\n\n    /// <summary>\n    /// Returns the underlying Application object, the ultimate parent \n    /// of this object\n    /// </summary>\n    Application app() const;\n\n    /// <summary>\n    /// Returns a list of all Windows associated with this workbook (there can be\n    /// multiple windows viewing a single workbook).\n    /// </summary>\n    /// <returns></returns>\n    Windows windows() const;\n\n    /// <summary>\n    /// Returns a collection of all Worksheets in this Workbook. It does not  \n    /// include chart sheets (or Excel4 macro sheets)\n    /// </summary>\n    /// <returns></returns>\n    Worksheets worksheets() const;\n\n    /// <summary>\n    /// Returns a worksheet object corresponding to the specified name if \n    /// it exists\n    /// </summary>\n    ExcelWorksheet worksheet(const std::wstring_view& name) const;\n\n    /// <summary>\n    /// Returns a range in this workbook given an address\n    /// </summary>\n    ExcelRange range(const std::wstring_view& address) const\n    {\n      return ExcelRange(address, app());\n    }\n\n    /// <summary>\n    /// Adds a new worksheet, naming it if a name is provided, otherwise it\n    /// will have a default name provided by Excel, such as 'Sheet4'.\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"before\"></param>\n    /// <param name=\"after\"></param>\n    /// <returns></returns>\n    ExcelWorksheet add(\n        const std::wstring_view& name = std::wstring_view(),\n        const ExcelWorksheet& before = ExcelWorksheet(nullptr),\n        const ExcelWorksheet& after = ExcelWorksheet(nullptr)) const;\n\n    /// <summary>\n    /// Makes this the active workbook\n    /// </summary>\n    /// <returns></returns>\n    void activate() const;\n\n    void save(const std::wstring_view& filepath = std::wstring_view());\n\n    void close(bool save=true);\n  };\n\n\n  /// <summary>\n  /// Wraps an COM Excel::Window object to avoid exposing the COM typelib\n  /// </summary>\n  class XLOIL_EXPORT ExcelWindow : public detail::AppObject<Excel::Window>\n  {\n  public:\n    using detail::AppObject<Excel::Window>::AppObject;\n\n    /// <summary>\n    /// Gives the ExcelWindow object associated with the given window caption, or the active window\n    /// </summary>\n    /// <param name=\"caption\">The name of the window to find, or the active window if null</param>\n    explicit ExcelWindow(\n      const std::wstring_view& caption = std::wstring_view(),\n      Application app = thisApp());\n\n    /// <summary>\n    /// Retuns the Win32 window handle\n    /// </summary>\n    /// <returns></returns>\n    size_t hwnd() const;\n\n    /// <summary>\n    /// Returns the window title\n    /// </summary>\n    std::wstring name() const;\n\n    /// <summary>\n    /// Returns the underlying Application object, the ultimate parent \n    /// of this object\n    /// </summary>\n    Application app() const;\n\n    /// <summary>\n    /// Gives the name of the workbook displayed by this window \n    /// </summary>\n    ExcelWorkbook workbook() const;\n  };\n\n  inline std::wstring to_wstring(const ExcelRange& x) { return x.name(); }\n\n  XLOIL_EXPORT ExcelRef refFromComRange(Excel::Range& range);\n\n  inline ExcelRef refFromRange(const Range& range)\n  {\n    auto excelRange = dynamic_cast<const ExcelRange*>(&range);\n    if (excelRange)\n      return refFromComRange(excelRange->com());\n    else\n      return static_cast<const XllRange&>(range).asRef();\n  }\n\n\n  class XLOIL_EXPORT Worksheets : public Collection<ExcelWorksheet, Excel::Sheets>\n  {\n  public:\n    Worksheets(const Application& app = thisApp());\n    Worksheets(const ExcelWorkbook& workbook);\n    ExcelWorksheet active() const { return app().activeWorksheet(); }\n    ExcelWorksheet add(\n      const std::wstring_view& name = std::wstring_view(),\n      const ExcelWorksheet& before = ExcelWorksheet(nullptr),\n      const ExcelWorksheet& after = ExcelWorksheet(nullptr)) const\n    {\n      return parent().add(name, before, after);\n    }\n    ExcelWorkbook parent() const;\n  };\n\n\n  class XLOIL_EXPORT Workbooks : public Collection<ExcelWorkbook, Excel::Workbooks>\n  {\n  public:\n    Workbooks(const Application& app = thisApp());\n    ExcelWorkbook active() const \n    {\n      return ExcelWorkbook(std::wstring_view(), app());\n    }\n    ExcelWorkbook add();\n  };\n\n\n  class XLOIL_EXPORT Windows : public Collection<ExcelWorksheet, Excel::Windows>\n  {\n  public:\n    Windows(const Application& app = thisApp());\n    Windows(const ExcelWorkbook& workbook);\n    ExcelWindow active() const\n    {\n      return ExcelWindow(std::wstring_view(), app());\n    }\n  };\n\n\n  class XLOIL_EXPORT Ranges : public Collection<ExcelRange, Excel::Areas>\n  {\n  public:\n    Ranges(const ExcelRange& multiRange);\n  };\n\n\n  class PauseExcel\n  {\n  private:\n    Application _app;\n    Application::CalculationMode _previousCalculation;\n    bool _previousEvents;\n    bool _previousAlerts;\n    bool _previousUpdating;\n\n  public:\n    PauseExcel(Application& app)\n      : _app(app)\n      , _previousCalculation(app.setCalculationMode(Application::Manual))\n      , _previousAlerts(app.setDisplayAlerts(false))\n      , _previousEvents(app.setEnableEvents(false))\n      , _previousUpdating(app.setScreenUpdating(false))\n    {}\n    ~PauseExcel()\n    {\n      _app.setCalculationMode(_previousCalculation);\n      _app.setDisplayAlerts(_previousAlerts);\n      _app.setEnableEvents(_previousEvents);\n      _app.setScreenUpdating(_previousUpdating);\n    }\n  };\n\n  // Some function definitions which need to live down here due to\n  // the order of declarations\n\n  inline Workbooks Application::workbooks() const\n  {\n    return Workbooks(*this);\n  }\n\n  inline Windows Application::windows() const\n  {\n    return Windows(*this);\n  }\n\n  inline Worksheets ExcelWorkbook::worksheets() const\n  { \n    return Worksheets(*this); \n  }\n\n  inline Windows ExcelWorkbook::windows() const\n  {\n    return Windows(*this);\n  }\n\n  inline ExcelWorksheet ExcelWorkbook::worksheet(const std::wstring_view& name) const\n  {\n    return worksheets().get(name);\n  }\n\n  inline Ranges ExcelRange::areas() const\n  {\n    return Ranges(*this);\n  }\n}\n\ntemplate<class T>\nstruct std::iterator_traits<xloil::ComIterator<T>>\n{\n  using iterator_category = std::forward_iterator_tag;\n  using value_type = T;\n  using reference = const T&;\n  using pointer = const T*;\n  using difference_type = size_t;\n};"
  },
  {
    "path": "include/xloil/ArrayBuilder.h",
    "content": "#pragma once\n\n#include <xloil/ExcelObj.h>\n#include <cassert>\n#include <vector>\n\nnamespace xloil\n{\n  namespace detail\n  {\n    struct ArrayBuilderCharAllocator\n    {\n      ArrayBuilderCharAllocator(wchar_t*& data, const wchar_t* endData)\n        : _stringData(data)\n#ifdef _DEBUG\n        , _endStringData(endData)\n#endif\n      {}\n\n      wchar_t* allocate(size_t n)\n      {\n#ifdef _DEBUG\n        if (_stringData + n > _endStringData)\n          throw std::runtime_error(\"ExcelArrayBuilder: string data buffer exhausted\");\n#endif\n        auto ptr = _stringData;\n        _stringData += n;\n        return ptr;\n      }\n\n      void deallocate(wchar_t*, size_t) { }\n\n    private:\n      wchar_t*& _stringData;\n#ifdef _DEBUG\n      const wchar_t* _endStringData;\n#endif\n    };\n\n    class ArrayBuilderAlloc\n    {\n    public:\n      // TODO: we could support resize on this class, with a small amount\n      // of string fiddling \n      ArrayBuilderAlloc(size_t nObjects, size_t stringLen)\n        : _buffer((ExcelObj*)\n            new char[sizeof(ExcelObj) * nObjects + sizeof(wchar_t) * stringLen])\n        , _nObjects(nObjects)\n        , _stringData((wchar_t*)(_buffer + nObjects))\n        , _endBuffer((char*)(_buffer + nObjects) + sizeof(wchar_t) * stringLen)\n      {\n        assert(nObjects > 0);\n      }\n\n      ~ArrayBuilderAlloc()\n      {\n        if (_buffer)\n          delete[] (char*)_buffer;\n      }\n\n      auto charAllocator() { return ArrayBuilderCharAllocator(_stringData, (const wchar_t*)_endBuffer); }\n\n      auto newString(size_t len)\n      {\n        auto ptr = charAllocator().allocate(len + 1);\n        ptr[0] = wchar_t(len);\n        return ptr;\n      }\n\n      bool ownsString(const wchar_t* str) const\n      {\n        return str >= (wchar_t*)_buffer && str <= (wchar_t*)_endBuffer;\n      }\n\n      ExcelObj& object(size_t i) { return _buffer[i]; }\n\n      auto data() { return _buffer; }\n\n      void fillNA()\n      {\n        new (_buffer) ExcelObj(CellError::NA);\n        for (size_t *p = (size_t*)(_buffer + 1), *q = (size_t*)_buffer; p != (size_t*)(_buffer + _nObjects); ++p, ++q)\n          *p = *q;\n      }\n\n      ExcelObj* release() \n      {\n        auto buffer = _buffer;\n        _buffer = nullptr;\n        return buffer;\n      }\n\n    private:\n      ExcelObj* _buffer;\n      size_t _nObjects;\n      const char* _endBuffer;\n      wchar_t* _stringData;\n    };\n\n    class ArrayBuilderIterator;\n\n    // TODO: share with SequentialArrayBuilder\n    class ArrayBuilderElement\n    {\n    public:\n      ArrayBuilderElement(size_t index, ArrayBuilderAlloc& allocator)\n        : _target(&allocator.object(index))\n        , _alloc(&allocator)\n      {}\n\n      ArrayBuilderElement(ExcelObj* target, ArrayBuilderAlloc& allocator)\n        : _target(target)\n        , _alloc(&allocator)\n      {}\n\n      template <class T,\n        std::enable_if_t<std::is_integral<T>::value, int> = 0>\n      auto& operator=(T x)\n      {\n        // Note that _target is uninitialised memory, so we cannot call \n        // *_target = ExcelObj(x)\n        new (_target) ExcelObj(x);\n        return *this;\n      }\n\n      auto& operator=(double x)    { new (_target) ExcelObj(x); return *this; }\n      auto& operator=(CellError x) { new (_target) ExcelObj(x); return *this; }\n\n      /// <summary>\n      /// Assign by copying data from a string_view.\n      /// </summary>\n      auto& operator=(const std::wstring_view& str)\n      {\n        copy_string(str.data(), str.length());\n        return *this;\n      }\n\n      /// <summary>\n      /// Copy from an ExcelObj\n      /// </summary>\n      auto& operator=(const ExcelObj& x)\n      {\n        assign(x);\n        return *this;\n      }\n\n      /// <summary>\n      /// Copies from an ExcelObj. Optionally does not copy string data.\n      /// This is safe when the parent ExcelObj will outlive this array.\n      /// </summary>\n      void assign(const ExcelObj& x)\n      {\n        if (!x.isType(ExcelType::ArrayValue))\n          ExcelObj::overwrite(*_target, CellError::Value);\n        else if (x.isType(ExcelType::Str) && !_alloc->ownsString(x.val.str.data))\n        {\n          auto pstr = x.cast<PStringRef>();\n          copy_string(pstr.begin(), pstr.length());\n        }\n        else\n          ExcelObj::overwrite(*_target, x);\n      }\n\n      operator const ExcelObj& () const { return *_target; }\n\n      /// <summary>\n      /// Move emplacement for an ExcelObj. Only safe if it is not a string or\n      /// is a string allocated using the ArrayBuilder's charAllocator.\n      /// </summary>\n      void take(ExcelObj&& x)\n      {\n        if (!x.isType(ExcelType::ArrayValue))\n          XLO_THROW(L\"Invalid array element '{}'\", x.toString());\n        new (_target) ExcelObj(std::forward<ExcelObj>(x));\n      }\n\n      /// <summary>\n      /// Emplacement for a static pascal string buffer - does not copy nor\n      /// free the buffer.\n      /// </summary>\n      /// <param name=\"pstr\"></param>\n      void emplace_pstr(wchar_t* pstr)\n      {\n        new (_target) ExcelObj(PString::steal(pstr));\n      }\n\n      void copy_string(const wchar_t* str, size_t len)\n      {\n        auto xlObj = new (_target) ExcelObj();\n        xlObj->xltype = msxll::xltypeStr;\n        // This strings here will never be freed directly: the ExcelObj's dtor will never be \n        // called as it is an array element: the array block and its string data are freed in \n        // one call. However, we set the view flag for good practice!\n        xlObj->val.str.xloil_view = true;\n\n        if (len == 0)\n        {\n          xlObj->val.str.data = Const::EmptyStr().val.str.data;\n        }\n        else\n        {\n          auto pstr = _alloc->newString(len);\n          wmemcpy_s(pstr + 1, len, str, len);\n          xlObj->val.str.data = pstr;\n        }\n      }\n\n    private:\n      ExcelObj* _target;\n      ArrayBuilderAlloc* _alloc;\n\n      auto increment(int n) { _target += n; return *this; }\n      friend class ArrayBuilderIterator;\n    };\n\n    class ArrayBuilderIterator\n    {\n    public:\n      using iterator = ArrayBuilderIterator;\n      using reference = ArrayBuilderElement;\n      using pointer = ArrayBuilderElement*;\n      using difference_type = size_t;\n      using value_type = ArrayBuilderElement;\n      using iterator_category = std::bidirectional_iterator_tag;\n\n      ArrayBuilderIterator(ArrayBuilderElement&& element, int step = 1)\n        : _current(element)\n        , _step(step)\n      {}\n\n      auto& operator++()\n      {\n        _current.increment(_step);\n        return *this;\n      }\n      auto& operator--()\n      {\n        _current.increment(-_step);\n        return *this;\n      }\n      auto operator++(int)\n      {\n        iterator copy = *this;\n        ++(*this);\n        return copy;\n      }\n      auto operator--(int)\n      {\n        iterator copy = *this;\n        --(*this);\n        return copy;\n      }\n\n      auto operator+(const size_t n)\n      {\n        return iterator(ArrayBuilderElement(_current).increment(_step * (int)n), _step);\n      }\n\n      auto operator-(const size_t n)\n      {\n        return iterator(ArrayBuilderElement(_current).increment(-_step * (int)n), _step);\n      }\n\n      bool operator==(iterator other) const { return _current._target == other._current._target; }\n      bool operator!=(iterator other) const { return !(*this == other); }\n\n      const auto& operator*() const { return _current; }\n      reference operator*() { return _current; }\n      pointer operator->() { return &_current; }\n\n    private:\n      ArrayBuilderElement _current;\n      int _step;\n    };\n  }\n\n  /// <summary>\n  /// Constructs and allocates ExcelObj arrays. This class does \n  /// not dynamically resize the array, you must know the size you\n  /// need (and the total length of contained strings) upfront.\n  /// Usage:\n  /// <code>\n  ///    ExcelArrayBuilder builder(3, 1);\n  ///    for (auto i = 0; i < 3; ++i)\n  ///      builder(i, 0) = i;\n  ///    return builder.toExcelObj();\n  /// </code>\n  /// </summary>\n  class ExcelArrayBuilder\n  {\n  public:\n    using row_t = ExcelObj::row_t;\n    using col_t = ExcelObj::col_t;\n    \n    /// <summary>\n    /// Creates an ArrayBuilder of specified size (it cannot be resized later).\n    /// It does not default-initialise any ExcelObj in the array, so this must\n    /// be done by the user of the class. The fillNA() function can quickly\n    /// achieve this.\n    /// </summary>\n    /// <param name=\"nRows\"></param>\n    /// <param name=\"nCols\"></param>\n    /// <param name=\"totalStrLength\">Total length of all strings to be added to the array</param>\n    /// <param name=\"padTo2DimArray\">Adds # N/A to ensure the array is at least 2x2</param>\n    XLOIL_EXPORT ExcelArrayBuilder(row_t nRows, col_t nCols,\n      size_t totalStrLength = 0, bool padTo2DimArray = false);\n\n    auto charAllocator() { return _allocator.charAllocator(); }\n\n    /// <summary>\n    /// Allocate a PString in the array's string store. This can be used for\n    /// optimisations where a temporary string would otherwise be created in\n    /// an ExcelObj.  Strings in an ExcelObj passed to ArrayBuilder elements\n    /// are automatically copied into the string store.\n    /// </summary>\n    auto string(uint16_t len)\n    {\n      return BasicPString<wchar_t, detail::ArrayBuilderCharAllocator>(len, charAllocator());\n    }\n\n    /// <summary>\n    /// Open a writer on the element (i, j), write to it with\n    /// <code>builder(i,j) = value;</code>\n    /// </summary>\n    detail::ArrayBuilderElement operator()(size_t i, size_t j)\n    {\n      return detail::ArrayBuilderElement(i * _nColumns + j, _allocator);\n    }\n\n    detail::ArrayBuilderElement operator()(size_t i)\n    {\n      return detail::ArrayBuilderElement(i, _allocator);\n    }\n\n    ExcelObj& element(size_t i, size_t j)\n    {\n      assert(_nRows == 1 || _nColumns == 1 || (i < _nRows && j < _nColumns));\n      return _allocator.object(i * _nColumns + j);\n    }\n\n    /// <summary>\n    /// Create an ExcelObj of type array from this builder. This releases control\n    /// of the data block and invalidates the builder.\n    /// </summary>\n    ExcelObj toExcelObj()\n    {\n      return ExcelObj(_allocator.release(), int(_nRows), int(_nColumns));\n    }\n\n    operator ExcelObj() { return toExcelObj(); }\n\n    row_t nRows() const { return _nRows; }\n    col_t nCols() const { return _nColumns; }\n\n    /// <summary>\n    /// Fills the array with N/A - useful if you do not want to worry\n    /// about filling in every value\n    /// </summary>\n    void fillNA()\n    {\n      _allocator.fillNA(); \n    }\n\n    auto begin()\n    {\n      return detail::ArrayBuilderIterator((*this)(0));\n    }\n\n    auto end()\n    {\n      return detail::ArrayBuilderIterator((*this)(_nRows, _nColumns));\n    }\n\n    auto row_begin(row_t i)\n    {\n      return detail::ArrayBuilderIterator((*this)(i, 0));\n    }\n\n    auto row_end(row_t i)\n    {\n      return row_begin(i) + _nColumns;\n    }\n\n    auto col_begin(col_t i)\n    {\n      return detail::ArrayBuilderIterator((*this)(0, i), _nColumns);\n    }\n\n    auto col_end(col_t i)\n    {\n      return col_begin(i) + _nRows;\n    }\n\n    /// <summary>\n    /// Returns a pointer to the data of the ExcelObj array being built\n    /// </summary>\n    auto* data() { return &_allocator.object(0); }\n\n  private:\n    row_t _nRows;\n    col_t _nColumns;\n    detail::ArrayBuilderAlloc _allocator;\n\n    static detail::ArrayBuilderAlloc initialiseAllocator(\n      row_t& nRows, col_t& nCols, size_t strLength, bool padTo2DimArray);\n  };\n\n  namespace detail\n  {\n    /// <summary>\n    /// Iterates through the strings in a contigous array of pstrings. The\n    /// returned pointer is to the start of the pstring (i.e including size)\n    /// </summary>\n    template<class TChar>\n    class PStringStackIterator\n    {\n    public:\n      PStringStackIterator(TChar* location)\n        : _current(location)\n      {}\n      const auto& operator*() const { return _current; }\n      auto& operator++()\n      {\n        // Skip the length of the pstring plus 1, since we \n        // start pointed 1 before the string begins.\n        _current += *_current + 1;\n        return *this;\n      }\n    private:\n      TChar* _current;\n    };\n\n    /// <summary>\n    /// Allocates pstrings in a contiguous array backed by a vector.\n    /// Care must be taken with this allocator as vector resizes can\n    /// move the string data in memory.\n    /// </summary>\n    template<class TChar>\n    class PStringStackAllocator : public PStringAllocator<TChar>\n    {\n    public:\n      PStringStackAllocator(std::vector<TChar>& data)\n        : _data(data)\n      {}\n\n      wchar_t* allocate(uint16_t n)\n      {\n        auto oldSize = _data.size();\n        _data.resize(oldSize + n);\n        return _data.data() + oldSize;\n      }\n\n      void deallocate(TChar*, size_t /*n*/)\n      {}\n\n    private:\n      std::vector<TChar>& _data;\n    };\n  }\n\n  /// <summary>\n  /// An alternative array building strategy which does not require pre-calculation\n  /// of the expected string length, however, values can only be added sequentially\n  /// row-wise. Useful if calculation of the string length is expensive or awkward.\n  /// </summary>\n  class SequentialArrayBuilder\n  {\n  public:\n    using row_t = ExcelObj::row_t;\n    using col_t = ExcelObj::col_t;\n\n    SequentialArrayBuilder(row_t nRows, col_t nCols, size_t expectedStrLength = 0)\n      : _nRows(nRows)\n      , _nColumns(nCols)\n    {\n      _objects.resize(nRows * nCols * sizeof(ExcelObj));\n      _target = (ExcelObj*)_objects.data();\n      _strings.reserve(expectedStrLength);\n      // TODO: pad 2d? not so useful since the invention of spill\n    }\n\n    auto charAllocator() { return detail::PStringStackAllocator(_strings); }\n\n    template <class T,\n      std::enable_if_t<std::is_integral<T>::value, int> = 0>\n    void emplace(T x)\n    {\n      emplace(ExcelObj(x));\n    }\n\n    void emplace(double x) { emplace(ExcelObj(x)); }\n    void emplace(CellError x) { emplace(ExcelObj(x)); }\n\n    /// <summary>\n    /// Assign by copying data from a string_view.\n    /// </summary>\n    void emplace(const std::wstring_view& str)\n    {\n      auto N = (uint16_t)std::min<size_t>(str.length(), USHRT_MAX - 1);\n      auto buffer = charAllocator().allocate(N + 1);\n      buffer[0] = N;\n      wmemcpy_s(buffer + 1, N, str.data(), N);\n      emplaceNilString();\n    }\n\n    void emplace(ExcelObj&& obj)\n    {\n      if (obj.type() == ExcelType::Str &&\n        !(obj.val.str.data >= _strings.data() && obj.val.str.data < _strings.data() + _strings.size()))\n      {\n        emplace(obj.cast<PStringRef>());\n      }\n      else\n      {\n        new (next()) ExcelObj(std::move(obj));\n      }\n    }\n\n    auto stringLength() const { return _strings.size(); }\n    auto nRows() const { return _nRows; }\n    auto nColumns() const { return _nColumns; }\n\n    /// <summary>\n    /// Create an ExcelObj of type array from this builder.\n    /// </summary>\n    XLOIL_EXPORT ExcelObj toExcelObj();\n\n    /// <summary>\n    /// Copies the data in this array builder to an ArrayBuilder (original flavour)\n    /// defined by iterators, should you need to do this.\n    /// </summary>\n    XLOIL_EXPORT void copyToBuilder(\n      detail::ArrayBuilderIterator targetBegin, detail::ArrayBuilderIterator targetEnd);\n\n  private:\n    row_t _nRows;\n    col_t _nColumns;\n    std::vector<char> _objects;\n    std::vector<wchar_t> _strings;\n    ExcelObj* _target;\n\n    void emplaceNilString()\n    {\n      // Write an empty ExcelObj and mark it with string type so we can find it later\n      _target->xltype = msxll::xltypeStr;\n      next();\n    }\n\n    void emplace(const PStringRef& pstr)\n    {\n      uint16_t N = pstr.length() + 1u;\n      auto buffer = charAllocator().allocate(N);\n      wmemcpy_s(buffer, N, pstr.data(), N);\n      emplaceNilString();\n    }\n\n    ExcelObj* last()\n    {\n      return (ExcelObj*)(_objects.data() + _objects.size());\n    }\n\n    ExcelObj* next()\n    {\n      auto p = _target++;\n      assert(p <= last());\n      return p;\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/Async.h",
    "content": "#pragma once\n#include \"ExportMacro.h\"\n#include <xloil/ExcelObj.h>\n#include <xloil/Events.h>\n#include <memory>\nnamespace xloil { class ExcelObj; }\nnamespace xloil\n{\n  /// <summary>\n  /// Wrapper for xlAsyncReturn which takes ExcelObj arguments. Used\n  /// to return values from native async functions.\n  /// </summary>\n  XLOIL_EXPORT void \n    asyncReturn(\n      const ExcelObj& asyncHandle, const ExcelObj& value);\n\n  struct AsyncHandle : public ExcelObj\n  {\n    template<class... Args>\n    void returnValue(Args&&... args) const\n    {\n      asyncReturn(*this, ExcelObj(std::forward<Args>(args)...));\n    }\n    void returnValue(const ExcelObj& value)\n    {\n      asyncReturn(*this, value);\n    }\n  };\n\n  XLOIL_EXPORT bool yieldAndCheckIfEscPressed();\n\n  class AsyncHelper\n  {\n    std::shared_ptr<const void> _eventHandler;\n    ExcelObj _asyncHandle;\n\n  public:\n    AsyncHelper(const ExcelObj& asyncHandle)\n      : _asyncHandle(asyncHandle)\n    {\n      _eventHandler = xloil::Event::CalcCancelled().bind(\n          [self = this]() { self->cancel(); });\n    }\n    virtual ~AsyncHelper()\n    {\n      _eventHandler.reset();\n    }\n    virtual void cancel()\n    {\n      _eventHandler.reset();\n    }\n    void result(const ExcelObj& value)\n    {\n      asyncReturn(_asyncHandle, value);\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/AutoBind.h",
    "content": "#pragma once\n#include <xloil/ExcelObj.h>\n#include <xloil/Preprocessor.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelArray.h>\n#include <string>\n#include <boost/preprocessor/repetition/enum.hpp>\n\nnamespace xloil\n{\n  namespace AutoBind\n  {\n    /// <summary>\n    /// XLO_BIND attempts to register a wrapped C++ function. It can be called with 2, 3 or 4 \n    /// arguments:\n    /// \n    ///    * `XLO_BIND(FunctionName, NumArgs)`\n    ///    * `XLO_BIND(FunctionName, NumArgs, Defaults)`\n    ///    * `XLO_BIND(FunctionName, NumArgs, Defaults, Converters)`\n    /// \n    /// The function is registered as `FunctionName` in Excel.\n    /// \n    /// The `FunctionName` must be imported into the current namespace.\n    /// \n    /// `Defaults` must be specified as `XLO_DEFAULTS(None, None, 1, 3.14)` where `None` indicates   \n    /// no default.  The defaults do not have to match those specified by the C++ funding being bound.   \n    /// \n    /// xlOil attempts to convert arguments from the `ExcelObj` type provided by Excel to the \n    /// type in the function definition by using the `ArgConvert` class.  The excel arguments must\n    /// correspond 1-1 with the arguments in the bound function.\n    ///  \n    /// </summary>\n#define XLO_BIND(...) XLO_EXPAND( _XLO_BIND_SELECT(__VA_ARGS__, _XLO_BIND4, _XLO_BIND3, _XLO_BIND2)(__VA_ARGS__) )\n\n#define XLO_DEFAULTS(...) ::std::make_tuple(__VA_ARGS__)\n\n    /// <summary>\n    /// Can be used in the 4-arg version of XLO_BIND when no defaults are required\n    /// </summary>\n#define XLO_NODEFAULTS(NumArgs) ::std::make_tuple(BOOST_PP_ENUM(NumArgs, _XLO_NODEFAULTS_TEXT, None))\n\n    /// <summary>\n    /// Indicates an argument is not defaulted\n    /// </summary>\n    struct NoneType {};\n    constexpr NoneType None;\n\n    /// <summary>\n    /// During auto-binding, arguments are convertered via `ArgConvert<T>(const ExcelObj& x)`, \n    /// so to add support for more argument types, provide specialisations of this class.\n    /// A number of specialisations for standard C++ types are already given.\n    /// </summary>\n    template<class T> struct ArgConvert {};\n\n    template<> struct ArgConvert<double>\n    {\n      double operator()(const ExcelObj& x) { return x.get<double>(); }\n    };\n    template<> struct ArgConvert<int>\n    {\n      int operator()(const ExcelObj& x) { return x.get<int>(); }\n    };\n    template<> struct ArgConvert<std::wstring>\n    {\n      std::wstring operator()(const ExcelObj& x) { return x.toString(); }\n    };\n    template<> struct ArgConvert<std::string>\n    {\n      std::string operator()(const ExcelObj& x) { return utf16ToUtf8(x.toString()); }\n    };\n    template<> struct ArgConvert<const wchar_t*>\n    {\n      const wchar_t* operator()(const ExcelObj& x) \n      { \n        _data = x.toString();\n        return _data.c_str();\n      }\n      std::wstring _data;\n    };\n\n    template<> struct ArgConvert<std::vector<double>>\n    {\n      std::vector<double> operator()(const ExcelObj& obj) \n      { \n        ExcelArray array(obj);\n        std::vector<double> result(array.size());\n        std::transform(array.begin(), array.end(), result.begin(), [](auto& x)\n          { return x.get<double>(); });\n        return result;\n      }\n    };\n\n    /// <summary>\n    /// During auto-binding, the return value is convertered via `ReturnConvert<T>(T x)`, \n    /// so to add support for more return types, provide specialisations of this class.\n    /// The call operator must return an un-owned `ExcelObj*`\n    /// </summary>\n    template<class T> struct ReturnConvert\n    {\n      ExcelObj* operator()(T val)\n      {\n        return new ExcelObj(val);\n      }\n    };\n\n    template<> struct ReturnConvert<std::vector<double>>\n    {\n      ExcelObj* operator()(const std::vector<double>& val)\n      {\n        ExcelArrayBuilder builder((uint32_t)val.size(), 1);\n        std::copy(val.begin(), val.end(), builder.begin());\n        return new ExcelObj(builder.toExcelObj());\n      }\n    };\n\n    namespace detail\n    {\n      template<template<typename> typename TArgConverter, typename T>\n      struct Defaulting\n      {\n        auto operator()(const ExcelObj& x, T defaultVal)\n        {\n          if (!x.isMissing())\n            return _converter(x);\n          else\n            return defaultVal;\n        }\n\n        auto operator()(const ExcelObj& x, NoneType)\n        {\n          return _converter(x);\n        }\n\n        TArgConverter<T> _converter;\n      };\n\n      template<template<typename> typename TArgConverter, template<typename> typename TReturnConverter, class TFunc>\n      struct ConvertAndInvoke {};\n\n      template <template<typename> typename TArgConverter, template<typename> typename TReturnConverter, typename ReturnType, typename... FuncArgs>\n      struct ConvertAndInvoke<TArgConverter, TReturnConverter, ReturnType(FuncArgs...)>\n      {\n        template<typename F, typename Defaults, typename... ExcelArgs, std::size_t... I>\n        auto impl(F func, Defaults defaults, std::index_sequence<I...>, ExcelArgs... args)\n        {\n          return TReturnConverter<ReturnType>()(\n            std::invoke(func, \n              Defaulting<TArgConverter, std::remove_const_t<std::remove_reference_t<FuncArgs>>>()(\n                args, std::get<I>(defaults))...\n            ));\n        }\n\n        template<typename F, typename Defaults, typename... ExcelArgs, typename Indices = std::make_index_sequence<sizeof...(FuncArgs)>>\n        auto operator()(F func, Defaults defaults, ExcelArgs... args)\n        {\n          return impl(func, defaults, Indices{}, args...);\n        }\n      };\n    }\n\n    struct DefaultConverters\n    {\n      template<class T> using Arg = ArgConvert<T>;\n      template<class T> using Return = ReturnConvert<T>;\n    };\n\n\n#define _XLO_NODEFAULTS_TEXT(z, n, text) text\n\n#define _XLO_BIND4(FUNC, NUM_ARGS, DEFAULTS, CONVERTERS) \\\n    XLO_FUNC_START(FUNC##_XLOIL(XLO_DECLARE_ARGS(NUM_ARGS, arg)))\\\n    { \\\n        auto defaults = DEFAULTS; \\\n        return ::xloil::AutoBind::detail::ConvertAndInvoke<CONVERTERS::Arg, CONVERTERS::Return, decltype(FUNC)>()( \\\n          FUNC, defaults, BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ADD(NUM_ARGS,1), arg)); \\\n    } XLO_FUNC_END(FUNC##_XLOIL).name(XLO_WSTR(FUNC))\n\n#define _XLO_BIND3(FUNC, NUM_ARGS, DEFAULTS) _XLO_BIND4(FUNC, NUM_ARGS, DEFAULTS, ::xloil::AutoBind::DefaultConverters)\n\n#define _XLO_BIND2(FUNC, NUM_ARGS) _XLO_BIND3(FUNC, NUM_ARGS, XLO_NODEFAULTS(NUM_ARGS))\n\n#define _XLO_BIND_SELECT(_1,_2,_3,_4, NAME,...) NAME\n\n  }\n}"
  },
  {
    "path": "include/xloil/Caller.h",
    "content": "#pragma once\n#include <xlOil/ExportMacro.h>\n#include <xlOil/XlCallSlim.h>\n#include <xlOil/PString.h>\n#include <xlOil/ExcelObj.h>\n#include <xlOil/EnumHelper.h>\n#include <memory>\n#include <string>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Captures and writes information about the calling cell or context \n  /// provided by xlfCaller. Only returns useful information when the\n  /// caller was a worksheet\n  /// </summary>\n  class XLOIL_EXPORT CallerInfo\n  {\n  private:    \n    ExcelObj _address;\n    ExcelObj _sheetName;\n\n  public:\n    /// <summary>\n    /// Constructor which makes calls to xlfCaller and xlfSheetName to\n    /// determine the caller.\n    /// </summary>\n    CallerInfo();\n\n    /// <summary>\n    /// Provide custom caller information. The <paramref name=\"address\"/> is\n    /// interpreted as per the return from xlfCaller. In particular, a string\n    /// address will be returned by <see cref=\"writeAddress\"/> unmodified. The \n    /// <paramref name=\"fullSheetName\"/> is used when the address is a ref or\n    /// sref.\n    /// </summary>\n    /// <param name=\"address\"></param>\n    /// <param name=\"fullSheetName\">If provided, should be of the form [Book]Sheet</param>\n    CallerInfo(const ExcelObj& address, const wchar_t* fullSheetName=nullptr);\n\n    /// <summary>\n    /// Returns the upper bound on the string length required to write the address\n    /// </summary>\n    /// <returns></returns>\n    uint16_t addressLength(AddressStyle style) const;\n\n    /// <summary>\n    /// Writes the caller address to the provided buffer, returning the number\n    /// of characters written on success or a negative number or on failure. \n    /// </summary>\n    /// <param name=\"style\">Selects A1-type or RC-type</param>\n    /// <returns></returns>\n    int writeAddress(\n      wchar_t* buf, \n      size_t bufLen, \n      AddressStyle style = AddressStyle::A1) const;\n\n    /// <summary>\n    /// As per <see cref=\"writeAddress\"/>, but returns a string rather than writing\n    /// to a buffer\n    /// </summary>\n    /// <param name=\"style\"></param>\n    /// <returns></returns>\n    std::wstring address(AddressStyle style = AddressStyle::A1) const;\n\n\n    std::wstring localAddress(AddressStyle style = AddressStyle::A1) const;\n\n    /// <summary>\n    /// Returns the calling worksheet name as a PString or a null PString\n    /// if it could not be determined.\n    /// </summary>\n    /// <returns></returns>\n    PStringRef fullSheetName() const\n    {\n      return _sheetName.cast<PStringRef>();\n    }\n   \n    /// <summary>\n    /// Returns a view containing only the sheet name.\n    /// </summary>\n    std::wstring_view sheetName() const\n    {\n      auto sName = fullSheetName();\n      if (sName.empty())\n        return std::wstring_view();\n      auto begin = sName.begin() + sName.find(L']') + 1;\n      return std::wstring_view(begin, sName.end() - begin);\n    }\n\n    /// <summary>\n    /// Returns a view containing only the workbook name. If the workbook has\n    /// been saved, this includes a file extension.\n    /// </summary>\n    std::wstring_view workbook() const\n    {\n      auto sName = fullSheetName();\n      if (sName.empty())\n        return std::wstring_view();\n      return std::wstring_view(sName.begin() + 1, sName.rfind(L']') - 1);\n    }\n\n    /// <summary>\n    /// Returns a pointer to a XLREF12 sheet reference if caller was a \n    /// worksheet, else returns nullptr.\n    /// </summary>\n    const msxll::XLREF12* sheetRef() const\n    {\n      return _address.isType(ExcelType::SRef)\n        ? &_address.val.sref.ref\n        : nullptr;\n    }\n  };\n\n  /// <summary>\n  /// Returns the Excel A1-style column letter corresponding\n  /// to a given zero-based column index. Returns the number of\n  /// characters written (1, 2 or 3)\n  /// </summary>\n  XLOIL_EXPORT uint8_t writeColumnName(size_t colIndex, char buf[3]);\n\n  /// <summary>\n  /// Writes a simple Excel ref including sheet name in either A1 or RxCy \n  /// to the provided string buffer. That is, gives \"[Book]Sheet!A1\" or \n  /// \"[Book]Sheet!R1C1\".  The workbook and sheet name may be quoted which gives\n  /// some consistency with COM's Range.Address, however in the COM case \n  /// there is a complex set of rules determining whether quotes are added.\n  /// <returns>The number of characters written</returns>\n  /// </summary>\n  XLOIL_EXPORT uint16_t xlrefWriteWorkbookAddress(\n    const msxll::IDSHEET& sheet,\n    const msxll::XLREF12& ref,\n    wchar_t* buf,\n    size_t bufSize,\n    AddressStyle style = AddressStyle::A1);\n\n  /// <summary>\n  /// Version of <see cref=\"xlrefToWorkbookAddress\"/> which returns a string rather\n  /// than writing to a buffer\n  /// </summary>\n  inline std::wstring xlrefToWorkbookAddress(\n    const msxll::IDSHEET& sheet,\n    const msxll::XLREF12& ref,\n    AddressStyle style = AddressStyle::A1)\n  {\n    return captureWStringBuffer([&](auto buf, auto sz)\n    {\n      return xlrefWriteWorkbookAddress(sheet, ref, buf, sz, style);\n    });\n  }\n\n\n  /// <summary>\n  /// Writes an Excel ref to 'A1'/'A1:Z9' or 'RxCy'/'RaCy:RxCy' format\n  /// in the provided string buffer. Includes a null-terminator.\n  /// <returns>\n  ///   The number of characters written not including the null terminator or \n  ///   zero if the bufSize is insufficient.\n  /// </returns>\n  /// </summary>\n  XLOIL_EXPORT uint16_t xlrefToAddress(\n    const msxll::XLREF12& ref,\n    wchar_t* buf,\n    size_t bufSize,\n    const std::wstring_view& sheetName = std::wstring_view(),\n    AddressStyle style = AddressStyle::A1);\n\n  /// <summary>\n  /// Version of <see cref=\"xlrefToAddress\"/> which writes to a string\n  /// </summary>\n  inline std::wstring xlrefToAddress(\n    const msxll::XLREF12& ref,\n    const std::wstring_view& sheetName = std::wstring_view(),\n    AddressStyle style = AddressStyle::A1)\n  {\n    return captureWStringBuffer([&](auto buf, auto sz)\n      {\n        return xlrefToAddress(ref, buf, sz, sheetName, style);\n      },\n      XL_CELL_ADDRESS_A1_MAX_LEN);\n  }\n\n  /// <summary>\n  /// Parses a local Excel address (not including sheet name) from a string such as \n  /// 'A1' or 'A1:Z9' or 'R1C4' to an XLREF12 object. Returns false if the string \n  /// could not be parsed into a valid XLREF12.\n  /// </summary>\n  bool localAddressToXlRef(\n    const std::wstring_view& address,\n    msxll::XLREF12& result);\n\n  /// <summary>\n  /// Parses an Excel address including sheet name from a string such as \n  /// 'A1' or 'A1:Z9' or 'R1C4' to an XLREF12 object. Returns false if the string \n  /// could not be parsed into a valid XLREF12.\n  /// </summary>\n  XLOIL_EXPORT bool addressToXlRef(\n    const std::wstring_view& address,\n    msxll::XLREF12& result,\n    std::wstring* sheetName = nullptr);\n\n  /// <summary>\n  /// Returns true if the user is currently in the function wizard.\n  /// It's quite an expensive check involving looping through visible \n  /// Windows as Excel does not provide a built-in way to check this.\n  /// </summary>\n  XLOIL_EXPORT bool inFunctionWizard();\n\n  /// <summary>\n  /// Throws \"#WIZARD!\" true if the user is currently in the function \n  /// wizard.  The idea being that this string will be returned to Excel\n  /// by the surrounding try...catch.\n  /// \n  /// Quite an expensive check as Excel does not provide a built-in \n  /// way to check this.\n  /// </summary>\n  inline void throwInFunctionWizard()\n  {\n    if (xloil::inFunctionWizard())\n      throw std::runtime_error(\"#WIZARD!\");\n  }\n}"
  },
  {
    "path": "include/xloil/Date.h",
    "content": "#pragma once\n#include \"ExportMacro.h\"\n#include <xloil/ExcelObj.h>\n#include <string_view>\n#include <time.h>\n#include <vector>\n\nnamespace std { struct tm; }\nnamespace xloil\n{\n  constexpr int XL_MAX_SERIAL_DATE = 2958465; // 31 December 9999\n\n  /// <summary>\n  /// Converts as Excel date expressed as an integer to day, month, year\n  /// Returns true if the conversion was successful, otherwise the int\n  /// is out of range of valid Excel dates.\n  /// </summary>\n  XLOIL_EXPORT bool \n    excelSerialDateToYMD(int nSerialDate, int &nYear, int &nMonth, int &nDay) noexcept;\n\n  /// <summary>\n  /// Converts as Excel date expressed as floating point to day, month, year,\n  /// hours, minutes, seconds and milliseconds.\n  /// Returns true if the conversion was successful, otherwise the value\n  /// is out of range of valid Excel dates.\n  /// </summary>\n  XLOIL_EXPORT bool\n    excelSerialDatetoYMDHMS(\n      double serial, int &nYear, int &nMonth, int &nDay,\n       int& nHours, int& nMins, int& nSecs, int& uSecs) noexcept;\n\n  /// <summary>\n  /// Converts a date specifed as day, month, year to an Excel date serial number\n  /// </summary>\n  XLOIL_EXPORT int\n    excelSerialDateFromYMD(int nYear, int nMonth, int nDay) noexcept;\n\n  /// <summary>\n  /// Converts a date specifed as day, month, year, hours, minutes, seconds and \n  /// milliseconds to an Excel date serial number\n  /// </summary>\n  XLOIL_EXPORT double\n    excelSerialDateFromYMDHMS(\n      int nYear, int nMonth, int nDay,\n      int nHours, int nMins, int nSecs, int uSecs) noexcept;\n\n  inline double\n    excelSerialDateFromTM(std::tm& tm, int uSecs = 0) noexcept\n  {\n    return excelSerialDateFromYMDHMS(tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,\n      tm.tm_hour, tm.tm_min, tm.tm_sec, uSecs);\n  }\n\n  /// <summary>\n  /// Parses a string into a std::tm struct. Note that in\n  /// the tm struct, the fields do not have the \"most natural\"\n  /// bases: years are since 1900 and months start at zero.\n  /// \n  /// If `format` is omitted, tries to parse the date using\n  /// all registered formats <see cref=\"dateTimeAddFormat\"/>.\n  /// \n  /// Because it uses `std::get_time`, month matching is \n  /// case sensitive based on the convention in the current\n  /// locale. This is such a painful restriction that replacing\n  /// the parsing with a better designed library is an open \n  /// issue (unfortunately there is nothing particularly \n  /// lightweight available).\n  /// </summary>\n  XLOIL_EXPORT bool stringToDateTime(\n    const std::wstring_view& str,\n    std::tm& result, \n    const wchar_t* format = nullptr);\n\n  inline std::tm stringToDateTime(\n    const std::wstring_view& str,\n    const wchar_t* format)\n  {\n    std::tm result;\n    stringToDateTime(str, result, format);\n    return result;\n  }\n\n  /// <summary>\n  /// Registers date time formats to try when parsing strings with\n  /// <see cref=\"stringToDateTime\"/>.  See `std::get_time` for format syntax.\n  /// </summary>\n  XLOIL_EXPORT std::vector<std::wstring>& theDateTimeFormats();\n\n  struct DateVisitor : public ExcelValVisitor<bool>\n  {\n    std::tm result = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n\n    template <class T> bool operator()(T)\n    {\n      return false;\n    }\n\n    bool operator()(int x)\n    {\n      if (!excelSerialDateToYMD(x,\n        result.tm_year, result.tm_mon, result.tm_mday))\n        return false;\n      result.tm_year -= 1900;\n      result.tm_mon -= 1;\n      return true;\n    }\n\n    bool operator()(double x)\n    {\n      return operator()((int)x); // Truncate or require exact?\n    }\n  };\n\n  struct DateTimeVisitor : public DateVisitor\n  {\n    int uSecs = 0;\n\n    using DateVisitor::operator();\n\n    bool operator()(double x)\n    {\n      if (!excelSerialDatetoYMDHMS(x,\n        result.tm_year, result.tm_mon, result.tm_mday,\n        result.tm_hour, result.tm_min, result.tm_sec, uSecs))\n        return false;\n      result.tm_year -= 1900;\n      result.tm_mon -= 1;\n      return true;\n    }\n  };\n\n  struct ParseDateVisitor : public DateTimeVisitor\n  {\n    ParseDateVisitor(const wchar_t* fmt = nullptr) \n      : format(fmt) {}\n\n    const wchar_t* format;\n\n    using DateVisitor::operator();\n    bool operator()(PStringRef str)\n    {\n      return stringToDateTime(str, result, format);\n    }\n  };\n\n\n  template <>\n  inline std::tm ExcelObj::get() const\n  {\n    DateTimeVisitor v;\n    if (visit(v))\n      return std::move(v.result);\n    XLO_THROW(\"Could not convert to datetime\");\n  }\n}\n"
  },
  {
    "path": "include/xloil/DynamicRegister.h",
    "content": "#pragma once\n#include <xloil/FuncSpec.h>\n#include <xloil/StaticRegister.h>\n\nnamespace xloil\n{\n  template<typename TRet, typename TData> using DynamicCallback\n    = TRet(*)(const TData* data, const ExcelObj**) noexcept;\n\n  class RegisteredCallback;\n\n  /// <summary>\n  /// Holds a run-time specified function spec. Can call the underlying function \n  /// or write a runtime thunk and register with UDF with Excel. Although the \n  /// ctor is templated on return type, only 4 return types are supported:\n  ///   * ExcelObj* - normal worksheet functions\n  ///   * void      - async function\n  ///   * int       - commands\n  ///   * FPArray*  - fast arrays\n  /// </summary>\n  class DynamicSpec : public WorksheetFuncSpec\n  {\n    friend class RegisteredCallback;\n\n  public:\n    template <class TRet, class TData>\n    DynamicSpec(\n      const std::shared_ptr<const FuncInfo>& info,\n      DynamicCallback<TRet, TData> callback,\n      const std::shared_ptr<const TData>& context)\n      : WorksheetFuncSpec(info)\n      , _callback(callback)\n      , _context(context)\n      , _hasReturn(!std::is_same_v<TRet, void>)\n      , _returnNull(!std::is_same_v<TRet, ExcelObj*>)\n    {\n      static_assert(std::is_same_v<TRet, void>\n                 || std::is_same_v<TRet, ExcelObj*>\n                 || std::is_same_v<TRet, int>\n                 || std::is_same_v<TRet, FPArray*>);\n    }\n\n    ExcelObj* call(const ExcelObj** args) const override\n    {\n      if (_hasReturn)\n      {\n        auto ret = static_cast<DynamicCallback<ExcelObj*, void>>(_callback)(_context.get(), args);\n        // It's not safe to return an FPArray* or int here, so we just discard it. In practice, \n        // call() is used for local functions which can't return FPArrays, and the return\n        // values for local Subroutines/Commands are not used by Excel.\n        return  _returnNull ? nullptr : ret;\n      }\n      else\n      {\n        // Only async functions can get here, but we would never invoke call() on an \n        // async function ourselves.\n        static_cast<DynamicCallback<void, void>>(_callback)(_context.get(), args);\n        return nullptr;\n      }\n    }\n\n    XLOIL_EXPORT std::shared_ptr<RegisteredWorksheetFunc> registerFunc() const override;\n\n    auto context() const { return _context; }\n\n  private:\n    std::shared_ptr<const void> _context;\n    void* _callback;\n    bool _hasReturn;\n    bool _returnNull;\n  };\n\n  namespace detail\n  {\n    template <typename ReturnType, typename... Args>\n    struct ArgTypesDefs<ReturnType, const FuncInfo&, Args...> \n      : public ArgTypesDefs<ReturnType, Args...>\n    {\n      static constexpr bool hasInfo = true;\n    };\n\n    template<typename TFunc>\n    auto hasInfo(int) -> decltype(ArgTypes<TFunc>::hasInfo, std::true_type());\n    template<typename TFunc>\n    auto hasInfo(long) -> std::false_type;\n\n    template<typename TRet>\n    struct DynamicCallbackFromLambda\n    {\n      template<typename TFunc, size_t... ArgIndices>\n      auto operator()(TFunc func, std::index_sequence<ArgIndices...>)\n      {\n        return [func](const FuncInfo& info, const ExcelObj** args)\n        {\n          (void)info;\n          try\n          {\n            if constexpr (decltype(hasInfo<TFunc>(0))::value)\n              return func(info, (ArgTypes<TFunc>::arg<ArgIndices>::type)(*args[ArgIndices])...);\n            else\n              return func((ArgTypes<TFunc>::arg<ArgIndices>::type)(*args[ArgIndices])...);\n          }\n          catch (const std::exception& e)\n          {\n            if constexpr(std::is_same_v<TRet, ExcelObj*>)\n              return returnValue(e);\n            else\n            {\n              XLO_WARN(e.what());\n              if constexpr (std::is_same_v<TRet, int>)\n                return 0;\n            }\n          }\n        };\n      }\n    };\n\n    template<typename TRet, typename TFunc>\n    auto dynamicCallbackFromLambda(TFunc func)\n    {\n      return DynamicCallbackFromLambda<TRet>()(\n        func,\n        std::make_index_sequence<ArgTypes<TFunc>::nArgs>{});\n    }\n  }\n\n  /// <summary>\n  /// Constructs a WorksheetFuncSpec from an std::function object which \n  /// takes <see cref=\"ExcelObj\"/> arguments\n  /// </summary>\n  template<class TRet=ExcelObj*>\n  class LambdaSpec : public WorksheetFuncSpec\n  {\n  public:\n    LambdaSpec(\n      const std::shared_ptr<const FuncInfo>& info,\n      const DynamicExcelFunc<TRet>& function)\n      : WorksheetFuncSpec(info)\n      , function(function)\n    {}\n\n    XLOIL_EXPORT std::shared_ptr<RegisteredWorksheetFunc> registerFunc() const override;\n\n    ExcelObj* call(const ExcelObj** args) const;\n    DynamicExcelFunc<TRet> function;\n  };\n\n  inline ExcelObj* LambdaSpec<ExcelObj*>::call(const ExcelObj** args) const\n  {\n    return function(*info(), args);\n  }\n\n  inline ExcelObj* LambdaSpec<int>::call(const ExcelObj** args) const\n  {\n    function(*info(), args);\n    return nullptr;\n  }\n\n  inline ExcelObj* LambdaSpec<void>::call(const ExcelObj** args) const\n  {\n    function(*info(), args);\n    return nullptr;\n  }\n\n  /// <summary>\n  /// Dynamically registers the provided callable, inheriting from \n  /// <see cref=\"FuncInfoBuilder\"/> which allows customisation of the registration\n  /// info.  Call <see cref=\"RegisterLambda::registerFunc\"/> on this object to\n  /// register the function.\n  /// </summary>\n  template<class TRet = ExcelObj*>\n  class RegisterLambda : public FuncInfoBuilderT<RegisterLambda<TRet>>\n  {\n    DynamicExcelFunc<TRet> _registerFunction;\n\n  public:\n    /// <summary>\n    /// Creates a lambda registration builder from a callable and optionally\n    /// a FuncInfo. If a FuncInfo is not provided, it can be built up using the \n    /// FuncInfoBuilder methods on this class\n    /// </summary>\n    template <class TFunc>\n    RegisterLambda(TFunc func, std::shared_ptr<FuncInfo> info = nullptr)\n      : FuncInfoBuilderT(detail::ArgTypes<TFunc>::types)\n    {\n      _registerFunction = detail::dynamicCallbackFromLambda<TRet, TFunc>(func);\n      if (info)\n      {\n        if (info->numArgs() != _info->numArgs())\n          XLO_THROW(\"RegisterLambda: if FuncInfo is provided, number of args must match\");\n        _info = info;\n      }\n    }\n\n    /// <summary>\n    /// Registers this function and returns a handle to a <see cref=\"RegisteredWorksheetFunc\"/>\n    /// object. Note that the handle must be kept in scope as its destructor\n    /// unregisters the function.\n    /// </summary>\n    std::shared_ptr<RegisteredWorksheetFunc> registerFunc()\n    {\n      return std::make_shared<LambdaSpec<TRet>>(\n        getInfo(), _registerFunction)->registerFunc();\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/EnumHelper.h",
    "content": "#pragma once\n#include <functional>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Species the format used to write sheet addresses\n  /// </summary>\n  enum class AddressStyle : int\n  {\n    /// <summary>\n    /// A1 Format: '[Book1]Sheet1'!A1:B2\n    /// </summary>\n    A1 = 0,\n    /// <summary>\n    /// RC Format: '[Book1]Sheet1'!R1C1:R2C2\n    /// </summary>\n    RC = 1,\n    /// <summary>\n    /// Makes the address absolute, e.g. $A$1\n    /// </summary>\n    ROW_FIXED = 2,\n    /// <summary>\n    /// Makes the address absolute, e.g. $A$1\n    /// </summary>\n    COL_FIXED = 4,\n    /// <summary>\n    /// Omits the sheet/workbook name\n    /// </summary>\n    LOCAL = 8,\n    /// <summary>\n    /// Does not quote sheet name, e.g. [Book1]Sheet1!A1:B2\n    /// </summary>\n    NOQUOTE = 16,\n  };\n\n  namespace detail\n  {\n    template<class T> struct isFlagEnum        { static constexpr bool value = false; };\n    template<> struct isFlagEnum<AddressStyle> { static constexpr bool value = true; };\n  }\n\n  // Based on https://stackoverflow.com/questions/49653901/\n\n  template< typename ENUM, typename std::enable_if_t<detail::isFlagEnum<ENUM>::value, int>* = nullptr>\n  inline constexpr ENUM operator |(ENUM lhs, ENUM rhs)\n  {\n    return static_cast<ENUM>(static_cast<std::underlying_type_t<ENUM>>(lhs) | static_cast<std::underlying_type_t<ENUM>>(rhs));\n  }\n\n  template< typename ENUM, typename std::enable_if_t<detail::isFlagEnum<ENUM>::value, int>* = nullptr>\n  inline constexpr ENUM& operator |=(ENUM& lhs, ENUM rhs)\n  {\n    lhs = lhs | rhs;\n    return lhs;\n  }\n\n  template< typename ENUM, typename std::enable_if_t<detail::isFlagEnum<ENUM>::value, int>* = nullptr>\n  inline constexpr auto operator &(ENUM lhs, ENUM rhs)\n  {\n    return static_cast<std::underlying_type_t<ENUM>>(lhs) & static_cast<std::underlying_type_t<ENUM>>(rhs);\n  }\n\n  template< typename ENUM, typename std::enable_if_t<detail::isFlagEnum<ENUM>::value, int>* = nullptr>\n  inline constexpr ENUM& operator &=(ENUM& lhs, ENUM rhs)\n  {\n    lhs = lhs & rhs;\n    return lhs;\n  }\n\n  template< typename ENUM, typename std::enable_if_t<detail::isFlagEnum<ENUM>::value, int>* = nullptr>\n  inline constexpr ENUM& operator &=(ENUM& lhs, std::underlying_type_t<ENUM> rhs)\n  {\n    lhs = static_cast<ENUM>(static_cast<std::underlying_type_t<ENUM>>(lhs) & rhs);\n    return lhs;\n  }\n}"
  },
  {
    "path": "include/xloil/Events.h",
    "content": "#pragma once\n#include <xloil/ExportMacro.h>\n#include <xlOil/Log.h> \n#include <xloil/Preprocessor.h>\n#include <functional>\n#include <memory>\n#include <list>\n#include <mutex>\n#include <future>\n#include <string>\n#include <sstream>\n\nnamespace xloil { class ExcelRange; }\n\n// You'd think char* to string conversion would be covered - welcome to \n// the patchwork world of c++ strings.\nnamespace std {\n  inline std::wstring to_wstring(const wchar_t* s) { return s; }\n}\n\nnamespace xloil\n{\n  namespace detail\n  {\n    struct AsyncVoidCollector\n    {\n      template<class THandlers, class... Args>\n      void operator()(const THandlers& handlers, Args&&... args) const\n      {\n        (void)std::async([handlers](Args... vals)\n        {\n          for (auto& h : handlers)\n            h(vals...);\n        }, args...);\n      }\n    };\n\n    struct VoidCollector\n    {\n      template<class THandlers, class... Args>\n      void operator()(const THandlers& handlers, Args&&... args) const\n      {\n        for (auto& h : handlers)\n        {\n          try\n          {\n            h(args...);\n          }\n          catch (const std::exception& e)\n          {\n            XLO_ERROR(\"Error during event: {}\", e.what());\n          }\n        }\n      }\n    };\n\n    template <typename... T>\n    inline std::wstring concatParameters(T&&... args) \n    {\n      using std::to_wstring;\n      std::wstring s;\n      ((((s += L' ') += to_wstring(std::forward<T>(args))) += L','), ...);\n      return s;\n    }\n  }\n  namespace Event\n  {\n    template<class, class = detail::VoidCollector> class Event {};\n\n    /// <summary>\n    /// An observer-pattern based Event handler\n    /// </summary>\n    template<class R, class TCollector, class... Args>\n    class Event<R(Args...), TCollector> :\n      public std::enable_shared_from_this<Event<R(Args...), TCollector>>\n    {\n    public:\n      using handler = std::function<R(Args...)>;\n      using handler_id = const handler*;\n\n      Event(const wchar_t* name = 0)\n        : _name(name ? name : L\"?\")\n      {}\n\n      virtual ~Event()\n      {}\n\n      /// <summary>\n      /// Registers an event handler\n      /// </summary>\n      /// <param name=\"h\"></param>\n      /// <returns>An ID which can be used to unregister the handler</returns>\n      handler_id operator+=(handler&& h)\n      {\n        std::lock_guard<std::mutex> lock(_lock);\n\n        auto& val = _handlers.emplace_back(std::forward<handler>(h));\n        return &val;\n      }\n\n      /// <summary>\n      /// Removes an event handler give its registration ID.\n      /// </summary>\n      /// <param name=\"id\"></param>\n      /// <returns></returns>\n      bool operator-=(handler_id id)\n      {\n        std::lock_guard<std::mutex> lock(_lock);\n\n        for (auto h = _handlers.begin(); h != _handlers.end(); ++h)\n        {\n          if (&(*h) == id)\n          {\n            _handlers.erase(h);\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /// <summary>\n      /// Removes an event handler given a reference to the handler\n      /// </summary>\n      bool operator-=(const handler& id)\n      {\n        return (*this) -= &id;\n      }\n\n      /// <summary>\n      /// Registers an event handler and returns a shared_ptr whose destructor\n      /// unregisters the event handler. The dtor keeps a shared_ptr to this \n      /// event to ensure the correct order of static destruction.\n      /// </summary>\n      /// <param name=\"h\"></param>\n      /// <returns></returns>\n      auto bind(handler&& h)\n      {\n        auto thisPtr = shared_from_this();\n        return std::static_pointer_cast<const void>(\n          std::shared_ptr<const handler>(\n            (*this) += std::forward<handler>(h),\n            [thisPtr](handler_id id) { (*thisPtr) -= id; }));\n      }\n\n      /// <summary>\n      /// Safe version of <see cref=\"bind\"/> which binds a member function to \n      /// an event and holds a weak ptr to the associated object, which it \n      /// checks for validity. The event handler itself is not unbound when the \n      /// weak ptr expires, only when the shared_ptr returned from this function\n      /// is destroyed.\n      /// </summary>\n      template<class T, class U, class D>\n      auto weakBind(std::weak_ptr<U>&& wptr, const D T::* func)\n      {\n        if (wptr.expired())\n          XLO_THROW(\"Internal: weakBind called with null pointer\");\n        return bind([=] (Args&&... args)\n        {\n          auto ptr = std::static_pointer_cast<T>(wptr.lock());\n          if (ptr)\n            ((*ptr).*func)(std::forward<Args>(args)...);\n          // TODO: schedule an unbind?\n        });\n      }\n\n      R fire(Args... args) const\n      {\n        if (_handlers.empty())\n          return R();\n\n        _lock.lock();\n        std::vector<handler> copy(_handlers.begin(), _handlers.end());\n        _lock.unlock();\n        if (spdlog::default_logger()->level() <= spdlog::level::debug)\n          XLO_DEBUG(L\"Firing event {0}{1}\", _name, detail::concatParameters(std::forward<Args>(args)...));\n        return _collector(copy, std::forward<Args>(args)...);\n      }\n\n      const std::list<handler>& handlers() const \n      {\n        return _handlers;\n      }\n\n      /// <summary>\n      /// Removes all existing handlers\n      /// </summary>\n      void clear()\n      {\n        _handlers.clear();\n      }\n\n      const std::wstring& name() const { return _name; }\n\n    private:\n      std::list<handler> _handlers;\n      mutable std::mutex _lock;\n      TCollector _collector;\n      std::wstring _name;\n    };\n\n    using EventNoParam = Event<void(void), detail::VoidCollector>;\n    using EventNameParam = Event<void(const wchar_t*), detail::VoidCollector>;\n\n    /// <summary>\n    /// Event triggered when the xlOil addin is unloaded by Excel.\n    /// Purposely not exported as plugins should unload when requested\n    /// by xlOil Core, hence have not need to hook this event.\n    /// </summary>\n    EventNoParam&\n      AutoClose();\n\n    /// <summary>\n    /// Event triggered at the end of an Excel calc cycle. Equivalent to\n    /// Excel's Application.AfterCalculate event.\n    /// </summary>\n    XLOIL_EXPORT EventNoParam&\n      AfterCalculate();\n\n    /// <summary>\n    /// Event triggered when calculation is cancelled by user interaction\n    /// with Excel.\n    /// </summary>\n    XLOIL_EXPORT EventNoParam&\n      CalcCancelled();\n\n    /// <summary>\n    /// Triggered when a new workbook is created. Passes the\n    /// workbook name as argument.  See the Excel\n    /// Application.NewWorkbook event.\n    /// </summary>\n    XLOIL_EXPORT EventNameParam&\n      NewWorkbook();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wsName, const ExcelRange& target)>&\n      SheetSelectionChange();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wsName, const ExcelRange& target, bool& cancel)>&\n      SheetBeforeDoubleClick();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wsName, const ExcelRange& target, bool& cancel)>&\n      SheetBeforeRightClick();\n\n    XLOIL_EXPORT EventNameParam&\n      SheetActivate();\n\n    XLOIL_EXPORT EventNameParam&\n      SheetDeactivate();\n\n    XLOIL_EXPORT EventNameParam&\n      SheetCalculate();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wsName, const ExcelRange& target)>&\n      SheetChange();\n\n    /// <summary>\n    /// Triggered when a workbook file is opened from storage. Passes\n    /// the file path and file name as arguments. See the Excel\n    /// Application.WorkbookOpen event.\n    /// </summary>\n    XLOIL_EXPORT Event<void(const wchar_t* wbPath, const wchar_t* wbName)>&\n      WorkbookOpen();\n\n    /// <summary>\n    /// WorkbookAfterClose is not part of Excel's event model.  Excel's event \n    /// `WorkbookBeforeClose`, can be cancellable by the user so it is not possible to \n    /// know if the workbook actually closed. When xlOil calls `WorkbookAfterClose`, the \n    /// workbook is certainly closed, but it may be some time since that closure happened.\n    /// \n    /// The event is not called for each workbook when xlOil (or Excel) exits.\n    /// </summary>\n    XLOIL_EXPORT EventNameParam&\n      WorkbookAfterClose();\n\n    /// <summary>\n    /// WorkbookRename is also not in Excel's event module. It is called when xlOil\n    /// detects that a workbook has been saved under a different name. It does this by\n    /// watching the `WorkbookBeforeSave` and `WorkbookAfterSave` events, so the event\n    /// is fired immediately after save.\n    /// </summary>\n    XLOIL_EXPORT Event<void(const wchar_t* currentPath, const wchar_t* previousPath)>&\n      WorkbookRename();\n\n    XLOIL_EXPORT EventNameParam&\n      WorkbookActivate();\n\n    XLOIL_EXPORT EventNameParam&\n      WorkbookDeactivate();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wbName, bool& cancel)>&\n      WorkbookBeforeClose();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wbName, bool saveAsUI, bool& cancel)>&\n      WorkbookBeforeSave();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wbName, bool success)>&\n      WorkbookAfterSave();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wbName, bool& cancel)>&\n      WorkbookBeforePrint();\n\n    XLOIL_EXPORT Event<void(const wchar_t* wbName, const wchar_t* wsName)>&\n      WorkbookNewSheet();\n\n    XLOIL_EXPORT EventNameParam&\n      WorkbookAddinInstall();\n\n    XLOIL_EXPORT EventNameParam&\n      WorkbookAddinUninstall();\n\n    /// <summary>\n    /// Triggered when an XLL related to this instance of xlOil is added by\n    /// the user using the Addin settings window. The parameter is the XLL\n    /// filename.\n    /// </summary>\n    XLOIL_EXPORT EventNameParam&\n      XllAdd();\n\n    /// <summary>\n    /// Triggered when an XLL related to this instance of xlOil is removed by\n    /// the user using the Addin settings window.  The parameter is the XLL\n    /// filename\n    /// </summary>\n    XLOIL_EXPORT EventNameParam&\n      XllRemove();\n\n    /// <summary>\n    /// Triggered when the COM add-in list is refreshed. xlOil must have \n    /// registered a COM add-in to be notified of this event.\n    /// </summary>\n    XLOIL_EXPORT EventNoParam&\n      ComAddinsUpdate();\n\n    enum class FileAction\n    {\n      /// Sent when a file is created or renamed\n      Add = 1,\n      /// Sent when a file is deleted or renamed\n      Delete = 2,\n      /// Sent when a file is modified\n      Modify = 4\n    };\n\n    XLOIL_EXPORT std::wstring to_wstring(const FileAction x);\n\n    using DirectoryChangeEvent_t = Event<void(const wchar_t* directory, const wchar_t* filename, FileAction)>;\n    XLOIL_EXPORT \n      std::shared_ptr<DirectoryChangeEvent_t>\n        DirectoryChange(const std::wstring& path, const bool subDirs);\n  }\n\n \n\n  /// <summary>\n  /// All the singleton xlOil events as a sequence. Use BOOST_PP_SEQ functions\n  /// to iterate over this sequence to create bindings. Non singleton/static\n  /// events such as DirectoryChange are not included here.\n  /// </summary>\n#define XLOIL_STATIC_EVENTS \\\n    (AfterCalculate)\\\n    (WorkbookOpen)\\\n    (NewWorkbook)\\\n    (SheetSelectionChange)\\\n    (SheetBeforeDoubleClick)\\\n    (SheetBeforeRightClick)\\\n    (SheetActivate)\\\n    (SheetDeactivate)\\\n    (SheetCalculate)\\\n    (SheetChange)\\\n    (WorkbookAfterClose)\\\n    (WorkbookRename)\\\n    (WorkbookActivate)\\\n    (WorkbookDeactivate)\\\n    (WorkbookBeforeClose)\\\n    (WorkbookBeforeSave)\\\n    (WorkbookAfterSave)\\\n    (WorkbookBeforePrint)\\\n    (WorkbookNewSheet)\\\n    (WorkbookAddinInstall)\\\n    (WorkbookAddinUninstall)\\\n    (XllAdd)\\\n    (XllRemove)\\\n    (ComAddinsUpdate)\n    \n\n    /// <summary>\n    /// Creates a function body for a event declaration such as\n    /// <code>\n    ///   Event<void(void)>& MyEvent();\n    /// </code>\n    /// You need to include BOOST_PP_STRINGIZE to use this macro.\n    /// </summary>\n#define XLOIL_DEFINE_EVENT(name) \\\n    decltype(name()) name() \\\n    { \\\n      static auto e = std::make_shared<std::remove_reference_t<\\\n        decltype(name())>>(XLO_WSTR(name)); \\\n      return *e; \\\n    }\n}"
  },
  {
    "path": "include/xloil/ExcelArray.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Throw.h>\n#include <cassert>\n\nnamespace xloil\n{\n  namespace detail\n  {\n    template <class TSize>\n    inline bool sliceIndices(int& from, int to, TSize& size)\n    {\n      if (from < 0)\n      {\n        from += size;\n        if (from < 0)\n          return false;\n      }\n      if (to < 0)\n      {\n        to += size;\n        if (to < 0)\n          return false;\n      }\n      else if (to > (int)size)\n        return false;\n      const auto sz = to - from;\n      if (sz < 0)\n        return false;\n      size = (TSize)sz;\n      return true;\n    }\n  }\n\n  class ExcelArray;\n\n  class ExcelArrayIterator\n  {\n  public:\n    using iterator = ExcelArrayIterator;\n    using col_t = ExcelObj::col_t;\n\n    ExcelArrayIterator(\n      const ExcelObj* position,\n      const col_t nCols,\n      const col_t baseNumCols) noexcept;\n    iterator& operator++() noexcept;\n    iterator& operator--() noexcept;\n    iterator operator++(int) noexcept\n    {\n      iterator retval = *this;\n      ++(*this);\n      return retval;\n    }\n    iterator operator--(int) noexcept\n    {\n      iterator retval = *this;\n      --(*this);\n      return retval;\n    }\n    bool operator==(iterator other) const noexcept { return _p == other._p; }\n    bool operator!=(iterator other) const noexcept { return !(*this == other); }\n    const ExcelObj& operator*() const noexcept { return *_p; }\n    auto* operator->() noexcept { return &*_p; }\n\n  private:\n    const ExcelObj* _p;\n    const ExcelObj* _pRowEnd;\n    col_t _nCols;\n    col_t _baseNumCols;\n  };\n\n\n  /// <summary>\n  /// Yes I know there's one in boost and there's ranges::stride_view in C++23 but we're\n  /// in 2022 and I don't want to include boost to save 20 lines!\n  /// </summary>\n  template<class T>\n  class StrideIterator\n  {\n  public:\n    using iterator = StrideIterator<T>;\n\n    StrideIterator(T start, ptrdiff_t stride)\n      : _p(start)\n      , _stride(stride)\n    {}\n    auto& operator++()\n    {\n      _p += _stride;\n      return *this;\n    }\n    auto& operator--()\n    {\n      _p -= _stride;\n      return *this;\n    }\n    auto operator++(int)\n    {\n      iterator copy = *this;\n      ++(*this);\n      return copy;\n    }\n    auto operator--(int)\n    {\n      iterator copy = *this;\n      --(*this);\n      return copy;\n    }\n\n    bool operator==(iterator other) const { return _p == other._p; }\n    bool operator!=(iterator other) const { return !(*this == other); }\n\n    const auto& operator*() const { return *_p; }\n    auto& operator*() { return *_p; }\n    auto* operator->() { return &*_p; }\n\n  private:\n    T _p;\n    ptrdiff_t _stride;\n  };\n}\n\ntemplate<> struct std::iterator_traits<xloil::ExcelArrayIterator>\n{\n  using iterator_category = std::bidirectional_iterator_tag;\n  using value_type = xloil::ExcelObj;\n  using reference = const value_type&;\n  using pointer = const value_type*;\n  using difference_type = size_t;\n};\n\ntemplate<class T> struct std::iterator_traits<xloil::StrideIterator<T>>\n{\n  using iterator_category = std::bidirectional_iterator_tag;\n  using value_type = typename std::iterator_traits<T>::value_type;\n  using reference = typename std::iterator_traits<T>::reference;\n  using pointer = typename std::iterator_traits<T>::pointer;\n  using difference_type = size_t;\n};\n\nnamespace xloil\n{\n  /// <summary>\n  /// Creates a view of an array contained in an ExcelObj. It does not \n  /// copy or own the array data.\n  /// </summary>\n  class ExcelArray\n  {\n  public:\n    using size_type = uint32_t;\n    using row_t = ExcelObj::row_t;\n    using col_t = ExcelObj::col_t;\n\n    /// <summary>\n    /// Create an ExcelArray from an ExcelObj. By default trims the provided array\n    /// to the last non-empty (not Nil, \\#N/A or \"\") row and column. \n    /// \n    /// Single values are converted to a 1x1 array. Throws if object type cannot \n    /// be converted to an array.\n    /// </summary>\n    /// <param name=\"obj\"></param>\n    /// <param name=\"trim\">If true, trim the array to the last non-empty row and columns</param>\n    XLOIL_EXPORT explicit ExcelArray(const ExcelObj& obj, bool trim = true);\n\n    /// <summary>\n    /// Creates an ExcelArray which is a subarray of a given one. It extends from \n    /// (fromRow, fromCol) to (toRow, toCol) not including the right-hand ends.\n    /// \n    /// Negative values for the parameters are interpreted as offsets from nRows and \n    /// nCols respectively.\n    /// </summary>\n    /// <param name=\"arr\">The parent array</param>\n    /// <param name=\"fromRow\">Starting row, included</param>\n    /// <param name=\"fromCol\">Starting column, included</param>\n    /// <param name=\"toRow\">Ending row, not included</param>\n    /// <param name=\"toCol\">Ending column, not included</param>\n    ExcelArray(const ExcelArray& arr,\n      int fromRow, int fromCol,\n      int toRow, int toCol)\n      : _baseCols(arr._baseCols)\n      , _rows(arr.nRows())\n      , _columns(arr.nCols())\n    {\n      if (!detail::sliceIndices(fromRow, toRow, _rows))\n        XLO_THROW_TYPE(std::out_of_range, \"Invalid sub-array row indices {0}, {1} in array of size ({2}, {3})\",\n          fromRow, toRow, arr.nRows());\n      if (!detail::sliceIndices(fromCol, toCol, _columns))\n        XLO_THROW_TYPE(std::out_of_range, \"Invalid sub-array column indices {0}, {1} in array of size ({2}, {3})\",\n          fromCol, toCol, arr.nCols());\n\n      _data = arr._data + (col_t)fromRow * _baseCols + fromCol;\n    }\n\n    /// <summary>\n    /// Retieves the i,j-th element from the array\n    /// </summary>\n    /// <param name=\"row\"></param>\n    /// <param name=\"col\"></param>\n    /// <returns>A const reference to the i,j-th element</returns>\n    const ExcelObj& operator()(row_t row, col_t col) const\n    {\n      checkRange(row, col);\n      return at(row, col);\n    }\n\n    /// <summary>\n    /// Retrives the n-th element in the array, working row-wise. Rather slow so use sparingly.\n    /// </summary>\n    /// <returns>A const reference to the n-th element</returns>\n    const ExcelObj& operator()(size_t n) const\n    {\n      checkRange(n);\n      return at(n);\n    }\n\n    const ExcelObj& operator[](size_t n) const\n    {\n      checkRange(n);\n      return at(n);\n    }\n\n    /// <summary>\n    /// Retrieves the i,j-th element without bounds checking\n    /// </summary>\n    /// <returns>A const reference to the i,j-th element</returns>\n    const ExcelObj& at(row_t row, col_t col) const\n    {\n      return *(row_begin(row) + col);\n    }\n    /// <summary>\n    /// Retrives the n-th element in the array, working row-wise without bounds checking.\n    /// Rather slow so use sparingly.\n    /// </summary>\n    /// <returns>A const reference to the n-th element</returns>\n    const ExcelObj& at(size_t n) const\n    {\n      auto N = nCols();\n      auto i = (row_t)n / N;\n      auto j = (col_t)(n % N);\n      return at(i, j);\n    }\n\n    /// <summary>\n    /// Returns a sub-array as a new ExcelArray.\n    /// It extends from (fromRow, fromCol) to the end of the array.\n    /// \n    /// Negative values for <paramref name=\"fromRow\"/> and <paramref name=\"fromCol\"/>\n    /// are interpreted as offsets from nRows and nCols respectively.\n    /// </summary>\n    /// <param name=\"fromRow\"></param>\n    /// <param name=\"fromCol\"></param>\n    /// <returns></returns>\n    ExcelArray slice(int fromRow, int fromCol) const\n    {\n      return ExcelArray(*this, fromRow, fromCol, nRows(), nCols());\n    }\n    /// <summary>\n    /// Returns a sub-array as a new ExcelArray.\n    /// It extends from (fromRow, fromCol) to (toRow, toCol) not including the right\n    /// hand ends.\n    /// \n    /// Negative values for the parameters are interpreted as offsets from nRows and \n    /// nCols respectively.\n    /// </summary>\n    /// <returns></returns>\n    ExcelArray slice(\n      int fromRow, int fromCol,\n      int toRow, int toCol) const\n    {\n      return ExcelArray(*this, fromRow, fromCol, toRow, toCol);\n    }\n\n    row_t nRows() const { return _rows; }\n    col_t nCols() const { return _columns; }\n    size_type size() const { return _rows * _columns; }\n\n    /// <summary>\n    /// Returns 2 if both nRows and nCols exceed 1, otherwise returns 1\n    /// unless the array has zero size, in which case returns zero.\n    /// </summary>\n    /// <returns></returns>\n    uint8_t dims() const\n    {\n      return _rows > 1 && _columns > 1\n        ? 2\n        : (_rows == 0 || _columns == 0 ? 0 : 1);\n    }\n\n    /// <summary>\n    /// Returns an iterator to the start of the specified row. Note this iterator\n    /// is only valid for the specified row, it does not wrap to the next row,\n    /// use <see cref=\"ExcelArray::begin\"/> for that functionality.\n    /// </summary>\n    const ExcelObj* row_begin(row_t i) const { return _data + i * (size_t)_baseCols; }\n\n    /// <summary>\n    /// Returns an iterator to the end of the specified row (i.e. one past the last element)\n    /// </summary>\n    /// <param name=\"i\"></param>\n    const ExcelObj* row_end(row_t i)   const { return row_begin(i) + nCols(); }\n\n    /// <summary>\n    /// Returns an iterator to the start of the specified column. Does not check that\n    /// `j` is a valid column.\n    /// </summary>\n    auto col_begin(col_t j) const\n    {\n      assert(j < _columns);\n      return StrideIterator<const ExcelObj*>(_data + j, _baseCols);\n    }\n\n    /// <summary>\n    /// Returns an iterator to the end of the specified column. Does not check that\n    /// `j` is a valid column.\n    /// </summary>\n    auto col_end(col_t j) const\n    {\n      assert(j < _columns);\n      return StrideIterator<const ExcelObj*>(_data + j + (_rows - 1) * _baseCols, _baseCols);\n    }\n\n    /// <summary>\n    /// Returns an iterator to the first element in the array\n    /// </summary>\n    /// <returns></returns>\n    ExcelArrayIterator begin() const\n    {\n      return ExcelArrayIterator(row_begin(0), _columns, _baseCols);\n    }\n\n    /// <summary>\n    /// Returns an iterator to the end of the array (i.e. one past the last element)\n    /// </summary>\n    /// <returns></returns>\n    ExcelArrayIterator end() const\n    {\n      // The whole array iterator steps beyond the end of the last start of the\n      // next row which may be different if _columns != _baseCols\n      return ExcelArrayIterator(row_begin(_columns > 0 ? nRows() : 0), _columns, _baseCols);\n    }\n\n    /// <summary>\n    /// Determines the type of data stored in the array if it is homogenous. If it is\n    /// not, it returns the type BigData.\n    ///\n    /// It assumes that boolean can be interpreted as integers and that integers can \n    /// be interpreted as float.  It also assumes \"empty\" can be interpreted as a floating\n    /// point (e.g. NaN), but other error types cannot.\n    ///\n    /// Note that objects in Excel arrays can be one of: int, bool, double, error, string, empty.\n    /// </summary>\n    ExcelType dataType() const\n    {\n      using namespace msxll;\n      int type = 0;\n      for (decltype(_rows) i = 0; i < _rows; ++i)\n        for (auto j = row_begin(i); j < row_end(i); ++j)\n          type |= j->xltype;\n\n      switch (type)\n      {\n      case xltypeBool:\n        return ExcelType::Bool;\n\n      case xltypeInt:\n      case xltypeInt | xltypeBool:\n        return ExcelType::Int;\n\n      case xltypeNum:\n      case xltypeInt | xltypeNum:\n      case xltypeInt | xltypeNum | xltypeBool:\n      case xltypeInt | xltypeNum | xltypeNil:\n      case xltypeInt | xltypeNum | xltypeBool | xltypeNil:\n        return ExcelType::Num;\n\n      case xltypeStr:\n        return ExcelType::Str;\n\n      case xltypeErr:\n        return ExcelType::Err;\n\n      default:\n        return ExcelType::BigData;\n      }\n    }\n\n    /// <summary>\n    /// Returns an ExcelObj of Array type which contains the array data\n    /// viewed by this ExcelArray. The data is copied. \n    /// you\n    /// </summary>\n    XLOIL_EXPORT ExcelObj toExcelObj() const;\n\n    /// <summary>\n    /// Determine the size of array data when blanks and \\#N/A is ignored.\n    /// </summary>\n    /// <returns>false if object is not an array, else true</returns>\n    XLOIL_EXPORT static bool trimmedArraySize(const ExcelObj& obj, row_t& nRows, col_t& nCols);\n\n    /// <summary>\n    /// Returns an ExcelObj of Array type which contains the array data.\n    /// Tries to avoid copying the underlying data where possible. This\n    /// function should only be used when the underlying data is guaranteed\n    /// to outlive the object returned from this function.\n    /// </summary>\n    ExcelObj toExcelObjUnsafe() const\n    {\n      if (dims() == 0)\n        return ExcelObj();\n\n      if (_columns == _baseCols || _rows == 1)\n        return ExcelObj(_data, _rows, _columns, true);\n      else\n      {\n        auto data = new ExcelObj::Base[size()];\n        // The iterator is noexcept so the raw ptr above is safe\n        std::copy(begin(), end(), data);\n        return ExcelObj((ExcelObj*)data, _rows, _columns);\n      }\n    }\n\n  private:\n    const ExcelObj* _data;\n    row_t _rows;\n    col_t _columns;\n    col_t _baseCols;\n\n    friend class ExcelArrayIterator;\n\n    void checkRange(size_t row, size_t col) const\n    {\n      if (row >= nRows() || col >= nCols())\n        XLO_THROW_TYPE(std::out_of_range, \"Array access ({0}, {1}) out of range ({2}, {3})\", row, col, nRows(), nCols());\n    }\n\n    void checkRange(size_t n) const\n    {\n      if (n >= size())\n        XLO_THROW_TYPE(std::out_of_range, \"Array access {0} out of range {1}\", n, size());\n    }\n  };\n\n  inline ExcelArrayIterator::ExcelArrayIterator(\n    const ExcelObj* position,\n    const ExcelObj::col_t nCols,\n    const ExcelObj::col_t baseNumCols) noexcept\n    : _p(position)\n    , _pRowEnd(nCols == baseNumCols ? nullptr : position + nCols)\n    , _nCols(nCols)\n    , _baseNumCols(baseNumCols)\n  {\n    // Note the optimisation: if nCols == baseNumCols, the array\n    // data is contiguous so we don't need to reset the pointer\n    // at the end of a row\n  }\n\n  inline ExcelArrayIterator& ExcelArrayIterator::operator++() noexcept\n  {\n    if (++_p == _pRowEnd)\n    {\n      _p += _baseNumCols - _nCols;\n      _pRowEnd += _baseNumCols;\n    }\n    return *this;\n  }\n  inline ExcelArrayIterator& ExcelArrayIterator::operator--() noexcept\n  {\n    if (_pRowEnd - _p == (ptrdiff_t)_nCols)\n    {\n      _pRowEnd -= _baseNumCols;\n      _p = _pRowEnd - 1;\n    }\n    else\n      --_p;\n    return *this;\n  }\n}"
  },
  {
    "path": "include/xloil/ExcelCall.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Throw.h>\n#include <vector>\n#include <memory>\n#include <list>\n\nnamespace xloil\n{\n  namespace detail\n  {\n    template <class TIterable> struct Splatter\n    {\n      Splatter(const TIterable& iter) : _obj(iter) {}\n      const TIterable& operator()() const { return _obj; }\n      const TIterable& _obj;\n    };\n\n    class CallArgHolder\n    {\n    private:\n      std::list<ExcelObj> _temporary;\n      std::vector<const ExcelObj*> _argVec;\n\n    public:\n      template<class... Args> CallArgHolder(Args&&... args)\n      {\n        _argVec.reserve(sizeof...(args));\n        add(std::forward<Args>(args)...);\n      }\n\n      const ExcelObj** ptrToArgs()\n      {\n        return (&_argVec[0]);\n      }\n\n      size_t nArgs() const { return _argVec.size(); }\n \n      template<class T> void add(const T& arg)\n      {\n        _temporary.emplace_back(arg);\n        _argVec.push_back(&_temporary.back());\n      }\n      void add(const ExcelObj& arg)\n      {\n        _argVec.push_back(&arg);\n      }\n      void add(const XLOIL_XLOPER* arg)\n      {\n        if (arg)\n          _argVec.push_back((const ExcelObj*)arg);\n        else\n          add<nullptr_t>(nullptr);\n      }\n\n      template <class TIter>\n      void add(detail::Splatter<TIter>&& splatter)\n      {\n        for (const auto& x : splatter())\n          add(x);\n      }\n      template<class T> void add(T&& arg)\n      {\n        _temporary.emplace_back(arg);\n        _argVec.push_back(&_temporary.back());\n      }\n\n      template<class T, class...Args>\n      void add(const T& first, Args&&... theRest)\n      {\n        add(first);\n        add(std::forward<Args>(theRest)...);\n      }\n    };\n  }\n\n  /// <summary>\n  /// Mimics pythons argument splat/unpack object for calls to\n  /// <see cref=\"callExcel\"/> by unpacking an iterable into function\n  /// arguments.\n  /// \n  /// <example>\n  /// vector<double> vals;\n  /// callExcel(xlfSum, unpack(vals));\n  /// </example>\n  /// </summary>\n  template <class TIterable>\n  auto unpack(const TIterable& iterable)\n  {\n    return detail::Splatter<TIterable>(iterable);\n  }\n\n  /// <summary>\n  /// A wrapper around the Excel12 call. Avoid using directly unless for \n  /// performance reasons.\n  /// </summary>\n  XLOIL_EXPORT int callExcelRaw(\n    int func, ExcelObj* result,\n    size_t nArgs = 0,\n    const ExcelObj** args = nullptr) noexcept;\n\n  /// <summary>\n  /// \n  /// </summary>\n  /// <typeparam name=\"T\"></typeparam>\n  /// <param name=\"func\"></param>\n  /// <param name=\"result\"></param>\n  /// <param name=\"nArgs\"></param>\n  /// <param name=\"firstArg\"></param>\n  /// <returns></returns>\n  template <class T>\n  inline int callExcelRaw(\n    int func, ExcelObj* result,\n    size_t nArgs,\n    T firstArg) noexcept\n  {\n    const ExcelObj* pArgs[XL_MAX_UDF_ARGS];\n    for (size_t i = 0; i < nArgs; ++i, ++firstArg)\n      pArgs[i] = &*firstArg;\n    return callExcelRaw(func, result, nArgs, pArgs);\n  }\n\n  /// <summary>\n  /// Convenience wrapper for <see cref=\"callExcelRaw\"/> for \n  /// a single argument\n  /// </summary>\n  inline int\n    callExcelRaw(int func, ExcelObj* result, const ExcelObj* arg) noexcept\n  {\n    auto p = arg;\n    return callExcelRaw(func, result, 1, &p);\n  }\n\n  /// <summary>\n  /// Returns a reable error from the return code produced by\n  /// <see cref=\"tryCallExcel\"/>.\n  /// </summary>\n  XLOIL_EXPORT const wchar_t*\n    xlRetCodeToString(int xlret, bool checkXllContext=true);\n\n  /// <summary>\n  /// If this error is thrown, Excel SDK documentation says you must\n  /// immediately return control.\n  /// </summary>\n  class ExcelAbort : public std::runtime_error\n  {\n  public:\n    ExcelAbort() : std::runtime_error(\"Excel abort\") {}\n  };\n\n  /// <summary>\n  /// Similar to <see cref=\"callExcel\"/> but does not throw on failure.\n  /// Rather returns a tuple (ExcelObj, int) where the second argument \n  /// is the return code <see cref=\"msxll::xlretSuccess\"/>.\n  /// </summary>\n  template<typename... Args>\n  inline std::pair<ExcelObj, int> \n    tryCallExcel(int func, Args&&... args) noexcept\n  {\n    auto result = std::make_pair(ExcelObj(), 0);\n    detail::CallArgHolder holder(std::forward<Args>(args)...);\n    result.second = callExcelRaw(func, &result.first, holder.nArgs(), holder.ptrToArgs());\n    result.first.resultFromExcel();\n    return result;\n  }\n\n  /// <summary>\n  /// As for <see cref=\"tryCallExcel\"/> but with no arguments.\n  /// </summary>\n  inline std::pair<ExcelObj, int> \n    tryCallExcel(int func)\n  {\n    auto result = std::make_pair(ExcelObj(), 0);\n    result.second = callExcelRaw(func, &result.first);\n    result.first.resultFromExcel();\n    return result;\n  }\n\n  /// <summary>\n  /// As for <see cref=\"tryCallExcel\"/> but with a single ExcelObj argument.\n  /// The separate implemenation gives some performance improvements.\n  /// </summary>\n  inline std::pair<ExcelObj, int> \n    tryCallExcel(int func, const ExcelObj& arg)\n  {\n    auto result = std::make_pair(ExcelObj(), 0);\n    auto p = &arg;\n    result.second = callExcelRaw(func, &result.first, 1, &p);\n    result.first.resultFromExcel();\n    return result;\n  }\n\n  /// <summary>\n  /// Calls the specified Excel function number with the given arguments.\n  /// Non-ExcelObj arguments are converted to ExcelObj types - this is \n  /// generally only possible for arithmetic and string types.\n  /// \n  /// Throws an exeception if the call fails, otherwise returns the \n  /// result as an ExcelObj.\n  /// </summary>\n  template<typename... Args>\n  inline ExcelObj callExcel(int func, Args&&... args)\n  {\n    auto [result, ret] = tryCallExcel(func, std::forward<Args>(args)...);\n    switch (ret)\n    {\n    case msxll::xlretSuccess:\n      break;\n    case msxll::xlretAbort:\n      throw ExcelAbort();\n    default:\n      XLO_THROW(L\"Excel call failed: {0}\", xlRetCodeToString(ret));\n    }\n    return result;\n  }\n\n  inline auto checkAbort()\n  {\n    ExcelObj result;\n    auto code = callExcelRaw(msxll::xlAbort, &result);\n    if (code != 0)\n      return false;\n    return result.get<bool>(false);\n  }\n\n  /// <summary>\n  /// Convert an Excel built-in function name to a number for use <see cref=\"callExcel\"/>\n  /// </summary>\n  /// <param name=\"name\"></param>\n  /// <returns>-1 if the name could not be found</returns>\n  XLOIL_EXPORT int excelFuncNumber(const char* name);\n\n  /// <summary>\n  /// Convert an Excel built-in function number used in <see cref=\"callExcel\"/> to its name string.\n  /// </summary>\n  /// <param name=\"number\"></param>\n  /// <returns>null if an invalid function number is passed</returns>\n  XLOIL_EXPORT const char* excelFuncName(const unsigned number) noexcept;\n}\n\n"
  },
  {
    "path": "include/xloil/ExcelObj.h",
    "content": "#pragma once\n#include <xlOil/XlCallSlim.h>\n#include <xlOil/ExportMacro.h>\n#include <xlOil/PString.h>\n#include <xlOil/Throw.h>\n#include <xlOil/Limits.h>\n#include <string>\n#include <cassert>\n#include <optional>\n\n#define XLOIL_XLOPER ::msxll::xloper12\n\nnamespace xloil\n{\n  /// <summary>\n  /// Describes the underlying type of the variant <see cref=\"ExcelObj\"/>\n  /// </summary>\n  enum class ExcelType\n  {\n    Num = msxll::xltypeNum,  /// Double precision numeric data\n    Str = msxll::xltypeStr,  /// Wide character string (max length 32767)\n    Bool = msxll::xltypeBool, /// Boolean\n    Ref = msxll::xltypeRef,  /// Range reference to one or more parts of the spreadsheet\n    Err = msxll::xltypeErr,  /// Error type, <see cref=\"CellError\"/>\n    Flow = msxll::xltypeFlow, /// Legacy. Unused by xlOil.\n    Multi = msxll::xltypeMulti, /// An array\n    Missing = msxll::xltypeMissing, /// An omitted parameter in a function call\n    Nil = msxll::xltypeNil,   /// An empty ExcelObj\n    SRef = msxll::xltypeSRef,  /// Range reference to one part of the current worksheet\n    Int = msxll::xltypeInt,   /// Integer type. Excel usually passes all numbers as type Num.\n    BigData = msxll::xltypeStr | msxll::xltypeInt,\n\n    /// Type group: Types that can be elements of an array. In theory nested arrays\n    /// are possible but Excel will never pass one.\n    ArrayValue = Num | Str | Bool | Err | Int | Nil,\n\n    /// Type group: Types which refer to ranges\n    RangeRef = SRef | Ref,\n\n    /// Type group: Types which do not have external memory allocation\n    Simple = Num | Bool | SRef | Missing | Nil | Int | Err\n  };\n\n  XLOIL_EXPORT const wchar_t* enumAsWCString(ExcelType e);\n\n  /// <summary>\n  /// Describes the various error types Excel can handle and display\n  /// </summary>\n  enum class CellError\n  {\n    Null = msxll::xlerrNull,   /// \\#NULL!\n    Div0 = msxll::xlerrDiv0,   /// \\#DIV0!\n    Value = msxll::xlerrValue, /// \\#VALUE!\n    Ref = msxll::xlerrRef,     /// \\#REF!\n    Name = msxll::xlerrName,   /// \\#NAME!\n    Num = msxll::xlerrNum,     /// \\#NUM!\n    NA = msxll::xlerrNA,       /// \\#NA!\n    GettingData = msxll::xlerrGettingData /// #GETTING_DATA\n  };\n\n  XLOIL_EXPORT const wchar_t* enumAsWCString(CellError e);\n\n  /// <summary>\n  /// Array of all CellError types, useful for autogeneration\n  /// of bindings\n  /// </summary>\n  static const CellError theCellErrors[] =\n  {\n    CellError::Null,\n    CellError::Div0,\n    CellError::Value,\n    CellError::Ref,\n    CellError::Name,\n    CellError::Num,\n    CellError::NA,\n    CellError::GettingData\n  };\n\n  class ExcelArray;\n  class ExcelObj;\n\n  namespace Const\n  {\n    /// <summary>\n    /// A static ExcelObj set to Missing type.\n    /// </summary>\n    XLOIL_EXPORT const ExcelObj& Missing();\n    /// <summary>\n    /// A static ExcelObj set to the specified error type\n    /// </summary>\n    XLOIL_EXPORT const ExcelObj& Error(CellError e);\n    /// <summary>\n    /// A static ExcelObj containing an empty string\n    /// </summary>\n    XLOIL_EXPORT const ExcelObj& EmptyStr();\n  }\n\n  /// <summary>\n  /// Wraps an XLL variant-type (xloper12) providing many useful and safe\n  /// methods to create, copy and modify the data.\n  /// \n  /// An ExcelObj can be statically cast to an xloper12 and vice-versa.\n  /// In fact, the underlying xloper12 members can be manipulated directly,\n  /// although this is not recommended.\n  /// </summary>\n  class XLOIL_EXPORT ExcelObj : public XLOIL_XLOPER\n  {\n  public:\n    typedef wchar_t Char;\n    typedef XLOIL_XLOPER Base;\n    using row_t = uint32_t;\n    using col_t = uint32_t;\n\n    ExcelObj()\n    {\n      xltype = msxll::xltypeNil;\n    }\n\n    /// <summary>\n    /// Constructor for integral types\n    /// </summary>\n    template <class T,\n      std::enable_if_t<std::is_integral<T>::value, int> = 0>\n    explicit ExcelObj(T x)\n    {\n      xltype = msxll::xltypeInt;\n      val.w = (int)x;\n    }\n\n    /// <summary>\n    /// Constructor for floating point types\n    /// </summary>\n    template <class T,\n      std::enable_if_t<std::is_floating_point<T>::value, int> = 0>\n    explicit ExcelObj(T d)\n    {\n      const auto type = fpclassify(d);\n      if (type <= 0)\n      {\n        xltype = msxll::xltypeNum;\n        val.num = (double)d;\n      }\n      else if (type == FP_NAN)\n      {\n        val.err = msxll::xlerrNA;\n        xltype = msxll::xltypeErr;\n      }\n      else // if (type == FP_INFINITE)\n      {\n        val.err = msxll::xlerrNum;\n        xltype = msxll::xltypeErr;\n      }\n    }\n\n    /// <summary>\n    /// Construct from a bool\n    /// </summary>\n    explicit ExcelObj(bool b)\n    {\n      xltype = msxll::xltypeBool;\n      val.xbool = b ? 1 : 0;\n    }\n\n    /// <summary>\n    /// Creates an empty object of the specified type. \"Empty\" in this case\n    /// means a sensible default depending on the data type.  For bool's it \n    /// is false, for numerics zero, for string it's the empty string, \n    /// for the error type it is \\#N/A.\n    /// </summary>\n    /// <param name=\"\"></param>\n    ExcelObj(ExcelType);\n\n    /// <summary>\n    /// Construct from char string\n    /// </summary>\n    explicit ExcelObj(const char* str)\n    {\n      createFromChars(str, strlen(str));\n    }\n    explicit ExcelObj(char* str) : ExcelObj(const_cast<const char*>(str)) {}\n\n    /// <summary>\n    /// Construct from wide-char string\n    /// </summary>\n    explicit ExcelObj(const wchar_t* str)\n      : ExcelObj(std::move(PString(str)))\n    {}\n    explicit ExcelObj(wchar_t* str) : ExcelObj(const_cast<const wchar_t*>(str)) {}\n\n    /// <summary>\n    /// Construct from STL wstring\n    /// </summary>\n    explicit ExcelObj(const std::wstring_view& s)\n      : ExcelObj(std::move(PString(s)))\n    {}\n\n    /// <summary>\n    /// Construct from STL string\n    /// </summary>\n    explicit ExcelObj(const std::string_view& s)\n    {\n      createFromChars(s.data(), s.length());\n    }    \n    \n    /// <summary>\n    /// Construct from string literal\n    /// </summary>\n    template<size_t N>\n    explicit ExcelObj(const wchar_t(*str)[N])\n      : ExcelObj(std::move(PString<>(str)))\n    {}\n\n    /// <summary>\n    /// Construct from char-string literal\n    /// </summary>\n    template<size_t N>\n    explicit ExcelObj(const char(*str)[N])\n    {\n      createFromChars(str, N);\n    }\n\n    /// <summary>\n    /// Move ctor from owned Pascal string buffer. This takes ownership\n    /// of the string buffer in the provided PString.\n    /// </summary>\n    /// <param name=\"pstr\"></param>\n    template<class TAlloc>\n    explicit ExcelObj(BasicPString<wchar_t, TAlloc>&& pstr)\n    {\n      val.str.data = pstr.release();\n      if (!val.str.data)\n        val.str.data = Const::EmptyStr().val.str.data;\n      // If the allocator wasn't the standard PStringAllocator, it's not safe\n      // to deallocate the string, so we mark it as a view \n      val.str.xloil_view = true;\n      xltype = msxll::xltypeStr;\n    }\n\n    template<>\n    explicit ExcelObj(BasicPString<wchar_t, PStringAllocator<wchar_t>>&& pstr)\n    {\n      val.str.data = pstr.release();\n      if (!val.str.data)\n        val.str.data = Const::EmptyStr().val.str.data;\n      val.str.xloil_view = false;\n      xltype = msxll::xltypeStr;\n    }\n\n    /// <summary>\n    /// Construct from nullptr - creates an ExcelType::Missing\n    /// </summary>\n    /// <param name=\"\"></param>\n    ExcelObj(nullptr_t)\n    {\n      xltype = msxll::xltypeMissing;\n    }\n\n    /// <summary>\n    /// Construct from a specified CellError \n    /// </summary>\n    /// <param name=\"err\"></param>\n    ExcelObj(CellError err)\n    {\n      val.err = (int)err;\n      xltype = msxll::xltypeErr;\n    }\n\n    /// <summary>\n    /// Constructs an array from data. By default, takes ownership of data, which\n    /// must be correctly arranged in memory. Generally, you should use the \n    /// ArrayBuilder to create arrays.\n    /// </summary>\n    /// <param name=\"isView\">If true, do not take ownership of array data</param>\n    ExcelObj(const ExcelObj* data, uint32_t nRows, uint32_t nCols, bool isView = false)\n    {\n      // Excel will crash if passed an empty array\n      if (nRows == 0 || nCols == 0)\n        throw std::range_error(\"ExcelObj: Cannot create empty array\");\n      val.array.rows = nRows;\n      val.array.columns = nCols;\n      val.array.lparray = (Base*)data;\n      val.array.xloil_view = isView;\n      xltype = msxll::xltypeMulti;\n    }\n\n    /// <summary>\n    /// Construct from iterable. The value_type of the iterable must be\n    /// convertible to an ExcelObj using one of the other constructors\n    /// </summary>\n    template <class TIter>\n    ExcelObj(TIter begin, TIter end);\n\n    /// <summary>\n    /// Construct from initialiser list\n    /// </summary>\n    template <class T>\n    ExcelObj(std::initializer_list<T> vals)\n      : ExcelObj(vals.begin(), vals.end())\n    {}\n\n    template <class T>\n    ExcelObj(std::initializer_list<std::initializer_list<T>> vals);\n\n    explicit ExcelObj(const std::tm& datetime);\n\n    /// <summary>\n    /// Catch constructor: purpose is to avoid pointers\n    /// being auto-cast to integral / bool types\n    /// </summary>\n    template <class T> explicit ExcelObj(T* t) { static_assert(false); }\n\n    /// <summary>\n    /// Copy constructor\n    /// </summary>\n    ExcelObj(const ExcelObj& that)\n    {\n      overwrite(*this, that);\n    }\n\n    /// <summary>\n    /// Move constructor\n    /// </summary>\n    ExcelObj(ExcelObj&& donor) noexcept\n    {\n      (Base&)*this = donor;\n      // Mark donor object as empty\n      donor.xltype = msxll::xltypeNil;\n    }\n\n    /// <summary>\n    /// Construct local range reference (will refer to active sheet)\n    /// </summary>\n    /// <param name=\"ref\"></param>\n    ExcelObj(const msxll::xlref12& ref)\n    {\n      val.sref.ref = ref;\n      xltype = msxll::xltypeSRef;\n    }\n\n    /// <summary>\n    /// Construct global range reference. Sheet ID can be obtained from\n    /// Excel's xlSheetId function.\n    /// </summary>\n    /// <param name=\"sheet\"></param>\n    /// <param name=\"ref\"></param>\n    ExcelObj(msxll::IDSHEET sheet, const msxll::xlref12& ref);\n\n    ~ExcelObj()\n    {\n      reset();\n    }\n\n    /// <summary>\n    /// Assignment from ExcelObj - performs a copy\n    /// </summary>\n    ExcelObj& operator=(const ExcelObj& that)\n    {\n      if (this == &that)\n        return *this;\n      copy(*this, that);\n      return *this;\n    }\n\n    /// <summary>\n    /// Move assignment - takes ownership of donor object's data\n    /// and sets it to ExcelType::Nil.\n    /// </summary>\n    template <class TDonor>\n    ExcelObj& operator=(TDonor&& that)\n    {\n      *this = std::move(ExcelObj(std::forward<TDonor>(that)));\n      return *this;\n    }\n\n    ExcelObj& operator=(ExcelObj&& donor) noexcept\n    {\n      reset();\n      (Base&)*this = donor;\n      // Mark donor object as empty\n      donor.xltype = msxll::xltypeNil;\n      return *this;\n    }\n\n    /// <summary>\n    /// Deletes object content and sets it to ExcelType::Nil\n    /// </summary>\n    void reset() noexcept;\n\n    /// <summary>\n    /// The equality operator performs a deep comparison, recursing \n    /// into arrays and with case-sensitive string comparison. This \n    /// is different to the '<', operator which implements a cheap\n    /// pointer comparison for arrays. \n    /// <seealso cref=\"compare\"/>\n    /// </summary>\n    /// <param name=\"that\"></param>\n    /// <returns></returns>\n    bool operator==(const ExcelObj& that) const;\n\n    bool operator<=(const ExcelObj& that) const\n    {\n      return compare(*this, that, true, true) != 1;\n    }\n\n    /// <summary>\n    /// Compares two ExcelObj using <see cref=\"compare\"/> with a\n    /// case insenstive string comparison and no recursion into arrays\n    /// <seealso cref=\"compare\"/>\n    /// </summary>\n    bool operator<(const ExcelObj& that) const\n    {\n      return compare(*this, that) == -1;\n    }\n\n    bool operator==(const CellError that) const\n    {\n      return this->xtype() == msxll::xltypeErr && val.err == (int)that;\n    }\n\n    // TODO: somehow template these?\n\n    /// <summary>\n    /// Compare to string (will return false if the ExcelObj is not of \n    /// string type\n    /// </summary>\n    bool operator==(const std::wstring_view& that) const\n    {\n      return cast<PStringRef>() == that;\n    }\n\n    /// <summary>\n    /// Compare to C-string (will return false if the ExcelObj is not of \n    /// string type\n    /// </summary>\n    bool operator==(const wchar_t* that) const\n    {\n      return cast<PStringRef>() == that;\n    }\n\n    /// <summary>\n    /// Compare to string literal (will return false if the ExcelObj is not of \n    /// string type\n    /// </summary>\n    template<size_t N>\n    bool operator==(const wchar_t(*that)[N]) const\n    {\n      return cast<PStringRef>() == that;\n    }\n\n    /// <summary>\n    /// Compare to scalar type (returns false is ExcelObj is not convertible)\n    /// </summary>\n    template <class T, std::enable_if_t<std::is_scalar_v<T>, bool> = true>\n    bool operator==(T that) const;\n\n    /// <summary>\n    /// Compares two ExcelObjs. Returns -1 if left < right, 0 if left == right, else 1.\n    /// \n    /// When the types of <paramref name=\"left\"/> and <paramref name=\"right\"/> are \n    /// the same, numeric and string types are compared in the expected way. Arrays\n    /// are compared by size. Refs are compared as address strings.  BigData and \n    /// Flow types cannot be compared and return zero.\n    /// \n    /// When the types differ, numeric types can still be compared but all others \n    /// are sorted by type number as repeated string conversions such as in a sort\n    /// would be very expensive.\n    /// </summary>\n    /// <param name=\"left\"></param>\n    /// <param name=\"right\"></param>\n    /// <param name=\"caseSensitive\">Whether string comparison is case sensitive</param>\n    /// <param name=\"recursive\">Recursively compare arrays or order them only by size</param>\n    /// <returns>-1, 0 or +1</returns>\n    static int compare(\n      const ExcelObj& left,\n      const ExcelObj& right,\n      bool caseSensitive = false,\n      bool recursive = false) noexcept;\n\n    /// <summary>\n    /// Returns true if this ExcelObj has ExcelType::Missing type.\n    /// </summary>\n    bool isMissing() const\n    {\n      return isType(ExcelType::Missing);\n    }\n\n    bool isEmptyStr() const\n    {\n      return isType(ExcelType::Str) && (val.str.data[0] == L'\\0');\n    }\n\n    /// <summary>\n    /// Returns true if value is *not* one of: Missing, Nil\n    /// error \\#N/A or an empty string.\n    /// </summary>\n    /// <returns></returns>\n    bool isNonEmpty() const\n    {\n      using namespace msxll;\n      switch (xtype())\n      {\n      case xltypeErr:\n        return val.err != xlerrNA;\n      case xltypeMissing:\n      case xltypeNil:\n        return false;\n      case xltypeStr:\n        return val.str.data[0] != L'\\0';\n      default:\n        return true;\n      }\n    }\n    \n    /// <summary>\n    /// Returns true if this ExcelObj is a \\#N/A error\n    /// </summary>\n    /// <returns></returns>\n    bool isNA() const\n    {\n      return isType(ExcelType::Err) && val.err == msxll::xlerrNA;\n    }\n\n    /// <summary>\n    /// Get an enum describing the data contained in the ExcelObj\n    /// </summary>\n    /// <returns></returns>\n    ExcelType type() const\n    {\n      return ExcelType(xtype());\n    }\n\n    /// <summary>\n    /// Returns true if this ExcelObj is of the specified type. This also\n    /// works for compound types like ArrayValue and RangeRef that can't \n    /// be checked for by equality with type().\n    /// </summary>\n    bool isType(ExcelType type) const\n    {\n      return (xltype & (int)type) != 0;\n    }\n\n    /// <summary>\n    /// Converts to a string. Attempts to stringify the various excel types.\n    /// \n    /// The function recurses row-wise over Arrays and ranges and \n    /// concatenates the result. An optional separator may be given to\n    /// insert between array/range entries.\n    /// </summary>\n    /// <param name=\"separator\">optional separator to use for arrays</param>\n    /// <returns></returns>\n    std::wstring toStringRecursive(const wchar_t* separator = nullptr) const;\n\n    /// <summary>\n    /// Similar to toStringRecursive but more suitable for output of object \n    /// descriptions, for example in error messages. For this reason\n    /// it doesn't throw but rather returns ``\\<ERROR\\>`` on failure.\n    /// \n    /// Returns the same as toStringRecursive except for arrays which yield \n    /// '[NxM]' where N and M are the number of rows and columns and \n    /// for ranges which return the range reference in the form 'Sheet!A1'.\n    /// </summary>\n    /// <returns></returns>\n    std::wstring toString() const noexcept;\n\n    /// <summary>\n    /// Gives the maximum string length if toStringRecursive is called on\n    /// this object without actually attempting the conversion.\n    /// This method is very fast except for arrays.\n    /// </summary>\n    uint16_t maxStringLength() const noexcept;\n\n    /// <summary>\n    /// Returns the string length if this object is a string, else zero.\n    /// </summary>\n    uint16_t stringLength() const\n    {\n      return xltype == msxll::xltypeStr ? val.str.data[0] : 0;\n    }\n\n    /// <summary>\n    /// Returns a type T from the object value type allowing some conversions:\n    /// \n    ///   * int -> double\n    ///   * double -> int (if an exact int)\n    ///   * bool -> 0 or 1\n    ///   * double/int -> bool if exactly 0 or 1\n    ///   * non-str type -> null wstring_view\n    /// \n    /// Other types will throw an exception.\n    /// </summary>\n    template <class T> T get() const;\n    \n    /// <summary>\n    /// As <see cref=\"get\"/> but returns the provided default if \n    /// the object is of type missing rather than throwing.\n    /// </summary>\n    template <class T> T get(const std::optional<T> defaultVal) const;\n\n    /// <summary>\n    /// As <see cref=\"get\"/> but returns a `std::optional<T>` which\n    /// is empty if the conversion is not possible\n    /// </summary>\n    template <class T> std::optional<T> getIf() const;\n\n    /// <summary>\n    /// Returns the value in the ExcelObj assuming it is the type specified\n    /// If it isn't, it will return nonsense (UB).  Allowable types are:\n    ///   * int\n    ///   * bool\n    ///   * double\n    ///   * CellError\n    ///   * PStringRef\n    /// </summary>\n    template <class T> T cast() const;\n    template <> PStringRef cast() const;\n\n    /// <summary>\n    /// Retuns a `std::wstring_view` of the string data in the object.\n    /// The view is empty if the object does not hold a string.\n    /// </summary>\n    /// <returns></returns>\n    std::wstring_view asStringView() const\n    {\n      return cast<PStringRef>();\n    }\n\n    /// <summary>\n    /// Destroys the target object and replaces it with the source\n    /// </summary>\n    static void copy(ExcelObj& to, const ExcelObj& from)\n    {\n      to.reset();\n      overwrite(to, from);\n    }\n\n    /// <summary>\n    /// Replaces the target object with the source without calling \n    /// the target's destructor.  Dangerous, but an optimisation for \n    /// uninitialised or non-allocating (e.g. numeric, error, nil) \n    /// target objects.\n    /// </summary>\n    static void overwrite(ExcelObj& to, const ExcelObj& from)\n    {\n      if (from.isType(ExcelType::Simple))\n        (msxll::XLOPER12&)to = (const msxll::XLOPER12&)from;\n      else\n        overwriteComplex(to, from);\n    }\n#\n    static void overwriteView(ExcelObj& to, const ExcelObj& from)\n    {\n      (msxll::XLOPER12&)to = (const msxll::XLOPER12&)from;\n\n      if (from.isType(ExcelType::Simple))\n        return;\n      else if (from.type() == ExcelType::Str)\n        to.val.str.xloil_view = true;\n      else if (from.type() == ExcelType::Multi)\n        to.val.array.xloil_view = true;\n      else\n        overwriteComplex(to, from);\n    }\n\n    /// <summary>\n    /// Call this on function result objects received from Excel to \n    /// declare that Excel must free them. This is automatically done\n    /// by callExcel/tryCallExcel so only invoke this if you use Excel12v\n    /// directly (which ideally you wouldn't!)\n    /// </summary>\n    /// <returns></returns>\n    ExcelObj& resultFromExcel() noexcept\n    {\n      xltype |= msxll::xlbitXLFree;\n      return *this;\n    }\n\n    ExcelObj* setDllFreeFlag() noexcept\n    {\n      xltype |= msxll::xlbitDLLFree;\n      return this;\n    }\n  \n    /// The xloper type made safe for use in switch statements by zeroing\n    /// the memory control flags. Generally, prefer the type() function.\n    int xtype() const\n    {\n      return xltype & ~(msxll::xlbitXLFree | msxll::xlbitDLLFree);\n    }\n\n    /// <summary>\n  /// Handles the switch on the type of the ExcelObj and dispatches to an\n  /// overload of the functor's operator(). Called via <see cref=\"FromExcel\"/>.\n  /// </summary>\n    template<class TFunc>\n    auto visit(TFunc&& functor) const;\n   \n    template<class TFunc, class TDefault>\n    auto visit(TFunc&& functor, TDefault defaultVal) const;\n\n   private:\n    static void overwriteComplex(ExcelObj& to, const ExcelObj& from);\n    void createFromChars(const char* chars, size_t len);\n  };\n\n  /// <summary>\n  /// Holder class which allows the type converter implementation to select\n  /// objects which represent arrays\n  /// </summary>\n  struct ArrayVal : public ExcelObj\n  {};\n\n  /// <summary>\n  /// Holder class which allows the type converter implementation to select\n  /// objects which represent range references\n  /// </summary>\n  struct RefVal : public ExcelObj\n  {};\n\n  /// <summary>\n  /// Indicates a missing value to a type converter implementation\n  /// </summary>\n  struct MissingVal\n  {};\n}\n\n#include <xloil/ArrayBuilder.h>\n#include <xloil/NumericTypeConverters.h>\n\nnamespace xloil\n{\n  namespace detail\n  {\n    template<class T>\n    inline size_t stringLength(const T&) { return 0; }\n    inline size_t stringLength(const std::string_view& s) { return s.length(); }\n    inline size_t stringLength(const std::wstring_view& s) { return s.length(); }\n    inline size_t stringLength(const std::string& s) { return s.length(); }\n    inline size_t stringLength(const std::wstring& s) { return s.length(); }\n    inline size_t stringLength(const char* s) { return strlen(s); }\n    inline size_t stringLength(const wchar_t* s) { return wcslen(s); }\n  }\n\n  template<class TIter> inline\n  ExcelObj::ExcelObj(TIter begin, TIter end)\n  {\n    size_t stringLen = 0;\n    ExcelObj::row_t nItems = 0;\n    for (auto i = begin; i != end; ++i, ++nItems)\n      stringLen += detail::stringLength(*i);\n\n    ExcelArrayBuilder builder(nItems, 1, stringLen);\n    size_t idx = 0;\n    for (auto i = begin; i != end; ++i, ++idx)\n      builder(idx, 0) = *i;\n\n    xltype = msxll::xltypeNil;\n    *this = builder.toExcelObj();\n  }\n\n  template<class T>\n  ExcelObj::ExcelObj(std::initializer_list<std::initializer_list<T>> vals)\n  {\n    const auto nRows = (row_t)vals.size();\n    const auto nCols = (col_t)vals.begin()->size();\n\n    size_t stringLen = 0;\n    for (const auto& row : vals)\n    {\n      for (const auto& v : row)\n      {\n        stringLen += detail::stringLength(v);\n      }\n    }\n\n    ExcelArrayBuilder builder(nRows, nCols, stringLen);\n    size_t idx = 0;\n    for (const auto& row : vals)\n    {\n      for (const auto& v : row)\n      {\n        builder(idx++) = v;\n      }\n    }\n\n    xltype = msxll::xltypeNil;\n    *this = builder.toExcelObj();\n  }\n\n  template <class T>\n  T ExcelObj::get() const\n  {\n    return visit(conv::ToType<T>());\n  }\n  \n  template <>\n  inline CellError ExcelObj::get() const\n  {\n    if ((xltype & msxll::xltypeErr) == 0)\n      throw std::runtime_error(\"Not a CellError type\");\n    return CellError(val.err);\n  }\n\n  template <class T> \n  T ExcelObj::get(const std::optional<T> defaultVal) const\n  {\n    return visit(conv::ToType<T>(), defaultVal.value());\n  }\n\n  template <>\n  inline std::wstring ExcelObj::get() const\n  {\n    return toString();\n  }\n\n  template <class T> std::optional<T> ExcelObj::getIf() const\n  {\n    return visit(conv::ToType<std::optional<T>>());\n  }\n\n  template <> inline std::optional<CellError> ExcelObj::getIf() const\n  {\n    if ((xltype & msxll::xltypeErr) == 0)\n      return std::optional<CellError>();\n    return CellError(val.err);\n  }\n\n  template<> inline double ExcelObj::cast() const\n  {\n    assert(xtype() == msxll::xltypeNum);\n    return val.num;\n  }\n\n  template<> inline int ExcelObj::cast() const\n  {\n    assert(xtype() == msxll::xltypeInt);\n    return val.w;\n  }\n  \n  template<> inline bool ExcelObj::cast() const\n  {\n    assert(xtype() == msxll::xltypeBool);\n    return val.xbool;\n  }\n\n  template<> inline CellError ExcelObj::cast() const\n  {\n    assert(xtype() == msxll::xltypeErr);\n    return CellError(val.err);\n  }\n\n  template<> inline PStringRef ExcelObj::cast() const\n  {\n    return PStringRef((xltype & msxll::xltypeStr) == 0 ? nullptr : val.str.data);\n  }\n\n  template<> inline const XLOIL_XLOPER* ExcelObj::cast() const\n  {\n    return this;\n  }\n\n  template <class T, std::enable_if_t<std::is_scalar_v<T>, bool>>\n  bool ExcelObj::operator==(T that) const\n  {\n    auto value = visit(conv::ToType<std::optional<T>>());\n    return value == that;\n  }\n\n  template<class TFunc>\n  auto ExcelObj::visit(TFunc&& functor) const\n  {\n    try\n    {\n      switch (type())\n      {\n      case ExcelType::Int:     return functor(val.w);\n      case ExcelType::Bool:    return functor(val.xbool != 0);\n      case ExcelType::Num:     return functor(val.num);\n      case ExcelType::Str:     return functor(cast<PStringRef>());\n      case ExcelType::Multi:   return functor(static_cast<const ArrayVal&>(*this));\n      case ExcelType::Missing: return functor(MissingVal());\n      case ExcelType::Err:     return functor(CellError(val.err));\n      case ExcelType::Nil:     return functor(nullptr);\n      case ExcelType::SRef:\n      case ExcelType::Ref:\n        return functor(static_cast<const RefVal&>(*this));\n      default:\n        XLO_THROW(\"Unexpected XL type\");\n      }\n    }\n    catch (const std::exception& e)\n    {\n      XLO_THROW(L\"Failed reading {0}: {1}\",\n        toString(),\n        utf8ToUtf16(e.what()));\n    }\n  }\n\n  template<class TFunc, class TDefault>\n  auto ExcelObj::visit(\n    TFunc&& functor,\n    TDefault defaultVal) const\n  {\n    return visit(ExcelValVisitorDefaulted<TFunc>(functor, defaultVal));\n  }\n\n  template<class TVisitor>\n  struct ApplyVisitor\n  {\n    TVisitor _visitor;\n    ApplyVisitor(TVisitor visitor) \n      : _visitor(visitor)\n    {}\n    auto operator()(const ExcelObj& obj)\n    {\n      return obj.visit(_visitor);\n    }\n  };\n}\n\nnamespace std {\n  /// <summary>\n  /// This hash does a non-recursive comparison, like operator '<'.\n  /// For arrays it does not satisfy A==B => hash(A) == hash(B), but \n  /// for other types it will.\n  /// </summary>\n  template <>\n  struct hash<xloil::ExcelObj>\n  {\n    XLOIL_EXPORT size_t operator()(const xloil::ExcelObj& value) const;\n  };\n}\n"
  },
  {
    "path": "include/xloil/ExcelObjCache.h",
    "content": "#pragma once\n#include <xloil/ExcelObj.h>\n#include <xloil/ObjectCache.h>\n#include <memory>\n\nnamespace xloil\n{\n  /// <summary>\n  /// The CacheUniquifier character for the Excel Object Cache\n  /// </summary>\n  template<>\n  struct CacheUniquifier<std::unique_ptr<const ExcelObj>>\n  {\n    static constexpr wchar_t value = L'\\x6C38';\n  };\n\n  template struct XLOIL_EXPORT ObjectCacheFactory<std::unique_ptr<const ExcelObj>>;\n\n  /// <summary>\n  /// If the argument is a string referencing an <see cref=\"ExcelObj\"/>\n  /// in the cache, the cached object is returned, otherwise the argument\n  /// object is returned.\n  /// </summary>\n  /// <param name=\"obj\"></param>\n  /// <returns></returns>\n  inline const ExcelObj& cacheCheck(const ExcelObj& obj)\n  {\n    if (obj.isType(ExcelType::Str))\n    {\n      auto cacheVal = getCached<ExcelObj>(obj.cast<PStringRef>());\n      if (cacheVal)\n        return *cacheVal;\n    }\n    return obj;\n  }\n\n  /// <summary>\n  /// Runs <see cref=\"xloil::cacheCheck\"/> on each supplied argument in-place. \n  /// Usage:\n  /// <code>\n  ///    ExcelObj *arg1, *arg2;\n  ///    cacheCheck(arg1, arg2);\n  ///    ExcelArray array1(arg1);\n  ///    ...\n  /// </code>\n  /// </summary>\n  /// <typeparam name=\"...Args\"></typeparam>\n  /// <param name=\"first\"></param>\n  /// <param name=\"...more\"></param>\n  template<class...Args>\n  inline void cacheCheck(const ExcelObj*& first, Args&&... more)\n  {\n    first = &cacheCheck(*first);\n    cacheCheck(std::forward<Args>(more)...);\n  }\n\n  inline void cacheCheck(const ExcelObj*& obj)\n  {\n    obj = &cacheCheck(*obj);\n  }\n\n  /// <summary>\n  /// Function object which runs <see cref=\"xloil::cacheCheck\"/>\n  /// </summary>\n  struct CacheCheck\n  {\n    void operator()(const ExcelObj*& obj) { cacheCheck(obj); }\n    template<class...Args>\n    void operator()(Args&&... args) { cacheCheck(std::forward<Args>(args)...); }\n  };\n\n  /// <summary>\n  /// Wraps a type conversion functor, interepting the string conversion to\n  /// look for a cache reference.  If found, calls the wrapped functor on the\n  /// cache object, otherwise passes the string through.\n  /// </summary>\n  template<class TBase>\n  struct CacheConverter : public TBase\n  {\n    template <class...Args>\n    CacheConverter(Args&&...args)\n      : TBase(std::forward<Args>(args)...)\n    {}\n\n    using TBase::operator();\n    auto operator()(const PStringRef& str) const\n    {\n      const ExcelObj* obj = getCached<ExcelObj>(str.view());\n      if (obj)\n        return obj->visit((TBase&)(*this));\n      \n      return TBase::operator()(str);\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/ExcelRef.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Range.h>\n#include <xlOil/ExcelCall.h>\n#include <xlOil/Caller.h>\n#include <xlOil/ExcelArray.h>\n\nnamespace xloil\n{\n  namespace detail\n  {\n    template<class TSuper>\n    class ExcelRefArgBase\n    {\n    public:\n      using row_t = Range::row_t;\n      using col_t = Range::col_t;\n\n      ExcelObj operator()(int i, int j) const\n      {\n        return up().range(i, j, i + 1, j + 1).value();\n      }\n\n      TSuper& operator=(const ExcelObj& value)\n      {\n        set(value);\n        return up();\n      }\n\n      row_t nRows() const\n      {\n        auto& r = up().ref();\n        return r.rwLast - r.rwFirst + 1;\n      }\n      col_t nCols() const\n      {\n        auto& r = up().ref();\n        return (col_t)(r.colLast - r.colFirst + 1);\n      }\n\n      std::tuple<row_t, col_t> shape() const\n      {\n        return { nRows(), nCols() };\n      }\n\n      std::tuple<row_t, col_t, row_t, col_t> bounds() const\n      {\n        auto& r = up().ref();\n        return { r.rwFirst, r.colFirst, r.rwLast, r.colLast };\n      }\n\n      /// <summary>\n      /// Returns the address of the range in the form '[Book]SheetNm'!A1:Z5\n      /// </summary>\n      std::wstring address(AddressStyle style = AddressStyle::A1) const\n      {\n        return xlrefToWorkbookAddress(up().sheetId(), up().ref(), style);\n      }\n\n      /// <summary>\n      /// Converts the referenced range to an ExcelObj. References to single\n      /// cells return an ExcelObj of the appropriate type. Multicell refernces \n      /// return an array.\n      /// </summary>\n      ExcelObj value() const\n      {\n        ExcelObj result;\n        callExcelRaw(msxll::xlCoerce, &result, &up().obj());\n        return result;\n      }\n\n      void set(const ExcelObj& value)\n      {\n        const ExcelObj* args[2];\n        args[0] = &up().obj();\n        args[1] = &value;\n        callExcelRaw(msxll::xlSet, nullptr, 2, args);\n      }\n\n      void clear()\n      {\n        callExcelRaw(msxll::xlSet, nullptr, &up().obj());\n      }\n\n      static auto subrangeHelper(\n        const msxll::xlref12& r,\n        int fromRow, int fromCol,\n        int toRow, int toCol) noexcept\n      {\n        return msxll::xlref12{\n          r.rwFirst + fromRow,\n          toRow == Range::TO_END ? r.rwLast : r.rwFirst + toRow,\n          r.colFirst + fromCol,\n          toCol == Range::TO_END ? r.colLast : r.colFirst + toCol };\n      }\n\n    private:\n      TSuper& up()             noexcept { return (TSuper&)(*this); }\n      const TSuper& up() const noexcept { return (const TSuper&)(*this); }\n    };\n  }\n\n\n  /// <summary>\n  /// Normalises a reference to a range on an Excel sheet, i.e. taken XLL \n  /// ref or sref (local reference, i.e. to the active sheet) type ExcelObj \n  /// and turns it into a global reference\n  /// </summary>\n  class XLOIL_EXPORT ExcelRef : public detail::ExcelRefArgBase<ExcelRef>\n  {\n  public:\n    using row_t = int;\n    using col_t = int;\n    friend class detail::ExcelRefArgBase<ExcelRef>;\n\n    /// <summary>\n    /// Constructs an ExcelRange from an ExcelObj. Will throw if\n    /// the object is not of type Ref or SRef.\n    /// </summary>\n    ExcelRef(const ExcelObj& from);\n\n    /// <summary>\n    /// Constructs an ExcelRange from a sheet address. If the address\n    /// does not contain a sheet name, the current Active sheet is used.\n    /// </summary>\n    explicit ExcelRef(const std::wstring_view& address);\n    explicit ExcelRef(const wchar_t* address) \n      : ExcelRef(std::wstring_view(address)) \n    {}\n\n    ExcelRef(msxll::IDSHEET sheetId, const msxll::xlref12& ref);\n\n    ExcelRef(msxll::IDSHEET sheetId,\n      int fromRow, int fromCol,\n      int toRow, int toCol)\n      : ExcelRef(sheetId, msxll::xlref12{ fromRow, toRow, fromCol, toCol })\n    {}\n\n    /// <summary>\n    /// Copy constructor\n    /// </summary>\n    ExcelRef(const ExcelRef& from)\n      : _obj(from._obj)\n    {}\n\n    ExcelRef(ExcelRef&& from) noexcept\n      : _obj(std::move(from._obj))\n    {}\n\n    ~ExcelRef() noexcept\n    {\n      reset();\n    }\n\n    ExcelRef range(\n      int fromRow, int fromCol,\n      int toRow = Range::TO_END, int toCol = Range::TO_END) const\n    {\n      return ExcelRef(sheetId(), \n        subrangeHelper(ref(), fromRow, fromCol, toRow, toCol));\n    }\n\n    operator const ExcelObj& () const noexcept { return _obj; }\n    operator ExcelObj&& ()            noexcept { return std::move(_obj); }\n\n  protected:\n    msxll::IDSHEET  sheetId() const noexcept { return _obj.val.mref.idSheet; }\n    msxll::IDSHEET& sheetId()       noexcept { return _obj.val.mref.idSheet; }\n\n    const msxll::XLREF12& ref() const noexcept\n    {\n      return _obj.val.mref.lpmref->reftbl[0];\n    }\n    msxll::XLREF12& ref() noexcept\n    {\n      return _obj.val.mref.lpmref->reftbl[0];\n    }\n\n    const ExcelObj& obj() const noexcept { return _obj; }\n    ExcelObj&       obj()       noexcept { return _obj; }\n\n  private:\n    ExcelObj _obj;\n\n    void create(\n      msxll::IDSHEET sheetId,\n      const msxll::xlref12& ref);\n\n    void reset() noexcept\n    {\n      if (_obj.xltype & msxll::xlbitDLLFree)\n      {\n        delete[] _obj.val.mref.lpmref;\n        _obj.xltype = msxll::xltypeNil;\n      }\n    }\n  };\n\n\n  /// <summary>\n  /// Contains argument passed to a user-defined function which may be an\n  /// ref or sref (local ref) argument. Using this class instead of ExcelObj\n  /// in the declaration of a registered function tells xlOil to allow range\n  /// references to be passed, otherwise they are converted to arrays.\n  /// </summary>\n  class RangeArg : public ExcelObj, public detail::ExcelRefArgBase<RangeArg>\n  {\n    friend class detail::ExcelRefArgBase<RangeArg>;\n\n    /// <summary>\n    /// Not externally constructable. Prefer to store or pass a ExcelRef: \n    /// this avoids inadvertent use of the local range (SRef) type which doesn't\n    /// link to a specific sheet.\n    /// </summary>\n    /// <param name=\"ref\"></param>\n    RangeArg(const msxll::xlref12& ref)\n      : ExcelObj(ref)\n    {}\n\n    RangeArg(msxll::IDSHEET sheet, const msxll::xlref12& ref)\n      : ExcelObj(sheet, ref)\n    {}\n\n  public:\n    ExcelRef toExcelRef()\n    {\n      return ExcelRef(*this);\n    }\n\n    RangeArg range(\n      int fromRow, int fromCol,\n      int toRow = Range::TO_END, int toCol = Range::TO_END) const\n    {\n      switch (xtype())\n      {\n      case msxll::xltypeRef:\n      {\n        auto& r = val.mref.lpmref->reftbl[0];\n        return RangeArg(val.mref.idSheet, \n          subrangeHelper(r, fromRow, fromCol, toRow, toCol));\n      }\n      case msxll::xltypeSRef:\n      {\n        auto& r = val.sref.ref;\n        return RangeArg(subrangeHelper(r, fromRow, fromCol, toRow, toCol));\n      }\n      default:\n        XLO_THROW(\"Not a ref\");\n      }\n    }\n\n  protected:\n    msxll::IDSHEET sheetId() const\n    {\n      switch (xtype())\n      {\n      case msxll::xltypeRef:\n        return val.mref.idSheet;\n      case msxll::xltypeSRef:\n      {\n        ExcelObj id;\n        callExcelRaw(msxll::xlSheetId, &id);\n        return id.val.mref.idSheet;\n      }\n      default:\n        XLO_THROW(\"Not a ref\");\n      }\n    }\n\n    const msxll::XLREF12& ref() const\n    {\n      switch (xtype())\n      {\n      case msxll::xltypeRef:\n        return val.mref.lpmref->reftbl[0];\n      case msxll::xltypeSRef:\n        return val.sref.ref;\n      default:\n        XLO_THROW(\"Not a ref\");\n      }\n    }\n    msxll::XLREF12& ref()\n    {\n      switch (xtype())\n      {\n      case msxll::xltypeRef:\n        return val.mref.lpmref->reftbl[0];\n      case msxll::xltypeSRef:\n        return val.sref.ref;\n      default:\n        XLO_THROW(\"Not a ref\");\n      }\n    }\n\n    const ExcelObj& obj() const noexcept { return *this; }\n    ExcelObj&       obj()       noexcept { return *this; }\n  };\n\n\n  /// <summary>\n  /// An implementation of Range which uses an ExcelRef, i.e. an Xll sheet \n  /// reference as it's underlying type\n  /// </summary>\n  class XllRange : public Range\n  {\n  public:\n    explicit XllRange(const ExcelRef& ref) noexcept : _ref(ref) {}\n    explicit XllRange(ExcelRef&& ref)      noexcept : _ref(ref) {}\n    explicit XllRange(const ExcelObj& ref) noexcept : _ref(ExcelRef(ref)) {}\n\n    template<class T>\n    class Iter\n    {\n    private:\n      T& _range;\n      XllRange::row_t _i;\n      XllRange::col_t _j;\n\n    public:\n      Iter(\n        T& r,\n        XllRange::row_t i = 0,\n        XllRange::col_t j = 0)\n        : _range(r)\n        , _i(i)\n        , _j(j)\n      {}\n\n      Iter& operator++()\n      {\n        if (++_j == _range.nCols())\n        {\n          _j = 0;\n          ++_i;\n        }\n\n        return (*this);\n      }\n\n      auto operator*() const\n      {\n        return _range.value(_i, _j);\n      }\n\n      bool operator==(const Iter<T>& that)\n      {\n        return &_range == &that._range \n          && _i == that._i \n          && _j == that._j;\n      }\n    };\n\n    std::unique_ptr<Range> range(\n      int fromRow, int fromCol,\n      int toRow = TO_END, int toCol = TO_END) const final override\n    {\n      return std::make_unique<XllRange>(\n        _ref.range(fromRow, fromCol, toRow, toCol));\n    }\n\n    std::unique_ptr<Range> trim() const final override\n    {\n      auto val = _ref.value();\n      if (!val.isType(ExcelType::Multi))\n        return std::make_unique<XllRange>(*this);\n      ExcelArray array(val);\n      return range(0, 0, \n        array.nRows() > 0 ? array.nRows() - 1 : 0, \n        array.nCols() > 1 ? array.nCols() - 1 : 0);\n    }\n\n    std::tuple<row_t, col_t> shape() const final override\n    {\n      return { _ref.nRows(), _ref.nCols() };\n    }\n\n    std::tuple<row_t, col_t, row_t, col_t> bounds() const final override\n    {\n      return _ref.bounds();\n    }\n\n    size_t nAreas() const override\n    {\n      return 1;\n    }\n\n    /// <summary>\n    /// Returns the address of the range in the form\n    /// 'SheetNm!A1:Z5'\n    /// </summary>\n    std::wstring address(AddressStyle style = AddressStyle::A1) const final override\n    {\n      return _ref.address(style);\n    }\n\n    /// <summary>\n    /// Converts the referenced range to an ExcelObj. \n    /// References to single cells return an ExcelObj of the\n    /// appropriate type. Multicell refernces return an array.\n    /// </summary>\n    ExcelObj value() const final override\n    {\n      return _ref.value();\n    }\n\n    ExcelObj value(row_t i, col_t j) const final override\n    {\n      return _ref.range(i, j, i, j).value();\n    }\n\n    void set(const ExcelObj& value) final override\n    {\n      _ref.set(value);\n    }\n\n    /// <summary>\n    /// Sets the formula if the range is a cell or an array formula for a \n    /// larger range. Formulae must use RC-style references; this is not\n    /// the case for ExcelRange, so there is no setFormula on the base Range\n    /// class. If the target range is larger than a single cell, the formula\n    /// will be filled to each cell in the range, unless the *array* paramter\n    /// is true, in which case the ArrayFormula property of the range will be\n    /// set to the given formula.\n    /// <see cref=\"xloil::Range\"\\> class.\n    /// </summary>\n    void setFormula(const std::wstring_view& formula, bool array=false);\n\n    ExcelObj formula() const final override\n    {\n      // xlfGetFormula always returns RC references, but GetCell uses the\n      // workspace settings to return RC or A1 style.\n      return callExcel(msxll::xlfGetCell, 6, _ref);\n    }\n\n    std::optional<bool> hasFormula() const final override\n    {\n      // xlfGetFormula always returns RC references, but GetCell uses the\n      // workspace settings to return RC or A1 style.\n      return callExcel(msxll::xlfIsformula, _ref).get<bool>();\n    }\n\n    /// <summary>\n    /// Clears / empties all cells referred to by this ExcelRange.\n    /// </summary>\n    void clear() final\n    {\n      _ref.clear();\n    }\n\n    auto begin()\n    {\n      return Iter<XllRange>(*this);\n    }\n    auto end()\n    {\n      return Iter<XllRange>(*this, nRows(), nCols());\n    }\n    auto cbegin()\n    {\n      return Iter<const XllRange>(*this);\n    }\n    auto cend()\n    {\n      return Iter<const XllRange>(*this, nRows(), nCols());\n    }\n\n    const ExcelRef& asRef() const { return _ref; }\n    Excel::Range* asComPtr() const final override { return nullptr; }\n\n  private:\n    ExcelRef _ref;\n  };\n}"
  },
  {
    "path": "include/xloil/ExcelThread.h",
    "content": "#pragma once\n#include \"ExportMacro.h\"\n#include <functional>\n#include <future>\n#include <memory>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Returns true if the current thread is the main Excel thread\n  /// </summary>\n  XLOIL_EXPORT bool isMainThread();\n\n  /// <summary>\n  /// Having this class in scope declares that you are in an XLL function \n  /// called by Excel.  This allows XLL API requests to runExcelThread \n  /// made on the main thread to pass straight through without expensive\n  /// context switching.\n  /// </summary>\n  class XLOIL_EXPORT InXllContext\n  {\n  public:\n    InXllContext();\n    ~InXllContext();\n    static bool check();\n  };\n  \n  /// <summary>\n  /// Returns *true* if it is safe to create a <see cref=\"CallerInfo\"/> object.\n  /// Otherwise, the *CallerInfo* ctor may crash during an XLL API call. \n  /// \n  /// Generally, it is safe when on the main thread and xlOil has been called\n  /// as an XLL function or a local function.\n  /// \n  /// *Application.Caller* may work in circumstances where this function returns\n  /// false.\n  /// </summary>\n  /// <returns></returns>\n  XLOIL_EXPORT bool isCallerInfoSafe();\n\n  /// <summary>\n  /// Determines how <see cref=\"excelRunOnMainThread\"/> will dispatch the provided\n  /// function. \n  /// </summary>\n  namespace ExcelRunQueue\n  {\n    enum QueueTypeValues\n    {\n      /// Run item via a hidden window message (this doesn't need to be specified).\n      WINDOW  = 1 << 0,\n      /// Always queue item, do not try to run immediately if on main thread\n      ENQUEUE = 1 << 2, \n      /// Item uses XLL API functions\n      XLL_API = 1 << 3, \n      /// Item uses COM API functions (default)\n      COM_API = 1 << 4,\n      /// Functions requiring COM are continually retried until COM is available.\n      /// This disables that functionality.\n      NO_RETRY = 1 << 5\n    };\n  }\n\n  /// <summary>\n  /// Excel will sometimes reject COM calls with the error VBA_E_IGNORE. This can \n  /// happen when the user needs to complete a UI gesture such as closing dialog box.\n  /// This is against standard COM practice, but the COM interface, unlike the GUI colours\n  /// has been abandoned and does not appear to receive updates. xlOil will throw the\n  /// ComBusyException in this case. Use of <see cref=\"excelRunOnMainThread\"/> allows\n  /// retrying a call until the interface becomes available.\n  /// </summary>\n  class ComBusyException : public std::runtime_error\n  {\n  public:\n    ComBusyException(const char* message = nullptr)\n      : std::runtime_error(message \n        ? message \n        : \"Excel COM is busy; a dialog box may be open. Retry the action and if this \"\n          \"error persists, restart Excel.\")\n    {}\n  };\n\n  namespace detail\n  {\n    /// <summary>\n    /// Should not be called directly.\n    /// Excepts a function which returns true if sucessful and false if it should be \n    /// rescheduled for a retry.\n    /// </summary>\n    XLOIL_EXPORT void\n      runExcelThreadImpl(\n        std::function<bool()>&& func,\n        int flags,\n        unsigned waitBeforeCall,\n        unsigned waitBetweenRetries);\n\n    template<typename F, class ReturnType>\n    auto packagedFunction(F&& f, const std::shared_ptr<std::promise<ReturnType>>& result)\n    {\n      return std::function<bool()>([result, f]() mutable\n      {\n        try\n        {\n          result->set_value(f());\n        }\n        catch (const ComBusyException&)\n        {\n          return false;\n        }\n        catch (...)\n        {\n          result->set_exception(std::current_exception());\n        }\n        return true;\n      });\n    }\n\n    template<typename F>\n    auto packagedFunction(F&& f, const std::shared_ptr<std::promise<void>>& result)\n    {\n      return std::function<bool()>([result, f]() mutable\n      {\n        try\n        {\n          f();\n          result->set_value();\n        }\n        catch (const ComBusyException&)\n        {\n          return false;\n        }\n        catch (...)\n        {\n          result->set_exception(std::current_exception());\n        }\n        return true;\n      });\n    }\n  }\n  /// <summary>\n  /// Excel's COM interface, used by any call based on the Excel::Application object,\n  /// must be called on the main thread. This function schedules a callback from the\n  /// main thread or executes immediately if called from the main thread (a  \n  /// callback can be forced with the ENQUEUE flag).\n  /// \n  /// The COM API is not always available - see <see cref=\"ComBusyException\"/> for\n  /// a discussion of this issue.\n  /// \n  /// Calls to the XLL interface require the main thread (with some exceptions) and\n  /// being in the correct 'context', i.e. being in a function invoked by Excel.\n  /// Setting the ExcelRunQueue::XLL_API flag schedules a callback to ensure this. \n  /// xlOil uses the COM interface to switch to XLL context, so consider setting \n  /// non-zero COM retries if using this option.\n  /// \n  /// </summary>\n  /// <param name=\"func\"></param>\n  /// <param name=\"flags\"></param>\n  /// <param name=\"waitBetweenRetries\">\n  ///   The number of milliseconds to wait between COM retries if Excel reports\n  ///   that the COM API is not available.\n  /// </param>\n  /// <param name=\"waitBeforeCall\">\n  ///   Wait for the specified number of milliseconds before executing the callback\n  /// </param>\n  /// <returns>A std::future which contains the result of the function</returns>\n  /// \n  template<typename F>\n  inline auto runExcelThread(F&& func,\n    int flags = ExcelRunQueue::COM_API,\n    unsigned waitBeforeCall = 0,\n    unsigned waitBetweenRetries = 200) -> std::future<decltype(func())>\n  {\n    using namespace detail;\n    using returnType = decltype(func());\n    // Need to create a ptr to the promise as the right ctors to move the\n    // promise into the packaged object as missing as of C++17\n    auto result = std::make_shared<std::promise<returnType>>();\n    runExcelThreadImpl(packagedFunction(std::move(func), result),\n      flags, waitBeforeCall, waitBetweenRetries);\n    return result->get_future();\n  }\n\n  /// <summary>\n  /// Internal use: called during Core DLL startup.\n  /// </summary>\n  void runComSetupOnXllOpen(const std::function<void()>& func);\n\n  /// <summary>\n  /// Internal use: called during Core DLL startup.\n  /// </summary>\n  void initMessageQueue(void* excelInstance);\n\n  /// <summary>\n  /// Internal use: called during teardown to ensure the queue \n  /// is finalised\n  /// </summary>\n  void teardownMessageQueue();\n}"
  },
  {
    "path": "include/xloil/ExcelTypeLib.h",
    "content": "/// <summary>\n/// This header file imports the Excel typelib required for accessing the\n/// COM interface, e.g. through the Excel::Application object. You may need\n/// to disable multi-threaded compliation in any source files which include \n/// this\n/// </summary>\n\n#pragma once\n\n#ifndef NOMINMAX\n#define NOMINMAX\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n// Let's please not have a macro called \"ABSOLUTE\"\n#define NOGDI\n#include <windows.h>\n\n#include <xloil/ExcelThread.h> // for ComBusyException\n\n// Disable \"prefer 'enum class' over 'enum' (Enum.3)\" in typelibs\n#pragma warning(disable:26812)\n\n// MSO.dll\n#import \"libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52\" version(\"2.8\") \\\n  rename(\"DocumentProperties\", \"MSODocumentProperties\") \\\n  rename(\"RGB\", \"MSORGB\") \\\n  rename(\"IAccessible\", \"MSOIAccessible\") \\\n  rename(\"SearchPath\", \"MSOSearchPath\")\n\n// VBE6EXT.OLB\n#import \"libid:0002E157-0000-0000-C000-000000000046\" \\\n  rename(\"Reference\", \"VBReference\")\n\n//disable: automatically excluding 'name' while importing type library 'library'\n#pragma warning(disable : 4192) \n\n// Excel.exe\n#import \"libid:00020813-0000-0000-C000-000000000046\" \\\n  rename(\"DocumentProperties\", \"ExcelDocumentProperties\") \\\n  rename(\"DialogBox\", \"ExcelDialogBox\" ) \\\n  rename(\"RGB\", \"ExcelRGB\" ) \\\n  rename(\"CopyFile\", \"ExcelCopyFile\" ) \\\n  rename(\"ReplaceText\", \"ExcelReplaceText\" )\n\n// Add-in designer C:\\\\Program Files\\\\Common Files\\\\Designer\\\\MSADDNDR.OLB\n#import \"libid:AC0714F2-3D04-11D1-AE7D-00A0C90F26F4\"\n\n/// <summary>\n/// The Excel Typelib LibID GUID as a string\n/// </summary>\nconstexpr wchar_t* const LIBID_STR_Excel = L\"{00020813-0000-0000-C000-000000000046}\";\n\n/// <summary>\n/// The Excel Typelib LibID\n/// </summary>\nextern \"C\" const GUID __declspec(selectany) LIBID_Excel =\n  { 0x00020813,0x0000,0x0000,{0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} };\n\n/// <summary>\n/// The AddInDesigner Typelib LibID\n/// </summary>\nextern \"C\" const GUID __declspec(selectany) LIBID_AddInDesigner =\n  { 0xAC0714F2,0x3D04,0x11D1, {0xAE,0x7D,0x00,0xA0,0xC9,0x0F,0x26,0xF4} };\n\n\n\n/// <summary>\n/// Code for VBA Ignore error generated from Excel COM.\n/// \n/// From MSDN:\n/// Excel will return this when you try to invoke the object model \n/// when the property browser is suspended.  This will happen around \n/// user edits to ensure that things don't get out of whack with \n/// automation slipping in in the middle.  The problem with VBA_E_IGNORE \n/// is that it is non-standard.  The COM prescribed way of addressing this\n/// issue is to register an IMessageFilter implementation.  This allows \n/// COM to notify the server whenever another thread is trying to make a \n/// call and this gives the server the opportunity to reject the call if \n/// they aren't in a position to handle it. However, VBA_E_IGNORE occurs \n/// outside of this mechanism so you will have to roll your own mechanism \n/// of handling it.  I would suggest that you create a some sort of dispatch\n/// loop whereby you handle the specific COM exception by waiting a few \n/// seconds and then jumping back to the start of the loop.\n/// See https://social.msdn.microsoft.com/Forums/vstudio/en-US/9168f9f2-e5bc-4535-8d7d-4e374ab8ff09/hresult-800ac472-from-set-operations-in-excel\n/// </summary>\nconstexpr HRESULT VBA_E_IGNORE = 0x800ac472;\n\n/// <summary>\n/// Catches COM errors (which do not derive from std::execption). This \n/// macro is automatically invoked just before XLO_FUNC_END in functions \n/// which access the COM interface (e.g. via Excel::Application).\n/// </summary>\n#define XLO_RETURN_COM_ERROR \\\n  catch (_com_error& error) \\\n  { \\\n    return xloil::returnValue(xloil::formatStr(L\"#COM ERROR %X: %s\", (size_t)error.Error(), error.ErrorMessage())); \\\n  }\n\n/// <summary>\n/// Catches COM errors (which do not derive from std::execption) and \n/// re-throws them as an xloil::Exception. In addition, it detects the\n/// dreaded VBA_E_IGNORE and throws an xloil::ComBusyException in this\n/// case.\n/// </summary>\n#define XLO_RETHROW_COM_ERROR \\\n  catch (_com_error& error) \\\n  { \\\n    if (error.Error() == VBA_E_IGNORE) \\\n      throw xloil::ComBusyException(); \\\n    else \\\n      XLO_THROW(L\"COM Error {0:#x}: {1}\", (unsigned)error.Error(), error.ErrorMessage()); \\\n  }\n  \n"
  },
  {
    "path": "include/xloil/ExcelUI.h",
    "content": "#pragma once\n#include <xloil/ExportMacro.h>\n#include <xloil/ExcelObj.h>\n#include <functional>\n#include <memory>\n#include <map>\n\ntypedef struct tagVARIANT VARIANT;\nstruct IDispatch;\n\nnamespace Excel { struct Window; }\nnamespace xloil { class ExcelWindow; }\nnamespace xloil\n{\n  /// <summary>\n  /// This class is passed to Ribbon callback functions and identifies which\n  /// control triggered the callback.\n  /// </summary>\n  struct RibbonControl\n  {\n    const wchar_t* Id;\n    const wchar_t* Tag;\n  };\n\n  /// <summary>\n  /// Displays a message in Excel's status bar\n  /// </summary>\n  /// <param name=\"msg\"></param>\n  /// <param name=\"timeout\">if positive, the message will be cleared after the specified\n  /// number of milliseconds</param>\n  /// <returns></returns>\n  XLOIL_EXPORT void statusBarMsg(const std::wstring_view& msg, size_t timeout = 0);\n\n  /// <summary>\n  /// Displays status bar messages, then clears the status bar on destruction\n  /// (with an optional delay)\n  /// </summary>\n  class StatusBar\n  {\n  public:\n    /// <summary>\n    /// Sets a final timeout in milliseconds. The status bar will be cleared\n    /// after this amount of time since the class is destroyed.\n    /// </summary>\n    /// <param name=\"finalTimeout\"></param>\n    StatusBar(size_t finalTimeout = 0) \n      : _timeout(finalTimeout) \n    {}\n\n    void msg(const std::wstring_view& msg, size_t timeout = 0)\n    {\n      statusBarMsg(msg, timeout);\n    }\n\n    ~StatusBar()\n    {\n      statusBarMsg(L\"\", _timeout);\n    }\n\n    size_t _timeout;\n  };\n\n  /// <summary>\n  /// Event handler to respond to custom task pane events. Callbacks will made on \n  /// Excel's main thread.\n  /// </summary>\n  class ICustomTaskPaneEvents\n  {\n  public:\n    /// <summary>\n    /// Called when the user closes/shows the pane with the new visibility in 'state'\n    /// </summary>\n    virtual void onVisible(bool state) = 0;\n    /// <summary>\n    /// Called when the user docks or undocks the pane\n    /// </summary>\n    virtual void onDocked() = 0;\n    /// <summary>\n    /// Called just before the pane is destroyed when the parent window is closed.\n    /// Only triggered when the xlOil host control is used, see `createTaskPane`.\n    /// </summary>\n    virtual void onDestroy() = 0;\n  };\n\n  /// <summary>\n  /// Wraps an Excel Custom Task Pane \n  /// (https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.tools.customtaskpane)\n  /// </summary>\n  class ICustomTaskPane\n  {\n  public:\n    enum DockPosition\n    {\n      Bottom = 3,\n      Floating = 4,\n      Left = 0,\n      Right = 2,\n      Top = 1\n    };\n    virtual ~ICustomTaskPane() {}\n\n    /// <summary>\n    /// Gets the base COM control created in the task pane. Thread safe.\n    /// </summary>\n    /// <returns></returns>\n    virtual IDispatch* content() const = 0;\n\n    /// <summary>\n    /// Gives the main Excel Window object to which this task pane is attached\n    /// </summary>\n    /// <returns></returns>\n    virtual ExcelWindow window() const = 0;\n\n    /// <summary>\n    /// Sets the visblity of the task pane to true/false\n    /// </summary>\n    /// <param name=\"visible\"></param>\n    virtual void setVisible(bool visible) = 0;\n\n    /// <summary>\n    /// Returns the current visibility of the task pane\n    /// </summary>\n    /// <returns></returns>\n    virtual bool getVisible() = 0;\n\n    /// <summary>\n    /// Returns the task pane size in pixels as a tuple (width, height)\n    /// </summary>\n    /// <returns></returns>\n    virtual std::pair<int, int> getSize() = 0;\n\n    /// <summary>\n    /// Sets the task pane size to the specified number of pixels\n    /// </summary>\n    /// <param name=\"width\"></param>\n    /// <param name=\"height\"></param>\n    virtual void setSize(int width, int height) = 0;\n\n    /// <summary>\n    /// Gets the current dock position of the task pane\n    /// </summary>\n    /// <returns></returns>\n    virtual DockPosition getPosition() const = 0;\n    /// <summary>\n    /// Sets the dock position: top, left, right, bottom, floating\n    /// </summary>\n    /// <param name=\"pos\"></param>\n    virtual void setPosition(DockPosition pos) = 0;\n\n    /// <summary>\n    /// Gets the window title of the task pane\n    /// </summary>\n    /// <returns></returns>\n    virtual std::wstring getTitle() const = 0;\n\n    /// <summary>\n    /// Registers a callback handler for task pane events. The callback will occur \n    /// in Excel's main thread.\n    /// </summary>\n    /// <param name=\"events\"></param>\n    virtual void listen(const std::shared_ptr<ICustomTaskPaneEvents>& events) = 0;\n\n    /// <summary>\n    /// If the pane contains an xlOil hosting control, attaches the specified \n    /// Win32 window to the control and automatically resizes it to fill the pane.\n    /// </summary>\n    /// <param name=\"hwnd\"></param>\n    virtual void attach(size_t hwnd, bool asParent=true) = 0;\n\n    virtual void destroy() = 0;\n  };\n\n  /// <summary>\n  /// The methods of classes of this type must be called on Excel's main thread, \n  /// unless otherwise noted.  This includes the destructor unless close has previously\n  /// been called.\n  /// </summary>\n  class IComAddin\n  {\n  public:\n    using RibbonCallback = std::function<\n      void(const RibbonControl&, VARIANT*, int, VARIANT**)>;\n    using RibbonMap = std::function<RibbonCallback(const wchar_t*)>;\n\n    /// <summary>\n    /// COM ProgID used to register this add-in\n    /// </summary>\n    virtual const wchar_t* progid() const = 0;\n    /// <summary>\n    /// Connects the add-in to Excel and optionally sets the Ribbon XML. The\n    /// Office Ribbon invokes callbacks on its controls by calling methods\n    /// named in the XML.  The `mapper` maps these names to actual C++ functions.\n    /// The Ribbon XML can *only* be set before the addin is connected, hence it\n    /// is specified here rather than in a setRibbon function.\n    /// </summary>\n    /// <param name=\"xml\"></param>\n    /// <param name=\"mapper\">\n    ///    A map from names to functions which returns a <see cref=\"RibbonCallback\"/> .\n    /// </param>\n    virtual void connect(\n      const wchar_t* xml = nullptr,\n      const RibbonMap& mapper = RibbonMap()) = 0;\n    /// <summary> \n    /// Disconnects the add-in from Excel and closes any associated Ribbons\n    /// </summary>\n    virtual void disconnect() = 0;\n\n    /// <summary>\n    /// Invalidates the specified control: this clears the caches of the\n    /// responses to all callbacks associated with the control. For example,\n    /// this can be used to hide a control by forcing its getVisible callback\n    /// to be invoked.\n    /// \n    /// If no control ID is specified, all controls are invalidated.\n    /// </summary>\n    /// <param name=\"controlId\"></param>\n    virtual void ribbonInvalidate(const wchar_t* controlId = 0) const = 0;\n    /// <summary>\n    /// Activates the specified Ribbon pane - this method does not work for the \n    /// built-in pane\n    /// </summary>\n    /// <returns>true if successful</returns>\n    virtual bool ribbonActivate(const wchar_t* controlId) const = 0;\n\n    /// <summary>\n    /// Creates a custom task pane\n    /// </summary>\n    /// <param name=\"name\">\n    ///   The name of the pane which will be displayed above it.\n    /// </param>\n    /// <param name=\"window\">\n    ///   The Excel window in which the pane should be created. If ommited, the \n    ///   active window is used.\n    /// </param>\n    /// <param name=\"progId\">\n    ///   The COM ProgID of the control to create in the task pane. If omitted\n    ///   an xlOil host control is created which can attach to a window.\n    /// </param>\n    /// <returns></returns>\n    virtual std::shared_ptr<ICustomTaskPane> createTaskPane(\n      const wchar_t* name,\n      const ExcelWindow* window = nullptr,\n      const wchar_t* progId = nullptr) = 0;\n\n    using TaskPaneMap = std::multimap<std::wstring, std::shared_ptr<ICustomTaskPane>>;\n    virtual const TaskPaneMap& panes() const = 0;\n\n    /// <summary>\n    /// Invalidates the object, do not call any further methods after this\n    /// </summary>\n    virtual void close() noexcept = 0;\n  };\n\n  /// <summary>\n  /// Registers a COM add-in with the specified name (which must be unique)\n  /// and an optional description to show in Excel's add-in options.  The add-in\n  /// is not activated until you call the <see cref=\"IComAddin::connect\"/> method.\n  /// </summary>\n  /// <returns>A pointer to an a <see cref=\"IComAddin\"/> object which controls\n  ///   the add-in.</returns>\n  XLOIL_EXPORT std::shared_ptr<IComAddin>\n    makeComAddin(const wchar_t* name, const wchar_t* description = nullptr);\n\n  inline auto makeAddinWithRibbon(\n    const wchar_t* name,\n    const wchar_t* xml,\n    const IComAddin::RibbonMap& mapper)\n  {\n    auto addin = makeComAddin(name, nullptr);\n    addin->connect(xml, mapper);\n    return addin;\n  }\n\n  /// <summary>\n  /// Converts a variant to an ExcelObj.\n  /// </summary>\n  /// <param name=\"variant\"></param>\n  /// <param name=\"allowRange\">If true, a variant Range will be converted to an xlRef,\n  /// otherwise it will become an array of ExcelObj.\n  /// </param>\n  /// <returns></returns>\n  XLOIL_EXPORT ExcelObj variantToExcelObj(const VARIANT& variant, bool allowRange = false);\n\n  XLOIL_EXPORT void excelObjToVariant(VARIANT* v, const ExcelObj& obj);\n}"
  },
  {
    "path": "include/xloil/ExportMacro.h",
    "content": "#pragma once\n\n#ifdef XLOIL_EXPORTS\n#define XLOIL_EXPORT __declspec(dllexport)\n#else\n#ifdef XLOIL_STATIC_LIB\n#define XLOIL_EXPORT \n#else\n#define XLOIL_EXPORT __declspec(dllimport)\n#endif\n#endif\n\n#define XLO_ENTRY_POINT(return_value) extern \"C\" __declspec(dllexport) return_value __stdcall \n"
  },
  {
    "path": "include/xloil/FPArray.h",
    "content": "#pragma once\n#include <xlOil/XlCallSlim.h>\n#include <xlOil/ExportMacro.h>\n#include <cassert>\n#include <memory>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Wraps a FP12 struct: this is a 2-d array of doubles which is an optional\n  /// argument type for user-defined functions. It is very fast and lightweight\n  /// but is less flexible and user-friendly: if any value in the array passed\n  /// to the function is not a number, Excel will return VALUE! without invoking\n  /// the function.  A function returning an FPArray, cannot return error conditions\n  /// so these must be logged.  See for example Excel's MINVERSE function.\n  /// </summary>\n  class FPArray : public msxll::_FP12\n  {\n  private:\n    FPArray() {}\n\n  public:\n    /// <summary>\n    /// Creates a managed `FPArray` that is deleted when AfterCalculate is invoked. You\n    /// should return a raw `FPArray*` from your function and not hold a reference.\n    /// Since an FPArray is variable size struct, it cannot be created using a normal\n    /// C++ constructor. The `FPArray` must be managed as there is no xlAutoFree\n    /// callback for Excel `FP12` return types.\n    /// </summary>\n    XLOIL_EXPORT static std::shared_ptr<FPArray> create(size_t nRows, size_t nCols);\n\n    /// <summary>\n    /// Returns the 'empty' static array (actually a 1x1 array containing a NaN) as\n    /// a truly empty FPArray is not valid.\n    /// </summary>\n    /// <returns></returns>\n    XLOIL_EXPORT static FPArray* empty();\n\n    /// <summary>\n    /// Assigns a the given double to all elements of the array\n    /// </summary>\n    /// <param name=\"val\"></param>\n    /// <returns></returns>\n    FPArray& operator=(double val)\n    {\n      for (auto i = begin(); i != end(); ++i)\n        *i = val;\n    }\n    bool operator==(const FPArray& that)\n    {\n      return rows == that.rows\n        && columns == that.columns\n        && std::equal(begin(), end(), that.begin());\n    }\n    /// <summary>\n    /// Total number of elements: rows x columns\n    /// </summary>\n    /// <returns></returns>\n    size_t size() const\n    {\n      return rows * columns;\n    }\n    /// <summary>\n    /// Retrieves the i-th element (data is stored in column-major order)\n    /// </summary>\n    double& operator[](size_t i)\n    {\n      assert(i < size());\n      return array[i];\n    }\n    /// <summary>\n    /// Retrieves the i-th element (data is stored in column-major order)\n    /// </summary>\n    double operator[](size_t i) const\n    {\n      assert(i < size());\n      return array[i];\n    }\n    /// <summary>\n    /// Retrieves the (i,j)-th element\n    /// </summary>\n    double& operator()(size_t i, size_t j)\n    {\n      assert(i < (size_t)rows && j < (size_t)columns);\n      return operator[](i * columns + j);\n    }\n    /// <summary>\n    /// Retrieves the (i,j)-th element\n    /// </summary>\n    double operator()(size_t i, size_t j) const\n    {\n      assert(i < (size_t)rows && j < (size_t)columns);\n      return operator[](i * columns + j);\n    }\n    double* begin()\n    {\n      return array;\n    }\n    double* end()\n    {\n      return array + size();\n    }\n    const double* begin() const\n    {\n      return array;\n    }\n    const double* end() const\n    {\n      return array + size();\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/FuncSpec.h",
    "content": "#pragma once\n\n#include \"Register.h\"\n#include \"ExportMacro.h\"\n#include <memory>\n\nnamespace xloil\n{\n  class RegisteredWorksheetFunc;\n\n  /// <summary>\n  /// A base class which encapsulates the specification of a registered \n  /// function. That is, its <see cref=\"FuncInfo\"/> and its call location.\n  /// </summary>\n  class WorksheetFuncSpec : public std::enable_shared_from_this<WorksheetFuncSpec>\n  {\n  public:\n    WorksheetFuncSpec(const std::shared_ptr<const FuncInfo>& info) \n      : _info(info)\n    {}\n\n    virtual ~WorksheetFuncSpec() {}\n\n    /// <summary>\n    /// Registers this function with the registry\n    /// </summary>\n    /// <returns>\n    /// A <see cref=\"RegisteredWorksheetFunc\"/> which can be used to deregister \n    /// this function.\n    /// </returns>\n    virtual std::shared_ptr<RegisteredWorksheetFunc> registerFunc() const = 0;\n\n    /// <summary>\n    /// Gets the <see cref=\"FuncInfo\"/> associated with this WorksheetFuncSpec\n    /// </summary>\n    /// <returns></returns>\n    const std::shared_ptr<const FuncInfo>& info() const { return _info; }\n\n    /// <summary>\n    /// Returns the name of the function, equivalent to info()->name\n    /// </summary>\n    /// <returns></returns>\n    const std::wstring& name() const { return _info->name; }\n\n    /// <summary>\n    /// This call is used for local functions. It does not necessarily equal the\n    /// callback used for Excel UDFs set by *registerFunc*\n    /// </summary>\n    /// <param name=\"args\"></param>\n    /// <returns></returns>\n    virtual ExcelObj* call(const ExcelObj** args) const = 0;\n\n  private:\n    std::shared_ptr<const FuncInfo> _info;\n  };\n\n  // This class is used for statically registered functions and should\n  // not be constructed directly.\n  class StaticWorksheetFunction : public WorksheetFuncSpec\n  {\n  public:\n    StaticWorksheetFunction(\n      const std::shared_ptr<const FuncInfo>& info, \n      const std::wstring_view& dllName,\n      const std::string_view& entryPoint)\n      : WorksheetFuncSpec(info)\n      , _dllName(dllName)\n      , _entryPoint(entryPoint)\n    {}\n\n    XLOIL_EXPORT std::shared_ptr<RegisteredWorksheetFunc> registerFunc() const override;\n\n    ExcelObj* call(const ExcelObj**) const override\n    {\n      throw std::exception();\n    }\n\n    std::wstring _dllName;\n    std::string _entryPoint;\n  };\n}"
  },
  {
    "path": "include/xloil/Interface.h",
    "content": "#pragma once\n#include <xloil/ExportMacro.h>\n#include <xloil/Register.h>\n#include <xloil/FuncSpec.h>\n#include <xloil/Version.h>\n#include <memory>\n#include <map>\n\nnamespace toml { class table; }\nnamespace xloil { \n  class RegisteredWorksheetFunc; \n  class LocalWorksheetFunc;\n  class AddinContext; \n  namespace Event { enum class FileAction; }\n}\n\nnamespace xloil\n{\n  class AddinContext;\n  /// <summary>\n  /// FuncSource is the base class in a hierachy which keeps track \n  /// of a location (typically a file) from which UDFs have been\n  /// registered and provides functionality such as reloading on change.\n  /// \n  /// Plugins should avoid keeping references to a FuncSource, or if\n  /// they do be careful to clean them up when an XLL detaches\n  /// </summary>\n  class XLOIL_EXPORT FuncSource : public std::enable_shared_from_this<FuncSource>\n  {\n  public:\n    /// <summary>\n    /// Called just after the source is registered in the global FuncSource\n    /// map. FuncSources should not register functions before `init`.\n    /// </summary>\n    virtual void init() = 0;\n  \n    virtual ~FuncSource();\n\n    virtual const std::wstring& name() const = 0;\n\n    /// <summary>\n    /// Registers the given function specifcations with Excel. If\n    /// registration fails the input parameter will contain the failed\n    /// functions, otherwise it will be empty. \n    /// \n    /// If this function is called a second time it replaces all currently\n    /// registered functions unless append is true.\n    /// \n    /// </summary>\n    /// <param name=\"specs\">functions to register</param>\n    /// <param name=\"append\">if false, replacess all currently registered functions</param>\n    void registerFuncs(\n      const std::vector<std::shared_ptr<const WorksheetFuncSpec> >& specs,\n      const bool append = false);\n\n    /// <summary>\n    /// Removes the specified function from Excel\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <returns></returns>\n    bool deregister(const std::wstring& name);\n\n    /// <summary>\n    /// A list of all functions declared by this Source.\n    /// </summary>\n    std::vector<std::shared_ptr<const WorksheetFuncSpec>> functions() const;\n\n  private:\n    std::map<std::wstring, std::shared_ptr<RegisteredWorksheetFunc>> _functions;\n  };\n\n  /// <summary>\n  /// FileSource extends FuncSource by watching the specified source file\n  /// for changes and signals `reload` on modification or deletes the \n  /// source (hence unregistering the UDFs) if the watched file is removed.\n  /// </summary>\n  class XLOIL_EXPORT FileSource : public FuncSource\n  {\n  public:\n    friend class AddinContext;\n\n    /// <summary>\n    /// </summary>\n    /// <param name=\"sourcePath\">Should be a full pathname</param>\n    /// <param name=\"watchFile\">If true enables a file watch</param>\n    FileSource(const wchar_t* sourcePath, bool watchFile = false);\n    virtual ~FileSource();\n\n    virtual const std::wstring& name() const override { return _sourcePath; }\n    const wchar_t* filename() const { return _sourceName; }\n\n  protected:\n    /// <summary>\n    /// Invoked when the source file is modified, but not deleted.\n    /// </summary>\n    virtual void reload();\n    virtual void init();\n\n  private:\n    std::wstring _sourcePath;\n    const wchar_t* _sourceName;\n    bool _watchFile;\n    std::shared_ptr<const void> _fileWatcher;\n\n    void handleDirChange(\n      const wchar_t* dirName,\n      const wchar_t* fileName,\n      const Event::FileAction action);\n  };\n\n  /// <summary>\n  /// LinkedSource extends FileSource by having an associated workbook. \n  /// This allows the registration of local functions. The workbook is \n  /// watched for rename and close events which trigger a call of \n  /// `renameWorkbook` or deletion of the source respectively.\n  /// </summary>\n  class XLOIL_EXPORT LinkedSource : public FileSource\n  {\n  public:\n    LinkedSource(\n      const wchar_t* sourceName,\n      bool watchFile,\n      const wchar_t* linkedWorkbookName)\n      : FileSource(sourceName, watchFile)\n    {\n      if (linkedWorkbookName)\n        _workbookName = linkedWorkbookName;\n    }\n    ~LinkedSource();\n\n    /// <summary>\n    /// Registers the given functions as local functions in the specified\n    /// workbook.  Either appends to or overwrites the existing functions\n    /// depending on the 'append' parameter.\n    /// </summary>\n    void registerLocal(\n      const std::vector<std::shared_ptr<const WorksheetFuncSpec>>& funcSpecs, \n      const bool append);\n\n    const std::wstring& linkedWorkbook() const { return _workbookName; }\n\n  protected:\n    virtual void init();\n    virtual void renameWorkbook(const wchar_t* newPathName);\n\n  private:\n    std::map<std::wstring, std::shared_ptr<const LocalWorksheetFunc>> _localFunctions;\n    std::wstring _workbookName;\n    std::wstring _vbaModuleName;\n    std::shared_ptr<const void> _workbookCloseHandler;\n    std::shared_ptr<const void> _workbookRenameHandler;\n\n    void handleClose(const wchar_t* wbName);\n    void handleRename(const wchar_t* wbPathName, const wchar_t* prevName);\n  };\n\n  /// <summary> \n  /// The AddinContext keeps track of file sources associated with an Addin\n  /// to ensure they are properly cleaned up when the addin unloads\n  /// </summary>\n  class AddinContext\n  {\n  public:\n    using ContextMap = std::map<std::wstring, std::shared_ptr<FuncSource>>;\n\n    AddinContext(\n      const std::wstring_view& pathName, \n      const std::shared_ptr<const toml::table>& settings,\n      const std::wstring_view& logFilePath);\n\n    ~AddinContext();\n\n\n    /// <summary>\n    /// Looks for a FileSource corresponding the specified pathname.\n    /// Returns the FileSource if found, otherwise a null pointer\n    /// </summary>\n    /// <param name=\"sourcePath\"></param>\n    /// <returns></returns>\n    XLOIL_EXPORT static std::pair<std::shared_ptr<FuncSource>, std::shared_ptr<AddinContext>>\n      findSource(const wchar_t* sourcePath);\n\n    /// <summary>\n    /// Removes the specified source\n    /// </summary>\n    void erase(const std::shared_ptr<FuncSource>& context)\n    {\n      _files.erase(context->name());\n    }\n\n    /// <summary>\n    /// Gets the root of the addin's ini file\n    /// </summary>\n    auto settings() const { return _settings.get(); }\n\n    /// <summary>\n    /// Returns a map of all Sources associated with this XLL addin\n    /// </summary>\n    const ContextMap& sources() const { return _files; }\n\n    /// <summary>\n    /// Returns the full pathname of the XLL addin\n    /// </summary>\n    const std::wstring& pathName() const { return _pathName; }\n\n    /// <summary>\n    /// Returns the full pathname of the log file addin\n    /// </summary>\n    const std::wstring& logFile() const { return _logFilePath; }\n\n    /// <summary>\n    /// Returns the filename of the XLL addin\n    /// </summary>\n    const wchar_t* fileName() const \n    {\n      auto slash = _pathName.find_last_of(L'\\\\');\n      return _pathName.c_str() + slash + 1;\n    }\n\n    void addSource(const std::shared_ptr<FuncSource>& source)\n    {\n      _files.emplace(std::make_pair(source->name(), source));\n      source->init();\n    }\n\n    void loadPlugins();\n    void detachPlugins();\n\n  private:\n    AddinContext(const AddinContext&) = delete;\n    AddinContext& operator=(const AddinContext&) = delete;\n\n    std::wstring _pathName;\n    std::wstring _logFilePath;\n    std::shared_ptr<const toml::table> _settings;\n    ContextMap _files;\n    std::vector<std::wstring> _plugins;\n  };\n\n/// <summary>\n/// This macro declares the plugin entry point. Its arguments must match\n/// <see cref=\"PluginInitFunc\"/>.\n/// </summary>\n#define XLO_PLUGIN_INIT(...) extern \"C\" __declspec(dllexport) int \\\n  XLO_PLUGIN_INIT_FUNC##(__VA_ARGS__) noexcept\n\n#define XLO_PLUGIN_INIT_FUNC xloil_init\n\n  /// <summary>\n  /// Contains information the plugin can use to initialise or \n  /// link with another addin\n  /// </summary>\n  /// \n  // TODO: rename to maybe PluginAction?  Also maybe Extensions rather than plugin?\n  struct PluginContext\n  {\n    enum Action\n    {\n      /// <summary>\n      /// The Load action is specified the first time a plugin is initialised\n      /// </summary>\n      Load,\n      /// <summary>\n      /// The Attach action is used when an XLL addin has requested use of the \n      /// plugin. The addin may have a settings file which the plugin should process\n      /// </summary>\n      Attach,\n      /// <summary>\n      /// Detach is called when an XLL using the plugin is unloading\n      /// </summary>\n      Detach,\n      /// <summary>\n      /// When Unload is called, the plugin should clean up all internal\n      /// data in anticipation of a call to FreeLibrary.\n      /// </summary>\n      Unload\n    };\n    Action action;\n    const wchar_t* pluginName;\n    const toml::table& settings;\n    uint8_t coreMajorVersion;\n    uint8_t coreMinorVersion;\n    uint8_t corePatchVersion;\n\n    bool checkExactVersion() const\n    {\n      return coreMajorVersion == XLOIL_MAJOR_VERSION \n        && coreMinorVersion == XLOIL_MINOR_VERSION \n        && corePatchVersion == XLOIL_PATCH_VERSION;\n    }\n  };\n\n  /// <summary>\n  /// A plugin must declare an extern C function with this signature\n  /// </summary>\n  typedef int(*PluginInitFunc)(AddinContext*, const PluginContext&);\n}\n"
  },
  {
    "path": "include/xloil/Limits.h",
    "content": "#pragma once\n#include <stdint.h>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Max string length for an A1-style cell address. The largest address\n  /// is \"AAA1000000:ZZZ1000001<null>\"\n  /// </summary>\n  constexpr uint16_t XL_CELL_ADDRESS_A1_MAX_LEN = 3 + 7 + 1 + 3 + 7 + 1;\n  /// <summary>\n  /// Max string length for an RC-style cell address\n  /// </summary>\n  constexpr uint16_t XL_CELL_ADDRESS_RC_MAX_LEN = 29;\n  /// <summary>\n  /// Max string length for a sheet name\n  /// </summary>\n  constexpr uint16_t XL_SHEET_NAME_MAX_LEN = 31;\n  /// <summary>\n  /// Max filename length. Used to be 216, but limit was raised\n  /// in May 2020 Office 365. Length of 260 is imposed by filesystem.\n  /// </summary>\n  constexpr uint16_t XL_FILENAME_MAX_LEN = 260;\n  /// <summary>\n  /// Max string length for an A1-style full address including workbook name.\n  /// Includes allowance of 2 for quoting the filename part\n  /// </summary>\n  constexpr uint16_t XL_FULL_ADDRESS_A1_MAX_LEN = XL_FILENAME_MAX_LEN + XL_SHEET_NAME_MAX_LEN + XL_CELL_ADDRESS_A1_MAX_LEN + 2;\n  /// <summary>\n  /// Max string length for an RC-style full address including workbook name\n  /// Includes allowance of 2 for quoting the filename part\n  /// </summary>\n  constexpr uint16_t XL_FULL_ADDRESS_RC_MAX_LEN = XL_FILENAME_MAX_LEN + XL_SHEET_NAME_MAX_LEN + XL_CELL_ADDRESS_RC_MAX_LEN + 2;\n  /// <summary>\n  /// Max string length for a (pascal) string in an ExcelObj\n  /// </summary>\n  constexpr uint16_t XL_STRING_MAX_LEN = 32767;\n  /// <summary>\n  /// Max number of rows on a sheet\n  /// </summary>\n  constexpr uint32_t XL_MAX_ROWS = 1048576;\n  /// <summary>\n  /// Max number of columns on a sheet\n  /// </summary>\n  constexpr uint16_t XL_MAX_COLS = 16384;\n  /// <summary>\n  /// Max number of args for a user-defined function\n  /// </summary>\n  constexpr uint16_t XL_MAX_UDF_ARGS = 255;\n  /// <summary>\n  /// Max number of args for a VBA function\n  /// </summary>\n  constexpr uint16_t XL_MAX_VBA_FUNCTION_ARGS = 60;\n  /// <summary>\n  /// Max number of args for a VBA function\n  /// </summary>\n  constexpr uint16_t XL_ARG_HELP_STRING_MAX_LENGTH = 255;\n}"
  },
  {
    "path": "include/xloil/Log.h",
    "content": "#pragma once\n\n// TODO: slim down this header!\n\n#ifdef XLOIL_NO_SPDLOG\n\n#define XLO_TRACE(...) \n#define XLO_DEBUG(...) \n#define XLO_INFO(...) \n#define XLO_WARN(...) \n#define XLO_ERROR(...) \n\n#else\n\n#include <xloil/ExportMacro.h>\n#include <string>\n\n#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE\n\n#define SPDLOG_WCHAR_FILENAMES\n#define SPDLOG_WCHAR_TO_UTF8_SUPPORT\n#include <xlOil/WindowsSlim.h>\n#include <spdlog/spdlog.h> \n\n\n#define XLO_TRACE(...) {if (spdlog::default_logger_raw()->should_log(spdlog::level::trace)) SPDLOG_TRACE(__VA_ARGS__);}\n#define XLO_DEBUG(...) SPDLOG_DEBUG(__VA_ARGS__)\n#define XLO_INFO(...) SPDLOG_INFO(__VA_ARGS__)\n#define XLO_WARN(...) SPDLOG_WARN(__VA_ARGS__)\n#define XLO_ERROR(...) SPDLOG_ERROR(__VA_ARGS__)\n\nnamespace xloil\n{\n  /// <summary>\n  /// Create an initialise a spdlog logger.\n  /// <param name=\"debugLevel\">\n  ///   If set to a spdlog level other than \"off\", a sink which writes to `OutputDebugString`\n  ///   is created with the given log level and added to the logger's sinks\n  /// </param>\n  /// <param name=\"makeDefault\">\n  ///   Make this logger the default logger, which can be accessed with `spdlog::default_logger()`\n  /// </param>\n  /// </summary>\n  std::shared_ptr<spdlog::logger> \n    loggerInitialise(const std::string_view& debugLevel, bool makeDefault = true);\n\n  /// <summary>\n  /// Sets the log level at which the logger's sinks should be flushed (written to disk for\n  /// file based sinks).\n  /// </summary>\n  void loggerSetFlush(\n    const std::shared_ptr<spdlog::logger>& logger,\n    const std::string_view& flushLevel);\n\n  /// <summary>\n  /// Adds a logger sink which pops up a log window when log messages exceed a certain\n  /// threshold (which defaults to \"warn\") \n  /// </summary>\n  void loggerAddPopupWindowSink(const std::shared_ptr<spdlog::logger>& logger);\n\n  /// <summary>\n  /// Add a rotating file sink to the logger, returning the name of the file\n  /// which was created.  This may be different to the requested file if that\n  /// file cannot be opened.\n  /// </summary>\n  std::wstring loggerAddRotatingFileSink(\n    const std::shared_ptr<spdlog::logger>& logger,\n    const std::wstring_view& logFilePath, const char* logLevel,\n    size_t maxFileSizeKb, size_t numFiles = 1);\n\n  /// <summary>\n  /// Gets the logger registry for the core dll so plugins can output to the same\n  /// log file\n  /// </summary>\n  XLOIL_EXPORT spdlog::details::registry& loggerRegistry();\n}\n\n#endif"
  },
  {
    "path": "include/xloil/LogWindow.h",
    "content": "#pragma once\n#include <xloil/State.h>\n#include <string>\n#include <memory>\n#include <functional>\n\n#ifndef _WINDOWS_\n#include <basetsd.h>\n#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name\nDECLARE_HANDLE(HWND);\nDECLARE_HANDLE(HINSTANCE);\nDECLARE_HANDLE(HMENU);\n\n#ifndef CALLBACK\n#define CALLBACK __stdcall\n#endif\n\ntypedef UINT_PTR WPARAM;\ntypedef LONG_PTR LPARAM;\ntypedef LONG_PTR LRESULT;\ntypedef LRESULT(CALLBACK* WNDPROC)(HWND, unsigned int, WPARAM, LPARAM);\n#endif\n\nnamespace xloil\n{\n  class ILogWindow\n  {\n  public:\n    virtual void openWindow() noexcept = 0;\n    virtual void appendMessage(std::wstring&& msg) noexcept = 0;\n  };\n\n  std::shared_ptr<ILogWindow> createLogWindow(\n    HWND parentWindow, // can be zero\n    HINSTANCE parentInstance,\n    const wchar_t* winTitle,\n    HMENU menuBar,\n    WNDPROC menuHandler,\n    size_t historySize) noexcept;\n\n  /// <summary>\n  /// Called from the XLL initialisation code to report errors before the\n  /// main logger has started.  Must be called on main thread - should be\n  /// the case since is is called from AutoOpen.\n  /// </summary>\n  void loadFailureLogWindow(HINSTANCE parent, const std::wstring_view& msg, bool openWindow);\n}\n"
  },
  {
    "path": "include/xloil/NumericTypeConverters.h",
    "content": "#pragma once\n#include <xlOil/TypeConverters.h>\n#include <xlOil/PString.h>\n\nnamespace xloil\n{\n  namespace conv\n  {\n    template<class TValue, class TResult> struct ExcelValToType {};\n\n    template<class TResult>\n    struct ExcelValToType<double, TResult> : public ExcelValVisitor<TResult>\n    {\n      using result_t = TResult;\n      using base = ExcelValVisitor<TResult>;\n      using base::operator();\n\n      result_t operator()(int x) const { return double(x); }\n      result_t operator()(bool x) const { return double(x); }\n      result_t operator()(double x) const { return x; }\n      result_t operator()(CellError err) const\n      {\n        using namespace msxll;\n        if (0 != ((int)err & (xlerrNull | xlerrDiv0 | xlerrNum | xlerrNA)))\n          return std::numeric_limits<double>::quiet_NaN();\n        return base::operator()(err);\n      }\n    };\n\n    template<class TResult>\n    struct ExcelValToType<int, TResult> : public ExcelValVisitor<TResult>\n    {\n      using result_t = TResult;\n      using base = ExcelValVisitor<TResult>;\n      using base::operator();\n\n      result_t operator()(int x) const { return x; }\n      result_t operator()(bool x) const { return int(x); }\n      result_t operator()(double x) const\n      {\n        int i;\n        if (floatingToInt(x, i))\n          return i;\n        return base::operator()(x);\n      }\n    };\n\n    /// Converts to bool using Excel's standard coercions for numeric types (x != 0)\n    template<class TResult>\n    struct ExcelValToType<bool, TResult> : public ExcelValVisitor<TResult>\n    {\n      using result_t = TResult;\n      using ExcelValVisitor<TResult>::operator();\n      result_t operator()(int x) const { return x != 0; }\n      result_t operator()(bool x) const { return x; }\n      result_t operator()(double x) const { return x != 0.0; }\n    };\n\n    template<>\n    struct ExcelValToType<std::wstring_view, std::wstring_view>\n      : public ExcelValVisitor<std::wstring_view>\n    {\n      using result_t = std::wstring_view;\n      using ExcelValVisitor<std::wstring_view>::operator();\n      result_t operator()(PStringRef str) const { return str; }\n    };\n\n    namespace detail\n    {\n      // Need this indirection layer as we can't partially specialise\n      // an alias, i.e. a `using` declaration.\n      template<class T>\n      struct ExcelValToTypeSpecialisation { using type = ExcelValToType<T, T>; };\n      template<class T>\n      struct ExcelValToTypeSpecialisation<std::optional<T>> { using type = ExcelValToType<T, std::optional<T>>; };\n    }\n\n    template<class T> using ToType = \n      typename detail::ExcelValToTypeSpecialisation<T>::type;\n  }\n}"
  },
  {
    "path": "include/xloil/ObjectCache.h",
    "content": "#pragma once\n#include <xloil/ExcelObj.h>\n#include <xloil/PString.h>\n#include <xloil/Events.h>\n#include <xloil/Caller.h>\n#include <xloil/Throw.h>\n#include <unordered_map>\n#include <string_view>\n#include <mutex>\n\nnamespace xloil\n{\n  template<class T>\n  struct CacheUniquifier\n  {\n    CacheUniquifier()\n    {\n      static wchar_t chr = L'\\xC38';\n      value = chr++;\n    }\n    wchar_t value;\n  };\n\n  namespace detail\n  {\n    template<uint16_t NPadding>\n    inline auto writeCacheId(\n      const CallerInfo& caller, const std::wstring_view& optionalName)\n    {\n      constexpr auto addressStyle = AddressStyle::RC | AddressStyle::NOQUOTE;\n      const auto nameLength = optionalName.size();\n      const auto pstrLength = \n        caller.addressLength(addressStyle)\n        + optionalName.size() \n        + NPadding + 1u; // Padding for the \",XX\" at the end and 1 for the uniquifier\n      PString pascalStr((uint16_t)pstrLength);\n      auto* buf = pascalStr.pstr() + 1;\n\n      int nWritten = 1; // Leave space for uniquifier\n\n      nWritten += caller.writeAddress(buf, pstrLength - 1, addressStyle);\n      // Check for a negative return condition from the above. This should not\n      // be possible as we made the buffer larger than the addres length\n      assert(nWritten - 1 > 0 && nWritten <= caller.addressLength(addressStyle) + 1);\n\n      if (nameLength != 0)\n        wmemcpy_s(buf + nWritten - 1, pstrLength - nWritten, optionalName.data(), nameLength);\n\n      // Fix up length\n      pascalStr.resize(uint16_t(nWritten + nameLength + NPadding));\n\n      return pascalStr;\n    }\n\n    // We need to explicitly define our own lookup function for undordered_map\n    // to use string_view objects without copying.  In std::map the find function \n    // is templated on the key type so we're just replicating that behaviour.\n    template<class Val>\n    struct Lookup : public std::unordered_map<std::wstring, Val>\n    {\n      using base = typename std::unordered_map<std::wstring, Val>;\n\n      template <class T>\n      _NODISCARD typename base::const_iterator search(const T& _Keyval) const\n      {\n        size_type _Bucket = std::hash<T>()(_Keyval) & _Mask;\n        for (auto _Where = begin(_Bucket); _Where != end(_Bucket); ++_Where)\n          if (_Where->first == _Keyval)\n            return _Where;\n        return (end());\n      }\n      template <class T>\n      _NODISCARD typename base::iterator search(const T& _Keyval)\n      {\n        size_type _Bucket = std::hash<T>()(_Keyval) & _Mask;\n        for (auto _Where = begin(_Bucket); _Where != end(_Bucket); ++_Where)\n          if (_Where->first == _Keyval)\n            return _Where;\n        return (end());\n      }\n    };\n\n    template<typename TObj>\n    class CellCache\n    {\n    private:\n      size_t _calcId;\n      std::vector<TObj> _objects;\n      TObj _obj;\n\n    public:\n      CellCache(TObj&& obj, size_t calcId)\n        : _calcId(calcId)\n        , _obj(std::move(obj))\n      {}\n\n      auto count() const { return (uint16_t)(_objects.size() + 1); }\n\n      auto add(TObj&& obj, size_t calcId)\n      {\n        if (_calcId != calcId)\n        {\n          std::swap(_obj, obj);\n          _calcId = calcId;\n          _objects.clear();\n        }\n        else\n          _objects.emplace_back(std::forward<TObj>(obj));\n        return _objects.size();\n      }\n\n      const TObj* fetch(size_t i) const\n      {\n        if (i == 0)\n          return &_obj;\n        else if (i <= _objects.size())\n          return &_objects[i - 1];\n        else\n          return nullptr;\n      }\n    };\n  }\n\n  /// <summary>\n  /// Creates a dictionary of TObj indexed by cell address.\n  /// The cell address used is determined from the currently executing cell\n  /// when the \"add\" method is called.\n  /// \n  /// This class is used to allow data which we cannot or do not want to write\n  /// to an Excel sheet to be passed between Excel user functions.\n  /// \n  /// The cache add a single character uniquifier TUniquifier to returned \n  /// reference strings. This allows very fast rejection of invalid references\n  /// during lookup. The uniquifier should be choosen to be unlikely to occur \n  /// at the start of a string before a '['.\n  /// \n  /// Example\n  /// -------\n  /// <code>\n  /// static ObjectCache<PyObject*>, L'&', false> theCache\n  ///     = ObjectCache<PyObject*>, L'&', false > ();\n  /// \n  /// ExcelObj refStr = theCache.add(new PyObject());\n  /// PyObject* obj = theCache.fetch(refStr);\n  /// </code>\n  /// </summary>\n  template<class TObj, class TUniquifier>\n  class ObjectCache\n  {\n  private:\n    typedef ObjectCache<TObj, TUniquifier> self;\n    typedef detail::CellCache<TObj> CellCache;\n\n    detail::Lookup<CellCache> _cache;\n    mutable std::mutex _cacheLock;\n\n    size_t _calcId;\n\n    std::shared_ptr<const void> _calcEndHandler;\n    std::shared_ptr<const void> _workbookCloseHandler;\n\n    void onAfterCalculate()\n    {\n      // Called by Excel event so will always be synchonised\n      ++_calcId; // Wraps at MAX_UINT - but this doesn't matter\n    }\n\n    /// <summary>\n    /// Used to append cell count to end of reference\n    /// </summary>\n    static constexpr uint8_t PADDING = 2;\n\n    TUniquifier _uniquifier;\n\n    ObjectCache()\n      : _calcId(1)\n    {}\n\n  public:\n    static auto create(bool reapOnWorkbookClose = true)\n    {\n      auto p = std::shared_ptr<ObjectCache>(new ObjectCache);\n      p->_calcEndHandler =\n        xloil::Event::AfterCalculate().weakBind(std::weak_ptr<ObjectCache>(p), &self::onAfterCalculate);\n\n      if (reapOnWorkbookClose)\n        p->_workbookCloseHandler =\n        xloil::Event::WorkbookAfterClose().weakBind(std::weak_ptr<ObjectCache>(p), &self::onWorkbookClose);\n\n      return p;\n    }\n\n    const TObj* fetch(const std::wstring_view& key) const\n    {\n      if (key.size() < PADDING) return nullptr;\n\n      const auto iResult = readCount(key[key.size() - 1]);\n      const auto cacheKey = key.substr(0, key.size() - PADDING);\n\n      std::scoped_lock lock(_cacheLock);\n      const auto found = _cache.search(cacheKey);\n\n      return found == _cache.end()\n        ? nullptr\n        : found->second.fetch(iResult);\n    }\n\n    ExcelObj add(\n      TObj&& obj,\n      const CallerInfo& caller = CallerInfo(),\n      const std::wstring_view& name = std::wstring_view())\n    {\n      auto fullKey = detail::writeCacheId<PADDING>(caller, name);\n      return _add(std::move(obj), std::move(fullKey));\n    }\n\n    ExcelObj add(\n      TObj&& obj,\n      const std::wstring_view& key)\n    {\n      PString fullKey((uint16_t)key.size() + PADDING + 2u);\n      std::copy(key.cbegin(), key.cend(), fullKey.begin() + 2u);\n      return _add(std::move(obj), std::move(fullKey));\n    }\n\n    /// <summary>\n    /// Remove the given cache reference and any associated objects. This\n    /// should only be called with manually specifed cache reference strings.\n    /// Note the counter (,NNN) after the cache reference is ignored if \n    /// specifed and all matching objects are removed.\n    /// </summary>\n    /// <param name=\"key\">cache reference to remove</param>\n    /// <returns>true if removal succeeded, otherwise false</returns>\n    bool erase(const std::wstring_view& key)\n    {\n      auto cacheKey = key.substr(0, key.length() - PADDING);\n\n      std::scoped_lock lock(_cacheLock);\n      auto found = _cache.search(cacheKey);\n      if (found == _cache.end())\n        return false;\n      _cache.erase(found);\n      return true;\n    }\n\n    void onWorkbookClose(const wchar_t* wbName)\n    {\n      // Called by Excel Event so will always be synchonised\n      const auto len = wcslen(wbName);\n      auto i = _cache.begin();\n      while (i != _cache.end())\n      {\n        // Key looks like UNIQ[WbName]BlahBlah, so skip 2 chars and check for match\n        if (wcsncmp(wbName, i->first.c_str() + 2, len) == 0)\n          i = _cache.erase(i);\n        else\n          ++i;\n      }\n    }\n\n    auto begin() const\n    {\n      return _cache.cbegin();\n    }\n\n    auto end() const\n    {\n      return _cache.cend();\n    }\n\n    std::wstring writeKey(\n      const std::wstring_view& cacheKey,\n      uint16_t count) const\n    {\n      std::wstring key;\n      key.resize(cacheKey.length() + PADDING);\n      key = cacheKey;\n      writeCount(key.data() + cacheKey.length(), count);\n      return key;\n    }\n\n    bool valid(const std::wstring_view& cacheString)\n    {\n      return cacheString.size() > 4\n        && cacheString[0] == _uniquifier.value\n        && cacheString[1] == L'['\n        && cacheString[cacheString.length() - PADDING] == L',';\n    }\n\n  private:\n    ExcelObj _add(\n      TObj&& obj,\n      PString&& fullKey)\n    {\n      fullKey[0] = _uniquifier.value;\n      // In most cases the second char is already '[' unless the caller is \n      // not a worksheet function or a custom cache string is used\n      fullKey[1] = L'[';\n\n      auto cacheKey = fullKey.view(0, fullKey.length() - PADDING);\n\n      decltype(_cache)::iterator found;\n\n      uint16_t iPos = 0;\n      {\n        std::scoped_lock lock(_cacheLock);\n\n        found = _cache.search(cacheKey);\n        if (found == _cache.end())\n        {\n          found = _cache.emplace(\n            std::pair(\n              std::wstring(cacheKey),\n              CellCache(std::forward<TObj>(obj), _calcId))).first;\n        }\n        else\n        {\n          iPos = (uint16_t)found->second.add(\n            std::forward<TObj>(obj), _calcId);\n        }\n      }\n\n      writeCount(fullKey.end() - PADDING, iPos);\n\n      return ExcelObj(std::move(fullKey));\n    }\n\n    size_t readCount(wchar_t count) const\n    {\n      return (size_t)(count - 65);\n    }\n\n    /// Add cell object count in form \",X\"\n    void writeCount(wchar_t* key, uint16_t iPos) const\n    {\n      static_assert(PADDING == 2);\n      key[0] = L',';\n      // An offset of 65 means we start with 'A'\n      key[1] = (wchar_t)(iPos + 65);\n    }\n  };\n\n  template<typename T>\n  struct ObjectCacheFactory\n  {\n    using cache_type = decltype(*ObjectCache<T, CacheUniquifier<T>>::create());\n    static cache_type& cache() {\n      static auto theInstance = ObjectCache<T, CacheUniquifier<T>>::create();\n      return *theInstance;\n    }\n  };\n\n  /// <summary>\n  /// Constructs an object of type <typeparamref name=\"T\"/> and adds\n  /// it to a cache of identically typed objects. Returns the key\n  /// string as an <see cref=\"ExcelObj\"/>.  Essentially a wrapper\n  /// around <code><![CDATA[cache.add(make_unique<T>(...))]]></code>.\n  /// The cache is automatically constructed if it doesn't already\n  /// exist.\n  /// </summary>\n  template<typename T, typename... Args>\n  inline auto makeCached(Args&&... args)\n  {\n    return ObjectCacheFactory<std::unique_ptr<const T>>::cache().add(\n      std::make_unique<T>(std::forward<Args>(args)...));\n  }\n\n  // TODO: consider abrogated caching where simple types are just returned un-cached\n  template<typename T>\n  inline auto addCached(\n    const T* ptr,\n    const std::wstring_view& name = std::wstring_view())\n  {\n    return ObjectCacheFactory<std::unique_ptr<const T>>::cache().add(\n      std::unique_ptr<const T>(ptr), CallerInfo(), name);\n  }\n\n  /// <summary>\n  /// Retrieves an object of type <typeparamref name=\"T\"/> given its key.\n  /// Returns nullptr if not found.\n  /// </summary>\n  template<typename T>\n  inline const T* getCached(const std::wstring_view& key)\n  {\n    if (!ObjectCacheFactory<std::unique_ptr<const T>>::cache().valid(key))\n      return nullptr;\n\n    const auto* found = ObjectCacheFactory<std::unique_ptr<const T>>::cache().fetch(key);\n    return found ? found->get() : nullptr;\n  }\n}"
  },
  {
    "path": "include/xloil/PString.h",
    "content": "#pragma once\n#include <xloil/StringUtils.h>\n#include <string>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Searches backward for the specified char returning a pointer\n  /// to its last occurence or null if not found. Essentialy it is\n  /// wmemchr backwards.\n  /// </summary>\n  inline const wchar_t*\n    wmemrchr(const wchar_t* ptr, wchar_t wc, size_t num)\n  {\n    for (; num; --ptr, --num)\n      if (*ptr == wc)\n        return ptr;\n    return nullptr;\n  }\n\n  template<class T>\n  struct PStringAllocator\n  {\n    constexpr T* allocate(size_t n)\n    {\n      return new T[n];\n    }\n    constexpr void deallocate(T* p, size_t /*n*/)\n    {\n      delete[] p;\n    }\n  };\n\n  template <class TChar = wchar_t, class TAlloc = PStringAllocator<TChar>> class BasicPString;\n  template <class TChar = wchar_t> class BasicPStringRef;\n\n  /// <summary>\n  /// PString (length-counted string) of wide-char, owns data, behaves a \n  /// bit like `std::wstring`\n  /// </summary>\n  using PString    = BasicPString<wchar_t>;\n  /// <summary>\n  /// A non-owning reference to the data underlying a <see cref=\"PString\"\\>\n  /// </summary>\n  using PStringRef = BasicPStringRef<const wchar_t>;\n\n  namespace detail\n  {\n    template<class T> struct StringTraits {};\n\n\n    template <class TChar = wchar_t>\n    class PStringImpl\n    {\n    public:\n      using size_type = std::remove_const_t<TChar>;\n      using char_type = std::remove_const_t<TChar>;\n      using value_type = typename TChar;\n      using const_value_type = const std::remove_const_t<value_type>;\n\n      /// <summary>\n      /// An invalid position index used to indicate \"not-found\", exactly\n      /// as per `std::string::npos`.\n      /// </summary>\n      static constexpr size_type npos = size_type(-1);\n      static constexpr size_t max_length = npos - 1;\n      using traits = std::char_traits<char_type>;\n\n      /// <summary>\n      /// Returns true if the string is empty\n      /// </summary>\n      bool empty() const { return !_data || _data[0] == 0; }\n\n      /// <summary>\n      /// Returns the length of the string. The length is limited by\n      /// sizeof(TChar).\n      /// </summary>\n      size_type length() const { return _data ? _data[0] : 0; }\n\n      /// <summary>\n      /// Returns a pointer to the start of the string data similar to \n      /// string::c_str, however, the string data is not guaranteed to be\n      /// null-terminated.\n      /// </summary>\n      const_value_type* pstr() const { return _data + 1; }\n      value_type* pstr() { return _data + 1; }\n\n      /// <summary>\n      /// Returns an iterator (really a pointer) to the beginning of the \n      /// string data.\n      /// </summary>\n      const_value_type* begin() const { return _data + 1; }\n      value_type* begin() { return _data + 1; }\n\n      /// <summary>\n      /// Returns an iterator (really a pointer) to the end of the \n      /// string data (just past the last character).\n      /// </summary>\n      const_value_type* end() const { return _data + 1 + length(); }\n      value_type* end() { return _data + 1 + length(); }\n\n      /// <summary>\n      /// Copy the contents of another Pascal string into this one. Throws\n      /// if the existing buffer is too short.\n      /// </summary>\n      PStringImpl& operator=(const PStringImpl& that)\n      {\n        if (this != &that)\n          writeOrThrow(that);\n        return *this;\n      }\n\n      /// <summary>\n      /// Writes the given null-terminated string into the buffer, raising an error\n      /// if the buffer is too short.\n      /// </summary>\n      template <class T>\n      PStringImpl& operator=(T str)\n      {\n        writeOrThrow(std::basic_string_view<char_type>(\n          detail::StringTraits<T>::data(str),\n          detail::StringTraits<T>::length(str)));\n        return *this;\n      }\n\n      template <class T>\n      bool operator==(T that) const\n      {\n        return view() == that;\n      }\n\n      template <class T>\n      bool operator!=(const T& that)\n      {\n        return !(*this == that);\n      }\n\n      char_type& operator[](const size_type i)\n      {\n        return _data[i + 1];\n      }\n      char_type operator[](const size_type i) const\n      {\n        return _data[i + 1];\n      }\n\n      operator std::basic_string_view<char_type>() const\n      {\n        return view();\n      }\n\n      /// <summary>\n      /// Overwrites <paramref name=\"len\"/> chars from given string into the buffer,  \n      /// starting at <paramref name=\"start\"/>. Returns true if successful or false\n      /// if the internal buffer is too short.\n      /// </summary>\n      bool replace(size_type start, std::basic_string_view<char_type> str)\n      {\n        if (start + str.length() > length())\n          return false;\n        if (str.length() > 0)\n          traits::copy(_data + 1 + start, str.data(), str.length());\n        return true;\n      }\n\n      /// <summary>\n      /// Overwrites <paramref name=\"len\"/> chars from given string into the buffer,  \n      /// starting at the beginning. Returns true if successful or false if the\n      /// internal buffer is too short.\n      /// </summary>\n      bool replace(std::basic_string_view<char_type> str)\n      {\n        return replace(0, str);\n      }\n\n      /// <summary>\n      /// Returns an STL string representation of the pascal string. This\n      /// copies the string data.\n      /// </summary>\n      std::basic_string<char_type> string() const\n      {\n        return std::basic_string<char_type>(pstr(), pstr() + length());\n      }\n\n      /// <summary>\n      /// Searches forward for the specified char returning its the offset\n      /// of its first occurence or npos if not found.\n      /// </summary>\n      size_type find(char_type needle, size_type pos = 0) const\n      {\n        auto p = traits::find(pstr() + pos, length(), needle);\n        return p ? (size_type)(p - pstr()) : npos;\n      }\n\n      /// <summary>\n      /// Searches backward for the specified char returning its the offset\n      /// of its last occurence or npos if not found.\n      /// </summary>\n      size_type rfind(char_type needle, size_type pos = npos) const\n      {\n        auto p = wmemrchr(\n          pstr() + (pos == npos ? length() : pos),\n          needle,\n          length() - (pos == npos ? 0 : pos));\n        return p ? (size_type)(p - pstr()) : npos;\n      }\n\n      /// <summary>\n      /// Returns a STL string_view of the string data or, optionally,\n      /// a substring of it.\n      /// </summary>\n      std::basic_string_view<char_type> view(size_type from = 0, size_type count = npos) const\n      {\n        return std::basic_string_view<char_type>(\n          pstr() + from, count != npos ? count : length() - from);\n      }\n\n      static char_type bound(size_t len)\n      {\n        return (char_type)(max_length < len ? max_length : len);\n      }\n\n      /// <summary>\n      /// Like strtok but for PString. Just like strtok the source string is modified.\n      /// Returns an empty BasicPStringRef when there are no more tokens.\n      /// </summary>\n      /// <param name=\"delims\"></param>\n      /// <returns></returns>\n      BasicPStringRef<char_type> strtok(const char_type* delims);\n\n    protected:\n      TChar* _data;\n\n      PStringImpl(TChar* data)\n        : _data(data)\n      {}\n\n      void writeOrThrow(std::basic_string_view<char_type> str)\n      {\n        if (!replace(str))\n          throw std::out_of_range(\n            formatStr(\"PString buffer too short: %u required, %u available\",\n              str.length(), length()));\n        _data[0] = (char_type)str.length();\n      }\n\n      void overwrite(const char_type* source, const size_type len)\n      {\n        traits::copy(_data + 1, source, len);\n      }\n    };\n\n  } // namespace detail\n\n  /// <summary>\n  /// A Pascal string is a length-counted, rather than null-terminated string\n  /// The first character in the string buffer contains its length, and the \n  /// remaining characters contain the content. This type of string is used in\n  /// by Excel in its xloper (ExcelObj type in xlOil). PString helps to handle\n  /// these Pascal strings by behaving somewhat like `std::string`, however it \n  /// is not recommended to use this type for generic string manipuation.\n  ///  \n  /// PString owns its data buffer, <see cref=\"BasicPStringRef\"/> does not.\n  /// </summary>\n  template <class TChar, class TAlloc>\n  class BasicPString : public detail::PStringImpl<TChar>\n  {\n  private:\n    TAlloc _alloc;\n\n   \n  public:\n    using base = detail::PStringImpl<TChar>;\n    using base::size_type;\n    using allocator_type = TAlloc;\n    using base::_data;\n\n    friend BasicPStringRef<TChar>;\n\n    /// <summary>\n    /// Create a PString of the specified length\n    /// </summary>\n    explicit BasicPString(size_type len = 0, TAlloc allocator = TAlloc())\n      : base(len == 0\n        ? nullptr\n        : allocator.allocate((unsigned)len + 1))\n      , _alloc(allocator)\n    {\n      if (len > 0)\n        _data[0] = len;\n    }\n\n    /// <summary>\n    /// Construct from an STL string_view\n    /// </summary>\n    /// <param name=\"str\"></param>\n    /// <param name=\"allocator\">Optional allocator instance</param>\n    explicit BasicPString(const std::basic_string_view<TChar>& str, TAlloc allocator = TAlloc())\n      : BasicPString((TChar)str.length(), allocator)\n    {\n      overwrite(str.data(), (TChar)str.length());\n    }\n\n    /// <summary>\n    /// Construct from C-string \n    /// </summary>\n    /// <param name=\"str\">C-string, must be null terminated</param>\n    /// <param name=\"allocator\">Optional allocator instance</param>\n    BasicPString(const TChar* str, TAlloc allocator = TAlloc())\n      : BasicPString((TChar)traits::length(str), allocator)\n    {\n      overwrite(str, length());\n    }\n\n    /// <summary>\n    /// Construct from string literal\n    /// </summary>\n    /// <param name=\"str\"></param>\n    /// <param name=\"allocator\">Optional allocator instance</param>\n    template<size_t N>\n    BasicPString(const TChar(*str)[N], TAlloc allocator = TAlloc())\n      : BasicPString((TChar)N, allocator)\n    {\n      overwrite(str, (TChar)N);\n    }\n\n    /// <summary>\n    /// Construct from another PString or PStringRef\n    /// </summary>\n    /// <param name=\"that\"></param>\n    /// <param name=\"allocator\">Optional allocator instance</param>\n    BasicPString(const base& that, TAlloc allocator = TAlloc())\n      : PString(that.length(), allocator)\n    {\n      traits::copy(_data + 1, that.pstr(), length());\n    }\n\n    /// <summary>\n    /// Move constructor\n    /// </summary>\n    /// <param name=\"that\"></param>\n    BasicPString(BasicPString&& that)\n      : PStringImpl(nullptr)\n      , _alloc(that._alloc)\n    {\n      std::swap(_data, that._data);\n    }\n\n    ~BasicPString()\n    {\n      _alloc.deallocate(_data, length() + (size_type)1);\n    }\n\n    operator PStringImpl<TChar>() const\n    {\n      return BasicPStringRef<TChar>(this->_data);\n    }\n\n    operator PStringImpl<TChar>()\n    {\n      return BasicPStringRef<TChar>(this->_data);\n    }\n\n    /// <summary>\n    /// Take ownership of a Pascal string buffer, constructed externally, ideally\n    /// with the same allocator\n    /// </summary>\n    static auto steal(TChar* data, TAlloc allocator = TAlloc())\n    {\n      return BasicPString(data, allocator);\n    }\n\n    BasicPString& operator=(BasicPString&& that)\n    {\n      _alloc.deallocate(_data, length() + 1);\n      _data = nullptr;\n      std::swap(_data, that._data);\n      _alloc = that._alloc;\n      return *this;\n    }\n\n    /// <summary>\n    /// Writes the given null-terminated string into the buffer, raising an error\n    /// if the buffer is too short.\n    /// </summary>\n    BasicPString& operator=(const TChar* str)\n    {\n      const auto len = bound(traits::length(str));\n      resize(len);\n      overwrite(str, len);\n      return *this;\n    }\n    /// <summary>\n    /// Writes the given string_view into the buffer, raising an error\n    /// if the buffer is too short.\n    /// </summary>\n    BasicPString& operator=(const std::basic_string_view<TChar>& str)\n    {\n      const auto len = bound(str.length());\n      resize(len);\n      overwrite(str.data(), len);\n      return *this;\n    }\n\n    using base::operator=;\n\n    /// <summary>\n    /// Returns a pointer to the buffer containing the string and\n    /// relinquishes ownership.\n    /// </summary>\n    TChar* release()\n    {\n      TChar* d = nullptr;\n      std::swap(d, _data);\n      return d;\n    }\n\n    /// <summary>\n    /// Resize the string buffer to the specified length. Increasing\n    /// the length forces a string copy.\n    /// </summary>\n    void resize(size_type sz)\n    {\n      if (sz <= length())\n      {\n        if (_data)\n          _data[0] = sz;\n      }\n      else\n      {\n        PString copy(sz);\n        if (_data)\n          traits::copy(copy._data + 1, _data, sz);\n        *this = std::move(copy);\n      }\n    }\n  private:\n    explicit BasicPString(TChar* data, TAlloc allocator = TAlloc())\n      : base(data)\n      , _alloc(allocator)\n    {}\n  };\n\n  /// <summary>\n  /// A view (i.e. non-owning) of a Pascal string, see the discussion in \n  /// <see cref=\"PString\"/> for background on Pascal strings\n  /// \n  /// This class cannot view a sub-string of a Pascal string, but \n  /// calling the <see cref=\"BasicPStringRef::view\"/> method returns\n  /// a std::string_view class which can.\n  /// </summary>\n  template <class TChar>\n  class BasicPStringRef: public detail::PStringImpl<TChar>\n  {\n  public:\n    using base = detail::PStringImpl<TChar>;\n    using size_type = typename base::size_type;\n    using char_type = typename base::char_type;\n\n    /// <summary>\n    /// Constructs a view of an existing Pascal string given its\n    /// full data buffer (including the length count).\n    /// </summary>\n    explicit BasicPStringRef(TChar* data = nullptr)\n      : base(data)\n    {}\n\n    /// <summary>\n    /// Construct from a PString\n    /// </summary>\n    /// <param name=\"str\"></param>\n    BasicPStringRef(BasicPString<char_type>& str)\n      : base(str._data)\n    {}\n\n    BasicPStringRef& operator=(const BasicPStringRef& that)\n    {\n      if (!_data)\n        _data = that._data;\n      else\n        *(PStringImpl*)(this) = that;\n\n      return *this;\n    }\n\n    /// <summary>\n    /// Returns a pointer to the raw pascal string buffer.  Use with caution\n    /// to ensure buffer lifetime is managed correctly\n    /// </summary>\n    auto data() const { return _data; }\n\n    /// <summary>\n    /// Resize the string buffer to the specified length. Increasing\n    /// the length throws an error\n    /// </summary>\n    void resize(size_type sz)\n    {\n      if (sz <= length())\n        _data[0] = sz;\n      else\n        throw std::out_of_range(\"Cannot increase size of PStringRef\");\n    }\n\n    auto remove_const()\n    {\n      return BasicPStringRef<char_type>(const_cast<char_type*>(_data));\n    }\n  };\n\n  template <class TChar>\n  BasicPStringRef<typename detail::PStringImpl<TChar>::char_type> \n    detail::PStringImpl<TChar>::strtok(\n      const typename detail::PStringImpl<TChar>::char_type* delims)\n  {\n    const auto nDelims = traits::length(delims);\n\n    // If a previous PString is passed in, we will have tokenised the string\n    // into [n]token[m]remaining, so the end() iterator should point to [m].\n    // Otherwise we start with our own _data buffer.\n    auto* p = _data;\n    if (!p)\n      return BasicPStringRef();\n\n    // First character is length\n    const auto stringLen = *p++;\n    const auto pEnd = p + stringLen;\n\n    // p points to the first char in the string, step until we are not\n    // pointing at a delimiter. If we hit the end of the string, there\n    // are no more tokens, so return a null PString.\n    while (traits::find(delims, nDelims, *p))\n      if (++p == pEnd)\n        return BasicPStringRef();\n\n    // p now points the first non-delimiter, the start of our token\n    auto* token = p;\n\n    // Find the next delimiter\n    while (p < pEnd && !traits::find(delims, nDelims, *p)) ++p;\n    const auto tokenLen = (TChar)(p - token);\n\n    // We know token[-1] must point to a delimiter or a length count,\n    // so it is safe to overwrite with the token length\n    token[-1] = tokenLen;\n\n    // If there still more string, overwrite p (which points to a delimiter)\n    // with the remaining length for subsequent calls to strtok.\n    if (p < pEnd)\n    {\n      *p = (TChar)(pEnd - p - 1);\n      _data = p;\n    }\n    else\n      _data = nullptr;\n    return BasicPStringRef(token - 1);\n  }\n  namespace detail\n  {\n    template <class TChar>\n    BasicPString<TChar> copyRight(const TChar* that, size_t len, const PStringImpl<TChar>& right)\n    {\n      auto* data = BasicPString<TChar>(right.bound(right.length() + len)).release();\n      std::char_traits<TChar>::copy(data + 1, that, len);\n      std::char_traits<TChar>::copy(data + 1 + len, right.pstr(), right.length());\n      return BasicPString<TChar>::steal(data);\n    }\n    template<class T> struct StringTraits<std::basic_string_view<T>>\n    {\n      static const T* data(const std::basic_string_view<T>& str) {\n        return str.data();\n      }\n      static size_t length(const std::basic_string_view<T>& str) {\n        return str.length();\n      }\n    };\n    template<class T> struct StringTraits<std::basic_string<T>>\n    {\n      static const T* data(const std::basic_string<T>& str) {\n        return str.c_str();\n      }\n      static size_t length(const std::basic_string<T>& str) {\n        return str.length();\n      }\n    };\n    template<class T> struct StringTraits<T*>\n    {\n      static const T* data(const T* str) {\n        return str;\n      }\n      static size_t length(const T* str) {\n        return std::char_traits<T>::length(str);\n      }\n    };\n    template<class T, size_t N> struct StringTraits<T(*)[N]>\n    {\n      static const T* data(const T(*str)[N]) {\n        return str;\n      }\n      static size_t length(const T(*str)[N]) {\n        return N;\n      }\n    };\n    template<class T> struct StringTraits<BasicPStringRef<T>>\n    {\n      static const T* data(const PStringImpl<T>& str) {\n        return str.pstr();\n      }\n      static size_t length(const PStringImpl<T>& str) {\n        return str.length();\n      }\n    };\n    template<class T> struct StringTraits<BasicPString<T>>\n    {\n      static const T* data(const PStringImpl<T>& str) {\n        return str.pstr();\n      }\n      static size_t length(const PStringImpl<T>& str) {\n        return str.length();\n      }\n    };\n  }\n\n  template <class TChar, class TRight>\n  inline BasicPString<TChar> operator+(const detail::PStringImpl<TChar>& left, TRight right)\n  {\n    const auto* r = detail::StringTraits<TRight>::data(right);\n    const auto len = detail::StringTraits<TRight>::length(right);\n    auto* data = BasicPString<TChar>(left.bound(left.length() + len)).release();\n    std::char_traits<TChar>::copy(data + 1, left.pstr(), left.length());\n    std::char_traits<TChar>::copy(data + 1 + left.length(), r, len);\n    return BasicPString<TChar>::steal(data);\n  }\n\n  template <class TChar>\n  inline BasicPString<TChar> operator+(const TChar* left, const detail::PStringImpl<TChar>& right)\n  {\n    return detail::copyRight(left, std::char_traits<TChar>::length(left), right);\n  }\n\n  template<class TChar, class _Traits, class _Alloc>\n  inline std::basic_string<TChar, _Traits, _Alloc> operator+(\n    const std::basic_string<TChar, _Traits, _Alloc>& left,\n    const detail::PStringImpl<TChar>& right)\n  {\n    std::basic_string<TChar, _Traits, _Alloc> result;\n    result.reserve(left.size() + right.length());\n    result += left;\n    result.append(right.begin(), right.end());\n    return result;\n  }\n}"
  },
  {
    "path": "include/xloil/Plugin.h",
    "content": "#pragma once\n#include <xlOil/Interface.h>\n#include <xlOil/Log.h>\n#include <xlOil/Throw.h>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Links a plug-in's *spdlog* instance to the main xlOil log output. \n  /// You don't have to do this if you're organising your own logging.\n  /// </summary>\n  /// <param name=\"\"></param>\n  /// <param name=\"plugin\"></param>\n  inline void linkPluginToCoreLogger(AddinContext*, const PluginContext& plugin)\n  {\n    if (plugin.action == PluginContext::Load)\n      spdlog::set_default_logger(loggerRegistry().default_logger());\n  }\n  /// <summary>\n  /// Throws if the version of xlOil used to build the plugin does not exactly match\n  /// the one loading it. Plugins could apply more sophisticated logic based on API \n  /// changes, but calling this is a safe default.\n  /// </summary>\n  /// <param name=\"ctx\"></param>\n  inline void throwIfNotExactVersion(const PluginContext& ctx)\n  {\n    if (ctx.action == PluginContext::Load && !ctx.checkExactVersion())\n      XLO_THROW(L\"Plugin '{}' expected xlOil {}.{}.{} but was loaded by {}.{}.{}\",\n        ctx.pluginName, XLOIL_MAJOR_VERSION, XLOIL_MINOR_VERSION, XLOIL_PATCH_VERSION,\n        ctx.coreMajorVersion, ctx.coreMinorVersion, ctx.corePatchVersion);\n  }\n}"
  },
  {
    "path": "include/xloil/Preprocessor.h",
    "content": "#pragma once\n#include <boost/preprocessor/repeat_from_to.hpp>\n#include <boost/preprocessor/arithmetic.hpp>\n#include <boost/preprocessor/repetition/enum_shifted_params.hpp>\n#include <boost/preprocessor/tuple/elem.hpp>\n#include <boost/preprocessor/cat.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include <xloil/Version.h>\n\nnamespace xloil { class ExcelObj; }\n\n/// <summary>  \n/// https://stackoverflow.com/questions/5134523\n/// </summary>\n#define XLO_EXPAND( x ) x\n\n/// <summary>  \n/// Stringifies the given argument to a wide string literal\n/// </summary>\n#define XLO_WSTR(s) BOOST_PP_CAT(L,BOOST_PP_CAT(BOOST_PP_EMPTY(),BOOST_PP_STRINGIZE(s)))\n\n/// <summary>\n/// Stringifies the given argument to a narrow string literal\n/// </summary>\n#define XLO_STR(s) BOOST_PP_STRINGIZE(s)\n\n/// <summary>\n/// Use in a function declaration to declare <code>const ExcelObj&amp;</code> arguments \n/// named prefix1, prefix2, ..., prefixN\n/// </summary>\n#define XLO_DECLARE_ARGS(N, prefix) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ADD(N,1), const ::xloil::ExcelObj& prefix)\n\n/// <summary>\n/// Returns a comma-separated list of argument addresses: &amp;prefix1, &amp;prefix2, ..., &amp;prefixN.\n/// Useful to create an array of function arguments.\n/// </summary>\n#define XLO_ARG_PTRS(N, prefix) BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_PP_ADD(N,1), &prefix)\n\n/// <summary>\n/// Returns a list of argument values and their names for use with <see cref=\"xloil::ProcessArgs\"/>.\n/// </summary>\n#define XLO_ARGS_LIST(N, prefix) BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_ADD(1, N), XLO_ARGS_LIST_IMPL, prefix)\n#define XLO_ARGS_LIST_IMPL(z, N, prefix) BOOST_PP_COMMA_IF(BOOST_PP_SUB(N, 1)) prefix##N, XLO_WSTR(BOOST_PP_CAT(prefix,N))\n\n/// <summary>\n/// Writes repeated arg descriptors in the form `.arg(prefixN, help)`\n/// </summary>\n#define XLO_WRITE_ARG_HELP(N, prefix, help) \\\n  BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_ADD(1, N), XLO_WRITE_ARG_HELP_I, (prefix, help))\n#define XLO_WRITE_ARG_HELP_I(z, N, data) .arg(XLO_WSTR(BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(0, data),N)), BOOST_PP_TUPLE_ELEM(1, data))\n\n/// <summary>\n/// As <see cref=\"XLO_ARG_PTRS\"/>, but runs <see cref=\"xloil::objectCacheExpand\"/> on each argument.\n/// Useful to create an array of function arguments.\n/// </summary>\n#define XLO_CACHE_ARG_PTRS_I(z, N, data) &::xloil::objectCacheExpand(BOOST_PP_CAT(data ## N)) BOOST_PP_COMMA_IF(N)\n#define XLO_CACHE_ARG_PTRS(N, prefix) BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_ADD(1, N), XLO_CACHE_ARG_PTRS_I, prefix)\n\n#define _XLOIL_VERSION_STR (XLOIL_MAJOR_VERSION)(.)(XLOIL_MINOR_VERSION)(.)(XLOIL_PATCH_VERSION)\n#define XLOIL_VERSION_STR XLO_WSTR(BOOST_PP_SEQ_CAT(_XLOIL_VERSION_STR))\n\nnamespace xloil\n{\n  class ExcelObj;\n\n  /// <summary>\n  /// Iterates over a number of ExcelObj arguments, applying a function to each.\n  /// Best illustrated with an example:\n  /// \n  /// <example>\n  ///   ProcessArgs([&str](auto iArg, auto argVal, auto argName)\n  ///   {\n  ///      str += wstring(argName) + \": \" + argVal.toString() + \"\\n\";\n  ///   }, XLO_ARGS_LIST(8, arg));\n  /// </example>\n  /// \n  /// ProcessArgs will accept lambdas which do not contain the <code>Arg</code>\n  /// or <code>argName</code> arguments.\n  ///  \n  /// </summary>\n  template<int N = 0, class TFunc, class... Args>\n  auto ProcessArgs(TFunc func, const ExcelObj& argVal, const wchar_t* argName, Args&&...args)\n    -> decltype(func(N, argVal, argName))\n  {\n    func(N, argVal, argName);\n    ProcessArgs<N + 1>(func, args...);\n  }\n  template<int N, class TFunc>\n  auto ProcessArgs(TFunc func, const ExcelObj& argVal, const wchar_t* argName)\n    -> decltype(func(N, argVal, argName))\n  {\n    func(N, argVal, argName);\n  }\n\n  template<class TFunc, class... Args>\n  auto ProcessArgs(TFunc func, const ExcelObj& argVal, const wchar_t* argName, Args&&... args)\n    -> decltype(func(argVal, argName))\n  {\n    func(argVal, argName);\n    ProcessArgs(func, args...);\n  }\n\n  template<class TFunc>\n  auto ProcessArgs(TFunc func, const ExcelObj& argVal, const wchar_t* argName)\n    -> decltype(func(argVal, argName))\n  {\n    func(argVal, argName);\n  }\n\n  template<class TFunc, class... Args>\n  auto ProcessArgs(TFunc func, const ExcelObj& argVal, const wchar_t* /*argName*/, Args&&... args)\n    -> decltype(func(argVal))\n  {\n    func(argVal);\n    ProcessArgs(func, args...);\n  }\n\n  template<class TFunc>\n  auto ProcessArgs(TFunc func, const ExcelObj& argVal, const wchar_t* /*argName*/)\n    -> decltype(func(argVal))\n  {\n    func(argVal);\n  }\n}\n"
  },
  {
    "path": "include/xloil/Range.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include <xlOil/EnumHelper.h>\n\nnamespace Excel { struct Range; }\n\nnamespace xloil\n{\n  /// <summary>\n  /// A Range holds refers to part of an Excel sheet. It can use either the\n  /// XLL or COM interfaces to interact with Excel. Range can only be used by\n  /// macro-enabled functions or event call-backs.\n  /// \n  /// Currently only single area ranges are supported\n  /// </summary>\n  class Range\n  {\n  public:\n    using row_t = ExcelObj::row_t;\n    using col_t = ExcelObj::col_t;\n\n    static constexpr int TO_END = INT_MAX;\n    virtual ~Range() {}\n\n    /// <summary>\n    /// Gives a subrange relative to the current range.  Similar to Excel's function, \n    /// we do not insist the sub-range is a subset, so fromRow can be negative or toRow \n    /// can be past the end of the referenced range. Unlike VBA / COM, the indices are zero-based\n    /// Omitting toRow or fromRow or passing the special value TO_END goes to the end of the \n    /// parent range.\n    /// </summary>\n    /// <param name=\"fromRow\"></param>\n    /// <param name=\"fromCol\"></param>\n    /// <param name=\"toRow\"></param>\n    /// <param name=\"toCol\"></param>\n    /// <returns></returns>\n    virtual std::unique_ptr<Range> range(\n      int fromRow, int fromCol,\n      int toRow = TO_END, int toCol = TO_END) const = 0;\n\n    /// <summary>\n    /// Returns a 1x1 subrange containing the specified cell. Uses zero-based\n    /// indexing unlike Excel's VBA Range.Cells function.\n    /// </summary>\n    std::unique_ptr<Range> cell(int i, int j) const\n    {\n      return range(i, j, i, j);\n    }\n\n    /// <summary>\n    /// Returns a sub-range by trimming to the last non-empty (not Nil, \\#N/A or \"\") \n    /// row and column. The top-left remains the same so the function always returns\n    /// at least a single cell, even if it's empty.  \n    /// </summary>\n    virtual std::unique_ptr<Range> trim() const = 0;\n\n    /// <summary>\n    /// Returns a tuple (num columns, num rows)\n    /// </summary>\n    virtual std::tuple<row_t, col_t> shape() const = 0;\n    \n    /// <summary>\n    /// Returns a zero-based tuple (top-left-row, top-left-col, bottom-right-row, bottom-right-col)\n    /// which defines the Range area (currently only rectangular ranges are supported).\n    /// </summary>\n    virtual std::tuple<row_t, col_t, row_t, col_t> bounds() const = 0;\n\n    virtual size_t nAreas() const = 0;\n\n    /// <summary>\n    /// Returns the number of rows in the range\n    /// </summary>\n    row_t nRows() const\n    {\n      return std::get<0>(shape());\n    }\n\n    /// <summary>\n    /// Returns the number of columns in the range\n    /// </summary>\n    col_t nCols() const\n    {\n      return std::get<1>(shape());\n    }\n\n    /// <summary>\n    /// Returns the number of cells in the range (i.e width x height)\n    /// </summary>\n    size_t size() const\n    {\n      size_t nRows; size_t nCols;\n      std::tie(nRows, nCols) = shape();\n      return nRows * nCols;\n    }\n\n    /// <summary>\n    /// Returns the address of the range in the form *[Book]SheetNm!A1:Z5*. The sheet\n    /// name may be surrounded by single quote characters if it contains or space or\n    /// satifies various other conditions.\n    /// If *local* is set to true, the workbook and sheet name are omitted.\n    /// </summary>\n    virtual std::wstring address(AddressStyle style = AddressStyle::A1) const = 0;\n\n    /// <summary>\n    /// Converts the referenced range to an ExcelObj. References to single\n    /// cells return an ExcelObj of the appropriate type. Multicell references\n    /// return an array.\n    /// </summary>\n    virtual ExcelObj value() const = 0;\n    \n    /// <summary>\n    /// Convenience wrapper for cell(i,j)->value()\n    /// </summary>\n    virtual ExcelObj value(row_t i, col_t j) const = 0;\n\n    /// <summary>\n    /// Convience wrapper for value(i, j). Note writing to the returned value \n    /// does not set values in the range. \n    /// </summary>\n    ExcelObj operator()(int i, int j) const\n    {\n      return value(i, j);\n    }\n\n    /// <summary>\n    /// Sets the cell values in the range to the provided value.  If `value` is \n    /// a single value, every cell will be set to that value.\n    /// </summary>\n    virtual void set(const ExcelObj& value) = 0;\n\n    /// <summary>\n    /// If the cell contains a constant, this property returns the value.  If the\n    /// cell is empty, this property returns an empty string. If the cell contains\n    /// a formula, the property returns the formula that would be displayed in the \n    /// formula bar as a string. If the range is larger than one cell, the property\n    /// returns an array of the values which would be obtained calling `formula` \n    /// on each cell.\n    /// </summary>\n    /// <returns></returns>\n    virtual ExcelObj formula() const = 0;\n\n    /// <summary>\n    /// Returns True if every cell in the range contains a formula, False if no cell\n    /// contains a formula and no value otherwise.\n    /// </summary>\n    virtual std::optional<bool> hasFormula() const = 0;\n\n    Range& operator=(const ExcelObj& value)\n    {\n      set(value);\n      return *this;\n    }\n\n    /// <summary>\n    /// Clears / empties all cells referred to by this ExcelRange.\n    /// </summary>\n    virtual void clear() = 0;\n\n    /// <summary>\n    /// Returns a pointer to the the underlying Excel API Range object\n    /// if this Range is based on one, otherwise returns null.\n    /// </summary>\n    virtual Excel::Range* asComPtr() const = 0;\n  };\n}"
  },
  {
    "path": "include/xloil/Register.h",
    "content": "#pragma once\n#include <xloil/ExportMacro.h>\n#include <functional>\n#include <string_view>\n#include <string>\n#include <vector>\n\nnamespace xloil { class ExcelObj; }\n\nnamespace xloil\n{\n  class ExcelObj;\n\n  /// <summary>\n  /// Holds the description of an Excel function argument\n  /// </summary>\n  struct FuncArg\n  {\n    enum ArgType\n    {\n      Obj         = 1 << 0,\n      Range       = 1 << 1,\n      Array       = 1 << 2,\n      AsyncHandle = 1 << 3,\n      ReturnVal   = 1 << 4,\n      Optional    = 1 << 5 /// Just affects the auto generated help string\n    };\n\n    FuncArg(\n      std::wstring_view argName = std::wstring_view(),\n      std::wstring_view argHelp = std::wstring_view(),\n      const int argType = Obj)\n      : name(argName)\n      , help(argHelp)\n      , type(argType)\n    {}\n    /// <summary>\n    /// The name of the argument shown in the function wizard.\n    /// </summary>\n    std::wstring name;\n    /// <summary>\n    /// An optional help string for the argument displayed in the function wizard.\n    /// </summary>\n    std::wstring help;\n\n    int type;\n\n    bool operator==(const FuncArg& that) const\n    {\n      return name == that.name && help == that.help && type == that.type;\n    }\n  };\n\n  struct FuncInfo\n  {\n    /// <summary>\n    /// Options which affect how the function is declared in Excel\n    /// </summary>\n    enum FuncOpts\n    {\n      /// <summary>\n      /// The function is re-entrant and may be called ny of Excel's\n      /// worker threads simultaneously\n      /// </summary>\n      THREAD_SAFE = 1 << 0,\n      /// <summary>\n      /// Gives the function special priviledges to read and write data \n      /// to the sheet\n      /// </summary>\n      MACRO_TYPE  = 1 << 1,\n      /// <summary>\n      /// Marks the function for recalculation on every calc cycle\n      /// </summary>\n      VOLATILE    = 1 << 2,\n      /// <summary>\n      /// Declares that the function is a command and has no return type\n      /// </summary>\n      COMMAND     = 1 << 3,\n      /// <summary>\n      /// Stops the function appearing in the function wizard or autocomplete\n      /// </summary>\n      HIDDEN      = 1 << 4,\n      /// <summary>\n      /// Marks the function as returning an `FPArray*` (FP12 struct)\n      /// </summary>\n      ARRAY       = 1 << 5\n    };\n\n    XLOIL_EXPORT virtual ~FuncInfo();\n    XLOIL_EXPORT bool operator==(const FuncInfo& that) const;\n    bool operator!=(const FuncInfo& that) const { return !(*this == that); }\n\n    /// <summary>\n    /// The name of the function which will be used in worksheet (and VBA) calls.\n    /// </summary>\n    std::wstring name;\n\n    /// <summary>\n    /// An optional help string which appears in the function wizard.\n    /// </summary>\n    std::wstring help;\n\n    /// <summary>\n    /// An optional category group which determiines where the function appears in\n    /// the funcion wizard.\n    /// </summary>\n    std::wstring category;\n    \n    /// <summary>\n    /// Array of function arguments in the order you expect them to be passed\n    /// Excel does not support named keyword arguments, but a <see cref=\"ExcelDict\"/>\n    /// can be used to give this behaviour. Can be empty.\n    /// </summary>\n    std::vector<FuncArg> args;\n\n    // TODO: make me an Enum, apparently that's OK in modern c++\n    unsigned options;\n\n    /// <summary>\n    /// Returns the number of function arguments \n    /// </summary>\n    size_t numArgs() const { return args.size(); }\n\n    XLOIL_EXPORT bool isValid() const;\n  };\n\n  template<class TRet = ExcelObj*> using DynamicExcelFunc\n    = std::function<TRet(const FuncInfo& info, const ExcelObj**)>;\n}\n\n/// <summary>\n/// If your DLL registers static functions, you must call this macro to setup\n/// the callback to free any returned ExcelObj. The function needs to be defined\n/// per DLL containing functions, rather than once for the registering XLL.\n/// A pragma ensures the function is exported undecorated in x86 and x64\n/// </summary>\n#define XLO_DEFINE_FREE_CALLBACK() \\\n  extern \"C\" void __stdcall xlAutoFree12(::xloil::ExcelObj* pxFree) { \\\n    __pragma(comment(linker, \"/EXPORT:\" __FUNCTION__\"=\" __FUNCDNAME__)) \\\n    try { \\\n      delete pxFree; \\\n    } catch (...) { } \\\n  }\n"
  },
  {
    "path": "include/xloil/RtdServer.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include <xlOil/ExportMacro.h>\n#include <memory>\n#include <future>\n\nnamespace xloil\n{\n  /// <summary>\n  /// An instance of this interface will be passed to an RtdTask.\n  /// The <see cref=\"RtdTask\"/> should indicate new data with publish.\n  /// </summary>\n  struct IRtdPublish\n  {\n    /// <summary>\n    /// Passes a value to underlying Rtd server, which will trigger an\n    /// update in Excel.\n    /// </summary>\n    /// <param name=\"\"></param>\n    virtual bool publish(ExcelObj&& value) noexcept = 0;\n  };\n\n  /// <summary>\n  /// An IRtdTask is a `std::packaged_task`-like object which can start and stop \n  /// a background publishing task.  It returns results through a\n  /// <see cref=\"IRtdPublish\"/> rather than directly.  \n  /// \n  /// If awaiting multiple futures and cancellation were supported in the STL's\n  /// async library, this interface could be factored out.\n  /// </summary>\n  struct IRtdTask\n  {\n    virtual ~IRtdTask() {}\n\n    /// <summary>\n    /// Start task, writing updates to the giver publisher\n    /// </summary>\n    /// <param name=\"\"></param>\n    virtual void start(IRtdPublish&) = 0;\n\n    /// <summary>\n    /// Return true if all child tasks have been cleanly shut down and this object\n    /// can be destroyed\n    /// </summary>\n    /// <returns></returns>\n    virtual bool done() noexcept = 0;\n\n    /// <summary>\n    /// Wait for pending completion of child tasks\n    /// </summary>\n    virtual void wait() = 0;\n\n    /// <summary>\n    /// Request publication ceases and child tasks be shut down\n    /// </summary>\n    virtual void cancel() = 0;\n  };\n\n  /// <summary>\n  /// Associates a topic string with a publishing task (typically a \n  /// <see cref=\"IRtdTask\"/>) and manages publication of results via\n  /// <see cref=\"IRtdServer::publish\"/>. This interface does not extend\n  /// <see cref=\"IRtdPublish\"/>, which publishes the actual values, rather\n  /// it defines the management of the task in the context of the RTD Server.\n  /// </summary>\n  struct IRtdPublisher\n  {\n    /// <summary>\n    /// Called when a worksheet function subscribes to the topic.\n    /// </summary>\n    /// <param name=\"numSubscribers\">current number of subscibers (including this one)</param>\n    virtual void connect(size_t numSubscribers) = 0;\n\n    /// <summary>\n    /// Called when a worksheet function unsubscribes to the topic. e.g. because\n    /// a formula has been changed or deleted.\n    /// </summary>\n    /// <param name=\"numSubscribers\"></param>\n    /// <returns>return true if you want the RtdServer to destroy this topic</returns>\n    virtual bool disconnect(size_t numSubscribers) = 0;\n\n    /// <summary>\n    /// Called by the RtdServer to tell the topic to stop all child workers\n    /// </summary>\n    virtual void stop() = 0;\n\n    /// <summary>\n    /// Return true if all child workers have cleanly shutdown and the object\n    /// can be destroyed\n    /// </summary>\n    /// <returns></returns>\n    virtual bool done() const = 0;\n\n    /// <summary>\n    /// The name of the topic\n    /// </summary>\n    /// <returns></returns>\n    virtual const wchar_t* topic() const noexcept = 0;\n  };\n;\n\n  /// <summary>\n  /// An IRtdAsyncTask packages a job for a worksheet functions which uses \n  /// RTD support to allow background execution. The function which initiates\n  /// the job will be called by Excel again to collect the result. Since the \n  /// worksheet function is stateless it cannot tell if it should start a new \n  /// task or collect a result. Hence the task object must support the '==' \n  /// operator so xlOil can  compare the task to be started to any that have \n  /// pending results for the calling cell.  This comparison carries some \n  /// overhead, so the RTD async mechanism should only be used when this \n  /// overhead is small relative to the function execution time.\n  /// </summary>\n  struct IRtdAsyncTask : public IRtdTask\n  {\n    virtual bool operator==(const IRtdAsyncTask& that) const = 0;\n  };\n\n  /// <summary>\n  /// Extends <see cref=\"IRtdPublish\"/> to provide a cancellation token. C++\n  /// does not currently support cancellable futures, so cancellation is \n  /// usually via periodic checking of a bool.\n  /// </summary>\n  struct RtdNotifier\n  {\n    RtdNotifier(\n      IRtdPublish& publisher,\n      const std::atomic<bool>& cancelFlag)\n      : _publisher(publisher)\n      , _cancel(cancelFlag)\n    {}\n\n    /// <summary>\n    /// This flag should be periodically checked to ensure cancellation is \n    /// responsive. If it is true, the producer should immediately shut down\n    /// </summary>\n    /// <returns></returns>\n    bool cancelled() const\n    {\n      return _cancel;\n    }\n\n    bool publish(ExcelObj&& value) const noexcept\n    {\n      return _cancel \n        ? false \n        : _publisher.publish(std::forward<ExcelObj>(value));\n    }\n\n  private:\n    IRtdPublish& _publisher;\n    const std::atomic<bool>& _cancel;\n  };\n\n\n  namespace detail\n  {\n    /// <summary>\n    /// Concrete implemenation of <see cref=\"IRtdTask\"/> which implements the\n    /// interface using a <code>std::future<void></code>.\n    /// </summary>\n    template <class TBase>\n    class RtdTaskBase : public TBase\n    {\n    public:\n      virtual std::future<void> operator()(RtdNotifier notify) = 0;\n\n      virtual void start(IRtdPublish& n) override\n      {\n        // The producer may be stopped and restarted, so wait for any prior\n        // future to exit\n        wait();\n        _cancel = false;\n        _future = (*this)(RtdNotifier(n, _cancel));\n      }\n      bool done() noexcept override\n      {\n        // The offical way to check readiness is \n        // _future.wait_for(std::chrono::seconds(0)) == std::future_status::ready\n        // But the clearly much more efficient _future._Is_ready seems to have appeared.\n        return !_future.valid() || _future._Is_ready();\n      }\n      void wait() override\n      {\n        if (_future.valid())\n          _future.wait();\n      }\n      void cancel() noexcept override\n      {\n        _cancel = true;\n      }\n\n    private:\n      std::future<void> _future;\n      std::atomic<bool> _cancel = false;\n    };\n  }\n  /// <summary>\n  /// Wraps a <code>std::function</code> to make an IRtdTask. The function \n  /// should take an RtdNotifier and return a <code>std::future<void> </code>.\n  /// The future is just a synchronisation object - returned values should be\n  /// published through the RtdNotifier. The cancel flag in the notifier should be\n  /// periodically checked.\n  /// </summary>\n  class RtdTask : public detail::RtdTaskBase<IRtdTask>\n  {\n  public:\n    using Prototype = std::function<std::future<void>(RtdNotifier)>;\n\n    RtdTask(const Prototype& func)\n     : _func(func)\n    {}\n\n    std::future<void> operator()(RtdNotifier notify) override\n    {\n      return _func(notify);\n    }\n\n  private:\n    Prototype _func;\n  };\n\n  /// <summary>\n  /// A base class for Rtd async tasks. \n  /// </summary>\n  struct RtdAsyncTask : public detail::RtdTaskBase<IRtdAsyncTask>\n  {};\n\n  class IRtdServer;\n\n  /// <summary>\n  /// Concrete implementation of <see cref=\"IRtdPublisher\"/> which can be overriden to \n  /// hook the virtual methods. \n  /// </summary>\n  class XLOIL_EXPORT RtdPublisher : public IRtdPublisher, public IRtdPublish\n  {\n  public:\n    RtdPublisher(\n      const wchar_t* topic,\n      IRtdServer& mgr,\n      const std::shared_ptr<IRtdTask>& task);\n    virtual ~RtdPublisher();\n    virtual void connect(size_t numSubscribers) override;\n    virtual bool disconnect(size_t numSubscribers) override;\n    virtual void stop() noexcept override;\n    virtual bool done() const noexcept override;\n    virtual const wchar_t* topic() const noexcept override;\n    virtual bool publish(ExcelObj&& value) noexcept override;\n    const std::shared_ptr<IRtdTask>& task() const { return _task; }\n\n  protected:\n    std::shared_ptr<IRtdTask> _task;\n    IRtdServer& _mgr;\n    std::wstring _topic;\n  };\n  \n\n  /// <summary>\n  /// An IRtdServer is a wrapper around an RTD COM Server. An RTD Server is a\n  /// producer/consumer queue which can trigger recalculations in cells marked\n  /// marked as RTD subscribers (consumers).  Excel will recalculate the entire\n  /// cell containing a subscriber, it cannot distinguish between multiple \n  /// functions in a single cell.  \n  /// \n  /// An RTD producer can be started anywhere including in another cell, or \n  /// even the same cell as the consumer. The latter allows execution of \n  /// functions asynchronously without the drawback of Excel's asynchronous \n  /// UDF support, which is that async functions are cancelled if the user \n  /// interacts with the sheet.\n  /// \n  /// RTD producers and subscribers find each other using a topic string. The\n  /// producer and subscribers can be registered in either order.\n  /// </summary>\n  class IRtdServer\n  {\n  public:\n    /// <summary>\n    /// Starts a producer/publisher embedded in an <see cref=\"IRtdPublisher\"/>\n    /// </summary>\n    /// <param name=\"publisher\">\n    /// </param>\n    virtual void start(\n      const std::shared_ptr<IRtdPublisher>& publisher) = 0;\n\n    /// <summary>\n    /// Convenience function which wraps a given `std::function` object in a \n    /// <see cref=\"IRtdPublisher\"/>, then calls <see cref=\"IRtdServer::start\"/>\n    /// </summary>\n    /// \n    /// <param name=\"topic\"> Topic name to be associated with the output of the \n    ///   function\n    /// </param>\n    /// <param name=\"func\"> The function must have a specific form, see \n    ///   <see cref=\"RtdTask\"/> for details\n    /// </param>\n    void start(\n      const wchar_t* topic,\n      const RtdTask::Prototype& func)\n    {\n      start(\n        std::make_shared<RtdPublisher>(\n          topic, *this, std::make_shared<RtdTask>(func)));\n    }\n    /// <summary>\n    /// Subscribes to a the specified topic. If no publisher for the topic\n    /// currently exists, the subscription will be held open pending\n    /// one being created. This calls Excel's RTD function, which means the\n    /// calling cell will be recalculated every time a new value is published.\n    /// \n    /// Calling this method when not in a worksheet function invoked by Excel\n    /// is undefined behaviour.\n    /// </summary>\n    /// <param name=\"topic\"></param>\n    /// <returns>The ExcelObj currently being published by the publisher\n    ///   or an empty ptr if no publisher exists.\n    /// </returns>\n    virtual std::shared_ptr<const ExcelObj> \n      subscribe(\n        const wchar_t* topic) = 0;\n\n    /// <summary>\n    /// This calls Excel's RTD function, which means the\n    /// calling cell will be recalculated every time a new value is published.\n    /// \n    /// Does not return a value. Just subscribes to updates\n    /// </summary>\n    /// <param name=\"topic\"></param>\n    virtual void\n      subscribeOnly(\n        const wchar_t* topic) = 0;\n\n    /// <summary>/// Looks up a value for a specified topic, but does not subscribe.\n    /// If there is no publisher for the topic, the returned pointer will\n    /// be null. If there is no published value, it will point to N/A.\n    /// This does not call Excel's RTD function.\n    /// </summary>\n    /// <param name=\"topic\"></param>\n    /// <returns></returns>\n    virtual std::shared_ptr<const ExcelObj>\n      peek(\n        const wchar_t* topic) = 0;\n\n    /// <summary>\n    /// Force publication of the specified value by the producer of the \n    /// given topic. If it is actively publishing values, the producer \n    /// will override this setting at the next update.\n    /// </summary>\n    /// <param name=\"topic\"></param>\n    /// <param name=\"value\"></param>\n    /// <returns>True if the producer was found and the value was set</returns>\n    virtual bool \n      publish(\n        const wchar_t* topic,\n        ExcelObj&& value = ExcelObj(std::clock())) = 0;\n\n\n    /// <summary>\n    /// Drops the producer for a topic by calling RtdPublisher::stop, then waits\n    /// for it to complete and publishes # N/A to all subscribers.\n    /// </summary>\n    virtual bool \n      drop(const wchar_t* topic) = 0;\n\n    /// <summary>\n    /// Drop all topics, stop their tasks and wait for completion\n    /// </summary>\n    virtual void \n      clear() = 0;\n\n    /// <summary>\n    /// Get the ProgId associated with the underlying COM server\n    /// </summary>\n    /// <returns></returns>\n    virtual const wchar_t* progId() const noexcept = 0;\n\n    /// <summary>\n    /// Initiates a connect as if Excel has requested the topic.  Will \n    /// conflict if Excel uses the topicID.  Used only for testing and \n    /// nefarious purposes in xlOil_Python\n    /// </summary>\n    virtual void testConnect(long topicId, const std::wstring_view& topicName) = 0;\n\n    /// <summary>\n    /// Initiates a disconnect, see testConnect\n    /// </summary>\n    virtual void testDisconnect(long topicId) = 0;\n  };\n\n  /// <summary>\n  /// Can be called from a worksheet function to run the given task asynchronously \n  /// in the context of Excel using the RTD machinery. This function does not \n  /// ensure the task will be run on another thread or process - the task must \n  /// ensure it does not blocking the calling thread.\n  /// \n  /// Passing a null ptr causes a null ptr to be returned. The useful side-effect\n  /// is that it initialises the RTD server. Otherwise the server will be started\n  /// on-demand in the calc cycle.\n  /// </summary>\n  XLOIL_EXPORT std::shared_ptr<ExcelObj> rtdAsync(\n    const std::shared_ptr<IRtdAsyncTask>& task);\n\n  void rtdAsyncServerClear();\n\n  /// <summary>\n  /// Creates a new Rtd Manager.  Optionally wraps the an Excel::IRtdServer COM\n  /// object specified with progId and clsid. The necessary registry keys to\n  /// access this COM object will be created if required.\n  /// </summary>\n  XLOIL_EXPORT std::shared_ptr<IRtdServer>\n    newRtdServer(\n      const wchar_t* progId = nullptr,\n      const wchar_t* clsid = nullptr);\n}"
  },
  {
    "path": "include/xloil/State.h",
    "content": "#pragma once\n#include <xlOil/ExportMacro.h>\n\nnamespace xloil\n{\n  namespace Environment\n  {\n    /// <summary>\n    /// The HINSTANCE for the xlOil Core DLL, as passed into DllMain\n    /// If xlOil is statically linked, the core is the DLL or XLL which \n    /// linked it.\n    /// </summary>\n    XLOIL_EXPORT void* coreModuleHandle() noexcept;\n\n    /// <summary>\n    /// Path to the xlOil Core DLL, including the DLL name.\n    /// If xlOil is statically linked, the core is the DLL or XLL which \n    /// linked it.\n    /// </summary>\n    XLOIL_EXPORT const wchar_t* coreDllPath() noexcept;\n\n    /// <summary>\n    /// Name of the xlOil Core DLL including the extension.\n    /// If xlOil is statically linked, the core is the DLL or XLL which \n    /// linked it.\n    /// </summary>\n    XLOIL_EXPORT const wchar_t* coreDllName() noexcept;\n\n    struct ExcelProcessInfo\n    {\n      ExcelProcessInfo();\n\n      /// <summary>\n      /// The Excel major version number\n      /// </summary>\n      int version;\n      /// <summary>\n      /// The Windows API process instance handle, castable to HINSTANCE\n      /// </summary>\n      void* hInstance;\n      /// <summary>\n      /// The Windows API handle for the top level Excel window \n      /// castable to type HWND\n      /// </summary>\n      long long hWnd;\n      /// <summary>\n      /// Thread Id of Excel's main thread\n      /// </summary>\n      size_t mainThreadId;\n      /// <summary>\n      /// Checks for dynamic array support\n      /// </summary>\n      bool supportsDynamicArrays;\n\n      bool isEmbedded() const { return mainThreadId != 0; }\n    };\n\n    /// <summary>\n    /// Returns Excel application state information such as the version number,\n    /// HINSTANCE, window handle and thread ID.\n    /// </summary>\n    XLOIL_EXPORT const ExcelProcessInfo& excelProcess() noexcept;\n\n    /// <summary>\n    /// Internal usage\n    /// </summary>\n    void setCoreHandle(void* coreHInstance);\n    /// <summary>\n    /// Internal usage\n    /// </summary>\n    XLOIL_EXPORT void initAppContext();\n    /// <summary>\n    /// Internal usage\n    /// </summary>\n    void registerIntellisense(const wchar_t* xllPath);\n  }\n}"
  },
  {
    "path": "include/xloil/StaticRegister.h",
    "content": "#pragma once\n#include <xlOil/Register.h>\n#include <xlOil/ExcelObj.h>\n#include <xlOil/FuncSpec.h>\n#include <array>\n\nnamespace xloil {\n  class WorksheetFuncSpec; \n  class RegisteredWorksheetFunc; \n  class FPArray; \n  class RangeArg; \n  struct AsyncHandle;\n}\n\n// In XLO_FUNC_START a separate declaration is needed to the function implementation\n// to work around this quite serious MSVC compiler bug:\n// https://stackoverflow.com/questions/45590594/generic-lambda-in-extern-c-function\n\n\n/// <summary>\n/// Marks the start of an function registered in Excel. This declares an extern 'C'\n/// DLL-exported function, so the function name must be unique as namespaces are ignored.\n/// </summary>\n#define XLO_FUNC_START(func) \\\n  XLO_ENTRY_POINT(XLOIL_XLOPER*) func; \\\n  XLOIL_XLOPER* __stdcall func \\\n  { \\\n    try \n\n#ifdef XLO_RETURN_COM_ERROR\n#define XLO_FUNC_END(func) \\\n    XLO_RETURN_COM_ERROR \\\n    catch (const ::std::exception& err) \\\n    { \\\n      return ::xloil::returnValue(err); \\\n    } \\\n    catch (...) \\\n    { \\\n      return ::xloil::returnValue(::xloil::CellError::Value); \\\n    } \\\n  } \\\n  extern auto _xloil_register_##func = XLO_REGISTER_LATER(func)\n#else\n#define XLO_FUNC_END(func) \\\n    catch (const ::std::exception& err) \\\n    { \\\n      return ::xloil::returnValue(err); \\\n    } \\\n    catch (...) \\\n    { \\\n      return ::xloil::returnValue(::xloil::CellError::Value); \\\n    } \\\n  } \\\n  XLO_STATIC_REGISTER(func)\n#endif // XLO_RETURN_COM_ERROR\n\n\n#define XLO_REGISTER_LATER(func) ::xloil::detail::registrationMemo(#func, func)\n\n#define XLO_STATIC_REGISTER(func) \\\n  extern auto _xloil_register_##func = ::xloil::detail::registrationMemo(#func, func)\n\nnamespace xloil\n{\n  /// <summary>\n  /// Constructs an ExcelObj from the given arguments, setting a flag to tell \n  /// Excel that xlOil will need a callback to free the memory. **This method must\n  /// be used for final object passed back to Excel. It must not be used anywhere\n  /// else**.\n  /// </summary>\n  template<class... Args>\n  inline ExcelObj* returnValue(Args&&... args)\n  {\n    return (new ExcelObj(std::forward<Args>(args)...))->setDllFreeFlag();\n  }\n  inline ExcelObj* returnValue(CellError err)\n  {\n    return const_cast<ExcelObj*>(&Const::Error(err));\n  }\n  inline ExcelObj* returnValue(const std::exception& e)\n  {\n    return returnValue(e.what());\n  }\n  inline ExcelObj* returnValue(ExcelObj* p)\n  {\n    return p;\n  }\n  inline ExcelObj* returnReference(const ExcelObj& obj)\n  {\n    return const_cast<ExcelObj*>(&obj);\n  }\n  inline ExcelObj* returnReference(ExcelObj& obj)\n  {\n    return &obj;\n  }\n  namespace detail\n  {\n    struct FuncInfoBuilderBase\n    {\n      FuncInfoBuilderBase(size_t nArgs, const int* types);\n      template<int N> \n      FuncInfoBuilderBase(const std::array<int, N>& types)\n        : FuncInfoBuilderBase(N, types.data())\n      {}\n\n      std::shared_ptr<FuncInfo> getInfo();\n\n    protected:\n      std::shared_ptr<FuncInfo> _info;\n      size_t _iArg;\n    };\n  }\n\n  template<class TSuper>\n  struct FuncInfoBuilderT : public detail::FuncInfoBuilderBase\n  {\n    using self = TSuper;\n    using detail::FuncInfoBuilderBase::FuncInfoBuilderBase;\n\n    /// <summary>\n    /// Sets the name for the function registration\n    /// </summary>\n    /// <param name=\"txt\"></param>\n    template<class T> self& name(T txt)\n    {\n      _info->name = txt;\n      return cast();\n    }\n    /// <summary>\n    /// Sets the function wizard help (max 255 chars)\n    /// </summary>\n    /// <param name=\"txt\"></param>\n    template<class T> self& help(T txt)\n    {\n      _info->help = txt;\n      return cast();\n    }\n    /// <summary>\n    /// Sets the category the function will be placed under in the wizard\n    /// </summary>\n    /// <param name=\"txt\"></param>\n    template<class T> self& category(T txt)\n    {\n      _info->category = txt;\n      return cast();\n    }\n    /// <summary>\n    /// Sets the name and optionally help for the next parameter and\n    /// marks the arg as optional. This just effects the auto generated\n    /// help string\n    /// </summary>\n    self& optArg(const wchar_t* name, const wchar_t* help = nullptr)\n    {\n      return optArg(_iArg++, name, help);\n    }\n    /// <summary>\n    /// Sets the name and optionally help for the next parameter, incrementing\n    /// the internal counter\n    /// </summary>\n    /// <param name=\"name\"></param>\n    /// <param name=\"help\"></param>\n    self& arg(const wchar_t* name, const wchar_t* help = nullptr)\n    {\n      return arg(_iArg++, name, help);\n    }\n    /// <summary>\n    /// Sets the name and optionally help for the i-th parameter\n    /// </summary>\n    /// <param name=\"i\"></param>\n    /// <param name=\"name\"></param>\n    /// <param name=\"help\">optional, may be null</param>\n    self& arg(size_t i, const wchar_t* name, const wchar_t* help = nullptr)\n    {\n      if (i >= _info->args.size())\n        XLO_THROW(\"Too many args for function\");\n      auto& arg = _info->args[i];\n      arg.name = name;\n      if (help)\n        arg.help = help;\n      return cast();\n    }\n    /// <summary>\n    /// Sets the name and optionally help for the i-th parameter and\n    /// marks the arg as optional. This just effects the auto generated\n    /// help string\n    /// </summary>\n    /// <param name=\"i\"></param>\n    /// <param name=\"name\"></param>\n    /// <param name=\"help\">optional, may be null</param>\n    self& optArg(size_t i, const wchar_t* name, const wchar_t* help = nullptr)\n    {\n      arg(i, name, help);\n      _info->args[i].type |= FuncArg::Optional;\n      return cast();\n    }\n\n    /// <summary>\n    /// Marks the function as a command, i.e. a macro triggered by the user\n    /// instead of by Excel's calculation cycle. You don't neeed to explicitly\n    /// specify a command, it is implied your function returns an int.\n    /// </summary>\n    self& command()\n    {\n      _info->options |= FuncInfo::COMMAND;\n      return cast();\n    }\n    /// <summary>\n    /// Hides the function in the function wizard\n    /// </summary>\n    self& hidden()\n    {\n      _info->options |= FuncInfo::HIDDEN;\n      return cast();\n    }\n    /// <summary>\n    /// Gives the function macro-sheet access rights to the API\n    /// </summary>\n    self& macro()\n    {\n      _info->options |= FuncInfo::MACRO_TYPE;\n      return cast();\n    }\n    /// <summary>\n    /// Tells Excel that the function is re-entrant and can safely be \n    /// called on multiple threads simultaneously\n    /// </summary>\n    self& threadsafe()\n    {\n      _info->options |= FuncInfo::THREAD_SAFE;\n      return cast();\n    }\n\n  protected:\n    self& cast() { return static_cast<self&>(*this); }\n  };\n\n  struct FuncInfoBuilder : public FuncInfoBuilderT<FuncInfoBuilder> {};\n\n  struct StaticRegistrationBuilder : public FuncInfoBuilderT<StaticRegistrationBuilder>\n  {\n    StaticRegistrationBuilder(\n      const char* entryPoint, int funcOpts, size_t nArgs, const int* type)\n      : FuncInfoBuilderT(nArgs, type)\n    {\n      _info->options = funcOpts;\n      _entryPoint = entryPoint;\n      name(utf8ToUtf16(entryPoint)); // TODO: entrypoint will always be ascii\n    }\n\n    template <class TFunc>\n    StaticRegistrationBuilder(const char* entryPoint, TFunc)\n      : StaticRegistrationBuilder(\n          entryPoint,\n          detail::ArgTypes<TFunc>::funcOpts,\n          detail::ArgTypes<TFunc>::nArgs,\n          detail::ArgTypes<TFunc>::types.data()\n        )\n    {\n    }\n\n    auto writeFuncSpec(const std::wstring_view& dllName)\n    {\n      return std::make_shared<const StaticWorksheetFunction>(\n        getInfo(), dllName, _entryPoint);\n    }\n\n    std::string _entryPoint;\n  };\n\n#if DOXYGEN\n/// <summary>\n/// Returning ExcelObj in-place is disabled by default. In the words of the XLL SDK:\n/// \n/// \"Excel permits the registration of functions that return an XLOPER by modifying \n/// an argument in place. However, if an XLOPER argument points to memory, and the \n/// pointer is then overwritten by the return value of the DLL function, Excel can \n/// leak memory. If the DLL allocated memory for the return value, Excel might try \n/// to free that memory, which could cause an immediate crash.  Therefore, you should \n/// not modify XLOPER/XLOPER12 arguments in place.\"\n/// \n/// In practice, it can be safe to modify an ExcelObj in place, for instance xloSort\n/// does this by changing the row order in the array, but without changing memory \n/// allocation.\n/// </summary>\n#define XLOIL_UNSAFE_INPLACE_RETURN\n#endif\n\n  namespace detail\n  {\n    template<class T> struct ArgType {};\n    template<> struct ArgType<const ExcelObj&> { static constexpr auto value = FuncArg::Obj; };\n    template<> struct ArgType<const ExcelObj*> { static constexpr auto value = FuncArg::Obj; };\n    template<> struct ArgType<const FPArray&> { static constexpr auto value = FuncArg::Array; };\n    template<> struct ArgType<const RangeArg&> { static constexpr auto value = FuncArg::Range; };\n\n    /// <summary>\n    /// In-place and async return argument types are only valid when the function \n    /// returns void\n    /// </summary>\n    template<class T> struct VoidArgType : public ArgType<T>\n    {};\n#ifdef XLOIL_UNSAFE_INPLACE_RETURN\n    template<> struct VoidArgType<ExcelObj&> { static constexpr auto value = FuncArg::Obj | FuncArg::ReturnVal; };\n    template<> struct VoidArgType<ExcelObj*> { static constexpr auto value = FuncArg::Obj | FuncArg::ReturnVal; };\n#endif\n    template<> struct VoidArgType<FPArray&> { static constexpr auto value = FuncArg::Array | FuncArg::ReturnVal; };\n    template<> struct VoidArgType<const AsyncHandle&> { static constexpr auto value = FuncArg::AsyncHandle; };\n\n#ifndef _WIN64\n#define XLOIL_STDCALL __stdcall\n#else\n#define XLOIL_STDCALL\n#endif\n\n    template<class T> struct ReturnType    { static constexpr auto value = 0; };\n    template<> struct ReturnType<int>      { static constexpr auto value = FuncInfo::COMMAND; };\n    template<> struct ReturnType<FPArray*> { static constexpr auto value = FuncInfo::ARRAY; };\n\n    /// <summary>\n    /// Ultimately inherits from Defs<ReturnType, Args...> but due to the myriad\n    /// ways which a callable can be expressed in C++, has a lot of specialisations\n    /// </summary>\n    template <template<typename, typename...> typename Defs, typename T>\n    struct FunctionTraitsFilter;\n\n    template <template<typename, typename...> typename Defs,\n      typename ReturnType, typename... Args>\n      struct FunctionTraitsFilter<Defs, ReturnType(Args...)>\n      : Defs<ReturnType, Args...> {};\n\n    template <template<typename, typename...> typename Defs,\n      typename ReturnType, typename... Args>\n      struct FunctionTraitsFilter<Defs, ReturnType(XLOIL_STDCALL*)(Args...)>\n      : Defs<ReturnType, Args...> {};\n\n    template <template<typename, typename...> typename Defs,\n      typename ReturnType, typename ClassType, typename... Args>\n      struct FunctionTraitsFilter<Defs, ReturnType(ClassType::*)(Args...)>\n      : Defs<ReturnType, Args...> {};\n\n    template <template<typename, typename...> typename Defs,\n      typename ReturnType, typename ClassType, typename... Args>\n      struct FunctionTraitsFilter<Defs, ReturnType(ClassType::*)(Args...) const>\n      : Defs<ReturnType, Args...> {};\n\n    template <template<typename, typename...> typename Defs, typename T, typename SFINAE = void>\n    struct FunctionTraits\n      : FunctionTraitsFilter<Defs, T> {};\n\n    template <template<typename, typename...> typename Defs, typename T>\n    struct FunctionTraits<Defs, T, decltype((void)&T::operator())>\n      : FunctionTraitsFilter<Defs, decltype(&T::operator())> {};\n\n    template <typename TReturnType, typename... Args>\n    struct ArgTypesDefs\n    {\n      static constexpr std::array<int, sizeof...(Args)> types = { ArgType<Args>::value ... };\n      static constexpr size_t nArgs = sizeof...(Args);\n      static constexpr auto funcOpts = ReturnType<TReturnType>::value;\n      template <size_t i> struct arg\n      {\n        using type = typename std::tuple_element<i, std::tuple<Args...>>::type;\n      };\n    };\n    template <typename... Args>\n    struct ArgTypesDefs<void, Args...>\n    {\n      static constexpr std::array<int, sizeof...(Args)> types = { VoidArgType<Args>::value ... };\n      static constexpr size_t nArgs = sizeof...(Args);\n      static constexpr auto funcOpts = 0;\n      template <size_t i> struct arg\n      {\n        using type = typename std::tuple_element<i, std::tuple<Args...>>::type;\n      };\n    };\n\n    template<class T> struct ArgTypes\n      : FunctionTraits<ArgTypesDefs, T>\n    {};\n\n\n    XLOIL_EXPORT StaticRegistrationBuilder&\n      createRegistrationMemo(\n        const char* entryPoint_, int funcOpts, size_t nArgs, const int* types);\n\n    template <class TFunc> inline StaticRegistrationBuilder&\n      registrationMemo(const char* name, TFunc)\n    {\n      using argTypes = detail::ArgTypes<TFunc>;\n      return createRegistrationMemo(\n        name, argTypes::funcOpts, argTypes::nArgs, argTypes::types.data());\n    }\n\n    std::vector<std::shared_ptr<const WorksheetFuncSpec>>\n      processRegistryQueue(const wchar_t* moduleName);\n\n    std::vector<std::shared_ptr<const RegisteredWorksheetFunc>>\n      registerStaticFuncs(const wchar_t* moduleName, std::wstring& errors);\n  }\n}"
  },
  {
    "path": "include/xloil/StringUtils.h",
    "content": "#pragma once\n#include <string>\n#include <codecvt>\n#include <algorithm>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Converts a UTF-16 wstring to a UTF-8 string\n  /// </summary>\n  inline std::string utf16ToUtf8(const std::wstring_view& str)\n  {\n    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;\n    return converter.to_bytes(str.data(), str.data() + str.length());\n  }\n\n  /// <summary>\n  /// Converts a UTF-8 string to a UTF-16 wstring\n  /// </summary>\n  inline std::wstring utf8ToUtf16(const std::string_view& str)\n  {\n    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;\n    return converter.from_bytes(str.data(), str.data() + str.length());\n  }\n\n  namespace detail\n  {\n    // http://unicode.org/faq/utf_bom.html\n    constexpr char32_t LEAD_OFFSET = (char32_t)(0xD800 - (0x10000 >> 10));\n    constexpr char32_t SURROGATE_OFFSET = (char32_t)(0x10000 - (0xD800 << 10) - 0xDC00);\n    constexpr char32_t HI_SURROGATE_START = 0xD800;\n  }\n\n  /// <summary>\n  /// Concerts a UTF-16 wchar_t string to a UTF-32 char32_t one.\n  /// This string conversion appears to be missing from the standard codecvt\n  /// library as of C++17.\n  /// </summary>\n  struct ConvertUTF16ToUTF32\n  {\n    using to_char = char32_t;\n    using from_char = char16_t;\n\n    size_t operator()(\n      to_char* target, \n      const size_t targetSize,\n      const from_char* begin, \n      const from_char* end) const noexcept\n    {\n      auto* p = target;\n      auto* pEnd = target + targetSize;\n      for (; begin < end; ++begin, ++p)\n      {\n        // If we are past the end of the buffer, carry on so we can\n        // determine the required buffer length, but do not write\n        // any characters\n        if (p == pEnd)\n        {\n          if (*begin >= detail::HI_SURROGATE_START)\n            ++begin;\n        }\n        else\n        {\n          if (*begin < detail::HI_SURROGATE_START)\n            *p = *begin;\n          else\n          {\n            auto lead = *begin++;\n            *p = (lead << 10) + *begin + detail::SURROGATE_OFFSET;\n          }\n        }\n      }\n      return p - target;\n    }\n    size_t operator()(\n      to_char* target, \n      const size_t size, \n      const wchar_t* begin, \n      const wchar_t* end) const noexcept\n    {\n      return (*this)(target, size, (const from_char*)begin, (const from_char*)end);\n    }\n  };\n\n  struct ConvertUTF32ToUTF16\n  {\n    using from_char = char32_t;\n    using to_char = char16_t;\n\n    static void convertChar(char32_t codepoint, char16_t &h, char16_t &l) noexcept\n    {\n      if (codepoint < 0x10000)\n      {\n        h = (char16_t)codepoint;\n        l = 0;\n        return;\n      }\n      h = (char16_t)(detail::LEAD_OFFSET + (codepoint >> 10));\n      l = (char16_t)(0xDC00 + (codepoint & 0x3FF));\n    }\n\n    /// <summary>\n    /// Stops at null character\n    /// </summary>\n    /// <param name=\"target\"></param>\n    /// <param name=\"targetSize\"></param>\n    /// <param name=\"begin\"></param>\n    /// <param name=\"end\"></param>\n    /// <returns></returns>\n    size_t operator()(\n      to_char* target, \n      const size_t targetSize, \n      const from_char* begin, \n      const from_char* end) const noexcept\n    {\n      auto* p = target;\n      auto* pEnd = target + targetSize;\n      to_char lead, trail;\n      for (; begin != end; ++begin, ++p)\n      {\n        convertChar(*begin, lead, trail);\n        // If we are past the end of the buffer, carry on so we can\n        // determine the required buffer length, but do not write\n        // any characters\n        if (p >= pEnd || (trail != 0 && p + 1 >= pEnd))\n        {\n          if (trail != 0) \n            ++p;\n        }\n        else\n        {\n          *p = lead;\n          if (trail != 0)\n            *(++p) = trail;\n        }\n      }\n      return p - target;\n    }\n    size_t operator()(\n      wchar_t* target, \n      const size_t size,\n      const from_char* begin, \n      const from_char* end) const noexcept\n    {\n      return (*this)((to_char*)target, size, begin, end);\n    }\n  };\n\n  /// <summary>\n  /// strlen for char32 strings with a maximum length (in case the string\n  /// is not null terminated). If a max is not required, use std::char_traits.\n  /// </summary>\n  /// <param name=\"str\"></param>\n  /// <param name=\"max\"></param>\n  /// <returns></returns>\n  inline size_t strlen32(const char32_t* str, const size_t max)\n  {\n    size_t count = 0;\n    while (*str != 0 && count < max)\n    {\n      ++count;\n      ++str;\n    }\n    return count;\n  }\n\n  /// <summary>\n  /// Tries to convert the provided floating point double to an integer.\n  /// Returns false if the input has a fractional part or is too large for\n  /// the given integer type.\n  /// </summary>\n  /// <param name=\"d\"></param>\n  /// <param name=\"i\"></param>\n  /// <returns></returns>\n  template <class TInt> inline\n  bool floatingToInt(double d, TInt& i) noexcept\n  {\n    double intpart;\n    if (std::modf(d, &intpart) != 0.0)\n      return false;\n\n    if (!(intpart > (std::numeric_limits<TInt>::min)()\n      && intpart < (std::numeric_limits<TInt>::max)()))\n      return false;\n\n    i = TInt(intpart);\n    return true;\n  }\n\n  /// <summary>\n  /// Wraps sprintf and returns a wstring\n  /// </summary>\n  template<class...Args>\n  inline std::wstring\n    formatStr(const wchar_t* fmt, Args...args)\n  {\n    const auto size = (size_t)_scwprintf(fmt, args...);\n    std::wstring result(size + 1, 0);\n    swprintf_s(&result[0], size + 1, fmt, args...);\n    result.pop_back();\n    return result;\n  }\n\n  /// <summary>\n  /// Wraps sprintf and returns a string\n  /// </summary>\n  template<class...Args>\n  inline std::string\n    formatStr(const char* fmt, Args...args)\n  {\n    const auto size = (size_t)_scprintf(fmt, args...);\n    std::string result(size + 1, 0);\n    sprintf_s(&result[0], size + 1, fmt, args...);\n    result.pop_back();\n    return result;\n  }\n\n  template <class TChar>\n  struct CaselessCompare\n  {\n    bool operator()(\n      const std::basic_string<TChar> & lhs,\n      const std::basic_string<TChar> & rhs) const\n    {\n      return (*this)(lhs.c_str(), rhs.c_str());\n    }\n    bool operator()(const TChar* lhs, const TChar* rhs) const\n    {\n      if constexpr (std::is_same<TChar, wchar_t>::value)\n        return _wcsicmp(lhs, rhs) < 0;\n      else\n        return _stricmp(lhs, rhs) < 0;\n    }\n  };\n\n\n  namespace detail\n  {\n    template<class TChar, class F>\n    auto captureStringBufferImpl(F bufWriter, size_t initialSize)\n    {\n      std::basic_string<TChar> s;\n      s.resize(initialSize);\n      intptr_t len;\n      // We assume, hopefully correctly, that the bufWriter function on\n      // failure returns either < 0 or the required buffer length.\n      while ((len = (intptr_t)bufWriter(s.data(), s.length())) > (intptr_t)s.length())\n        s.resize(len < 0 ? s.size() * 2 : (size_t)len);\n\n      // Now resize the string to the correct size.  Some windows functions, \n      // e.g. ExpandEnvironmentStrings include the null-terminator in the \n      // returned buffer length whereas other seemingly similar ones, e.g. \n      // GetEnvironmentVariable, do not. Wonderful.\n      s.resize(len > 0 && s.data()[len - 1] == '\\0' ? len - 1 : len);\n      return s;\n    }\n\n    template <class TChar>\n    struct char_traits : public std::char_traits<TChar>\n    {};\n\n    template <>\n    struct char_traits<wchar_t> : public std::char_traits<wchar_t>\n    {\n      static wchar_t tolower(wchar_t c) { return ::towlower(c); }\n    };\n\n    template <>\n    struct char_traits<char> : public std::char_traits<wchar_t>\n    {\n      static char tolower(char c) { return (char)::tolower(c); }\n    };\n  }\n  /// <summary>\n  /// Helper function to capture C++ strings from Windows Api functions which have\n  /// signatures like\n  ///    int_charsWritten GetTheString(wchar* buffer, int bufferSize);\n  /// </summary>\n  /// \n  template<class F>\n  auto captureStringBuffer(F bufWriter, size_t initialSize = 1024)\n  {\n    return detail::captureStringBufferImpl<char, F>(bufWriter, initialSize);\n  }\n\n  /// <summary>\n  /// Helper function to capture C++ strings from Windows Api functions which have\n  /// signatures like\n  ///    int_charsWritten GetTheString(wchar* buffer, int bufferSize);\n  /// </summary>\n  /// \n  template<class F>\n  auto captureWStringBuffer(F bufWriter, size_t initialSize = 1024)\n  {\n    return detail::captureStringBufferImpl<wchar_t, F>(bufWriter, initialSize);\n  }\n\n  template <class Elem> inline\n   std::basic_string<Elem>& toLower(std::basic_string<Elem>&& str)\n  {\n    std::transform(str.begin(), str.end(), str.begin(), detail::char_traits<Elem>::tolower);\n    return str;\n  }\n  template <class Elem> inline\n    void toLower(std::basic_string<Elem>& str)\n  {\n    std::transform(str.begin(), str.end(), str.begin(), detail::char_traits<Elem>::tolower);\n  }\n\n\n  /// <summary>\n  /// Writes an unsigned int64 to a char buffer for a fixed radix. Does not\n  /// write a null-terminator. Returns the length of the string written or\n  /// zero if the buffer is insufficient.  Essentially `itoa` where the \n  /// compiler can optimise for the fixed radix.\n  /// </summary>\n  /// <typeparam name=\"TChar\">char-type</typeparam>\n  /// <typeparam name=\"TRadix\">\n  ///   Numbers above 32 will result in some pretty weird characters in the output\n  /// </typeparam>\n  /// <param name=\"value\"></param>\n  /// <param name=\"result\">Pointer to the start of the result buffer</param>\n  /// <param name=\"resultSize\">Size of the result buffer in chars</param>\n  /// <returns></returns>\n  template<size_t TRadix, class TChar>\n  inline uint8_t unsignedToString(size_t value, TChar* result, size_t resultSize)\n  {\n    // Surely larger than this is just silly?\n    static_assert(TRadix <= 128);\n\n    // 64 chars should hold a 64-bit int in radix = 2\n    // TODO: could make this buffer smaller for bigger radix\n    constexpr auto bufSize = 64;\n\n    // The below division and remainder algorithm writes the string in reverse\n    // so we write to a separate buffer\n    TChar buf[bufSize];\n\n    // Current write position in the buffer\n    TChar* p = buf;\n    do {\n      // Integer divide value by radix \n      const uint8_t rem = value % TRadix;\n      value = value / TRadix;\n\n      // Remainder determines the offset from the '0' or 'a' chars\n      if constexpr (TRadix <= 10)\n      {\n        *p = rem + '0';\n      }\n      else if constexpr (TRadix <= 10 + 26)\n      {\n        *p = rem < 10\n          ? rem + '0'\n          : rem + 'A' - 10;\n      }\n      else\n      {\n        *p = rem < 10\n          ? rem + '0'\n          : rem < 36\n            ? rem + 'A' - 10\n            : rem + 'a' - 36;\n      }\n      ++p;\n    } while (value > 0);\n\n    // Check how many chars we wrote\n    const auto len = uint8_t(p - buf);\n\n    // Check buffer size\n    if (len > resultSize)\n      return 0;\n\n    // Reverse the string back into the result array\n    std::reverse_copy(buf, p, result);\n    return len;\n  }\n\n  template<size_t TRadix, class TChar, size_t TResultSize>\n  inline size_t unsignedToString(size_t value, TChar(&result)[TResultSize])\n  {\n    return unsignedToString<TRadix, TChar>(value, result, TResultSize);\n  }\n\n  namespace detail\n  {\n    /// <summary>\n    /// Parses a uint64 expressed as characters in a given alphabet.\n    /// Stops parsing when `TAlphabet` assigns a value above `THigh`\n    /// Moves the `begin` iterator to just past the last correctly\n    /// parsed character.\n    /// </summary>\n    /// <typeparam name=\"TIter\"></typeparam>\n    /// <typeparam name=\"TAlphabet\">\n    ///   A trivially constructible class whose operator() returns \n    ///   a uint value for a given character \n    /// </typeparam>\n    /// <typeparam name=\"TRadix\">\n    /// <typeparam name=\"THigh\">\n    ///   Maxmium allowed symbol value, usually TRadix - 1\n    /// </typeparam>\n    /// <param name=\"begin\"></param>\n    /// <param name=\"end\"></param>\n    /// <returns></returns>\n    template<\n      class TIter,\n      class TAlphabet,\n      size_t TRadix,\n      size_t THigh = TRadix - 1>\n    inline auto parseUnsigned(\n      TIter& begin, \n      const TIter end)\n    {\n      size_t val = 0;\n      do {\n        auto c = *begin;\n        auto v = TAlphabet()(c);\n        if (v > THigh)\n          break;\n        val = val * TRadix + v;\n      } while (++begin != end);\n      return val;\n    }\n\n    struct StandardAlphabet\n    {\n      static constexpr int8_t _alphabet[] = {\n        0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n        -1, -1, -1, -1, -1, -1, -1,\n        10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n        -1, -1, -1, -1, -1, -1,\n        10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n      };\n      auto operator()(int16_t c) const \n      { \n        if (c < '0' || c > 'z')\n          return (uint8_t)-1;\n        return (uint8_t)_alphabet[c - '0'];\n      }\n    };\n\n    struct DecimalAlphabet\n    {\n      auto operator()(int16_t c) const\n      {\n        if (c < '0' || c > '9')\n          return (uint8_t)-1;\n        return (uint8_t)(c - '0');\n      }\n    };\n  }\n\n  /// <summary>\n  /// Parses a uint64 expressed as characters with a given radix.\n  /// Essentially a templated version of `utoa`. Moves the `begin` \n  /// iterator to just past the last correctly parsed character.\n  /// </summary>\n  template<size_t TRadix, class TIter>\n  inline auto parseUnsigned(TIter& begin, const TIter& end)\n  {\n    if constexpr (TRadix <= 10)\n      return detail::parseUnsigned<TIter, detail::DecimalAlphabet, TRadix>(begin, end);\n    else\n      return detail::parseUnsigned<TIter, detail::StandardAlphabet, TRadix>(begin, end);\n  }\n\n  template<size_t TRadix, class TIter>\n  inline auto parseUnsigned(const TIter& begin, const TIter& end)\n  {\n    auto i = begin;\n    return parseUnsigned<TRadix, TIter>(i, end);\n  }\n\n  // Borrowed from Boost. Doesn't logically live in this header file, but \n  // lacks another home\n  inline size_t boost_hash_combine(size_t seed) { return seed; }\n\n  template <typename T, typename... Rest>\n  inline size_t boost_hash_combine(size_t seed, const T& v, Rest... rest) {\n    seed ^= std::hash<T>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);\n    return boost_hash_combine(seed, rest...);\n  }\n\n  template<class A, class B>\n  struct pair_hash {\n    size_t operator()(std::pair<A, B> p) const noexcept\n    {\n      return boost_hash_combine(377, p.first, p.second);;\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/Throw.h",
    "content": "#include <spdlog/fmt/bundled/format.h>\n#include <xlOil/StringUtils.h>\n#include \"ExportMacro.h\"\n\n#pragma once\n\n/// <summary>\n/// Throws an xloil::Exception. Accepts python format strings like the logging functions\n/// e.g. XLO_THROW(\"Bad: {0} {1}\", errCode, e.what()) \n/// </summary>\n#define XLO_THROW(...) do { throw xloil::Exception<>(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } while(false)\n#define XLO_ASSERT(condition) assert((condition) && #condition)\n#define XLO_THROW_TYPE(Type, ...) do { throw xloil::Exception<Type>(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); } while(false)\n\nnamespace xloil\n{\n  /// <summary>\n  /// Wrapper around GetLastError and FormatMessage to write out any error condition\n  /// set by Windows API functions.\n  /// </summary>\n  XLOIL_EXPORT std::wstring writeWindowsError();\n\n  XLOIL_EXPORT void logException(\n    const char* path,\n    const int line,\n    const char* func,\n    const char* msg) noexcept;\n\n  namespace detail\n  {\n    inline std::string toUtf8(std::string&& str) { return std::move(str); }\n    inline std::string toUtf8(std::wstring&& wstr) { return utf16ToUtf8(wstr); }\n\n    template<class TChar, class... Args>\n    inline std::string formatExceptionT(\n      const std::basic_string_view<TChar>& formatStr,\n      Args&&... args) noexcept\n    {\n      try\n      {\n        // This 250 size is the same default as in spdlog, the buffer is actually dynamic\n        fmt::basic_memory_buffer<TChar, 250> buf;\n        fmt::format_to(buf, formatStr, std::forward<Args>(args)...);\n        return toUtf8(std::basic_string<TChar>(buf.data(), buf.size()));\n      }\n      catch (...)\n      {\n        return toUtf8(std::basic_string<TChar>(formatStr));\n      }\n    }\n    template<class... Args>\n    inline std::string formatException(\n      const std::string_view& formatStr,\n      Args&&... args) noexcept\n    {\n      return formatExceptionT<char>(formatStr, std::forward<Args>(args)...);\n    }\n    template<class... Args>\n    inline std::string formatException(\n      const std::wstring_view& formatStr,\n      Args&&... args) noexcept\n    {\n      return formatExceptionT<wchar_t>(formatStr, std::forward<Args>(args)...);\n    }\n\n  } // detail\n\n#pragma warning(disable: 4275) // Complaints about dll-interface. MS suggests disabling\n  template<class TBase = std::runtime_error>\n  class Exception : public TBase\n  {\n  public:\n    template<class TMsg, class... Args>\n    Exception(\n      const char* path, const int line, const char* func,\n      TMsg&& msg, Args&&... args)\n      : TBase(detail::formatException(std::forward<TMsg>(msg), std::forward<Args>(args)...))\n    {\n      logException(path, line, func, what());\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/TypeConverters.h",
    "content": "#pragma once\n\n#ifndef XLOIL_XLOPER\n#error \"Don't include this directly, include ExcelObj.h\"\n#endif\n\n#include <optional>\n#include <stdexcept>\n\nnamespace xloil { class ExcelRef; }\nnamespace xloil\n{\n  /// <summary>\n  /// Interface class for converters which take an ExcelObj and output a\n  /// language-specific type\n  /// </summary>\n  template <class TResult>\n  class IConvertFromExcel\n  {\n  public:\n    using result_type = TResult;\n    using const_result_ptr = const typename std::remove_pointer<TResult>::type*;\n    virtual ~IConvertFromExcel() {}\n    virtual result_type operator()(\n      const ExcelObj& xl, \n      const_result_ptr defaultVal = nullptr) = 0;\n  };\n\n  /// <summary>\n  /// Interface class for converters which take a language-specific type\n  /// and produce an ExcelObj\n  /// </summary>\n  template <class TSource>\n  class IConvertToExcel\n  {\n  public:\n    virtual ~IConvertToExcel() {}\n    virtual ExcelObj operator()(const TSource& obj) const = 0;\n  };\n\n  template <class TSource>\n  class IConvertToExcel<TSource*>\n  {\n  public:\n    virtual ~IConvertToExcel() {}\n    virtual ExcelObj operator()(const TSource* obj) const = 0;\n  };\n\n  /// <summary>\n  /// Provides the default implementation (which is generally an error)\n  /// for conversion functors to be used in <see cref=\"FromExcel\"/> or \n  /// <see cref=\"visitExcelObj\"/>\n  /// </summary>\n  template <class TResult>\n  class ExcelValVisitor\n  {\n  public:\n    using return_type = TResult;\n    template <class T> return_type operator()(T) const\n    { \n      throw std::runtime_error(\"Cannot convert to required type\");\n    }\n  };\n\n  template <class TResult>\n  class ExcelValVisitor<std::optional<TResult>>\n  {\n  public:\n    using return_type = std::optional<TResult>;\n    template <class T> return_type operator()(T) const\n    {\n      return std::optional<TResult>();\n    }\n  };\n\n  template <class TResult>\n  class ExcelValVisitor<TResult*>\n  {\n  public:\n    using return_type = TResult*;\n    template <class T> return_type operator()(T) const\n    {\n      return nullptr;\n    }\n  };\n\n  template<class TVisitor>\n  class ExcelValVisitorDefaulted \n    : public ExcelValVisitor<typename TVisitor::return_type>\n  {\n    using base = ExcelValVisitor<typename TVisitor::return_type>;\n    using default_type = const typename TVisitor::return_type&;\n\n    TVisitor _visitor;\n    default_type _defaultValue;\n\n  public:\n    template <class...Args>\n    ExcelValVisitorDefaulted(\n      TVisitor visitor,\n      default_type defaultVal)\n      : _visitor(visitor)\n      , _defaultValue(defaultVal)\n    {}\n\n    template<class T> auto operator()(T x) const\n    {\n      return _visitor(std::forward<T>(x));\n    }\n\n    auto operator()(MissingVal) const\n    {\n      return _defaultValue;\n    }\n  };\n}"
  },
  {
    "path": "include/xloil/Version.h",
    "content": "#pragma once\n\n#define XLOIL_MAJOR_VERSION 0\n#define XLOIL_MINOR_VERSION 22\n#define XLOIL_PATCH_VERSION 1\n"
  },
  {
    "path": "include/xloil/WindowsSlim.h",
    "content": "#pragma once\n\n// Heavily chopped down windows include which contains just want we need\n\n#ifndef NOMINMAX\n#define NOMINMAX  //Macros min(a, b) and max(a, b)\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#define NOGDICAPMASKS  //CC_ * , LC_*, PC_*, CP_*, TC_*, RC_\n#define NOVIRTUALKEYCODES  //VK_ *\n#define NOWINMESSAGES  //WM_ * , EM_*, LB_*, CB_*\n#define NOWINSTYLES  //WS_ * , CS_*, ES_*, LBS_*, SBS_*, CBS_*\n#define NOSYSMETRICS  //SM_ *\n#define NOMENUS  //MF_ *\n#define NOICONS  //IDI_ *\n#define NOKEYSTATES  //MK_ *\n#define NOSYSCOMMANDS  //SC_ *\n#define NORASTEROPS  //Binary and Tertiary raster ops\n#define NOSHOWWINDOW  //SW_ *\n#define OEMRESOURCE  //OEM Resource values\n#define NOATOM  //Atom Manager routines\n#define NOCLIPBOARD  //Clipboard routines\n#define NOCOLOR  //Screen colors\n#define NOCTLMGR  //Control and Dialog routines\n#define NODRAWTEXT  //DrawText() and DT_*\n#define NOGDI  //All GDI defines and routines\n#define NOKERNEL  //All KERNEL defines and routines\n//#define NOUSER  //All USER defines and routines\n//#define NONLS  //All NLS defines and routines\n#define NOMB  //MB_ * and MessageBox()\n#define NOMEMMGR  //GMEM_ * , LMEM_*, GHND, LHND, associated routines\n#define NOMETAFILE  //typedef METAFILEPICT\n//#define NOMSG  //typedef MSG and associated routines\n#define NOOPENFILE  //OpenFile(), OemToAnsi, AnsiToOem, and OF_*\n#define NOSCROLL  //SB_ * and scrolling routines\n#define NOSERVICE  //All Service Controller routines, SERVICE_ equates, etc.\n#define NOSOUND  //Sound driver routines\n#define NOTEXTMETRIC  //typedef TEXTMETRIC and associated routines\n#define NOWH  //SetWindowsHook and WH_*\n#define NOWINOFFSETS  //GWL_ * , GCL_*, associated routines\n#define NOCOMM  //COMM driver routines\n#define NOKANJI  //Kanji support stuff.\n#define NOHELP  //Help engine interface.\n#define NOPROFILER  //Profiler interface.\n#define NODEFERWINDOWPOS  //DeferWindowPos routines\n#define NOMCX  //Modem Configuration Extensions\n#include <Windows.h>\n\n"
  },
  {
    "path": "include/xloil/XlCallSlim.h",
    "content": "#pragma once\n\n/* EDITED TO REMOVE DEPENDENCY ON WINDOWS.H AND ADD NAMESPACE */\n\n/*\n**  Microsoft Excel Developer's Toolkit\n**  Version 15.0\n**\n**  File:           INCLUDE\\XLCALL.H\n**  Description:    Header file for for Excel callbacks\n**  Platform:       Microsoft Windows\n**\n**  DEPENDENCY: none\n**\n**  This file defines the constants and\n**  data types which are used in the\n**  Microsoft Excel C API.\n**\n*/\n\n/*\n** XL 12 Basic Datatypes\n**/\n\nnamespace msxll\n{\n  typedef unsigned char BYTE;\n  typedef unsigned short WORD;\n  typedef unsigned long DWORD;\n\n  typedef __int32 BOOL;\t\t\t/* Boolean */\n  typedef wchar_t XCHAR;\t\t\t/* Wide Character */\n  typedef __int32 RW;\t\t\t/* XL 12 Row */\n  typedef __int32 COL;\t \t      \t/* XL 12 Column */\n  typedef DWORD* IDSHEET;\t\t/* XL12 Sheet ID */\n\n\n  /*\n  ** XLREF structure\n  **\n  ** Describes a single rectangular reference.\n  */\n\n  typedef struct xlref\n  {\n    WORD rwFirst;\n    WORD rwLast;\n    BYTE colFirst;\n    BYTE colLast;\n  } XLREF, *LPXLREF;\n\n\n  /*\n  ** XLMREF structure\n  **\n  ** Describes multiple rectangular references.\n  ** This is a variable size structure, default\n  ** size is 1 reference.\n  */\n\n  typedef struct xlmref\n  {\n    WORD count;\n    XLREF reftbl[1];\t\t\t\t\t/* actually reftbl[count] */\n  } XLMREF, *LPXLMREF;\n\n\n  /*\n  ** XLREF12 structure\n  **\n  ** Describes a single XL 12 rectangular reference.\n  */\n\n  typedef struct xlref12\n  {\n    RW rwFirst;\n    RW rwLast;\n    COL colFirst;\n    COL colLast;\n  } XLREF12, *LPXLREF12;\n\n\n  /*\n  ** XLMREF12 structure\n  **\n  ** Describes multiple rectangular XL 12 references.\n  ** This is a variable size structure, default\n  ** size is 1 reference.\n  */\n\n  typedef struct xlmref12\n  {\n    WORD count;\n    XLREF12 reftbl[1];\t\t\t\t\t/* actually reftbl[count] */\n  } XLMREF12, *LPXLMREF12;\n\n\n  /*\n  ** FP structure\n  **\n  ** Describes FP structure.\n  */\n\n  typedef struct _FP\n  {\n    unsigned short int rows;\n    unsigned short int columns;\n    double array[1];        /* Actually, array[rows][columns] */\n  } FP;\n\n  /*\n  ** FP12 structure\n  **\n  ** Describes FP structure capable of handling the big grid.\n  */\n\n  typedef struct _FP12\n  {\n    __int32 rows;\n    __int32 columns;\n    double array[1];        /* Actually, array[rows][columns] */\n  } FP12;\n\n\n  /*\n  ** XLOPER structure\n  **\n  ** Excel's fundamental data type: can hold data\n  ** of any type. Use \"R\" as the argument type in the\n  ** REGISTER function.\n  **/\n\n  typedef struct xloper\n  {\n    union\n    {\n      double num;\t\t\t\t\t/* xltypeNum */\n      char* str;\t\t\t\t\t/* xltypeStr */\n#ifdef __cplusplus\n      WORD xbool;\t\t\t\t\t/* xltypeBool */\n#else\t\n      WORD bool;\t\t\t\t\t/* xltypeBool */\n#endif\t\n      WORD err;\t\t\t\t\t/* xltypeErr */\n      short int w;\t\t\t\t\t/* xltypeInt */\n      struct\n      {\n        WORD count;\t\t\t\t/* always = 1 */\n        XLREF ref;\n      } sref;\t\t\t\t\t\t/* xltypeSRef */\n      struct\n      {\n        XLMREF *lpmref;\n        IDSHEET idSheet;\n      } mref;\t\t\t\t\t\t/* xltypeRef */\n      struct\n      {\n        struct xloper *lparray;\n        WORD rows;\n        WORD columns;\n      } array;\t\t\t\t\t/* xltypeMulti */\n      struct\n      {\n        union\n        {\n          short int level;\t\t/* xlflowRestart */\n          short int tbctrl;\t\t/* xlflowPause */\n          IDSHEET idSheet;\t\t/* xlflowGoto */\n        } valflow;\n        WORD rw;\t\t\t\t/* xlflowGoto */\n        BYTE col;\t\t\t\t/* xlflowGoto */\n        BYTE xlflow;\n      } flow;\t\t\t\t\t\t/* xltypeFlow */\n      struct\n      {\n        union\n        {\n          BYTE *lpbData;\t\t\t/* data passed to XL */\n          void* hdata;\t\t\t/* data returned from XL */\n        } h;\n        long cbData;\n      } bigdata;\t\t\t\t\t/* xltypeBigData */\n    } val;\n    WORD xltype;\n  } XLOPER, *LPXLOPER;\n\n  /*\n  ** XLOPER12 structure\n  **\n  ** Excel 12's fundamental data type: can hold data\n  ** of any type. Use \"U\" as the argument type in the\n  ** REGISTER function.\n  **/\n\n  typedef struct xloper12\n  {\n    union\n    {\n      double num;\t\t\t\t       \t/* xltypeNum */\n      struct\n      {\n        XCHAR* data;\n        bool xloil_view; // Our modification\n      } str; \t/* xltypeStr */\n      BOOL xbool;\t\t\t\t       \t/* xltypeBool */\n      int err;\t\t\t\t       \t/* xltypeErr */\n      int w;\n      struct\n      {\n        WORD count;\t\t\t       \t/* always = 1 */\n        XLREF12 ref;\n      } sref;\t\t\t\t\t\t/* xltypeSRef */\n      struct\n      {\n        XLMREF12 *lpmref;\n        IDSHEET idSheet;\n      } mref;\t\t\t\t\t\t/* xltypeRef */\n      struct\n      {\n        struct xloper12 *lparray;\n        RW rows;\n        COL columns;\n        bool xloil_view; // Clearly wasn't in Microsoft's spec!\n      } array;\t\t\t\t\t/* xltypeMulti */\n      struct\n      {\n        union\n        {\n          int level;\t\t\t/* xlflowRestart */\n          int tbctrl;\t\t\t/* xlflowPause */\n          IDSHEET idSheet;\t\t/* xlflowGoto */\n        } valflow;\n        RW rw;\t\t\t\t       \t/* xlflowGoto */\n        COL col;\t\t\t       \t/* xlflowGoto */\n        BYTE xlflow;\n      } flow;\t\t\t\t\t\t/* xltypeFlow */\n      struct\n      {\n        union\n        {\n          BYTE *lpbData;\t\t\t/* data passed to XL */\n          void* hdata;\t\t\t/* data returned from XL */\n        } h;\n        long cbData;\n      } bigdata;\t\t\t\t\t/* xltypeBigData */\n    } val;\n    DWORD xltype;\n  } XLOPER12, *LPXLOPER12;\n\n  /*\n  ** XLOPER and XLOPER12 data types\n  **\n  ** Used for xltype field of XLOPER and XLOPER12 structures\n  */\n\n  constexpr int xltypeNum = 0x0001;\n  constexpr int xltypeStr = 0x0002;\n  constexpr int xltypeBool = 0x0004;\n  constexpr int xltypeRef = 0x0008;\n  constexpr int xltypeErr = 0x0010;\n  constexpr int xltypeFlow = 0x0020;\n  constexpr int xltypeMulti = 0x0040;\n  constexpr int xltypeMissing = 0x0080;\n  constexpr int xltypeNil = 0x0100;\n  constexpr int xltypeSRef = 0x0400;\n  constexpr int xltypeInt = 0x0800;\n     \n  constexpr int xlbitXLFree = 0x1000;\n  constexpr int xlbitDLLFree = 0x4000;\n          \n  constexpr int xltypeBigData = (xltypeStr | xltypeInt);\n\n\n  /*\n  ** Error codes\n  **\n  ** Used for val.err field of XLOPER and XLOPER12 structures\n  ** when constructing error XLOPERs and XLOPER12s\n  */\n\n  constexpr int xlerrNull = 0;\n  constexpr int xlerrDiv0 = 7;\n  constexpr int xlerrValue = 15;\n  constexpr int xlerrRef = 23;\n  constexpr int xlerrName = 29;\n  constexpr int xlerrNum = 36;\n  constexpr int xlerrNA = 42;\n  constexpr int xlerrGettingData = 43;\n\n  /*\n  ** Return codes\n  **\n  ** These values can be returned from Excel4(), Excel4v(), Excel12() or Excel12v().\n  */\n\n  constexpr int xlretSuccess                = 0;    /* success */ \n  constexpr int xlretAbort                  = 1;    /* macro halted */\n  constexpr int xlretInvXlfn                = 2;    /* invalid function number */ \n  constexpr int xlretInvCount               = 4;    /* invalid number of arguments */ \n  constexpr int xlretInvXloper              = 8;    /* invalid OPER structure */  \n  constexpr int xlretStackOvfl              = 16;   /* stack overflow */  \n  constexpr int xlretFailed                 = 32;   /* command failed */  \n  constexpr int xlretUncalced               = 64;   /* uncalced cell */\n  constexpr int xlretNotThreadSafe          = 128;  /* not allowed during multi-threaded calc */\n  constexpr int xlretInvAsynchronousContext = 256;  /* invalid asynchronous function handle */\n  constexpr int xlretNotClusterSafe         = 512;  /* not supported on cluster */\n\n\n  /*\n  ** XLL events\n  **\n  ** Passed in to an xlEventRegister call to register a corresponding event.\n  */\n\n  constexpr int xleventCalculationEnded = 1;   /* Fires at the end of calculation */\n  constexpr int xleventCalculationCanceled = 2;    /* Fires when calculation is interrupted */\n\n\n  /*\n  ** Function prototypes\n  */\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n    int _cdecl Excel4(int xlfn, LPXLOPER operRes, int count, ...);\n    /* followed by count LPXLOPERs */\n\n    int __stdcall Excel4v(int xlfn, LPXLOPER operRes, int count, LPXLOPER opers[]);\n\n    int __stdcall XLCallVer(void);\n\n    long __stdcall LPenHelper(int wCode, void* lpv);\n\n    int _cdecl Excel12(int xlfn, LPXLOPER12 operRes, int count, ...);\n    /* followed by count LPXLOPER12s */\n\n    int __stdcall Excel12v(int xlfn, LPXLOPER12 operRes, int count, LPXLOPER12 opers[]);\n\n#ifdef __cplusplus\n  }\n#endif\n\n\n  /*\n  ** Cluster Connector Async Callback\n  */\n\n  typedef int(__stdcall *PXL_HPC_ASYNC_CALLBACK)(LPXLOPER12 operAsyncHandle, LPXLOPER12 operReturn);\n\n  /*\n  ** Cluster connector entry point return codes\n  */\n\n  constexpr int xlHpcRetSuccess = 0;\n  constexpr int xlHpcRetSessionIdInvalid = -1;\n  constexpr int xlHpcRetCallFailed = -2;\n\n\n  /*\n  ** Function number bits\n  */\n\n  constexpr int xlCommand = 0x8000;\n  constexpr int xlSpecial = 0x4000;\n  constexpr int xlIntl = 0x2000;\n  constexpr int xlPrompt = 0x1000;\n\n  /*\n  ** Auxiliary function numbers\n  **\n  ** These functions are available only from the C API,\n  ** not from the Excel macro language.\n  */\n\n  constexpr int xlFree = (0 | xlSpecial);\n  constexpr int xlStack = (1 | xlSpecial);\n  constexpr int xlCoerce = (2 | xlSpecial);\n  constexpr int xlSet = (3 | xlSpecial);\n  constexpr int xlSheetId = (4 | xlSpecial);\n  constexpr int xlSheetNm = (5 | xlSpecial);\n  constexpr int xlAbort = (6 | xlSpecial);\n  constexpr int xlGetInst = (7 | xlSpecial); /* Returns application's hinstance as an integer value, supported on 32-bit platform only */\n  constexpr int xlGetHwnd = (8 | xlSpecial);\n  constexpr int xlGetName = (9 | xlSpecial);\n  constexpr int xlEnableXLMsgs = (10 | xlSpecial);\n  constexpr int xlDisableXLMsgs = (11 | xlSpecial);\n  constexpr int xlDefineBinaryName = (12 | xlSpecial);\n  constexpr int xlGetBinaryName = (13 | xlSpecial);\n  /* GetFooInfo are valid only for calls to LPenHelper */\n constexpr int xlGetFmlaInfo\t= (14 | xlSpecial);\n constexpr int xlGetMouseInfo = (15 | xlSpecial);\n constexpr int xlAsyncReturn\t= (16 | xlSpecial);\t/*Set return value from an asynchronous function call*/\n constexpr int xlEventRegister = (17 | xlSpecial);\t/*Register an XLL event*/\n constexpr int xlRunningOnCluster = (18 | xlSpecial);\t/*Returns true if running on Compute Cluster*/\n constexpr int xlGetInstPtr = (19 | xlSpecial);\t/* Returns application's hinstance as a handle, supported on both 32-bit and 64-bit platforms */\n\n  /* edit modes */\n  constexpr int xlModeReady = 0;\t// not in edit mode\n  constexpr int xlModeEnter = 1;\t// enter mode\n  constexpr int xlModeEdit = 2;\t// edit mode\n  constexpr int xlModePoint = 4;\t// point mode\n\n  /* document(page) types */\n   constexpr int dtNil = 0x7f;\t// window is not a sheet, macro, chart or basic\n  // OR window is not the selected window at idle state\n  constexpr int dtSheet = 0;// sheet\n  constexpr int dtProc = 1;\t// XLM macro\n  constexpr int dtChart = 2;// Chart\n  constexpr int dtBasic = 6;\t// VBA \n\n   /* hit test codes */\n   constexpr int htNone = 0x00;\t// none of below\n   constexpr int htClient = 0x01;\t// internal for \"in the client are\", should never see\n   constexpr int htVSplit = 0x02;\t// vertical split area with split panes\n   constexpr int htHSplit = 0x03;\t// horizontal split area\n   constexpr int htColWidth = 0x04;\t// column width adjuster area\n   constexpr int htRwHeight = 0x05;\t// row height adjuster area\n   constexpr int htRwColHdr = 0x06;\t// the intersection of row and column headers\n   constexpr int htObject = 0x07;\t// the body of an object\n   // the following are for size handles of draw objects\n   constexpr int htTopLeft = 0x08;\n   constexpr int htBotLeft = 0x09;\n   constexpr int htLeft = 0x0A;\n   constexpr int htTopRight = 0x0B;\n   constexpr int htBotRight = 0x0C;\n   constexpr int htRight = 0x0D;\n   constexpr int htTop = 0x0E;\n   constexpr int htBot = 0x0F;\n   // end size handles\n   constexpr int htRwGut = 0x10;\t// row area of outline gutter\n   constexpr int htColGut = 0x11;\t// column area of outline gutter\n   constexpr int htTextBox = 0x12;\t// body of a text box (where we shouw I-Beam cursor)\n   constexpr int htRwLevels = 0x13;\t// row levels buttons of outline gutter\n   constexpr int htColLevels = 0x14;\t// column levels buttons of outline gutter\n   constexpr int htDman = 0x15;\t// the drag/drop handle of the selection\n   constexpr int htDmanFill = 0x16;\t// the auto-fill handle of the selection\n   constexpr int htXSplit = 0x17;\t// the intersection of the horz & vert pane splits\n   constexpr int htVertex = 0x18;\t// a vertex of a polygon draw object\n   constexpr int htAddVtx = 0x19;\t// htVertex in add a vertex mode\n   constexpr int htDelVtx = 0x1A;\t// htVertex in delete a vertex mode\n   constexpr int htRwHdr = 0x1B;\t// row header\n   constexpr int htColHdr = 0x1C;\t// column header\n   constexpr int htRwShow = 0x1D;\t// Like htRowHeight except means grow a hidden column\n   constexpr int htColShow = 0x1E;\t// column version of htRwShow\n   constexpr int htSizing = 0x1F;\t// Internal use only\n   constexpr int htSxpivot = 0x20;// a drag/drop tile in a pivot table\n   constexpr int htTabs = 0x21;\t// the sheet paging tabs\n   constexpr int htEdit = 0x22;\t// Internal use only\n\n  typedef struct _fmlainfo\n  {\n    int wPointMode;\t// current edit mode.  0 => rest of struct undefined\n    int cch;\t// count of characters in formula\n    char *lpch;\t// poinconstexpr unsignedter to formula characters.  READ ONLY!!!\n    int ichFirst;\t// char offset to start of selection\n    int ichLast;\t// char offset to end of selection (may be > cch)\n    int ichCaret;\t// char offset to blinking caret\n  } FMLAINFO;\n\n\n  /*\n  ** User defined function\n  **\n  ** First argument should be a function reference.\n  */\n\nconstexpr int xlUDF = 255;\n\n// Excel function numbers\nconstexpr int xlfCount = 0;\nconstexpr int xlfIsna = 2;\nconstexpr int xlfIserror = 3;\nconstexpr int xlfSum = 4;\nconstexpr int xlfAverage = 5;\nconstexpr int xlfMin = 6;\nconstexpr int xlfMax = 7;\nconstexpr int xlfRow = 8;\nconstexpr int xlfColumn = 9;\nconstexpr int xlfNa = 10;\nconstexpr int xlfNpv = 11;\nconstexpr int xlfStdev = 12;\nconstexpr int xlfDollar = 13;\nconstexpr int xlfFixed = 14;\nconstexpr int xlfSin = 15;\nconstexpr int xlfCos = 16;\nconstexpr int xlfTan = 17;\nconstexpr int xlfAtan = 18;\nconstexpr int xlfPi = 19;\nconstexpr int xlfSqrt = 20;\nconstexpr int xlfExp = 21;\nconstexpr int xlfLn = 22;\nconstexpr int xlfLog10 = 23;\nconstexpr int xlfAbs = 24;\nconstexpr int xlfInt = 25;\nconstexpr int xlfSign = 26;\nconstexpr int xlfRound = 27;\nconstexpr int xlfLookup = 28;\nconstexpr int xlfIndex = 29;\nconstexpr int xlfRept = 30;\nconstexpr int xlfMid = 31;\nconstexpr int xlfLen = 32;\nconstexpr int xlfValue = 33;\nconstexpr int xlfTrue = 34;\nconstexpr int xlfFalse = 35;\nconstexpr int xlfAnd = 36;\nconstexpr int xlfOr = 37;\nconstexpr int xlfNot = 38;\nconstexpr int xlfMod = 39;\nconstexpr int xlfDcount = 40;\nconstexpr int xlfDsum = 41;\nconstexpr int xlfDaverage = 42;\nconstexpr int xlfDmin = 43;\nconstexpr int xlfDmax = 44;\nconstexpr int xlfDstdev = 45;\nconstexpr int xlfVar = 46;\nconstexpr int xlfDvar = 47;\nconstexpr int xlfText = 48;\nconstexpr int xlfLinest = 49;\nconstexpr int xlfTrend = 50;\nconstexpr int xlfLogest = 51;\nconstexpr int xlfGrowth = 52;\nconstexpr int xlfGoto = 53;\nconstexpr int xlfHalt = 54;\nconstexpr int xlfPv = 56;\nconstexpr int xlfFv = 57;\nconstexpr int xlfNper = 58;\nconstexpr int xlfPmt = 59;\nconstexpr int xlfRate = 60;\nconstexpr int xlfMirr = 61;\nconstexpr int xlfIrr = 62;\nconstexpr int xlfRand = 63;\nconstexpr int xlfMatch = 64;\nconstexpr int xlfDate = 65;\nconstexpr int xlfTime = 66;\nconstexpr int xlfDay = 67;\nconstexpr int xlfMonth = 68;\nconstexpr int xlfYear = 69;\nconstexpr int xlfWeekday = 70;\nconstexpr int xlfHour = 71;\nconstexpr int xlfMinute = 72;\nconstexpr int xlfSecond = 73;\nconstexpr int xlfNow = 74;\nconstexpr int xlfAreas = 75;\nconstexpr int xlfRows = 76;\nconstexpr int xlfColumns = 77;\nconstexpr int xlfOffset = 78;\nconstexpr int xlfAbsref = 79;\nconstexpr int xlfRelref = 80;\nconstexpr int xlfArgument = 81;\nconstexpr int xlfSearch = 82;\nconstexpr int xlfTranspose = 83;\nconstexpr int xlfError = 84;\nconstexpr int xlfStep = 85;\nconstexpr int xlfType = 86;\nconstexpr int xlfEcho = 87;\nconstexpr int xlfSetName = 88;\nconstexpr int xlfCaller = 89;\nconstexpr int xlfDeref = 90;\nconstexpr int xlfWindows = 91;\nconstexpr int xlfSeries = 92;\nconstexpr int xlfDocuments = 93;\nconstexpr int xlfActiveCell = 94;\nconstexpr int xlfSelection = 95;\nconstexpr int xlfResult = 96;\nconstexpr int xlfAtan2 = 97;\nconstexpr int xlfAsin = 98;\nconstexpr int xlfAcos = 99;\nconstexpr int xlfChoose = 100;\nconstexpr int xlfHlookup = 101;\nconstexpr int xlfVlookup = 102;\nconstexpr int xlfLinks = 103;\nconstexpr int xlfInput = 104;\nconstexpr int xlfIsref = 105;\nconstexpr int xlfGetFormula = 106;\nconstexpr int xlfGetName = 107;\nconstexpr int xlfSetValue = 108;\nconstexpr int xlfLog = 109;\nconstexpr int xlfExec = 110;\nconstexpr int xlfChar = 111;\nconstexpr int xlfLower = 112;\nconstexpr int xlfUpper = 113;\nconstexpr int xlfProper = 114;\nconstexpr int xlfLeft = 115;\nconstexpr int xlfRight = 116;\nconstexpr int xlfExact = 117;\nconstexpr int xlfTrim = 118;\nconstexpr int xlfReplace = 119;\nconstexpr int xlfSubstitute = 120;\nconstexpr int xlfCode = 121;\nconstexpr int xlfNames = 122;\nconstexpr int xlfDirectory = 123;\nconstexpr int xlfFind = 124;\nconstexpr int xlfCell = 125;\nconstexpr int xlfIserr = 126;\nconstexpr int xlfIstext = 127;\nconstexpr int xlfIsnumber = 128;\nconstexpr int xlfIsblank = 129;\nconstexpr int xlfT = 130;\nconstexpr int xlfN = 131;\nconstexpr int xlfFopen = 132;\nconstexpr int xlfFclose = 133;\nconstexpr int xlfFsize = 134;\nconstexpr int xlfFreadln = 135;\nconstexpr int xlfFread = 136;\nconstexpr int xlfFwriteln = 137;\nconstexpr int xlfFwrite = 138;\nconstexpr int xlfFpos = 139;\nconstexpr int xlfDatevalue = 140;\nconstexpr int xlfTimevalue = 141;\nconstexpr int xlfSln = 142;\nconstexpr int xlfSyd = 143;\nconstexpr int xlfDdb = 144;\nconstexpr int xlfGetDef = 145;\nconstexpr int xlfReftext = 146;\nconstexpr int xlfTextref = 147;\nconstexpr int xlfIndirect = 148;\nconstexpr int xlfRegister = 149;\nconstexpr int xlfCall = 150;\nconstexpr int xlfAddBar = 151;\nconstexpr int xlfAddMenu = 152;\nconstexpr int xlfAddCommand = 153;\nconstexpr int xlfEnableCommand = 154;\nconstexpr int xlfCheckCommand = 155;\nconstexpr int xlfRenameCommand = 156;\nconstexpr int xlfShowBar = 157;\nconstexpr int xlfDeleteMenu = 158;\nconstexpr int xlfDeleteCommand = 159;\nconstexpr int xlfGetChartItem = 160;\nconstexpr int xlfDialogBox = 161;\nconstexpr int xlfClean = 162;\nconstexpr int xlfMdeterm = 163;\nconstexpr int xlfMinverse = 164;\nconstexpr int xlfMmult = 165;\nconstexpr int xlfFiles = 166;\nconstexpr int xlfIpmt = 167;\nconstexpr int xlfPpmt = 168;\nconstexpr int xlfCounta = 169;\nconstexpr int xlfCancelKey = 170;\nconstexpr int xlfInitiate = 175;\nconstexpr int xlfRequest = 176;\nconstexpr int xlfPoke = 177;\nconstexpr int xlfExecute = 178;\nconstexpr int xlfTerminate = 179;\nconstexpr int xlfRestart = 180;\nconstexpr int xlfHelp = 181;\nconstexpr int xlfGetBar = 182;\nconstexpr int xlfProduct = 183;\nconstexpr int xlfFact = 184;\nconstexpr int xlfGetCell = 185;\nconstexpr int xlfGetWorkspace = 186;\nconstexpr int xlfGetWindow = 187;\nconstexpr int xlfGetDocument = 188;\nconstexpr int xlfDproduct = 189;\nconstexpr int xlfIsnontext = 190;\nconstexpr int xlfGetNote = 191;\nconstexpr int xlfNote = 192;\nconstexpr int xlfStdevp = 193;\nconstexpr int xlfVarp = 194;\nconstexpr int xlfDstdevp = 195;\nconstexpr int xlfDvarp = 196;\nconstexpr int xlfTrunc = 197;\nconstexpr int xlfIslogical = 198;\nconstexpr int xlfDcounta = 199;\nconstexpr int xlfDeleteBar = 200;\nconstexpr int xlfUnregister = 201;\nconstexpr int xlfUsdollar = 204;\nconstexpr int xlfFindb = 205;\nconstexpr int xlfSearchb = 206;\nconstexpr int xlfReplaceb = 207;\nconstexpr int xlfLeftb = 208;\nconstexpr int xlfRightb = 209;\nconstexpr int xlfMidb = 210;\nconstexpr int xlfLenb = 211;\nconstexpr int xlfRoundup = 212;\nconstexpr int xlfRounddown = 213;\nconstexpr int xlfAsc = 214;\nconstexpr int xlfDbcs = 215;\nconstexpr int xlfRank = 216;\nconstexpr int xlfAddress = 219;\nconstexpr int xlfDays360 = 220;\nconstexpr int xlfToday = 221;\nconstexpr int xlfVdb = 222;\nconstexpr int xlfMedian = 227;\nconstexpr int xlfSumproduct = 228;\nconstexpr int xlfSinh = 229;\nconstexpr int xlfCosh = 230;\nconstexpr int xlfTanh = 231;\nconstexpr int xlfAsinh = 232;\nconstexpr int xlfAcosh = 233;\nconstexpr int xlfAtanh = 234;\nconstexpr int xlfDget = 235;\nconstexpr int xlfCreateObject = 236;\nconstexpr int xlfVolatile = 237;\nconstexpr int xlfLastError = 238;\nconstexpr int xlfCustomUndo = 239;\nconstexpr int xlfCustomRepeat = 240;\nconstexpr int xlfFormulaConvert = 241;\nconstexpr int xlfGetLinkInfo = 242;\nconstexpr int xlfTextBox = 243;\nconstexpr int xlfInfo = 244;\nconstexpr int xlfGroup = 245;\nconstexpr int xlfGetObject = 246;\nconstexpr int xlfDb = 247;\nconstexpr int xlfPause = 248;\nconstexpr int xlfResume = 251;\nconstexpr int xlfFrequency = 252;\nconstexpr int xlfAddToolbar = 253;\nconstexpr int xlfDeleteToolbar = 254;\nconstexpr int xlfResetToolbar = 256;\nconstexpr int xlfEvaluate = 257;\nconstexpr int xlfGetToolbar = 258;\nconstexpr int xlfGetTool = 259;\nconstexpr int xlfSpellingCheck = 260;\nconstexpr int xlfErrorType = 261;\nconstexpr int xlfAppTitle = 262;\nconstexpr int xlfWindowTitle = 263;\nconstexpr int xlfSaveToolbar = 264;\nconstexpr int xlfEnableTool = 265;\nconstexpr int xlfPressTool = 266;\nconstexpr int xlfRegisterId = 267;\nconstexpr int xlfGetWorkbook = 268;\nconstexpr int xlfAvedev = 269;\nconstexpr int xlfBetadist = 270;\nconstexpr int xlfGammaln = 271;\nconstexpr int xlfBetainv = 272;\nconstexpr int xlfBinomdist = 273;\nconstexpr int xlfChidist = 274;\nconstexpr int xlfChiinv = 275;\nconstexpr int xlfCombin = 276;\nconstexpr int xlfConfidence = 277;\nconstexpr int xlfCritbinom = 278;\nconstexpr int xlfEven = 279;\nconstexpr int xlfExpondist = 280;\nconstexpr int xlfFdist = 281;\nconstexpr int xlfFinv = 282;\nconstexpr int xlfFisher = 283;\nconstexpr int xlfFisherinv = 284;\nconstexpr int xlfFloor = 285;\nconstexpr int xlfGammadist = 286;\nconstexpr int xlfGammainv = 287;\nconstexpr int xlfCeiling = 288;\nconstexpr int xlfHypgeomdist = 289;\nconstexpr int xlfLognormdist = 290;\nconstexpr int xlfLoginv = 291;\nconstexpr int xlfNegbinomdist = 292;\nconstexpr int xlfNormdist = 293;\nconstexpr int xlfNormsdist = 294;\nconstexpr int xlfNorminv = 295;\nconstexpr int xlfNormsinv = 296;\nconstexpr int xlfStandardize = 297;\nconstexpr int xlfOdd = 298;\nconstexpr int xlfPermut = 299;\nconstexpr int xlfPoisson = 300;\nconstexpr int xlfTdist = 301;\nconstexpr int xlfWeibull = 302;\nconstexpr int xlfSumxmy2 = 303;\nconstexpr int xlfSumx2my2 = 304;\nconstexpr int xlfSumx2py2 = 305;\nconstexpr int xlfChitest = 306;\nconstexpr int xlfCorrel = 307;\nconstexpr int xlfCovar = 308;\nconstexpr int xlfForecast = 309;\nconstexpr int xlfFtest = 310;\nconstexpr int xlfIntercept = 311;\nconstexpr int xlfPearson = 312;\nconstexpr int xlfRsq = 313;\nconstexpr int xlfSteyx = 314;\nconstexpr int xlfSlope = 315;\nconstexpr int xlfTtest = 316;\nconstexpr int xlfProb = 317;\nconstexpr int xlfDevsq = 318;\nconstexpr int xlfGeomean = 319;\nconstexpr int xlfHarmean = 320;\nconstexpr int xlfSumsq = 321;\nconstexpr int xlfKurt = 322;\nconstexpr int xlfSkew = 323;\nconstexpr int xlfZtest = 324;\nconstexpr int xlfLarge = 325;\nconstexpr int xlfSmall = 326;\nconstexpr int xlfQuartile = 327;\nconstexpr int xlfPercentile = 328;\nconstexpr int xlfPercentrank = 329;\nconstexpr int xlfMode = 330;\nconstexpr int xlfTrimmean = 331;\nconstexpr int xlfTinv = 332;\nconstexpr int xlfMovieCommand = 334;\nconstexpr int xlfGetMovie = 335;\nconstexpr int xlfConcatenate = 336;\nconstexpr int xlfPower = 337;\nconstexpr int xlfPivotAddData = 338;\nconstexpr int xlfGetPivotTable = 339;\nconstexpr int xlfGetPivotField = 340;\nconstexpr int xlfGetPivotItem = 341;\nconstexpr int xlfRadians = 342;\nconstexpr int xlfDegrees = 343;\nconstexpr int xlfSubtotal = 344;\nconstexpr int xlfSumif = 345;\nconstexpr int xlfCountif = 346;\nconstexpr int xlfCountblank = 347;\nconstexpr int xlfScenarioGet = 348;\nconstexpr int xlfOptionsListsGet = 349;\nconstexpr int xlfIspmt = 350;\nconstexpr int xlfDatedif = 351;\nconstexpr int xlfDatestring = 352;\nconstexpr int xlfNumberstring = 353;\nconstexpr int xlfRoman = 354;\nconstexpr int xlfOpenDialog = 355;\nconstexpr int xlfSaveDialog = 356;\nconstexpr int xlfViewGet = 357;\nconstexpr int xlfGetpivotdata = 358;\nconstexpr int xlfHyperlink = 359;\nconstexpr int xlfPhonetic = 360;\nconstexpr int xlfAveragea = 361;\nconstexpr int xlfMaxa = 362;\nconstexpr int xlfMina = 363;\nconstexpr int xlfStdevpa = 364;\nconstexpr int xlfVarpa = 365;\nconstexpr int xlfStdeva = 366;\nconstexpr int xlfVara = 367;\nconstexpr int xlfBahttext = 368;\nconstexpr int xlfThaidayofweek = 369;\nconstexpr int xlfThaidigit = 370;\nconstexpr int xlfThaimonthofyear = 371;\nconstexpr int xlfThainumsound = 372;\nconstexpr int xlfThainumstring = 373;\nconstexpr int xlfThaistringlength = 374;\nconstexpr int xlfIsthaidigit = 375;\nconstexpr int xlfRoundbahtdown = 376;\nconstexpr int xlfRoundbahtup = 377;\nconstexpr int xlfThaiyear = 378;\nconstexpr int xlfRtd = 379;\nconstexpr int xlfCubevalue = 380;\nconstexpr int xlfCubemember = 381;\nconstexpr int xlfCubememberproperty = 382;\nconstexpr int xlfCuberankedmember = 383;\nconstexpr int xlfHex2bin = 384;\nconstexpr int xlfHex2dec = 385;\nconstexpr int xlfHex2oct = 386;\nconstexpr int xlfDec2bin = 387;\nconstexpr int xlfDec2hex = 388;\nconstexpr int xlfDec2oct = 389;\nconstexpr int xlfOct2bin = 390;\nconstexpr int xlfOct2hex = 391;\nconstexpr int xlfOct2dec = 392;\nconstexpr int xlfBin2dec = 393;\nconstexpr int xlfBin2oct = 394;\nconstexpr int xlfBin2hex = 395;\nconstexpr int xlfImsub = 396;\nconstexpr int xlfImdiv = 397;\nconstexpr int xlfImpower = 398;\nconstexpr int xlfImabs = 399;\nconstexpr int xlfImsqrt = 400;\nconstexpr int xlfImln = 401;\nconstexpr int xlfImlog2 = 402;\nconstexpr int xlfImlog10 = 403;\nconstexpr int xlfImsin = 404;\nconstexpr int xlfImcos = 405;\nconstexpr int xlfImexp = 406;\nconstexpr int xlfImargument = 407;\nconstexpr int xlfImconjugate = 408;\nconstexpr int xlfImaginary = 409;\nconstexpr int xlfImreal = 410;\nconstexpr int xlfComplex = 411;\nconstexpr int xlfImsum = 412;\nconstexpr int xlfImproduct = 413;\nconstexpr int xlfSeriessum = 414;\nconstexpr int xlfFactdouble = 415;\nconstexpr int xlfSqrtpi = 416;\nconstexpr int xlfQuotient = 417;\nconstexpr int xlfDelta = 418;\nconstexpr int xlfGestep = 419;\nconstexpr int xlfIseven = 420;\nconstexpr int xlfIsodd = 421;\nconstexpr int xlfMround = 422;\nconstexpr int xlfErf = 423;\nconstexpr int xlfErfc = 424;\nconstexpr int xlfBesselj = 425;\nconstexpr int xlfBesselk = 426;\nconstexpr int xlfBessely = 427;\nconstexpr int xlfBesseli = 428;\nconstexpr int xlfXirr = 429;\nconstexpr int xlfXnpv = 430;\nconstexpr int xlfPricemat = 431;\nconstexpr int xlfYieldmat = 432;\nconstexpr int xlfIntrate = 433;\nconstexpr int xlfReceived = 434;\nconstexpr int xlfDisc = 435;\nconstexpr int xlfPricedisc = 436;\nconstexpr int xlfYielddisc = 437;\nconstexpr int xlfTbilleq = 438;\nconstexpr int xlfTbillprice = 439;\nconstexpr int xlfTbillyield = 440;\nconstexpr int xlfPrice = 441;\nconstexpr int xlfYield = 442;\nconstexpr int xlfDollarde = 443;\nconstexpr int xlfDollarfr = 444;\nconstexpr int xlfNominal = 445;\nconstexpr int xlfEffect = 446;\nconstexpr int xlfCumprinc = 447;\nconstexpr int xlfCumipmt = 448;\nconstexpr int xlfEdate = 449;\nconstexpr int xlfEomonth = 450;\nconstexpr int xlfYearfrac = 451;\nconstexpr int xlfCoupdaybs = 452;\nconstexpr int xlfCoupdays = 453;\nconstexpr int xlfCoupdaysnc = 454;\nconstexpr int xlfCoupncd = 455;\nconstexpr int xlfCoupnum = 456;\nconstexpr int xlfCouppcd = 457;\nconstexpr int xlfDuration = 458;\nconstexpr int xlfMduration = 459;\nconstexpr int xlfOddlprice = 460;\nconstexpr int xlfOddlyield = 461;\nconstexpr int xlfOddfprice = 462;\nconstexpr int xlfOddfyield = 463;\nconstexpr int xlfRandbetween = 464;\nconstexpr int xlfWeeknum = 465;\nconstexpr int xlfAmordegrc = 466;\nconstexpr int xlfAmorlinc = 467;\nconstexpr int xlfConvert = 468;\nconstexpr int xlfAccrint = 469;\nconstexpr int xlfAccrintm = 470;\nconstexpr int xlfWorkday = 471;\nconstexpr int xlfNetworkdays = 472;\nconstexpr int xlfGcd = 473;\nconstexpr int xlfMultinomial = 474;\nconstexpr int xlfLcm = 475;\nconstexpr int xlfFvschedule = 476;\nconstexpr int xlfCubekpimember = 477;\nconstexpr int xlfCubeset = 478;\nconstexpr int xlfCubesetcount = 479;\nconstexpr int xlfIferror = 480;\nconstexpr int xlfCountifs = 481;\nconstexpr int xlfSumifs = 482;\nconstexpr int xlfAverageif = 483;\nconstexpr int xlfAverageifs = 484;\nconstexpr int xlfAggregate = 485;\nconstexpr int xlfBinom_dist = 486;\nconstexpr int xlfBinom_inv = 487;\nconstexpr int xlfConfidence_norm = 488;\nconstexpr int xlfConfidence_t = 489;\nconstexpr int xlfChisq_test = 490;\nconstexpr int xlfF_test = 491;\nconstexpr int xlfCovariance_p = 492;\nconstexpr int xlfCovariance_s = 493;\nconstexpr int xlfExpon_dist = 494;\nconstexpr int xlfGamma_dist = 495;\nconstexpr int xlfGamma_inv = 496;\nconstexpr int xlfMode_mult = 497;\nconstexpr int xlfMode_sngl = 498;\nconstexpr int xlfNorm_dist = 499;\nconstexpr int xlfNorm_inv = 500;\nconstexpr int xlfPercentile_exc = 501;\nconstexpr int xlfPercentile_inc = 502;\nconstexpr int xlfPercentrank_exc = 503;\nconstexpr int xlfPercentrank_inc = 504;\nconstexpr int xlfPoisson_dist = 505;\nconstexpr int xlfQuartile_exc = 506;\nconstexpr int xlfQuartile_inc = 507;\nconstexpr int xlfRank_avg = 508;\nconstexpr int xlfRank_eq = 509;\nconstexpr int xlfStdev_s = 510;\nconstexpr int xlfStdev_p = 511;\nconstexpr int xlfT_dist = 512;\nconstexpr int xlfT_dist_2t = 513;\nconstexpr int xlfT_dist_rt = 514;\nconstexpr int xlfT_inv = 515;\nconstexpr int xlfT_inv_2t = 516;\nconstexpr int xlfVar_s = 517;\nconstexpr int xlfVar_p = 518;\nconstexpr int xlfWeibull_dist = 519;\nconstexpr int xlfNetworkdays_intl = 520;\nconstexpr int xlfWorkday_intl = 521;\nconstexpr int xlfEcma_ceiling = 522;\nconstexpr int xlfIso_ceiling = 523;\nconstexpr int xlfBeta_dist = 525;\nconstexpr int xlfBeta_inv = 526;\nconstexpr int xlfChisq_dist = 527;\nconstexpr int xlfChisq_dist_rt = 528;\nconstexpr int xlfChisq_inv = 529;\nconstexpr int xlfChisq_inv_rt = 530;\nconstexpr int xlfF_dist = 531;\nconstexpr int xlfF_dist_rt = 532;\nconstexpr int xlfF_inv = 533;\nconstexpr int xlfF_inv_rt = 534;\nconstexpr int xlfHypgeom_dist = 535;\nconstexpr int xlfLognorm_dist = 536;\nconstexpr int xlfLognorm_inv = 537;\nconstexpr int xlfNegbinom_dist = 538;\nconstexpr int xlfNorm_s_dist = 539;\nconstexpr int xlfNorm_s_inv = 540;\nconstexpr int xlfT_test = 541;\nconstexpr int xlfZ_test = 542;\nconstexpr int xlfErf_precise = 543;\nconstexpr int xlfErfc_precise = 544;\nconstexpr int xlfGammaln_precise = 545;\nconstexpr int xlfCeiling_precise = 546;\nconstexpr int xlfFloor_precise = 547;\nconstexpr int xlfAcot = 548;\nconstexpr int xlfAcoth = 549;\nconstexpr int xlfCot = 550;\nconstexpr int xlfCoth = 551;\nconstexpr int xlfCsc = 552;\nconstexpr int xlfCsch = 553;\nconstexpr int xlfSec = 554;\nconstexpr int xlfSech = 555;\nconstexpr int xlfImtan = 556;\nconstexpr int xlfImcot = 557;\nconstexpr int xlfImcsc = 558;\nconstexpr int xlfImcsch = 559;\nconstexpr int xlfImsec = 560;\nconstexpr int xlfImsech = 561;\nconstexpr int xlfBitand = 562;\nconstexpr int xlfBitor = 563;\nconstexpr int xlfBitxor = 564;\nconstexpr int xlfBitlshift = 565;\nconstexpr int xlfBitrshift = 566;\nconstexpr int xlfPermutationa = 567;\nconstexpr int xlfCombina = 568;\nconstexpr int xlfXor = 569;\nconstexpr int xlfPduration = 570;\nconstexpr int xlfBase = 571;\nconstexpr int xlfDecimal = 572;\nconstexpr int xlfDays = 573;\nconstexpr int xlfBinom_dist_range = 574;\nconstexpr int xlfGamma = 575;\nconstexpr int xlfSkew_p = 576;\nconstexpr int xlfGauss = 577;\nconstexpr int xlfPhi = 578;\nconstexpr int xlfRri = 579;\nconstexpr int xlfUnichar = 580;\nconstexpr int xlfUnicode = 581;\nconstexpr int xlfMunit = 582;\nconstexpr int xlfArabic = 583;\nconstexpr int xlfIsoweeknum = 584;\nconstexpr int xlfNumbervalue = 585;\nconstexpr int xlfSheet = 586;\nconstexpr int xlfSheets = 587;\nconstexpr int xlfFormulatext = 588;\nconstexpr int xlfIsformula = 589;\nconstexpr int xlfIfna = 590;\nconstexpr int xlfCeiling_math = 591;\nconstexpr int xlfFloor_math = 592;\nconstexpr int xlfImsinh = 593;\nconstexpr int xlfImcosh = 594;\nconstexpr int xlfFilterxml = 595;\nconstexpr int xlfWebservice = 596;\nconstexpr int xlfEncodeurl = 597;\nconstexpr int xlfFilter = 614;\n\n/* Excel command numbers */\nconstexpr int xlcBeep = 0 | xlCommand;\nconstexpr int xlcOpen = 1 | xlCommand;\nconstexpr int xlcOpenLinks = 2 | xlCommand;\nconstexpr int xlcCloseAll = 3 | xlCommand;\nconstexpr int xlcSave = 4 | xlCommand;\nconstexpr int xlcSaveAs = 5 | xlCommand;\nconstexpr int xlcFileDelete = 6 | xlCommand;\nconstexpr int xlcPageSetup = 7 | xlCommand;\nconstexpr int xlcPrint = 8 | xlCommand;\nconstexpr int xlcPrinterSetup = 9 | xlCommand;\nconstexpr int xlcQuit = 10 | xlCommand;\nconstexpr int xlcNewWindow = 11 | xlCommand;\nconstexpr int xlcArrangeAll = 12 | xlCommand;\nconstexpr int xlcWindowSize = 13 | xlCommand;\nconstexpr int xlcWindowMove = 14 | xlCommand;\nconstexpr int xlcFull = 15 | xlCommand;\nconstexpr int xlcClose = 16 | xlCommand;\nconstexpr int xlcRun = 17 | xlCommand;\nconstexpr int xlcSetPrintArea = 22 | xlCommand;\nconstexpr int xlcSetPrintTitles = 23 | xlCommand;\nconstexpr int xlcSetPageBreak = 24 | xlCommand;\nconstexpr int xlcRemovePageBreak = 25 | xlCommand;\nconstexpr int xlcFont = 26 | xlCommand;\nconstexpr int xlcDisplay = 27 | xlCommand;\nconstexpr int xlcProtectDocument = 28 | xlCommand;\nconstexpr int xlcPrecision = 29 | xlCommand;\nconstexpr int xlcA1R1c1 = 30 | xlCommand;\nconstexpr int xlcCalculateNow = 31 | xlCommand;\nconstexpr int xlcCalculation = 32 | xlCommand;\nconstexpr int xlcDataFind = 34 | xlCommand;\nconstexpr int xlcExtract = 35 | xlCommand;\nconstexpr int xlcDataDelete = 36 | xlCommand;\nconstexpr int xlcSetDatabase = 37 | xlCommand;\nconstexpr int xlcSetCriteria = 38 | xlCommand;\nconstexpr int xlcSort = 39 | xlCommand;\nconstexpr int xlcDataSeries = 40 | xlCommand;\nconstexpr int xlcTable = 41 | xlCommand;\nconstexpr int xlcFormatNumber = 42 | xlCommand;\nconstexpr int xlcAlignment = 43 | xlCommand;\nconstexpr int xlcStyle = 44 | xlCommand;\nconstexpr int xlcBorder = 45 | xlCommand;\nconstexpr int xlcCellProtection = 46 | xlCommand;\nconstexpr int xlcColumnWidth = 47 | xlCommand;\nconstexpr int xlcUndo = 48 | xlCommand;\nconstexpr int xlcCut = 49 | xlCommand;\nconstexpr int xlcCopy = 50 | xlCommand;\nconstexpr int xlcPaste = 51 | xlCommand;\nconstexpr int xlcClear = 52 | xlCommand;\nconstexpr int xlcPasteSpecial = 53 | xlCommand;\nconstexpr int xlcEditDelete = 54 | xlCommand;\nconstexpr int xlcInsert = 55 | xlCommand;\nconstexpr int xlcFillRight = 56 | xlCommand;\nconstexpr int xlcFillDown = 57 | xlCommand;\nconstexpr int xlcDefineName = 61 | xlCommand;\nconstexpr int xlcCreateNames = 62 | xlCommand;\nconstexpr int xlcFormulaGoto = 63 | xlCommand;\nconstexpr int xlcFormulaFind = 64 | xlCommand;\nconstexpr int xlcSelectLastCell = 65 | xlCommand;\nconstexpr int xlcShowActiveCell = 66 | xlCommand;\nconstexpr int xlcGalleryArea = 67 | xlCommand;\nconstexpr int xlcGalleryBar = 68 | xlCommand;\nconstexpr int xlcGalleryColumn = 69 | xlCommand;\nconstexpr int xlcGalleryLine = 70 | xlCommand;\nconstexpr int xlcGalleryPie = 71 | xlCommand;\nconstexpr int xlcGalleryScatter = 72 | xlCommand;\nconstexpr int xlcCombination = 73 | xlCommand;\nconstexpr int xlcPreferred = 74 | xlCommand;\nconstexpr int xlcAddOverlay = 75 | xlCommand;\nconstexpr int xlcGridlines = 76 | xlCommand;\nconstexpr int xlcSetPreferred = 77 | xlCommand;\nconstexpr int xlcAxes = 78 | xlCommand;\nconstexpr int xlcLegend = 79 | xlCommand;\nconstexpr int xlcAttachText = 80 | xlCommand;\nconstexpr int xlcAddArrow = 81 | xlCommand;\nconstexpr int xlcSelectChart = 82 | xlCommand;\nconstexpr int xlcSelectPlotArea = 83 | xlCommand;\nconstexpr int xlcPatterns = 84 | xlCommand;\nconstexpr int xlcMainChart = 85 | xlCommand;\nconstexpr int xlcOverlay = 86 | xlCommand;\nconstexpr int xlcScale = 87 | xlCommand;\nconstexpr int xlcFormatLegend = 88 | xlCommand;\nconstexpr int xlcFormatText = 89 | xlCommand;\nconstexpr int xlcEditRepeat = 90 | xlCommand;\nconstexpr int xlcParse = 91 | xlCommand;\nconstexpr int xlcJustify = 92 | xlCommand;\nconstexpr int xlcHide = 93 | xlCommand;\nconstexpr int xlcUnhide = 94 | xlCommand;\nconstexpr int xlcWorkspace = 95 | xlCommand;\nconstexpr int xlcFormula = 96 | xlCommand;\nconstexpr int xlcFormulaFill = 97 | xlCommand;\nconstexpr int xlcFormulaArray = 98 | xlCommand;\nconstexpr int xlcDataFindNext = 99 | xlCommand;\nconstexpr int xlcDataFindPrev = 100 | xlCommand;\nconstexpr int xlcFormulaFindNext = 101 | xlCommand;\nconstexpr int xlcFormulaFindPrev = 102 | xlCommand;\nconstexpr int xlcActivate = 103 | xlCommand;\nconstexpr int xlcActivateNext = 104 | xlCommand;\nconstexpr int xlcActivatePrev = 105 | xlCommand;\nconstexpr int xlcUnlockedNext = 106 | xlCommand;\nconstexpr int xlcUnlockedPrev = 107 | xlCommand;\nconstexpr int xlcCopyPicture = 108 | xlCommand;\nconstexpr int xlcSelect = 109 | xlCommand;\nconstexpr int xlcDeleteName = 110 | xlCommand;\nconstexpr int xlcDeleteFormat = 111 | xlCommand;\nconstexpr int xlcVline = 112 | xlCommand;\nconstexpr int xlcHline = 113 | xlCommand;\nconstexpr int xlcVpage = 114 | xlCommand;\nconstexpr int xlcHpage = 115 | xlCommand;\nconstexpr int xlcVscroll = 116 | xlCommand;\nconstexpr int xlcHscroll = 117 | xlCommand;\nconstexpr int xlcAlert = 118 | xlCommand;\nconstexpr int xlcNew = 119 | xlCommand;\nconstexpr int xlcCancelCopy = 120 | xlCommand;\nconstexpr int xlcShowClipboard = 121 | xlCommand;\nconstexpr int xlcMessage = 122 | xlCommand;\nconstexpr int xlcPasteLink = 124 | xlCommand;\nconstexpr int xlcAppActivate = 125 | xlCommand;\nconstexpr int xlcDeleteArrow = 126 | xlCommand;\nconstexpr int xlcRowHeight = 127 | xlCommand;\nconstexpr int xlcFormatMove = 128 | xlCommand;\nconstexpr int xlcFormatSize = 129 | xlCommand;\nconstexpr int xlcFormulaReplace = 130 | xlCommand;\nconstexpr int xlcSendKeys = 131 | xlCommand;\nconstexpr int xlcSelectSpecial = 132 | xlCommand;\nconstexpr int xlcApplyNames = 133 | xlCommand;\nconstexpr int xlcReplaceFont = 134 | xlCommand;\nconstexpr int xlcFreezePanes = 135 | xlCommand;\nconstexpr int xlcShowInfo = 136 | xlCommand;\nconstexpr int xlcSplit = 137 | xlCommand;\nconstexpr int xlcOnWindow = 138 | xlCommand;\nconstexpr int xlcOnData = 139 | xlCommand;\nconstexpr int xlcDisableInput = 140 | xlCommand;\nconstexpr int xlcEcho = 141 | xlCommand;\nconstexpr int xlcOutline = 142 | xlCommand;\nconstexpr int xlcListNames = 143 | xlCommand;\nconstexpr int xlcFileClose = 144 | xlCommand;\nconstexpr int xlcSaveWorkbook = 145 | xlCommand;\nconstexpr int xlcDataForm = 146 | xlCommand;\nconstexpr int xlcCopyChart = 147 | xlCommand;\nconstexpr int xlcOnTime = 148 | xlCommand;\nconstexpr int xlcWait = 149 | xlCommand;\nconstexpr int xlcFormatFont = 150 | xlCommand;\nconstexpr int xlcFillUp = 151 | xlCommand;\nconstexpr int xlcFillLeft = 152 | xlCommand;\nconstexpr int xlcDeleteOverlay = 153 | xlCommand;\nconstexpr int xlcNote = 154 | xlCommand;\nconstexpr int xlcShortMenus = 155 | xlCommand;\nconstexpr int xlcSetUpdateStatus = 159 | xlCommand;\nconstexpr int xlcColorPalette = 161 | xlCommand;\nconstexpr int xlcDeleteStyle = 162 | xlCommand;\nconstexpr int xlcWindowRestore = 163 | xlCommand;\nconstexpr int xlcWindowMaximize = 164 | xlCommand;\nconstexpr int xlcError = 165 | xlCommand;\nconstexpr int xlcChangeLink = 166 | xlCommand;\nconstexpr int xlcCalculateDocument = 167 | xlCommand;\nconstexpr int xlcOnKey = 168 | xlCommand;\nconstexpr int xlcAppRestore = 169 | xlCommand;\nconstexpr int xlcAppMove = 170 | xlCommand;\nconstexpr int xlcAppSize = 171 | xlCommand;\nconstexpr int xlcAppMinimize = 172 | xlCommand;\nconstexpr int xlcAppMaximize = 173 | xlCommand;\nconstexpr int xlcBringToFront = 174 | xlCommand;\nconstexpr int xlcSendToBack = 175 | xlCommand;\nconstexpr int xlcMainChartType = 185 | xlCommand;\nconstexpr int xlcOverlayChartType = 186 | xlCommand;\nconstexpr int xlcSelectEnd = 187 | xlCommand;\nconstexpr int xlcOpenMail = 188 | xlCommand;\nconstexpr int xlcSendMail = 189 | xlCommand;\nconstexpr int xlcStandardFont = 190 | xlCommand;\nconstexpr int xlcConsolidate = 191 | xlCommand;\nconstexpr int xlcSortSpecial = 192 | xlCommand;\nconstexpr int xlcGallery3dArea = 193 | xlCommand;\nconstexpr int xlcGallery3dColumn = 194 | xlCommand;\nconstexpr int xlcGallery3dLine = 195 | xlCommand;\nconstexpr int xlcGallery3dPie = 196 | xlCommand;\nconstexpr int xlcView3d = 197 | xlCommand;\nconstexpr int xlcGoalSeek = 198 | xlCommand;\nconstexpr int xlcWorkgroup = 199 | xlCommand;\nconstexpr int xlcFillGroup = 200 | xlCommand;\nconstexpr int xlcUpdateLink = 201 | xlCommand;\nconstexpr int xlcPromote = 202 | xlCommand;\nconstexpr int xlcDemote = 203 | xlCommand;\nconstexpr int xlcShowDetail = 204 | xlCommand;\nconstexpr int xlcUngroup = 206 | xlCommand;\nconstexpr int xlcObjectProperties = 207 | xlCommand;\nconstexpr int xlcSaveNewObject = 208 | xlCommand;\nconstexpr int xlcShare = 209 | xlCommand;\nconstexpr int xlcShareName = 210 | xlCommand;\nconstexpr int xlcDuplicate = 211 | xlCommand;\nconstexpr int xlcApplyStyle = 212 | xlCommand;\nconstexpr int xlcAssignToObject = 213 | xlCommand;\nconstexpr int xlcObjectProtection = 214 | xlCommand;\nconstexpr int xlcHideObject = 215 | xlCommand;\nconstexpr int xlcSetExtract = 216 | xlCommand;\nconstexpr int xlcCreatePublisher = 217 | xlCommand;\nconstexpr int xlcSubscribeTo = 218 | xlCommand;\nconstexpr int xlcAttributes = 219 | xlCommand;\nconstexpr int xlcShowToolbar = 220 | xlCommand;\nconstexpr int xlcPrintPreview = 222 | xlCommand;\nconstexpr int xlcEditColor = 223 | xlCommand;\nconstexpr int xlcShowLevels = 224 | xlCommand;\nconstexpr int xlcFormatMain = 225 | xlCommand;\nconstexpr int xlcFormatOverlay = 226 | xlCommand;\nconstexpr int xlcOnRecalc = 227 | xlCommand;\nconstexpr int xlcEditSeries = 228 | xlCommand;\nconstexpr int xlcDefineStyle = 229 | xlCommand;\nconstexpr int xlcLinePrint = 240 | xlCommand;\nconstexpr int xlcEnterData = 243 | xlCommand;\nconstexpr int xlcGalleryRadar = 249 | xlCommand;\nconstexpr int xlcMergeStyles = 250 | xlCommand;\nconstexpr int xlcEditionOptions = 251 | xlCommand;\nconstexpr int xlcPastePicture = 252 | xlCommand;\nconstexpr int xlcPastePictureLink = 253 | xlCommand;\nconstexpr int xlcSpelling = 254 | xlCommand;\nconstexpr int xlcZoom = 256 | xlCommand;\nconstexpr int xlcResume = 258 | xlCommand;\nconstexpr int xlcInsertObject = 259 | xlCommand;\nconstexpr int xlcWindowMinimize = 260 | xlCommand;\nconstexpr int xlcSize = 261 | xlCommand;\nconstexpr int xlcMove = 262 | xlCommand;\nconstexpr int xlcSoundNote = 265 | xlCommand;\nconstexpr int xlcSoundPlay = 266 | xlCommand;\nconstexpr int xlcFormatShape = 267 | xlCommand;\nconstexpr int xlcExtendPolygon = 268 | xlCommand;\nconstexpr int xlcFormatAuto = 269 | xlCommand;\nconstexpr int xlcGallery3dBar = 272 | xlCommand;\nconstexpr int xlcGallery3dSurface = 273 | xlCommand;\nconstexpr int xlcFillAuto = 274 | xlCommand;\nconstexpr int xlcCustomizeToolbar = 276 | xlCommand;\nconstexpr int xlcAddTool = 277 | xlCommand;\nconstexpr int xlcEditObject = 278 | xlCommand;\nconstexpr int xlcOnDoubleclick = 279 | xlCommand;\nconstexpr int xlcOnEntry = 280 | xlCommand;\nconstexpr int xlcWorkbookAdd = 281 | xlCommand;\nconstexpr int xlcWorkbookMove = 282 | xlCommand;\nconstexpr int xlcWorkbookCopy = 283 | xlCommand;\nconstexpr int xlcWorkbookOptions = 284 | xlCommand;\nconstexpr int xlcSaveWorkspace = 285 | xlCommand;\nconstexpr int xlcChartWizard = 288 | xlCommand;\nconstexpr int xlcDeleteTool = 289 | xlCommand;\nconstexpr int xlcMoveTool = 290 | xlCommand;\nconstexpr int xlcWorkbookSelect = 291 | xlCommand;\nconstexpr int xlcWorkbookActivate = 292 | xlCommand;\nconstexpr int xlcAssignToTool = 293 | xlCommand;\nconstexpr int xlcCopyTool = 295 | xlCommand;\nconstexpr int xlcResetTool = 296 | xlCommand;\nconstexpr int xlcConstrainNumeric = 297 | xlCommand;\nconstexpr int xlcPasteTool = 298 | xlCommand;\nconstexpr int xlcPlacement = 300 | xlCommand;\nconstexpr int xlcFillWorkgroup = 301 | xlCommand;\nconstexpr int xlcWorkbookNew = 302 | xlCommand;\nconstexpr int xlcScenarioCells = 305 | xlCommand;\nconstexpr int xlcScenarioDelete = 306 | xlCommand;\nconstexpr int xlcScenarioAdd = 307 | xlCommand;\nconstexpr int xlcScenarioEdit = 308 | xlCommand;\nconstexpr int xlcScenarioShow = 309 | xlCommand;\nconstexpr int xlcScenarioShowNext = 310 | xlCommand;\nconstexpr int xlcScenarioSummary = 311 | xlCommand;\nconstexpr int xlcPivotTableWizard = 312 | xlCommand;\nconstexpr int xlcPivotFieldProperties = 313 | xlCommand;\nconstexpr int xlcPivotField = 314 | xlCommand;\nconstexpr int xlcPivotItem = 315 | xlCommand;\nconstexpr int xlcPivotAddFields = 316 | xlCommand;\nconstexpr int xlcOptionsCalculation = 318 | xlCommand;\nconstexpr int xlcOptionsEdit = 319 | xlCommand;\nconstexpr int xlcOptionsView = 320 | xlCommand;\nconstexpr int xlcAddinManager = 321 | xlCommand;\nconstexpr int xlcMenuEditor = 322 | xlCommand;\nconstexpr int xlcAttachToolbars = 323 | xlCommand;\nconstexpr int xlcVbaactivate = 324 | xlCommand;\nconstexpr int xlcOptionsChart = 325 | xlCommand;\nconstexpr int xlcVbaInsertFile = 328 | xlCommand;\nconstexpr int xlcVbaProcedureDefinition = 330 | xlCommand;\nconstexpr int xlcRoutingSlip = 336 | xlCommand;\nconstexpr int xlcRouteDocument = 338 | xlCommand;\nconstexpr int xlcMailLogon = 339 | xlCommand;\nconstexpr int xlcInsertPicture = 342 | xlCommand;\nconstexpr int xlcEditTool = 343 | xlCommand;\nconstexpr int xlcGalleryDoughnut = 344 | xlCommand;\nconstexpr int xlcChartTrend = 350 | xlCommand;\nconstexpr int xlcPivotItemProperties = 352 | xlCommand;\nconstexpr int xlcWorkbookInsert = 354 | xlCommand;\nconstexpr int xlcOptionsTransition = 355 | xlCommand;\nconstexpr int xlcOptionsGeneral = 356 | xlCommand;\nconstexpr int xlcFilterAdvanced = 370 | xlCommand;\nconstexpr int xlcMailAddMailer = 373 | xlCommand;\nconstexpr int xlcMailDeleteMailer = 374 | xlCommand;\nconstexpr int xlcMailReply = 375 | xlCommand;\nconstexpr int xlcMailReplyAll = 376 | xlCommand;\nconstexpr int xlcMailForward = 377 | xlCommand;\nconstexpr int xlcMailNextLetter = 378 | xlCommand;\nconstexpr int xlcDataLabel = 379 | xlCommand;\nconstexpr int xlcInsertTitle = 380 | xlCommand;\nconstexpr int xlcFontProperties = 381 | xlCommand;\nconstexpr int xlcMacroOptions = 382 | xlCommand;\nconstexpr int xlcWorkbookHide = 383 | xlCommand;\nconstexpr int xlcWorkbookUnhide = 384 | xlCommand;\nconstexpr int xlcWorkbookDelete = 385 | xlCommand;\nconstexpr int xlcWorkbookName = 386 | xlCommand;\nconstexpr int xlcGalleryCustom = 388 | xlCommand;\nconstexpr int xlcAddChartAutoformat = 390 | xlCommand;\nconstexpr int xlcDeleteChartAutoformat = 391 | xlCommand;\nconstexpr int xlcChartAddData = 392 | xlCommand;\nconstexpr int xlcAutoOutline = 393 | xlCommand;\nconstexpr int xlcTabOrder = 394 | xlCommand;\nconstexpr int xlcShowDialog = 395 | xlCommand;\nconstexpr int xlcSelectAll = 396 | xlCommand;\nconstexpr int xlcUngroupSheets = 397 | xlCommand;\nconstexpr int xlcSubtotalCreate = 398 | xlCommand;\nconstexpr int xlcSubtotalRemove = 399 | xlCommand;\nconstexpr int xlcRenameObject = 400 | xlCommand;\nconstexpr int xlcWorkbookScroll = 412 | xlCommand;\nconstexpr int xlcWorkbookNext = 413 | xlCommand;\nconstexpr int xlcWorkbookPrev = 414 | xlCommand;\nconstexpr int xlcWorkbookTabSplit = 415 | xlCommand;\nconstexpr int xlcFullScreen = 416 | xlCommand;\nconstexpr int xlcWorkbookProtect = 417 | xlCommand;\nconstexpr int xlcScrollbarProperties = 420 | xlCommand;\nconstexpr int xlcPivotShowPages = 421 | xlCommand;\nconstexpr int xlcTextToColumns = 422 | xlCommand;\nconstexpr int xlcFormatCharttype = 423 | xlCommand;\nconstexpr int xlcLinkFormat = 424 | xlCommand;\nconstexpr int xlcTracerDisplay = 425 | xlCommand;\nconstexpr int xlcTracerNavigate = 430 | xlCommand;\nconstexpr int xlcTracerClear = 431 | xlCommand;\nconstexpr int xlcTracerError = 432 | xlCommand;\nconstexpr int xlcPivotFieldGroup = 433 | xlCommand;\nconstexpr int xlcPivotFieldUngroup = 434 | xlCommand;\nconstexpr int xlcCheckboxProperties = 435 | xlCommand;\nconstexpr int xlcLabelProperties = 436 | xlCommand;\nconstexpr int xlcListboxProperties = 437 | xlCommand;\nconstexpr int xlcEditboxProperties = 438 | xlCommand;\nconstexpr int xlcPivotRefresh = 439 | xlCommand;\nconstexpr int xlcLinkCombo = 440 | xlCommand;\nconstexpr int xlcOpenText = 441 | xlCommand;\nconstexpr int xlcHideDialog = 442 | xlCommand;\nconstexpr int xlcSetDialogFocus = 443 | xlCommand;\nconstexpr int xlcEnableObject = 444 | xlCommand;\nconstexpr int xlcPushbuttonProperties = 445 | xlCommand;\nconstexpr int xlcSetDialogDefault = 446 | xlCommand;\nconstexpr int xlcFilter = 447 | xlCommand;\nconstexpr int xlcFilterShowAll = 448 | xlCommand;\nconstexpr int xlcClearOutline = 449 | xlCommand;\nconstexpr int xlcFunctionWizard = 450 | xlCommand;\nconstexpr int xlcAddListItem = 451 | xlCommand;\nconstexpr int xlcSetListItem = 452 | xlCommand;\nconstexpr int xlcRemoveListItem = 453 | xlCommand;\nconstexpr int xlcSelectListItem = 454 | xlCommand;\nconstexpr int xlcSetControlValue = 455 | xlCommand;\nconstexpr int xlcSaveCopyAs = 456 | xlCommand;\nconstexpr int xlcOptionsListsAdd = 458 | xlCommand;\nconstexpr int xlcOptionsListsDelete = 459 | xlCommand;\nconstexpr int xlcSeriesAxes = 460 | xlCommand;\nconstexpr int xlcSeriesX = 461 | xlCommand;\nconstexpr int xlcSeriesY = 462 | xlCommand;\nconstexpr int xlcErrorbarX = 463 | xlCommand;\nconstexpr int xlcErrorbarY = 464 | xlCommand;\nconstexpr int xlcFormatChart = 465 | xlCommand;\nconstexpr int xlcSeriesOrder = 466 | xlCommand;\nconstexpr int xlcMailLogoff = 467 | xlCommand;\nconstexpr int xlcClearRoutingSlip = 468 | xlCommand;\nconstexpr int xlcAppActivateMicrosoft = 469 | xlCommand;\nconstexpr int xlcMailEditMailer = 470 | xlCommand;\nconstexpr int xlcOnSheet = 471 | xlCommand;\nconstexpr int xlcStandardWidth = 472 | xlCommand;\nconstexpr int xlcScenarioMerge = 473 | xlCommand;\nconstexpr int xlcSummaryInfo = 474 | xlCommand;\nconstexpr int xlcFindFile = 475 | xlCommand;\nconstexpr int xlcActiveCellFont = 476 | xlCommand;\nconstexpr int xlcEnableTipwizard = 477 | xlCommand;\nconstexpr int xlcVbaMakeAddin = 478 | xlCommand;\nconstexpr int xlcInsertdatatable = 480 | xlCommand;\nconstexpr int xlcWorkgroupOptions = 481 | xlCommand;\nconstexpr int xlcMailSendMailer = 482 | xlCommand;\nconstexpr int xlcAutocorrect = 485 | xlCommand;\nconstexpr int xlcPostDocument = 489 | xlCommand;\nconstexpr int xlcPicklist = 491 | xlCommand;\nconstexpr int xlcViewShow = 493 | xlCommand;\nconstexpr int xlcViewDefine = 494 | xlCommand;\nconstexpr int xlcViewDelete = 495 | xlCommand;\nconstexpr int xlcSheetBackground = 509 | xlCommand;\nconstexpr int xlcInsertMapObject = 510 | xlCommand;\nconstexpr int xlcOptionsMenono = 511 | xlCommand;\nconstexpr int xlcNormal = 518 | xlCommand;\nconstexpr int xlcLayout = 519 | xlCommand;\nconstexpr int xlcRmPrintArea = 520 | xlCommand;\nconstexpr int xlcClearPrintArea = 521 | xlCommand;\nconstexpr int xlcAddPrintArea = 522 | xlCommand;\nconstexpr int xlcMoveBrk = 523 | xlCommand;\nconstexpr int xlcHidecurrNote = 545 | xlCommand;\nconstexpr int xlcHideallNotes = 546 | xlCommand;\nconstexpr int xlcDeleteNote = 547 | xlCommand;\nconstexpr int xlcTraverseNotes = 548 | xlCommand;\nconstexpr int xlcActivateNotes = 549 | xlCommand;\nconstexpr int xlcProtectRevisions = 620 | xlCommand;\nconstexpr int xlcUnprotectRevisions = 621 | xlCommand;\nconstexpr int xlcOptionsMe = 647 | xlCommand;\nconstexpr int xlcWebPublish = 653 | xlCommand;\nconstexpr int xlcNewwebquery = 667 | xlCommand;\nconstexpr int xlcPivotTableChart = 673 | xlCommand;\nconstexpr int xlcOptionsSave = 753 | xlCommand;\nconstexpr int xlcOptionsSpell = 755 | xlCommand;\nconstexpr int xlcHideallInkannots = 808 | xlCommand;\n}"
  },
  {
    "path": "include/xloil/XllEntryPoint.h",
    "content": "#include <xloil/State.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/Events.h>\n#include <xloil/LogWindow.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/StringUtils.h>\n#include <xloil/ExcelThread.h>\n#include <functional>\n#include <filesystem>\n\nnamespace xloil { class RegisteredWorksheetFunc; }\n\nnamespace XllInfo\n{\n  inline static HINSTANCE dllHandle = NULL;\n  inline static std::wstring xllName;\n  inline static std::wstring xllPath;\n}\n\n// These functions are defined in XLO_DECLARE_ADDIN\nvoid autoOpenDefinedInMacro();\nvoid autoCloseDefinedInMacro();\nstd::wstring addInManagerInfo();\n\ninline static bool theXllIsOpen = false;\n\nvoid setDllPath(HMODULE handle)\n{\n  try\n  {\n    XllInfo::xllPath = xloil::captureWStringBuffer(\n      [handle](auto* buf, auto len)\n      {\n        return GetModuleFileName(handle, buf, (DWORD)len);\n      });\n\n    if (!XllInfo::xllPath.empty())\n    {\n      XllInfo::xllName = std::filesystem::path(XllInfo::xllPath).filename();\n      return;\n    }\n  }\n  catch (...)\n  {\n  }\n\n  OutputDebugStringW(L\"xlOil_Loader: Could not determine XLL location\");\n}\n\n\nnamespace xloil\n{\n  template<class T>\n  struct RegisterAddin\n  {\n    std::unique_ptr<T> theAddin;\n    std::vector<std::shared_ptr<const RegisteredWorksheetFunc>> theFunctions;\n\n    ~RegisterAddin()\n    {\n      if (theXllIsOpen)\n      {\n        XLO_ERROR(L\"RegisterAddin: teardown initiated before xlAutoClose for {}\", XllInfo::xllPath);\n        autoClose();\n      }\n    }\n\n    void autoOpen()\n    {\n      try\n      {\n        Environment::initAppContext();\n          \n        // A statically linked addin is its own core\n        Environment::setCoreHandle(XllInfo::dllHandle);\n\n        // Handle this event even if we have no registered async functions as they could be \n        // dynamically registered later\n        tryCallExcel(msxll::xlEventRegister,\n          \"xlHandleCalculationCancelled\", msxll::xleventCalculationCanceled);\n\n        // Do this safely in single-thread mode\n        initMessageQueue(Environment::excelProcess().hInstance);\n\n        lauch();\n\n        Environment::registerIntellisense(XllInfo::xllPath.c_str());\n\n        std::wstring errorMessages;\n        theFunctions = xloil::detail::registerStaticFuncs(XllInfo::xllName.c_str(), errorMessages);\n        if (!errorMessages.empty())\n          loadFailureLogWindow(XllInfo::dllHandle, errorMessages.c_str(), true);\n\n        theXllIsOpen = true;\n      }\n      catch (const std::exception& e)\n      {\n        loadFailureLogWindow(XllInfo::dllHandle, utf8ToUtf16(e.what()), true);\n      }\n    }\n\n    void lauch()\n    {\n      theAddin.reset(new T());\n    }\n\n    void autoClose()\n    {\n      if (theXllIsOpen)\n        theAddin.reset();\n\n      theFunctions.clear();\n      theXllIsOpen = false;\n    }\n  };\n}\n\nXLO_ENTRY_POINT(int) DllMain(\n  _In_ HINSTANCE hinstDLL,\n  _In_ DWORD     fdwReason,\n  _In_ LPVOID    /*lpvReserved*/\n)\n{\n  if (fdwReason == DLL_PROCESS_ATTACH)\n  {\n    XllInfo::dllHandle = hinstDLL;\n    setDllPath(hinstDLL);\n  }\n  return TRUE;\n}\n\n/// <summary>\n/// xlAutoOpen is how Microsoft Excel loads XLL files.\n/// When you open an XLL, Microsoft Excel calls the xlAutoOpen\n/// function, and nothing more.\n/// </summary>\n/// <returns>Must return 1</returns>\nXLO_ENTRY_POINT(int) xlAutoOpen(void)\n{\n  try\n  {\n    autoOpenDefinedInMacro();\n  }\n  catch (...) \n  {}\n  return 1; // We alway return 1, even on failure.\n}\n\nXLO_ENTRY_POINT(int) xlAutoClose(void)\n{\n  try\n  {\n    autoCloseDefinedInMacro();\n  }\n  catch (...)\n  {}\n  return 1;\n}\n\nXLO_DEFINE_FREE_CALLBACK()\n\nXLO_ENTRY_POINT(int) xlHandleCalculationCancelled()\n{\n  try\n  {\n    if (theXllIsOpen)\n      xloil::Event::CalcCancelled().fire();\n  }\n  catch (...)\n  {}\n  return 1;\n}\n\nXLO_ENTRY_POINT(msxll::XLOPER12*) xlAddInManagerInfo12(msxll::XLOPER12* xAction)\n{\n  using namespace msxll;\n\n  static XLOPER12 xIntAction, xInfo = { 1.0, xltypeNum }, xType = { 1.0, xltypeInt };\n  xType.val.w = xltypeInt;\n\n  Excel12(msxll::xlCoerce, &xIntAction, 2, xAction, xType);\n\n  if (xInfo.xltype == xltypeStr)\n    delete[] xInfo.val.str.data;\n\n  try\n  {\n    auto info = addInManagerInfo();\n    if (xIntAction.val.w == 1 && !info.empty())\n    {\n      xInfo.xltype = xltypeStr;\n      xInfo.val.str.data = xloil::PString(info).release();\n    }\n    return &xInfo;\n  }\n  catch (...)\n  {}\n\n  xInfo.xltype = xltypeErr;\n  xInfo.val.err = xlerrValue;\n\n  return &xInfo;\n}\n\nXLO_ENTRY_POINT(int) xlAutoAdd()\n{\n  try\n  {\n    if (theXllIsOpen)\n      xloil::Event::XllAdd().fire(XllInfo::xllName.c_str());\n  }\n  catch (...)\n  { }\n  return 1;\n}\n\nXLO_ENTRY_POINT(int) xlAutoRemove()\n{\n  try\n  {\n    if (theXllIsOpen)\n      xloil::Event::XllRemove().fire(XllInfo::xllName.c_str());\n  }\n  catch (...)\n  { }\n  return 1;\n}\n\nnamespace detail\n{\n  // Some ugly SFINAE to check if the an addInManagerInfo method is present\n  auto callAddInManagerInfo(void*)\n  {\n    return std::wstring();\n  }\n\n  template<class T, std::enable_if_t<std::is_constructible_v<decltype(T::addInManagerInfo())>, bool> = true>\n  auto callAddInManagerInfo(T*)\n  {\n    return T::addInManagerInfo();\n  }\n}\n\n// Break this macro into two as the requirements for the Core addin are slightly\n// different to user-built XLLs\n\n#define _XLO_DECLARE_ADDIN_IMPL(AddinType, InfoFunc) \\\n  namespace { AddinType theRegistedAddin; } \\\n  void autoOpenDefinedInMacro()  { theRegistedAddin.autoOpen(); } \\\n  void autoCloseDefinedInMacro() { theRegistedAddin.autoClose(); } \\\n  std::wstring addInManagerInfo() { return InfoFunc; }\n\n#define XLO_DECLARE_ADDIN(T) _XLO_DECLARE_ADDIN_IMPL(RegisterAddin<T>, ::detail::callAddInManagerInfo((T*)nullptr))\n"
  },
  {
    "path": "include/xloil/xlOil.h",
    "content": "#pragma once\n#include \"AppObjects.h\"\n#include \"ArrayBuilder.h\"\n#include \"Async.h\"\n#include \"AutoBind.h\"\n#include \"Caller.h\"\n#include \"Date.h\"\n#include \"DynamicRegister.h\"\n#include \"EnumHelper.h\"\n#include \"Events.h\"\n#include \"ExcelArray.h\"\n#include \"ExcelCall.h\"\n#include \"ExcelObj.h\"\n#include \"ExcelObjCache.h\"\n#include \"ExcelRef.h\"\n#include \"ExcelThread.h\"\n#include \"ExcelUI.h\"\n#include \"ExportMacro.h\"\n#include \"FPArray.h\"\n#include \"FuncSpec.h\"\n#include \"Interface.h\"\n#include \"Limits.h\"\n#include \"Log.h\"\n#include \"LogWindow.h\"\n#include \"NumericTypeConverters.h\"\n#include \"ObjectCache.h\"\n#include \"Plugin.h\"\n#include \"Preprocessor.h\"\n#include \"PString.h\"\n#include \"Range.h\"\n#include \"Register.h\"\n#include \"RtdServer.h\"\n#include \"State.h\"\n#include \"StaticRegister.h\"\n#include \"StringUtils.h\"\n#include \"Throw.h\"\n#include \"TypeConverters.h\"\n#include \"Version.h\"\n#include \"XlCallSlim.h\"\n"
  },
  {
    "path": "libs/SetRoot.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <xlOilRoot>$(SolutionDir)</xlOilRoot>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "libs/xlOilPlugin.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Label=\"Globals\">\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <IncludePath>$(xlOilRoot)external\\boost-1.67;$(xlOilRoot)external\\tomlplusplus\\include;$(xlOilRoot)external\\spdlog\\include;$(xlOilRoot)external;$(xlOilRoot)include;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <LibraryPath>$(xlOilRoot)\\build\\$(Platform)\\$(Configuration);$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;SPDLOG_COMPILED_LIB;_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR;XLO_PROJECT_NAME=$(ProjectName);%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <DisableSpecificWarnings>4251</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>xloil.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup />\n</Project>"
  },
  {
    "path": "libs/xlOilStaticLib.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <IncludePath>$(xlOilRoot)external\\boost-1.67;$(xlOilRoot)\\external\\spdlog\\include;$(xlOilRoot)\\src;$(xlOilRoot)\\include;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Platform)'=='x64'\">\n    <LibraryPath>$(xlOilRoot)\\external\\Excel2013SDK\\LIB\\x64;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Platform)'=='Win32'\">\n    <LibraryPath>$(xlOilRoot)\\external\\Excel2013SDK\\LIB;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LibraryPath>$(xlOilRoot)\\build\\$(Platform)\\DebugStatic;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LibraryPath>$(xlOilRoot)\\build\\$(Platform)\\ReleaseStatic;$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;SPDLOG_COMPILED_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <DisableSpecificWarnings>4251</DisableSpecificWarnings>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>xlcall32.lib;Oleacc.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/ArrayHelpers.h",
    "content": "#pragma once\n#include \"PyHelpers.h\"\n#include \"PyCache.h\"\n\nnamespace xloil\n{\n  namespace Python\n  {\n    inline void accumulateObjectStringLength(PyObject* p, size_t& strLength) noexcept\n    {\n      if (PyUnicode_Check(p))\n        strLength += PyUnicode_GetLength(p);\n      else if (!PyFloat_Check(p) && !PyLong_Check(p) && !PyBool_Check(p))\n        strLength += CACHE_KEY_MAX_LEN;\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/AsyncFunctions.cpp",
    "content": "#include \"AsyncFunctions.h\"\n#include \"PyFunctionRegister.h\"\n#include \"PyCore.h\"\n#include \"PyRtd.h\"\n#include \"TypeConversion/BasicTypes.h\"\n#include \"PyHelpers.h\"\n#include \"PyEvents.h\"\n#include \"EventLoop.h\"\n#include \"PyAddin.h\"\n#include <xloil/ExcelObj.h>\n#include <xloil/Async.h>\n#include <xloil/RtdServer.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/Caller.h>\n#include <CTPL/ctpl_stl.h>\n#include <vector>\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::pair;\nusing std::wstring;\nusing std::string;\nusing std::make_shared;\nusing std::make_pair;\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    auto& asyncEventLoop()\n    {\n      return *theCoreAddin()->thread;\n    }\n\n    struct AsyncReturn : public AsyncHelper\n    {\n      AsyncReturn(\n        const ExcelObj& asyncHandle,\n        const shared_ptr<const IPyToExcel>& returnConverter,\n        CallerInfo&& caller)\n        : AsyncHelper(asyncHandle)\n        , _returnConverter(returnConverter)\n        , _caller(std::move(caller))\n      {\n      }\n\n      ~AsyncReturn()\n      {\n        try\n        {\n          cancel();\n        }\n        catch (...) {}\n      }\n\n      void set_task(const py::object& task)\n      {\n        _task = task;\n      }\n\n      void set_result(const py::object& value)\n      {\n        static ExcelObj obj = _returnConverter\n          ? (*_returnConverter)(value.ptr())\n          : FromPyObj()(value.ptr());\n        result(obj);\n      }\n      void set_done()\n      {}\n      \n      void cancel() override\n      {\n        if (_task.ptr())\n        {\n          py::gil_scoped_acquire gilAcquired;\n          if (py::hasattr(_task, \"cancel\"))\n            asyncEventLoop().callback(_task.attr(\"cancel\"));\n          _task.release();\n        }\n      }\n\n      const CallerInfo& caller() const noexcept\n      {\n        return _caller;\n      }\n\n    private:\n      shared_ptr<const IPyToExcel> _returnConverter;\n      py::object _task;\n      CallerInfo _caller;\n    };\n\n    void pythonAsyncCallback(\n      const PyFuncInfo* info,\n      const ExcelObj** xlArgs) noexcept\n    {\n      const ExcelObj* asyncHandle = xlArgs[0];\n\n      try\n      {\n        py::gil_scoped_acquire gilAcquired;\n\n        PyErr_Clear();\n\n        // I think it's better to process the arguments to python here rather than \n        // copying the ExcelObj's and converting on the async thread (since CPython\n        // is single threaded anyway)\n        PyCallArgs<> pyCallArgs;\n\n        // Raw ptr, but we take ownership in the next line\n        auto* asyncReturn = new AsyncReturn(\n          *asyncHandle,\n          info->getReturnConverter(),\n          CallerInfo());\n\n        pyCallArgs.push_back(py::cast(asyncReturn,\n          py::return_value_policy::take_ownership).release().ptr());\n\n        py::object kwargs;\n        info->convertArgs([&](auto i) { return *xlArgs[1 + i]; },\n          pyCallArgs,\n          kwargs);\n\n        pyCallArgs.call(info->func(), kwargs);\n      }\n      catch (const py::error_already_set& e)\n      {\n        raiseUserException(e);\n        asyncReturn(*asyncHandle, ExcelObj(e.what()));\n      }\n      catch (const std::exception& e)\n      {\n        XLO_WARN(e.what());\n        asyncReturn(*asyncHandle, ExcelObj(e.what()));\n      }\n      catch (...)\n      {\n        XLO_WARN(\"Async unknown error\");\n        asyncReturn(*asyncHandle, ExcelObj(CellError::Value));\n      }\n    }\n\n    /// <summary>\n    /// Holder for python target function and its arguments.\n    /// Able to compare arguments with another AsyncTask\n    /// </summary>\n    struct RtdAsyncTask : public IRtdAsyncTask\n    {\n      const PyFuncInfo& _info;\n      vector<ExcelObj> _xlArgs;\n      shared_ptr<RtdReturn> _returnObj;\n      CallerInfo _caller;\n\n      RtdAsyncTask(const PyFuncInfo& info, const ExcelObj** xlArgs)\n        : _info(info)\n      {\n        const auto nArgs = info.info()->numArgs();\n        _xlArgs.reserve(nArgs);\n        for (auto i = 0u; i < nArgs; ++i)\n          _xlArgs.emplace_back(ExcelObj(*xlArgs[i]));\n      }\n\n      virtual ~RtdAsyncTask()\n      {\n        _returnObj.reset();\n      }\n\n      void start(IRtdPublish& publisher) override\n      {\n        _returnObj.reset(new RtdReturn(publisher, _info.getReturnConverter(), _caller));\n        py::gil_scoped_acquire gilAcquired;\n        \n        PyErr_Clear(); // TODO: required?\n        py::object kwargs;\n        PyCallArgs<> pyArgs;\n\n        try\n        {\n          pyArgs.push_back(py::cast(_returnObj).release().ptr());\n\n          _info.convertArgs([&](auto i) -> const ExcelObj& { return _xlArgs[i]; },\n            pyArgs,\n            kwargs);\n\n          pyArgs.call(_info.func(), kwargs);\n        }\n        catch (const py::error_already_set& e)\n        {\n          // TODO: publish directly through the argument to this function!\n          raiseUserException(e);\n          publisher.publish(ExcelObj(e.what()));\n        }\n        catch (const std::exception& e)\n        {\n          publisher.publish(ExcelObj(e.what()));\n        }\n      }\n      bool done() noexcept override\n      {\n        return _returnObj ? _returnObj->done() : false;\n      }\n      void wait() noexcept override\n      {\n        if (_returnObj)\n          _returnObj->wait();\n      }\n      void cancel() override\n      {\n        if (_returnObj && !_returnObj->done())\n        {\n          py::gil_scoped_acquire gilAcquired;\n          _returnObj->cancel();\n        }\n      }\n      bool operator==(const IRtdAsyncTask& that_) const override\n      {\n        const auto* that = dynamic_cast<const RtdAsyncTask*>(&that_);\n        if (!that)\n          return false;\n\n        // First check we both agree on the function.\n        if (&_info != &that->_info)\n          return false;\n\n        // Check number of args match\n        if (_xlArgs.size() != that->_xlArgs.size())\n          return false;\n\n        // Check each arg is equal\n        for (auto i = _xlArgs.begin(), j = that->_xlArgs.begin();\n          i != _xlArgs.end();\n          ++i, ++j)\n        {\n          if (!(*i == *j))\n            return false;\n        }\n\n        return true;\n      }\n    };\n\n    ExcelObj* pythonRtdCallback(\n      const PyFuncInfo* info,\n      const ExcelObj** xlArgs) noexcept\n    {\n      try\n      {\n        auto value = rtdAsync(\n          std::make_shared<RtdAsyncTask>(*info, xlArgs));\n\n        return returnValue(value ? *value : CellError::NA);\n      }\n      catch (const py::error_already_set& e)\n      {\n        raiseUserException(e);\n        return returnValue(e.what());\n      }\n      catch (const std::exception& e)\n      {\n        return returnValue(e.what());\n      }\n      catch (...)\n      {\n        return returnValue(CellError::Null);\n      }\n    }\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        py::class_<AsyncReturn>(mod, \"_AsyncReturn\")\n          .def(\"set_result\", &AsyncReturn::set_result)\n          .def(\"set_done\", &AsyncReturn::set_done)\n          .def(\"set_task\", &AsyncReturn::set_task)\n          .def_property_readonly(\"caller\", &AsyncReturn::caller)\n          .def_property_readonly(\"loop\", [](py::object) { return asyncEventLoop().loop(); });\n\n        mod.def(\"get_async_loop\", \n          []() { return asyncEventLoop().loop(); },\n          R\"(\n            Returns the asyncio event loop associated with the async background\n            worker thread.  All async / RTD worksheet functions are executed \n            on this event loop.\n          )\");\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/AsyncFunctions.h",
    "content": "#pragma once\n\nnamespace xloil\n{\n  class ExcelObj;\n\n  namespace Python\n  {\n    class PyFuncInfo;\n\n    void pythonAsyncCallback(\n      const PyFuncInfo* info,\n      const ExcelObj** xlArgs) noexcept;\n\n    ExcelObj* pythonRtdCallback(\n      const PyFuncInfo* info,\n      const ExcelObj** xlArgs) noexcept;\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/CPython.h",
    "content": "#pragma once\n// Horrible hack to allow our debug build to link with release python lib and so avoid building debug python\n// https://stackoverflow.com/questions/17028576/\n\n// Include these before Python.h does or our trick with the _DEBUG\n// macro will backfire\n#  include <stdlib.h>\n#  include <stdio.h>\n#  include <errno.h>\n#  include <string.h>   \n\n#ifdef _DEBUG\n#  define XLO_PY_HACK\n#endif\n#undef _DEBUG\n#include <Python.h>\n#ifdef XLO_PY_HACK\n#  define _DEBUG\n#endif"
  },
  {
    "path": "libs/xlOil_Python/EventLoop.cpp",
    "content": "#include \"EventLoop.h\"\n#include \"PyHelpers.h\"\n#include \"PyEvents.h\"\n#include <CTPL/ctpl_stl.h>\n#include <xlOil/Log.h>\n\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n\n#define _XLO_PUMP_CODE(ALL_TASKS) R\"(\ndef pump(loop, timeout):\n\n    import asyncio\n\n    async def wait():\n      await asyncio.sleep(timeout)\n\n    loop.run_until_complete(wait())\n\n    all_tasks = )\" ALL_TASKS R\"(\n    return len([task for task in all_tasks(loop) if not task.done()]))\"\n\n#if PY_VERSION_HEX < 0x03070000\n#define XLO_PUMP_CODE _XLO_PUMP_CODE(\"asyncio.Task.all_tasks\")\n#else\n#define XLO_PUMP_CODE _XLO_PUMP_CODE(\"asyncio.all_tasks\")\n#endif\n\n    // We create the loop pumper here rather than in the xloil package to avoid \n    // a dependency on that package (in particular, processing __init__. It's\n    // rather difficult to define async functions in pybind so we create the \n    // necessary object with PyRun_String.\n    auto _create_pump_function()\n    {\n      py::dict globals;\n      py::dict locals;\n\n      auto result = PyRun_String(XLO_PUMP_CODE, Py_file_input, globals.ptr(), locals.ptr());\n      // Very annoying undef, not sure how to do it earlier\n#undef ALL_TASKS\n\n      if (result == nullptr)\n        throw py::error_already_set();\n      Py_XDECREF(result);\n      // locals[\"pump\"] doesn't work, returns a dict\n      auto func = PyBorrow(PyDict_GetItemString(locals.ptr(), \"pump\"));\n      return func;\n    }\n\n    EventLoop::EventLoop(unsigned asyncioTimeout_, unsigned sleepTime_)\n      : _thread(new ctpl::thread_pool(1))\n      , _stopped(false)\n      , asyncioTimeout(asyncioTimeout_)\n      , sleepTime(sleepTime_)\n    {\n#ifdef _DEBUG\n      if (PyGILState_Check() == 1)\n        XLO_THROW(\"Release GIL before constructing an EventLoop\");\n#endif\n\n      _thread->push([this](int) mutable\n        {\n          try\n          {\n            pybind11::gil_scoped_acquire getGil;\n            // Create a hanging ref to the python thread state, to avoid all context vars,\n            // particularly the asyncio loop, being deleted at the end of this function.\n            getGil.inc_ref();\n\n            _eventLoop = pybind11::module::import(\"asyncio\").attr(\"new_event_loop\")();\n            _pumpFunction = _create_pump_function();\n            _callSoonFunction = _eventLoop.attr(\"call_soon_threadsafe\");\n          }\n          catch (const std::exception& e)\n          {\n            XLO_ERROR(\"Failed to initialise python event loop: {0}\", e.what());\n          }\n        }).get();\n\n        if (!_eventLoop || _eventLoop.is_none() || !_callSoonFunction || _callSoonFunction.is_none())\n          XLO_THROW(\"Failed starting event loop\");\n\n        _thread->push([this](int) mutable\n          {\n            try\n            {\n              // Resolve hanging reference to python thread state\n              {\n                pybind11::gil_scoped_acquire getGil;\n                getGil.dec_ref();\n              }\n\n              // Pump the asyncio loop for a specified number of milliseconds, release Gil\n              // and Sleep.  If the event loop has no active tasks, sleep for 4x as long.\n              size_t nTasks = 0;\n              while (!_stopped)\n              {\n                {\n                  pybind11::gil_scoped_acquire getGil;\n                  nTasks = _pumpFunction(_eventLoop, asyncioTimeout / 1000 * (nTasks > 0 ? 1 : 0.25)).cast<size_t>();\n                }\n                Sleep(nTasks > 0 ? sleepTime : sleepTime * 4);\n              }\n\n              // Aquire GIL to decref our python objects and close the event loop\n              {\n                pybind11::gil_scoped_acquire getGil;\n                _eventLoop.attr(\"close\");\n                _pumpFunction = pybind11::object();\n                _callSoonFunction = pybind11::object();\n                _eventLoop = pybind11::object();\n              }\n            }\n            catch (const std::exception& e)\n            {\n              XLO_ERROR(\"Failed to initialise python worker thread: {0}\", e.what());\n            }\n          });\n    }\n\n    EventLoop::~EventLoop()\n    {\n      try\n      {\n        if (_thread->size() > 0)\n          shutdown();\n        assert(!_pumpFunction);\n      }\n      catch (const std::exception& e)\n      {\n        XLO_ERROR(\"Failed to shutdown python worker thread: {0}\", e.what());\n      }\n    }\n\n    void EventLoop::runAsync(const pybind11::object& coro)\n    {\n      auto loggedCoro = pybind11::module::import(\"xloil._event_loop\").attr(\"_logged_wrapper_async\")(coro);\n      pybind11::module::import(\"asyncio\").attr(\"run_coroutine_threadsafe\")(loggedCoro, _eventLoop);\n    }\n\n    void EventLoop::shutdown()\n    {\n      stop();\n      // Don't empty queue on thread stop to allow our event loop to shutdown cleanly\n      _thread->stop(true);\n    }\n\n    pybind11::object EventLoop::loggedWrapper(const pybind11::object& func)\n    {\n      return pybind11::module::import(\"xloil._event_loop\").attr(\"_logged_wrapper\")(func);\n    }\n\n    pybind11::object& EventLoop::loop()\n    { \n      return _eventLoop; \n    }\n    std::thread& EventLoop::thread()\n    { \n      return _thread->get_thread(0); \n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/EventLoop.h",
    "content": "#include <pybind11/pybind11.h>\n#include <memory>\n#include <thread>\n#include <atomic>\n\nnamespace ctpl {\n  class thread_pool;\n}\n\nnamespace xloil\n{\n  namespace Python\n  {\n    class EventLoop\n    {\n      std::unique_ptr<ctpl::thread_pool> _thread;\n      pybind11::object _eventLoop;\n      pybind11::object _callSoonFunction;\n      pybind11::object _pumpFunction;\n      std::atomic<bool> _stopped;\n\n      pybind11::object loggedWrapper(const pybind11::object& func);\n\n    public:\n      unsigned asyncioTimeout;\n      unsigned sleepTime;\n\n      EventLoop(unsigned asyncioTimeout_ = 200, unsigned sleepTime_ = 200);\n\n      ~EventLoop();\n\n      template <class...Args>\n      void callback(const pybind11::object& func, Args&&... args)\n      {\n        if (!active())\n          return;\n        _callSoonFunction(loggedWrapper(func), std::forward<Args>(args)...);\n      }\n\n      template <class...Args>\n      void callback(const char* module, const char* func, Args&&... args)\n      {\n        callback(pybind11::module::import(module).attr(func), std::forward<Args>(args)...);\n      }\n\n      void runAsync(const pybind11::object& coro);\n\n      bool active()\n      {\n        return !_stopped;\n      }\n\n      void stop()\n      {\n        _stopped = true;\n      }\n\n      void shutdown();\n\n      pybind11::object& loop();\n      std::thread& thread();\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/Loader/StubLoader.cpp",
    "content": "#include <xloil/Plugin.h>\n#include <xloil/StringUtils.h>\n#include <xlOilHelpers/Environment.h>\n#include <xloil/Throw.h>\n#include <xloil/WindowsSlim.h>\n#include <cstdlib>\n#include <filesystem>\n#include <fstream>\n\nnamespace fs = std::filesystem;\nusing std::vector;\nusing std::wstring;\nusing std::string;\n\nnamespace\n{\n  /// <summary>\n  /// Finds the value of the home= directive in a pyvenv.cfg.\n  /// Verbatim from CPython's launcher.c\n  /// </summary>\n  int find_home_value(const char* buffer, const char** start, size_t* length)\n  {\n    for (const char* s = strstr(buffer, \"home\"); s; s = strstr(s + 1, \"\\nhome\")) {\n      if (*s == '\\n') {\n        ++s;\n      }\n      for (auto i = 4; i > 0 && *s; --i, ++s);\n\n      while (*s && iswspace(*s)) {\n        ++s;\n      }\n      if (*s != L'=') {\n        continue;\n      }\n\n      do {\n        ++s;\n      } while (*s && iswspace(*s));\n\n      *start = s;\n      auto* nl = strchr(s, '\\n');\n      if (nl) {\n        *length = (ptrdiff_t)nl - (ptrdiff_t)s;\n      }\n      else {\n        *length = strlen(s);\n      }\n      return 1;\n    }\n    return 0;\n  }\n}\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      std::string findPythonHomeDir()\n      {\n        constexpr auto PYVENVCFG = \"pyvenv.cfg\";\n\n        auto pyExecutableDir = fs::path(getEnvironmentVar(\"PYTHONEXECUTABLE\")).parent_path();\n        auto pyvenvCfg = pyExecutableDir / PYVENVCFG;\n\n        if (!fs::exists(pyvenvCfg))\n        {\n          pyvenvCfg = pyExecutableDir.parent_path() / PYVENVCFG;\n          if (!fs::exists(pyvenvCfg))\n          {\n            // Not a venv\n            return pyExecutableDir.string();\n          }\n        }\n\n        std::ifstream file(pyvenvCfg);\n        std::string contents(std::istreambuf_iterator<char>{file}, {});\n        const char* pHomeDir;\n        size_t homeDirLength;\n        if (find_home_value(contents.c_str(), &pHomeDir, &homeDirLength) == 1)\n          return std::string(pHomeDir, homeDirLength);\n\n        else\n          XLO_THROW(\"Could not find 'home' in {0}\", pyvenvCfg.string());\n      }\n\n      static HMODULE thePythonLib = nullptr;\n      static PluginInitFunc theInitFunc = nullptr;\n    }\n\n    XLO_PLUGIN_INIT(AddinContext* context, const PluginContext& plugin)\n    {\n      try\n      {\n        if (plugin.action == PluginContext::Load)\n        {\n          linkPluginToCoreLogger(context, plugin);\n          throwIfNotExactVersion(plugin);\n\n          string dllName = \"xlOil_Python\";\n\n          auto userVersion = getEnvironmentVar(\"XLOIL_PYTHON_VERSION\");\n\n          auto pythonHome = findPythonHomeDir();\n          auto path = getEnvironmentVar(\"PATH\")\n            .append(\";\").append(pythonHome)\n            .append(\";\").append(pythonHome).append(\"\\\\Library\\\\bin\");\n          setEnvironmentVar(\"PATH\", path.c_str());\n\n          if (!userVersion.empty())\n          {\n            userVersion.erase(\n              std::remove(userVersion.begin(), userVersion.end(), '.'), \n              userVersion.end());\n            dllName += userVersion;\n          }\n          else\n          {\n            // Load the plugin, but first set the DLL directory to our PYTHONHOME in case\n            // there are other pythons on the path\n            HMODULE py3dll;\n            {\n              PushDllDirectory setDllDir(pythonHome.c_str());\n              // Load the plugin\n              py3dll = LoadLibrary(L\"python3.dll\");\n              if (!py3dll)\n                XLO_THROW(writeWindowsError());\n            }\n\n            typedef const char*(*Py_GetVersion_t)();\n            const auto pyGetVersion = (Py_GetVersion_t)\n              GetProcAddress(py3dll, \"Py_GetVersion\");\n\n            if (!pyGetVersion)\n              XLO_THROW(writeWindowsError());\n\n            // This means we need to link python3.dll. If python 4 comes along and \n            // the old python3.dll is no longer around, we could sniff the dependencies\n            // of python.exe to work out which version we need to load\n            auto pyVersion = pyGetVersion();\n\n            // Version string looks like \"X.Y.Z blahblahblah\"\n            // Convert X.Y version to XY and append to dllname. Stop processing\n            // when we hit something else\n            auto periods = 0;\n            for (auto c = pyVersion; ; ++c)\n            {\n              if (isdigit(*c))\n                dllName.push_back(*c);\n              else if (*c == '.')\n              {\n                if (++periods > 1)\n                  break;\n              }\n              else\n                break;\n            }\n          }\n\n          dllName += \".pyd\";\n\n          // Load the library - the xlOil loader should already have set the DLL\n          // load directory and we expect to find the versioned python plugins\n          // in the directory this DLL is in.\n          thePythonLib = LoadLibraryA(dllName.c_str());\n          if (!thePythonLib)\n            XLO_THROW(\"Failed LoadLibrary for: {}\", dllName);\n\n          theInitFunc = (PluginInitFunc)GetProcAddress(\n            thePythonLib,\n            \"xloil_python_init\");\n\n          if (!theInitFunc)\n            XLO_THROW(\"Failed to find xloil python entry point in {}\", dllName);\n        }\n\n        // Forward the request to the real python plugins \n        return theInitFunc(context, plugin);\n      }\n      catch (const std::exception& e)\n      {\n        XLO_ERROR(e.what());\n        return -1;\n      }\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/Loader/xlOil_Python.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{CE2AD1AD-E034-4C06-943F-8251C05AD37A}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python3.lib</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\">\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\..\\libs\\xlOilPlugin.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <PropertyGroup>\n    <IncludePath>$(xlOilRoot)external\\python\\3.10\\include;$(xlOilRoot)src;$(IncludePath);$(ProjectDir)</IncludePath>\n    <LibraryPath>$(xlOilRoot)external\\python\\3\\$(Platform);$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>PYTHON_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>xloilHelpers.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"StubLoader.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\..\\src\\xlOilHelpers\\xlOilHelpers.vcxproj\">\n      <Project>{f7aa4c6f-c223-4ed1-bbb3-836e7ec044f2}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\..\\src\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/Package/TestConfig.py",
    "content": "from pathlib import Path\nimport sys\nimport os\n\nPACKAGE_PATH = Path(__file__).parent.resolve()\nSOLUTION_PATH = PACKAGE_PATH / \"../../../\"\nTEST_PATH = SOLUTION_PATH / \"tests\"\n\ndef _set_test_environment():\n    \"\"\"\n        If the env var XLOIL_TEST_BIN_DIR has been defined, ensure the python \n        package is on the path and XLOIL_BIN_DIR is set. Note that \n        XLOIL_TEST_BIN_DIR is assumed to be relative to the solution root.\n\n        Otherwise assume we are in pre-release test mode and that the \n        xloil addin has been installed.\n    \"\"\"\n\n    test_bin_dir = os.environ.get(\"XLOIL_TEST_BIN_DIR\", None)\n    \n    if test_bin_dir is not None:\n        global ADDIN_PATH\n        bin_path = (SOLUTION_PATH / test_bin_dir).resolve()\n\n        os.environ['XLOIL_BIN_DIR'] = str(bin_path)\n        # Need to do this so when we launch Excel, we can see the python package\n        os.environ[\"PYTHONPATH\"] = str(PACKAGE_PATH)\n    else:\n        os.environ[\"PYTHONPATH\"] = os.curdir\n\n_set_test_environment()"
  },
  {
    "path": "libs/xlOil_Python/Package/generate_stubs.py",
    "content": "#\n# Called from xloil/docs/make.cmd\n#\n\nimport os\nimport sys\nfrom pathlib import Path\n\nPACKAGE_PATH = Path(__file__).parent.resolve()\nSOLUTION_PATH = PACKAGE_PATH / \"../../../\"\n\n# Setup paths to import xlOil\nsys.path.append(str(PACKAGE_PATH))\nimport xloil\n\n# Setup paths to import pybind11_stubgen\nsys.path.append(str(SOLUTION_PATH / \"external\" / \"pybind11-stubgen\"))\nfrom pybind11_stubgen import write_documentation_stubs\n\n# Run the stub generator\nout_dir = PACKAGE_PATH / 'stubs'\n\nwrite_documentation_stubs('xloil_core', out_dir)\n\n# Seems awfully hard to copy/delete directories in python, you'd\n# think pathlib would have it covered\nfrom distutils.dir_util import copy_tree\ncopy_tree(str(out_dir), str(PACKAGE_PATH / \"xloil\" / \"stubs\"))\nimport shutil\nshutil.rmtree(str(out_dir))"
  },
  {
    "path": "libs/xlOil_Python/Package/setup.py",
    "content": "from setuptools import setup, Distribution, find_packages\nimport sys\nfrom pathlib import Path\nfrom argparse import ArgumentParser\nimport os\nimport shutil as sh\nimport re\n\n#\n# Process our cmd line args\n#\nparser = ArgumentParser()\nparser.add_argument(\"--arch\")\nparser.add_argument(\"--pyver\")\nparser.add_argument(\"--version\")\nargs, unknown = parser.parse_known_args()\n\nif 'arch' not in args:\n    raise Exception(\"No architecture specified\")\n\nif 'pyver' not in args:\n    raise Exception(\"No python version specified\")\n\nif 'version' not in args:\n    raise Exception(\"No xloil version specified\")\n\ntarget_py_ver = args.pyver\n\n# Pass the un-parsed args to setuptools\nsys.argv = [sys.argv[0]] + unknown\n\n#\n# Define directoies\n#\n# We are run from ./staging/pypackage so need to go up a directory\n\nstaging_dir = staging_dir = Path(__file__).resolve().parent.parent\nbin_dir = staging_dir / args.arch\n\n#\n# Specify data files to copy\n#\ndata_files = [str(bin_dir / f) for f in [\n    'xlOil.xll', \n    'xlOil.dll',\n    'xlOil_Python.dll', \n    'xlOil_Utils.dll', \n    'xlOil_SQL.dll', \n    'xlOil_Install.ps1', \n    'xlOil_NewAddin.ps1',\n    'xlOil_Remove.ps1']]\n\ndata_files += [str(staging_dir / 'xlOil.ini')]\n\npy_version_XY = target_py_ver.replace('.','')\ndata_files += [str(bin_dir / f'xlOil_Python{py_version_XY}.pyd')]\n\n#\n# Grab the help text from README.md\n# \nwith open(\"README.md\", \"r\") as fh:\n    contents_of_readme = fh.read()\n\nclass BinaryDistribution(Distribution):\n    \"\"\"Distribution which always forces a binary package with platform name\"\"\"\n    def has_ext_modules(self):\n        return True\n\nsetup(\n    name=\"xloil\",\n    version=args.version,\n    author=\"Steven Cunnane\",\n    author_email=\"replace-this-with-my-surname@gmail.com\",\n    description=\"Excel interop for Python and Jupyter\",\n    long_description=contents_of_readme,\n    long_description_content_type=\"text/markdown\",\n    url=\"https://gitlab.com/stevecu/xloil\",\n    download_url='https://gitlab.com/stevecu/xloil/-/releases/',\n    project_urls = {\n      'Documentation': 'https://xloil.readthedocs.io/en/stable',\n    },\n    license='Apache',\n    \n    distclass=BinaryDistribution,\n    packages=find_packages(),\n    data_files=[('share/xloil', data_files)],\n    entry_points = {\n        'console_scripts': ['xloil=xloil.command_line:main'],\n        'pyinstaller40':   ['hook-dirs=xloil._pyinstaller:get_hook_dirs'],\n    },\n\n    # Doesn't work, but the internet says it should\n    # options={'bdist_wheel':{'python_tag':'foo'}},\n    \n    python_requires=f'>=3.6',\n    install_requires=[\n        'numpy>=1.18',\n        'tomlkit'\n    ],\n    extras_require={\n        \"com\": [\"pywin32\", \"tkinter\"],\n    },\n    classifiers=[\n        'Development Status :: 5 - Production/Stable',\n        'Programming Language :: Python :: 3',\n        'Programming Language :: Python :: 3.7',\n        'Programming Language :: Python :: 3.8',\n        'Programming Language :: Python :: 3.9',\n        'Programming Language :: Python :: 3.10',\n        'Programming Language :: Python :: 3.11',\n        'Programming Language :: Python :: 3.12',\n        'Programming Language :: Python :: 3.13',\n        'Programming Language :: Python :: 3.14',\n        'Programming Language :: C++',\n        'Topic :: Software Development :: Libraries :: Python Modules',\n        'Topic :: Office/Business :: Financial :: Spreadsheet',\n        'Topic :: Software Development :: Libraries :: Application Frameworks',\n        'Framework :: Jupyter',\n        'Operating System :: Microsoft :: Windows'\n    ]\n)"
  },
  {
    "path": "libs/xlOil_Python/Package/test_JupyterConnection.py",
    "content": "import unittest\nfrom pathlib import Path\nfrom unittest.mock import Mock\nfrom TestConfig import *\n\n\ndef _test_func1():\n    ...\n\ndef _test_func2(x):\n    ...\n\ndef _test_func3(x: str, y:int, **kwargs):\n    ...\n\nclass Test_JupyterConnection(unittest.TestCase):\n\n    def test_RegisterFunc(self):\n        \"\"\"\n        Tests the serialisation and deserialisation which occurs when a function\n        is decorated for registration in a jupyter session\n        \"\"\"\n        from xloil.jupyter import _JupyterConnection\n\n        # Mock xlOil's function registration as it only works when embedded\n        import xloil_core\n        registrar = Mock()\n        xloil_core._register_functions = registrar\n\n        # Create the impl object which gets created in the jupyter kernel.\n        from xloil.jupyter_kernel import _xlOilJupyterImpl\n        ipy_mock = Mock()\n        xloil_jupyter = _xlOilJupyterImpl(ipy_shell=ipy_mock, excel_hwnd=0)\n\n        # func_inspect.Arg gets pasted into the impl object when created in \n        # a jupyter kernel; here we need to do that manually\n        from xloil.func_inspect import Arg\n        setattr(_xlOilJupyterImpl, \"Arg\", Arg)\n        \n        for func in [_test_func1, _test_func2, _test_func3]:\n            # Subtests are broken in Visual Studio as of 2022\n\n            #with self.subTest(func=func):\n\n            # 'decorate' func using the decorator exposed in jupyter\n            xloil_jupyter.func(func)\n\n            # Get the args the decorator publishes to kernels\n            args = ipy_mock.display_pub.publish.call_args[0]\n\n            self.assertEqual(args[1].get('type'), \"FuncRegister\")\n\n            func_info = args[0].get('xloil/data')\n\n            _JupyterConnection._process_xloil_message(\n                self=Mock(), message_type=\"FuncRegister\", payload=func_info)\n\n            registrar.assert_called()\n\n\n"
  },
  {
    "path": "libs/xlOil_Python/Package/test_PythonAutomation.py",
    "content": "import unittest\nimport sys\nimport os\nimport numpy as np\n\nfrom TestConfig import *\n\n\nclass Test_PythonAutomation(unittest.TestCase):\n    def __init__(self, methodName: str = \"runTest\") -> None:\n        super().__init__(methodName)\n\n        import xloil\n        self._app = xloil.Application()\n        self._wb = self._app.workbooks.add()\n        # Can be useful for debugging\n        # app.visible=True\n\n    def test_range_trim(self):\n\n        import xloil as xlo\n\n        ws = self._wb.worksheets.add()\n        address = \"A1:C1\"\n        range = ws[address]\n\n        self.assertEqual(range.address(local=True), address)\n\n        self.assertEqual(len(range.areas), 1)\n\n        # Create the range another way, check we have the same result\n        self.assertEqual(range.bounds, \n                         ws.range(from_row=0, from_col=0, \n                                  num_rows=1, num_cols=3).bounds)\n\n        # Empty range: trimming returns top left cell\n        firstR, firstC, lastR, lastC = range.trim().bounds\n        self.assertEqual(firstR, lastR)\n        self.assertEqual(firstC, lastC)\n\n        # Make range non empty, now trimming returns entire range\n        range.set(1)\n        firstR, firstC, lastR, lastC = range.trim().bounds\n        self.assertEqual(range.trim().bounds, range.bounds)\n\n        # Try getting special cells constants - should return\n        # the entire range\n        numbers = range.special_cells(\"constants\", (\"numbers\", \"logical\"))\n        self.assertEqual(numbers.bounds, range.bounds)\n\n        # Double values in the range and check the sum doubles\n        range *= 2\n        self.assertEqual(np.sum(range.value), 2 * len(range))\n\n        # Clear the range, now trimming should give 1 cell again\n        range.clear()\n        self.assertEqual(range.trim().shape, (1, 1))\n\n\n    def test_specialcells(self):\n\n        ws = self._wb.worksheets.add()\n        ws[\"A1\"] = 1\n        ws[\"A2\"] = \"world\"\n        ws[\"B2\"] = 2\n        ws[\"B1\"] = \"hello\"\n        \n        text_cells = ws[\"A1:B2\"].special_cells(\"constants\", str)\n\n        # Should be a 2 area range\n        self.assertEqual(len(text_cells.areas), 2)\n\n        message = \" \".join((cell.value for cell in text_cells))\n        self.assertEqual(message, \"hello world\")\n\n    def test_formula(self):\n        ws = self._wb.worksheets.add()\n        ws[\"A1\"] = \"=A2+1\"\n        ws[\"A2\"] = 2\n\n        self.assertEqual(ws[\"A1\"].has_formula, True)\n        self.assertEqual(ws[\"A1\"].formula, \"=A2+1\")\n\n\n\nclass Test_PythonUtils(unittest.TestCase):\n    \n    def test_convert_address_a1(self):\n        import xloil as xlo\n\n        self.assertEqual(\n            xlo.Address((0, 0))(style=\"a1\"),\n            \"A1\")\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1)).a1,\n            \"A1:B2\")\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1)).a1_fixed,\n            \"$A$1:$B$2\")\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1))(style=\"$a$1\"),\n            \"$A$1:$B$2\")\n\n        self.assertEqual(\n            xlo.Address(\"Sheet1!r1c1\")(style=\"a1\"),\n            \"'Sheet1'!A1\")\n\n        count = 0\n        for cell in xlo.Address((0, 0, 2, 2)):\n            self.assertEqual(cell.from_row, cell.to_row)\n            self.assertEqual(cell.from_col, cell.to_col)\n            count += 1\n\n        self.assertEqual(count, 6)\n\n    def test_convert_address_rc(self):\n        import xloil as xlo\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1))(style=\"rc\"),\n            \"R1C1:R2C2\")\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1)).rc_fixed,\n            \"$R1$C1:$R2$C2\")\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1)).rc_fixed,\n            \"$R1$C1:$R2$C2\")\n\n        self.assertEqual(\n            xlo.Address(\"Sheet1!$a$1\").rc,\n            \"'Sheet1'!R1C1\")\n\n    def test_convert_address_tuple(self):\n        import xloil as xlo\n\n        self.assertEqual(\n            xlo.Address((0, 0)).tuple,\n            (0, 0))\n\n        self.assertEqual(\n            xlo.Address((0, 0, 1, 1)).tuple,\n            (0, 0, 1, 1))\n\n        self.assertEqual(\n            xlo.Address(\"$a$1\").tuple,\n            (0, 0))\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "libs/xlOil_Python/Package/test_SpreadsheetRunner.py",
    "content": "import unittest\nimport os\nimport sys\nfrom pathlib import Path\n\nfrom TestConfig import *\n\nRESULT_RANGE_PREFIX = \"test_\"\n\n# TODO: as new sheets are unlikely to be added often, could manually make a test case per sheet\nclass Test_SpreadsheetRunner(unittest.TestCase):\n    def test_RunSheets(self):\n\n        SHEET_PATH = TEST_PATH / \"AutoSheets\"\n\n        import xloil as xlo\n        from xloil._paths import ADDIN_NAME, XLOIL_BIN_DIR\n\n        test_sheets = [(SHEET_PATH / x) for x in SHEET_PATH.glob(\"*.xls*\")]\n\n        app = xlo.Application()\n        \n        # Excel like to have at least one workbook open. If not, then when\n        # we close our test workbook below, sometimes the COM server will\n        # become unavailable and we'll get \"Remote procedure call failed\"\n        dummy = app.workbooks.add()\n\n        # Load addin: when running via COM automation, no addins are  \n        # loaded by default\n        if not app.RegisterXLL(os.path.join(XLOIL_BIN_DIR, ADDIN_NAME)):\n            raise Exception(\"xloil load failed\")\n\n        # Uncomment these lines to help debugging. Note the debugger\n        # can be attached to the Excel *or* python process\n        #input(\"Attach debugger now...\")\n        app.visible = True\n\n        test_results = {}\n        for filename in test_sheets:\n            print(filename)\n            wb = app.open(str(filename), read_only=True)\n    \n            app.calculate(full=True)\n            names = wb.to_com().Names\n            \n            # Some of the python test functions (not RTD or async) require this \n            # wait time to work. I'm not completely sure why.\n            if \"settings_wait\" in [x.Name.lower() for x in names]:\n                wait_time = wb[\"Settings_Wait\"].value\n                import time\n                time.sleep(wait_time)\n                app.calculate()\n                time.sleep(1)\n        \n            for named_range in names:\n                if named_range.Name.lower().startswith(RESULT_RANGE_PREFIX):\n                    # skip one char as RefersTo always starts with '='\n                    address = named_range.RefersTo[1:]\n                    test_results[(filename.stem, named_range.Name)] = wb[address].value\n        \n            wb.close(save=False)\n\n        app.quit()\n\n        \n        # Subtests are broken in VS code up to 2021. Don't seem to work\n        # in Visual Studio 2019 either... hoping that one day....\n        # https://github.com/microsoft/vscode-python/issues/17561\n\n        succeed = True\n        for k, v in test_results.items():\n            with self.subTest(msg=k):\n                self.assertTrue(v)\n            if v is not True:\n                print(k, v)\n                succeed = False\n        self.assertTrue(succeed) # Required because VS is broken\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xlOil_Python_Package.pyproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" DefaultTargets=\"Build\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{9bad0dfb-5b9d-4cf0-8bd8-e812bb7c5046}</ProjectGuid>\n    <ProjectHome />\n    <StartupFile>setup.py</StartupFile>\n    <SearchPath>\n    </SearchPath>\n    <WorkingDirectory>.</WorkingDirectory>\n    <OutputPath>.</OutputPath>\n    <ProjectTypeGuids>{888888a0-9f3d-457c-b088-3a5042f75d52}</ProjectTypeGuids>\n    <LaunchProvider>Standard Python launcher</LaunchProvider>\n    <TestFramework>unittest</TestFramework>\n    <UnitTestPattern>test*.py</UnitTestPattern>\n    <UnitTestRootDirectory>.</UnitTestRootDirectory>\n    <EnableNativeCodeDebugging>True</EnableNativeCodeDebugging>\n    <IsWindowsApplication>False</IsWindowsApplication>\n    <Environment>\n    </Environment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Debug'\" />\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Release'\" />\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\" '$(VisualStudioVersion)' == '' \">10.0</VisualStudioVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"generate_stubs.py\" />\n    <Compile Include=\"setup.py\" />\n    <Compile Include=\"TestConfig.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"test_JupyterConnection.py\" />\n    <Compile Include=\"test_PythonAutomation.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"test_SpreadsheetRunner.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\_event_loop.py\" />\n    <Compile Include=\"xloil\\_superreload.py\" />\n    <Compile Include=\"xloil\\com.py\" />\n    <Compile Include=\"xloil\\command_line.py\" />\n    <Compile Include=\"xloil\\debug.py\" />\n    <Compile Include=\"xloil\\excelfuncs.py\" />\n    <Compile Include=\"xloil\\func_inspect.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\gui\\qt_console.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\gui\\tk_console.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\gui\\wx.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\gui\\qtpy.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\gui\\__init__.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\importer.py\" />\n    <Compile Include=\"xloil\\jupyter.py\" />\n    <Compile Include=\"xloil\\jupyter_kernel.py\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"xloil\\matplotlib.py\" />\n    <Compile Include=\"xloil\\pandas.py\" />\n    <Compile Include=\"xloil\\stubs\\xloil_core\\event\\__init__.py\" />\n    <Compile Include=\"xloil\\stubs\\xloil_core\\__init__.py\" />\n    <Compile Include=\"xloil\\xloil_ribbon.py\" />\n    <Compile Include=\"xloil\\_core.py\" />\n    <Compile Include=\"xloil\\_paths.py\" />\n    <Compile Include=\"xloil\\pillow.py\" />\n    <Compile Include=\"xloil\\register.py\" />\n    <Compile Include=\"xloil\\rtd.py\" />\n    <Compile Include=\"xloil\\gui\\tkinter.py\" />\n    <Compile Include=\"xloil\\type_converters.py\" />\n    <Compile Include=\"xloil\\logging.py\" />\n    <Compile Include=\"xloil\\__init__.py\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"xloil\" />\n    <Folder Include=\"xloil\\gui\\\" />\n    <Folder Include=\"xloil\\stubs\\\" />\n    <Folder Include=\"xloil\\stubs\\xloil_core\\\" />\n    <Folder Include=\"xloil\\stubs\\xloil_core\\event\\\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\Python Tools\\Microsoft.PythonTools.targets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/__init__.py",
    "content": "\nfrom ._core import *\n\nfrom .logging import *\n\nfrom .register import (\n    Arg, \n    func,\n    scan_module,\n    register_functions,\n    Caller,\n    )\n\nfrom .importer import (\n    linked_workbook,\n    source_addin,\n    get_event_loop,\n    import_functions\n    )\n\nfrom .com import (\n    constants,\n    PauseExcel,\n    fix_name_errors\n    )\n\nfrom .rtd import RtdSimplePublisher\n\nfrom .type_converters import (\n    ExcelValue,\n    Cache, \n    SingleValue,\n    AllowRange,\n    Array,\n    FastArray,\n    converter,\n    returner\n    )\n\n# Small hacky workaround for the jupyter connection feature.\n# If we're imported in an ipython kernel and the variable \n# _xloil_jpy_impl exists, it means xloil has connected to tht\n# kernel. In which case, fix up the `func` and `app` functions\n# to do the same as before\ntry:\n    ipy = get_ipython()\n    \n    impl = ipy.user_ns.get(\"_xloil_jpy_impl\", None)\n    if impl is not None:\n        global func, app\n        func = impl.func\n        app = impl.app\nexcept NameError:\n    ... # Not in an ipython kernel"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/_core.py",
    "content": "import importlib.util\nfrom ._paths import XLOIL_BIN_DIR, add_dll_path, _get_environment_strings\nimport os\nimport sys\n\n# Tests if we have been loaded from the XLL plugin which will have\n# already injected the xloil_core module\nXLOIL_EMBEDDED = importlib.util.find_spec(\"xloil_core\") is not None\nXLOIL_READTHEDOCS = 'READTHEDOCS' in os.environ\n\nif XLOIL_EMBEDDED:\n    \"\"\"\n    This looks like hocus pocus, but if we don't do it Qt (and possibly others)\n    will fail to find environment variables we set prior to even loading the \n    python3.dll. I suspect this is something to do with having different environment\n    blocks per version of the C runtime. See discussion https://bugs.python.org/issue16633\n    This seems like the easist workaround for now.\n    \"\"\"\n    env_vars = _get_environment_strings()\n    for name, val in env_vars.items():\n        if not name.startswith(\"=\"):\n            os.environ[name] = val\n\n    try: \n        from xloil_core import _LogWriter\n        from conda.activate import CmdExeActivator\n        if os.path.exists(os.path.join(sys.prefix, 'conda-meta', 'history')):\n            activation = CmdExeActivator().build_activate(sys.prefix)\n            for name, val in activation['export_vars'].items():\n                os.environ[name] = str(val)\n    except ImportError:\n        pass\n\nelif not XLOIL_READTHEDOCS:\n\n    # We try to load xlOil_PythonXY.pyd where XY is the python version\n    # if we succeed, we fake an entry in sys.modules so that future \n    # imports of 'xloil_core' will work as expected.\n    import importlib\n\n    sys.path.append(XLOIL_BIN_DIR)\n\n    ver = sys.version_info\n    pyd_name = f\"xlOil_Python{ver.major}{ver.minor}\"\n    mod = None\n    try:\n        with add_dll_path(XLOIL_BIN_DIR):\n            mod = importlib.import_module(pyd_name)\n    except (ImportError, ModuleNotFoundError) as e:\n        raise type(e)(f\"Failed to load {pyd_name} with \" +\n            f\"sys.path={sys.path} and XLOIL_BIN_DIR={XLOIL_BIN_DIR} and PATH={os.environ['PATH']}\")\n\n    sys.path.pop()\n    sys.modules['xloil_core'] = mod\n\n\ntry:\n    from xloil_core import *\n    # These classes back singletons, so we want their docstrings but we don't \n    # want to suggest they are part of the API, hence the leading underscore\n    from xloil_core import _LogWriter, _AddinsDict, _DateFormatList \n    \nexcept ImportError:\n\n    # Fallback to stubs\n    from .stubs.xloil_core import *\n    from .stubs.xloil_core import _LogWriter, _AddinsDict, _DateFormatList \n    \n    # Not completely sure this part is necessary in stubs mode\n    from .stubs import xloil_core\n    sys.modules['xloil_core'] = xloil_core\n   \n\nif XLOIL_READTHEDOCS:\n    def _fix_module_for_docs(namespace, target, replace):\n        \"\"\"\n            When sphinx autodoc reads python objects, it uses their __module__\n            attribute to determine their fully-qualified name.  When importing\n            from a hidden private implementation, we'd like to rename this \n            __module__ so the import appeared to come from the top level package\n        \"\"\"\n        for name in list(namespace):\n            val = namespace[name]\n            if getattr(val, '__module__', None) == target:\n                val.__module__ = replace\n\n    _fix_module_for_docs(locals(), xloil_core.__name__, 'xloil')\n\nclass _ActiveWorksheets:\n    def __getattr__(self, name):\n        return getattr(active_workbook().worksheets, name)\n\n    def __getitem__(self, name):\n        return active_workbook().worksheets[name]\n\n    def __iter__(self):\n        return iter(active_workbook().worksheets)\n\n\nclass _ActiveWorkbooks:\n\n    _impl = None\n    \n    @property\n    def _obj(self):\n        if self._impl is None:\n            self._impl = all_workbooks()\n        return self._impl\n\n    def __getattr__(self, name):\n        return getattr(self._obj, name)\n\n    def __getitem__(self, name):\n        return self._obj[name]\n\n    def __iter__(self):\n        return iter(self._impl)\n\nworksheets = _ActiveWorksheets()\n\"\"\"\n    Collection of all open workbooks as Workbook objects for the current\n    application. Equivalent to `xloil.app().workbooks`. \n\n    Wraps `xloil_core.all_workbooks()` to match Excel's *Workbooks* \n    collection. \n\n    Examples\n    --------\n\n        workbooks['MyBook'].path\n        workbooks.active.path\n\n\"\"\"\n\nworkbooks = _ActiveWorkbooks()\n\"\"\"\n    Collection of Worksheets of the active Workbook\n    \n    Wraps `active_workbook().worksheets` to match Excel's *Worksheets* \n    collection. \n\n    Examples\n    --------\n\n        worksheets['Sheet1']['A1'].value = 'Hello'\n\n\"\"\"\n\ndef create_gui(*args, **kwargs) -> ExcelGUI:\n    # DEPRECATED. Rather create the xloil.ExcelGUI object directly.\n\n    import warnings\n    warnings.warn(\"create_gui is deprecated, create the ExcelGUI object directly\", \n                  DeprecationWarning, stacklevel=2)\n    if 'mapper' in kwargs:\n        kwargs['funcmap'] = kwargs.pop('mapper')\n    return ExcelGUI(*args, **kwargs)\n\n\nclass Singleton(type):\n    _instances = {}\n    def __call__(cls, *args, **kwargs):\n        if cls not in cls._instances:\n            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)\n        return cls._instances[cls]\n    \n\nclass StatusBarExecutor:\n    \"\"\"\n    Executor which displays messages in Excel's status bar whilst running.\n    Errors are logged rather than raised.\n    \"\"\"\n    def __init__(self, timeout):\n        self._timeout = timeout\n        \n    def map(self, func, *args, message, job_name: str):\n        \"\"\"\n        args should be a parameter list of iterables of arguments to pass to *func*,\n        the same as python's built-in map. *message* should be a function which takes\n        the same arguments as *func* and returns a message to be displayed.\n        \n        Errors are logged rather than raised.\n        \"\"\"\n        success = True\n        from .logging import log_except\n        \n        with StatusBar(self._timeout) as status:\n             \n            for arg_tuple in zip(*args):\n                msg = message(*arg_tuple)   \n                status.msg(msg)\n                try:\n                    yield func(*arg_tuple)\n                except Exception as err:\n                    log_except(f\"Failed {msg}\")\n                    success = False\n                    yield err\n                    \n            if success:\n                status.msg(f\"{job_name} succeeded\")\n            else:\n                status.msg(f\"{job_name} failed (see log)\")\n\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/_event_loop.py",
    "content": "from .logging import log_except\n\ndef _logged_wrapper(func):\n    \"\"\"\n    Wraps func so that any errors are logged. Invoked from the core.\n    \"\"\"\n    def logged_func(*args, **kwargs):\n        try:\n            return func(*args, **kwargs)\n        except Exception as e:\n            log_except(f\"Error during {func.__name__}\")\n    return logged_func\n\nasync def _logged_wrapper_async(coro):\n    \"\"\"\n    Wraps coroutine so that any errors are logged. Invoked from the core.\n    \"\"\"\n    try:\n        return await coro\n    except Exception as e:\n        log_except(f\"Error during coroutine\")\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/_paths.py",
    "content": "import sys\nimport os\n\nADDIN_NAME        = \"xlOil.xll\"\nINIFILE_NAME      = \"xlOil.ini\"\nAPP_DATA_DIR      = os.path.join(os.environ.get('APPDATA','.'), \"xlOil\")\nXLOIL_INSTALL_DIR = os.path.join(sys.prefix, \"share\", \"xloil\")\nXLOIL_BIN_DIR     = os.environ.get(\"XLOIL_BIN_DIR\", XLOIL_INSTALL_DIR)\n\nclass _SetPathContext:\n\n    def __init__(self, path):\n        self._path = path\n        self._old_PATH = os.environ['PATH']\n\n    def __enter__(self):\n        os.environ['PATH'] += os.pathsep + self._path \n        return self\n\n    def close(self):\n        os.environ['PATH'] = self._old_PATH\n\n    def __exit__(self, *args):\n        self.close()\n\ndef add_dll_path(path):\n    \"\"\"\n        Returns a context manager which adds a PATH to the dll search directory\n        (either via AddDllDirectory or by changing PATH). The change is reversed\n        on context exit\n    \"\"\"\n    try:\n        return os.add_dll_directory(path)\n    except (AttributeError, FileNotFoundError):\n        # Either Py < 3.8 or path does not exist (but we have to return a context mgr)\n        return _SetPathContext(path)\n\ndef _get_environment_strings():\n    \"\"\"\n        Does the same as:\n            import win32profile\n            win32profile.GetEnvironmentStrings()\n        But avoids the depedency on pywin32\n    \"\"\"\n   \n    import ctypes\n    import locale\n\n    kernel_func = ctypes.windll.kernel32.GetEnvironmentStringsA\n    char_ptr = ctypes.POINTER(ctypes.c_char)\n    kernel_func.restype = char_ptr\n\n    # P will point to an block of char formatted as:\n    #     name1=val1/0\n    #     ...\n    #     nameN=valN/0/0\n    # (line-breaks added for clarity, they aren't present in the string)\n    p = kernel_func()\n    try:\n    \n        result = {}\n        start = end = 0\n        null = b'\\x00' # Null-terminator for C-strings\n\n        while True:\n            while p[end] != null:\n                end += 1\n            if end == start:\n                break\n                \n            keyval = p[start:end].decode(locale.getpreferredencoding()).partition('=')\n            # GetEnvironmentStrings returns some strange entries starting with '='\n            if any(keyval[0]):\n                result[keyval[0]] = keyval[2]\n                \n            end += 1    # Step over null terminator\n            start = end # Move string start pointer\n    finally:\n        ctypes.windll.kernel32.FreeEnvironmentStringsA(p)\n    \n    return result"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/_pyinstaller/__init__.py",
    "content": "import os\n\ndef get_hook_dirs():\n    # Tell PyInstaller where to find hooks provided by this distribution\n    return [os.path.dirname(__file__)]\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/_pyinstaller/hook-xloil.py",
    "content": "from importlib.metadata import files\n_BINARY_SUFFIXES = [\".dll\", \".xll\", \".pyd\"]\nbinaries=[\n    (f.locate(), \"share/xloil\") \n    for f in files(\"xloil\") \n    if \"share\" in str(f) and f.suffix in _BINARY_SUFFIXES\n]\ndatas=[\n    (f.locate(), \"share/xloil\") \n    for f in files(\"xloil\") \n    if \"share\" in str(f) and f.suffix not in _BINARY_SUFFIXES\n]\nhiddenimports = [\n    \"xloil.xloil_ribbon\", \n    \"xloil._event_loop\", \n    \"xloil.excelfuncs\"\n]\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/_superreload.py",
    "content": "\"\"\"IPython extension to reload modules before executing user code.\n\nCaveats\n=======\n\nReloading Python modules in a reliable way is in general difficult,\nand unexpected things may occur. ``%autoreload`` tries to work around\ncommon pitfalls by replacing function code objects and parts of\nclasses previously in the module with new versions. This makes the\nfollowing things to work:\n\n- Functions and classes imported via 'from xxx import foo' are upgraded\n  to new versions when 'xxx' is reloaded.\n\n- Methods and properties of classes are upgraded on reload, so that\n  calling 'c.foo()' on an object 'c' created before the reload causes\n  the new code for 'foo' to be executed.\n\nSome of the known remaining caveats are:\n\n- Replacing code objects does not always succeed: changing a @property\n  in a class to an ordinary method or a method to a member variable\n  can cause problems (but in old objects only).\n\n- Functions that are removed (eg. via monkey-patching) from a module\n  before it is reloaded are not upgraded.\n\n- C extension modules cannot be reloaded, and so cannot be autoreloaded.\n\n- While comparing Enum and Flag, the 'is' Identity Operator is used (even in the case '==' has been used (Similar to the 'None' keyword)).\n\n- Reloading a module, or importing the same module by a different name, creates new Enums. These may look the same, but are not.\n\"\"\"\n\n# ------------------------------------------------------------------------------\n# superreload\n# ------------------------------------------------------------------------------\n# -----------------------------------------------------------------------------\n#  Copyright (C) 2000 Thomas Heller\n#  Copyright (C) 2008 Pauli Virtanen <pav@iki.fi>\n#  Copyright (C) 2012 The IPython Development Team\n#\n#  Distributed under the terms of the BSD License.  The full license is in\n#  the file COPYING, distributed as part of this software.\n# -----------------------------------------------------------------------------\n#\n# This IPython module is written by Pauli Virtanen, based on the autoreload\n# code by Thomas Heller.\n#\n\nimport sys\nimport types\nimport weakref\nimport gc\nfrom importlib import reload\n\nfunc_attrs = [\n    \"__code__\",\n    \"__defaults__\",\n    \"__doc__\",\n    \"__closure__\",\n    \"__globals__\",\n    \"__dict__\",\n]\n\n\ndef update_function(old, new):\n    \"\"\"Upgrade the code object of a function\"\"\"\n    for name in func_attrs:\n        try:\n            setattr(old, name, getattr(new, name))\n        except (AttributeError, TypeError):\n            pass\n\n\ndef update_instances(old, new):\n    \"\"\"Use garbage collector to find all instances that refer to the old\n    class definition and update their __class__ to point to the new class\n    definition\"\"\"\n\n    refs = gc.get_referrers(old)\n\n    for ref in refs:\n        if type(ref) is old:\n            object.__setattr__(ref, \"__class__\", new)\n\n\ndef update_class(old, new):\n    \"\"\"Replace stuff in the __dict__ of a class, and upgrade\n    method code objects, and add new methods, if any\"\"\"\n    for key in list(old.__dict__.keys()):\n        old_obj = getattr(old, key)\n        try:\n            new_obj = getattr(new, key)\n            # explicitly checking that comparison returns True to handle\n            # cases where `==` doesn't return a boolean.\n            if (old_obj == new_obj) is True:\n                continue\n        except AttributeError:\n            # obsolete attribute: remove it\n            try:\n                delattr(old, key)\n            except (AttributeError, TypeError):\n                pass\n            continue\n        except ValueError:\n            # can't compare nested structures containing\n            # numpy arrays using `==`\n            pass\n\n        if update_generic(old_obj, new_obj):\n            continue\n\n        try:\n            setattr(old, key, getattr(new, key))\n        except (AttributeError, TypeError):\n            pass  # skip non-writable attributes\n\n    for key in list(new.__dict__.keys()):\n        if key not in list(old.__dict__.keys()):\n            try:\n                setattr(old, key, getattr(new, key))\n            except (AttributeError, TypeError):\n                pass  # skip non-writable attributes\n\n    # update all instances of class\n    update_instances(old, new)\n\n\ndef update_property(old, new):\n    \"\"\"Replace get/set/del functions of a property\"\"\"\n    update_generic(old.fdel, new.fdel)\n    update_generic(old.fget, new.fget)\n    update_generic(old.fset, new.fset)\n\n\ndef isinstance2(a, b, typ):\n    return isinstance(a, typ) and isinstance(b, typ)\n\n\nUPDATE_RULES = [\n    (lambda a, b: isinstance2(a, b, type), update_class),\n    (lambda a, b: isinstance2(a, b, types.FunctionType), update_function),\n    (lambda a, b: isinstance2(a, b, property), update_property),\n]\nUPDATE_RULES.extend(\n    [\n        (\n            lambda a, b: isinstance2(a, b, types.MethodType),\n            lambda a, b: update_function(a.__func__, b.__func__),\n        ),\n    ]\n)\n\n\ndef update_generic(a, b):\n    for type_check, update in UPDATE_RULES:\n        if type_check(a, b):\n            update(a, b)\n            return True\n    return False\n\n\nclass StrongRef:\n    def __init__(self, obj):\n        self.obj = obj\n\n    def __call__(self):\n        return self.obj\n\n\nmod_attrs = [\n    \"__name__\",\n    \"__doc__\",\n    \"__package__\",\n    \"__loader__\",\n    \"__spec__\",\n    \"__file__\",\n    \"__cached__\",\n    \"__builtins__\",\n]\n\n\ndef append_obj(module, d, name, obj, autoload=False):\n    in_module = hasattr(obj, \"__module__\") and obj.__module__ == module.__name__\n    if autoload:\n        # check needed for module global built-ins\n        if not in_module and name in mod_attrs:\n            return False\n    else:\n        if not in_module:\n            return False\n\n    key = (module.__name__, name)\n    try:\n        d.setdefault(key, []).append(weakref.ref(obj))\n    except TypeError:\n        pass\n    return True\n\n\ndef superreload(module, reload=reload, old_objects=None, shell=None):\n    \"\"\"Enhanced version of the builtin reload function.\n\n    superreload remembers objects previously in the module, and\n\n    - upgrades the class dictionary of every old class in the module\n    - upgrades the code object of every old function and method\n    - clears the module's namespace before reloading\n\n    \"\"\"\n    if old_objects is None:\n        old_objects = {}\n\n    # collect old objects in the module\n    for name, obj in list(module.__dict__.items()):\n        if not append_obj(module, old_objects, name, obj):\n            continue\n        key = (module.__name__, name)\n        try:\n            old_objects.setdefault(key, []).append(weakref.ref(obj))\n        except TypeError:\n            pass\n\n    # reload module\n    try:\n        # clear namespace first from old cruft\n        old_dict = module.__dict__.copy()\n        old_name = module.__name__\n        module.__dict__.clear()\n        module.__dict__[\"__name__\"] = old_name\n        module.__dict__[\"__loader__\"] = old_dict[\"__loader__\"]\n    except (TypeError, AttributeError, KeyError):\n        pass\n\n    try:\n        module = reload(module)\n    except:\n        # restore module dictionary on failed reload\n        module.__dict__.update(old_dict)\n        raise\n\n    # iterate over all objects and update functions & classes\n    for name, new_obj in list(module.__dict__.items()):\n        key = (module.__name__, name)\n        if key not in old_objects:\n            # here 'shell' acts both as a flag and as an output var\n            if (\n                shell is None\n                or name == \"Enum\"\n                or not append_obj(module, old_objects, name, new_obj, True)\n            ):\n                continue\n            shell.user_ns[name] = new_obj\n\n        new_refs = []\n        for old_ref in old_objects[key]:\n            old_obj = old_ref()\n            if old_obj is None:\n                continue\n            new_refs.append(old_ref)\n            update_generic(old_obj, new_obj)\n\n        if new_refs:\n            old_objects[key] = new_refs\n        else:\n            del old_objects[key]\n\n    return module\n\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/com.py",
    "content": "from . import _core\n\n# TODO: support comtypes\nclass _Win32ComConstants:\n    def __getattr__(self, name):\n        from win32com.client import constants\n        return getattr(constants, name)\n\n\nconstants = _Win32ComConstants()\n\"\"\"\n    Contains the numeric value for enums used in the Excel.Application API.\n    For example:\n\n    ::\n\n        from xloil import constants as xlc\n        xloil.app().Calculation = xlc.xlCalculationManual\n        xloil.app().Selection.PasteSpecial(Paste=xlc.xlPasteFormulas)\n\n\"\"\"\n\nclass PauseExcel():\n    \"\"\"\n    A context manager which pauses Excel by disabling events, turning off screen updating \n    and switching to manual calculation mode.  Which of these changes are applied can\n    be controlled by parameters to the constructor - the default is to apply all of them.\n    Previous settings are restored when the context scope closes.\n\n    Parameters\n    ----------\n    events: bool (default False)\n        if False, pauses Excel's event model (Application.EnableEvents in VBA)\n\n    calculation: bool (default False)\n        if False, sets the calculation mode to manual (Application.Calculation in VBA)\n\n    screen_updating: bool\n        if False, disables screen updating in Excel (Application.ScreenUpdating in VBA)\n\n    alerts: bool\n        if False, disables alerts in Excel (Application.DisplayAlerts in VBA)\n\n    \"\"\"\n    _calc_mode = None\n    _screen_updating = None\n    _events = None\n    _alerts = None\n\n    def __enter__(self, events=False, calculation=False, screen_updating=False, alerts=False):\n        app = _core.app()\n\n        if not events:\n            self._events = app.EnableEvents\n            app.EnableEvents = False\n\n        if not calculation:\n            self._calc_mode = app.Calculation\n            # The below constant equals constants.xlCalculationManual but\n            # avoids the dependency on win32com\n            app.Calculation = -4135\n\n        if not screen_updating:\n            self._screen_updating = app.ScreenUpdating\n            app.ScreenUpdating = False\n\n        if not alerts:\n            self._alerts = app.DisplayAlerts\n            app.DisplayAlerts = False\n\n        return self\n\n    def __exit__(self, type, value, traceback):\n\n        app = _core.app()\n\n        if self._events is not None:\n            app.EnableEvents = self._events\n\n        if self._calc_mode is not None:\n            app.Calculation = self._calc_mode\n\n        if self._screen_updating is not None:\n            app.ScreenUpdating = self._screen_updating\n\n        if self._alerts is not None:\n            app.DisplayAlerts = self._alerts\n\n\ndef fix_name_errors(workbook):\n    \"\"\"\n        Marks #NAME! errors in current workbook for recalculation. Can be used\n        when missing addin functions have caused #NAME! errors - these errors cannot\n        simply be resolved by full recalc (Ctrl-Alt-F9).\n\n        May not be performant in large workbooks with many errors.\n    \"\"\"\n    for ws in workbook.worksheets:\n        errors = ws.used_range.special_cells(\"formulas\", \"errors\")\n        if errors is None:\n            continue\n        for cell in errors:\n            if cell.Value2 == _core.CellError.NAME.value:\n                cell.Formula = cell.Formula\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/command_line.py",
    "content": "import sys\nimport os\nfrom pathlib import Path\nimport re\nimport winreg as reg\nfrom contextlib import suppress\nimport binascii\nimport shutil as sh\nfrom ._paths import *\nfrom argparse import ArgumentParser\n\n_XL_START_PATH = Path(os.getenv('APPDATA')) / \"Microsoft\" / \"Excel\" / \"XLSTART\"\n_XLL_INSTALL_PATH = _XL_START_PATH / ADDIN_NAME\n\ndef _excel_regpath(version):\n    return rf\"Software\\Microsoft\\Office\\{version}\\Excel\"\n\ndef _find_excel_version():\n    # Will fetch a value like \"Excel.Application.16\"\n    # Note for Office 2019, it still gives version 16...hmm\n    verstr = reg.QueryValue(reg.HKEY_CLASSES_ROOT, r\"Excel.Application\\CurVer\")\n    return int(verstr.replace('Excel.Application.',''))\n\n\ndef _check_VBA_access(version):\n\n    user_access = 1\n    lm_access = 1\n\n    with suppress(OSError): \n        user_key = reg.OpenKey(reg.HKEY_CURRENT_USER, _excel_regpath(version) + r\"\\Security\")\n        user_access, = reg.QueryValueEx(user_key, \"AccessVBOM\")\n    with suppress(OSError):\n        lm_key =  reg.OpenKey(reg.HKEY_LOCAL_MACHINE, _excel_regpath(version) + r\"\\Security\")\n        lm_access, = reg.QueryValueEx(lm_key, \"AccessVBOM\")\n\n    if user_access == 0 or lm_access == 0:\n        print(\"To ensure xlOil local functions work, allow access to the VBA Object Model in\\n\" +\n\t\t\t\"Excel > File > Options > Trust Center > Trust Center Settings > Macro Settings\\n\")\n\n\ndef _get_xloil_bin_dir():\n\n    # We look in the a possibly overriden (by an env var) bin dir, the normal install \n    # path and the current directory\n    for bin_path in [Path(XLOIL_BIN_DIR), Path(XLOIL_INSTALL_DIR), Path(\".\")]:\n        if (bin_path / ADDIN_NAME).exists():\n            return bin_path\n\n    raise Exception(f\"{ADDIN_NAME} not found\")\n\ndef _remove_from_resiliancy(filename, version):\n\n    # Source https://stackoverflow.com/questions/751048/\n\n    #Converts the File Name string to UTF16 Hex\n    filename_hex = binascii.hexlify(filename.encode('utf-16'))\n\n    # If we can't find the key or exit the for loop, suppress the error\n    with suppress(OSError): \n        regkey = reg.OpenKey(reg.HKEY_CURRENT_USER, _excel_regpath(version) + r\"\\Resiliency\\DisabledItems\")\n\n        for i in range(1024):\n            name, value, = reg.EnumValue(regkey, i)\n            value_hex = binascii.hexlify(value.encode('utf-16'))\n            if filename_hex in value:\n                reg.DeleteValue(regkey, name)\n\n\ndef _remove_addin(excel_version, addin_path):\n\n    # If we can't find the key or exit the for loop, suppress the error\n    with suppress(OSError): \n        regkey = reg.OpenKey(reg.HKEY_CURRENT_USER, _excel_regpath(excel_version) + r\"\\Add-in Manager\")\n\n        # Cycles through all the properties and delete if it contains the file name.\n        for i in range(1024):\n            name, value, = reg.EnumValue(regkey, i)\n            if addin_path in value:\n                reg.DeleteValue(regkey, name)\n\n\ndef _toml_lit_string(s:str):\n    # TOML literal strings have a lot of quotes and escapes, this function does the encoding\n    return \"'''\" + s.replace('\\\\','\\\\\\\\') + \"'''\"\n\ndef _get_python_paths():\n    \"\"\"\n        Returns the paths to be set in the xlOil.ini file (the appropriate stubs\n        must already exist).\n    \"\"\"\n    return { \n        'PYTHONEXECUTABLE': sys.executable\n    }\n\ndef _write_python_path_to_ini(ini_txt, bin_dir:str, comment_reg_keys:bool, replace_paths=None):\n\n    if replace_paths is None:\n        replace_paths = _get_python_paths()\n\n    fails = 0\n\n    def replace(pat, repl):\n        nonlocal ini_txt\n        ini_txt = re.sub(pat, repl, ini_txt, count=1, flags=re.M)\n            \n    def check_replace(pat, repl):\n        nonlocal fails, ini_txt\n        if re.search(pat, ini_txt, flags=re.M) is None:\n            print(f\"Failed to match pattern {pat}\")\n            fails += 1\n        else:\n            replace(pat, repl)\n    \n    for var, value in replace_paths.items():\n        check_replace(r'^(\\s*' + var + r'\\s*=).*', r'\\g<1>' + _toml_lit_string(value))\n        \n    # Set XLOIL_PATH\n    check_replace(r'^(\\s*XLOIL_PATH\\s*=).*', r'\\g<1>' + _toml_lit_string(str(bin_dir)))\n    \n    # Comment out the now usused code to get the python paths from the registry\n    # Don't error if this fails as it's not critical\n    if comment_reg_keys:\n        \n        for key in [\"xlOil_PythonRegKey\"]:\n            replace(rf'^(\\s*{key}\\s*=.*)', r'#\\g<1>')\n\n    return ini_txt, fails == 0\n    \n   \ndef install_xloil(ini_template:str=None, \n                  addin_name=None,\n                  replace_ini=False, \n                  replace_paths=None):\n\n    ini_path = Path(APP_DATA_DIR) / INIFILE_NAME\n\n    if addin_name is None:\n        addin_name = ADDIN_NAME\n        \n    excel_version = _find_excel_version()\n\n    # Just in case we got put in Excel's naughty corner for misbehaving addins\n    _remove_from_resiliancy(ADDIN_NAME, excel_version)\n\n    # Check access to the VBA Object model (for local functions)\n    _check_VBA_access(excel_version)\n\n    # Ensure XLSTART dir really exists\n    with suppress(FileExistsError):\n        os.mkdir(_XL_START_PATH)\n\n    bin_dir = _get_xloil_bin_dir()\n\n    # Copy the XLL\n    sh.copy(bin_dir / ADDIN_NAME, _XLL_INSTALL_PATH)\n    print(\"Installed \", _XLL_INSTALL_PATH)\n    \n    # Copy the ini file to APPDATA, avoiding overwriting any existing ini\n    if not replace_ini and ini_path.exists():\n        print(\"Found existing settings file at \\n\", ini_path)\n    else:\n        with suppress(FileExistsError):\n            ini_path.parent.mkdir()\n        sh.copy(ini_template or bin_dir / INIFILE_NAME, ini_path)\n\n    # Edit the xloil.ini file. To preserve comments and whitespace it's easier to just use\n    # regex replace rather than read the file as structured TOML\n    ini_txt = ini_path.read_text(encoding='utf-8')\n\n    ini_txt, success = _write_python_path_to_ini(ini_txt, bin_dir, \n                                                 comment_reg_keys=True, \n                                                 replace_paths=replace_paths)\n\n    # Check if any of the counts is not 1, i.e. the expression matched zero or multiple times\n    if not success:\n        print(f'WARNING: Failed to set python paths in {ini_path}. You may have to do this manually.')\n    else:\n        ini_path.write_text(ini_txt, encoding='utf-8')\n        print(f'Edited {ini_path} to point to {sys.prefix} python distribution.')\n\ndef _remove_xloil():\n\n    excel_version = _find_excel_version()\n    \n    # Ensure no xlOil addins are in the registry\n    _remove_addin(excel_version, _XLL_INSTALL_PATH)\n    try:\n        os.remove(_XLL_INSTALL_PATH)\n    except FileNotFoundError:\n        ...\n\ndef _clean_xloil():\n\n    _remove_xloil()\n\n    ini_path = Path(APP_DATA_DIR) / INIFILE_NAME\n    try:\n        os.remove(os.path.join(APP_DATA_DIR, INIFILE_NAME))\n        os.remove(os.path.join(APP_DATA_DIR, \"xlOil.log\"))\n    except FileNotFoundError:\n        ...\n    import subprocess\n    import sys\n\n    subprocess.Popen(f\"{sys.executable} -m pip uninstall --yes xloil\", shell=True)\n\n\ndef _create_addin(filename):\n\n    basename = Path(os.path.splitext(filename)[0])\n\n    xll_path = basename.with_suffix(\".xll\")\n    ini_path = basename.with_suffix(\".ini\")\n\n    bin_dir = _get_xloil_bin_dir()\n    print(\"xlOil binaries found at:\", str(bin_dir))\n\n    sh.copy(bin_dir / ADDIN_NAME,    xll_path)\n    sh.copy(bin_dir / INIFILE_NAME,  ini_path)\n    \n    print(\"New addin created at:\", xll_path)\n\n    # Edit ini file\n    ini_txt = ini_path.read_text(encoding='utf-8')\n    \n    # Assume we want the xlOil_Python plugin as we're running a python script\n    ini_txt, count = re.subn(r'^(\\s*Plugins\\s*=).*', r'\\g<1>[\"xlOil_Python\"]', ini_txt, flags=re.M)\n\n    # Assume we want the python paths set to the distribution running this script\n    ini_txt, success = _write_python_path_to_ini(ini_txt, bin_dir, \n                                                 comment_reg_keys=True)\n    \n    ini_path.write_text(ini_txt)\n\n    print(\"xlOil_Python plugin enabled using python installed at: \", sys.prefix)\n \n    \ndef _package_pyinstaller(ini_template: str, \n                         makespec: bool = False, \n                         extra_args: str = None):\n\n    if ini_template is None:\n        ini_template = Path(APP_DATA_DIR) / INIFILE_NAME\n    else:\n        ini_template = Path(ini_template)\n        \n    python3_dll = os.path.join(sys.base_exec_prefix, \"python3.dll\")\n\n    # Use the filename stems as when the script is run, these files will be\n    # available in its current directory. \n    ini_filename = ini_template.name\n    addin_filename = \"xloil.xll\"\n    \n    entry_point = \"install_main.py\"\n    \n    install_stub = \\\n        'import os\\n' \\\n        'import sys\\n' \\\n        'from xloil.command_line import install_xloil\\n' \\\n        f'install_xloil(ini_template=\"{ini_filename}\", addin_name=\"{addin_filename}\",\\n' \\\n        '   replace_paths={\"PYTHONEXECUTABLE\": os.path.join(sys.prefix, \"python.exe\")})\\n'\n    \n    Path(entry_point).write_text(install_stub)\n\n    args = [\n        '',\n        entry_point,\n        '--onedir',\n        '--debug=noarchive',\n        '--nowindow',\n        f'--add-data={ini_template}:.',\n        f'--add-data={python3_dll}:.',\n        f'--add-data={sys.executable}:.',\n    ]\n\n    if extra_args is not None:\n        args += extra_args\n       \n    print(args)\n    \n    try:\n        if makespec:\n            from PyInstaller.utils.cliutils.makespec import run\n        else:\n            from PyInstaller.__main__ import run\n    except ImportError:\n        raise ImportError(\"To run `xloil package` you need the pyinstaller package installed\")\n\n    sys.argv = args\n    run()\n\n\ndef main():\n    parser = ArgumentParser(prog='xlOil', \n                            description='Excel/Python integration')\n    \n    subparsers = parser.add_subparsers(help='Commands to control local xlOil distribution')\n\n    p = subparsers.add_parser('install', \n                              help='Installs xloil by copying the Excel addin to the XLSTART directory '\n                                   'and sets the correct paths in xloil.ini')\n    p.add_argument(\"ini_template\", nargs='?', type=str, default=None,\n                   help='Path to xloil.ini file to modify and install, if not present the default file is used')\n    p.set_defaults(func=install_xloil)\n    \n    p = subparsers.add_parser('create', \n                              help='Creates an XLL addin to simplify distribution of Excel funcs to other xlOil users')\n    p.add_argument(\"filename\", type=str, \n                   help='Name of the XLL file to create')\n    p.set_defaults(func=_create_addin)\n\n    p = subparsers.add_parser('package', \n                              help='Uses PyInstaller to create a packaged xloil installer. Any arguments '\n                                   'which xlOil does not parse will be passed directly to PyInstaller. '\n                                   'Invoke this function from a minimal python distribution, otherwise the '\n                                   'resulting package may be large. See docs for more details.')\n    p.add_argument(\"ini_template\", type=str, \n                   help='The xlOil ini file to package and distribute')\n    p.add_argument(\"--makespec\", action='store_true', \n                   help='If present, creates the PyInstaller spec file then exits. This allows more precise '\n                        'tweaking of the PyInstaller config. See PyInstaller docs on pyi-makespec')\n    p.set_defaults(func=_package_pyinstaller)\n\n    p = subparsers.add_parser('clean', \n                              help='Uninstalls xlOil and removes its package using pip')\n    p.set_defaults(func=_clean_xloil)\n\n    p = subparsers.add_parser('remove', \n                              help='Removes the xlOil addin from Excel. Leaves xlOil.ini in place')\n    p.set_defaults(func=_remove_xloil)\n    \n    p = subparsers.add_parser('uninstall', \n                              help='Equivalent to the remove command')\n    p.set_defaults(func=_remove_xloil)\n    \n    args, more_args = parser.parse_known_args()\n    \n    func_args = vars(args)\n    func = func_args.pop(\"func\")\n    if len(more_args) > 0:\n        func(**vars(args), extra_args=more_args)\n    else:\n        func(**vars(args))\n        \n\nif __name__ == '__main__':\n    main()"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/debug.py",
    "content": "import xloil\n\nclass _Handler_pdb_window:\n\n    def __init__(self):\n        ...\n\n    def call(self, type, value, trace):\n\n        # Don't pop the debugger up whilst the user is trying to enter function\n        # args in the wizard: that's just rude!\n        if xloil.in_wizard():\n            return\n\n        from xloil.gui.tkinter import Tk_thread\n\n        console = Tk_thread().submit(self._open_console, Tk_thread().root, trace)\n        console.result() # Blocks\n\n    @staticmethod\n    def _open_console(tk_root, trace):\n\n        import tkinter as tk\n        import sys\n        \n        from xloil.gui.tkinter import TkConsole\n\n        top_level = tk.Toplevel(tk_root)\n\n        def disable_debugging():\n            xloil.event.UserException.clear()\n\n        menu = tk.Menu(top_level)\n        menu.add_command(label=\"Disable Debugger\", command=disable_debugging)\n        top_level.config(menu=menu)\n\n        import pdb\n        console = TkConsole(top_level, lambda: pdb.post_mortem(trace),\n            fg='white', bg='black', font='Consolas', insertbackground='red')\n        \n        # Auto resize widget with window\n        console.pack(expand=True, fill=tk.BOTH)\n\n        # Destroy window if pdb exits\n        console.bind(\"<<CommandDone>>\", lambda e: top_level.destroy())\n\n        top_level.deiconify()\n        \n\ndef debugpy_listen(port=None):\n    \n    if _is_debugpy_listening():\n        return\n \n    if port is None:\n        addin = xloil.source_addin() \n        port = int(addin.settings['xlOil_Python']['DebugPyPort'])\n\n    import debugpy\n    connection = debugpy.listen(port)\n\n    xloil.log(f\"Debugpy listening on {connection}\")\n\n    def enable_debug():\n        import debugpy, threading\n        xloil.log.debug(f\"Debugpy enabling debugging on thread {threading.get_native_id()}\")\n        #debugpy.debug_this_thread()\n        debugpy.trace_this_thread()\n\n\n    # Set main thread listener\n    xloil.excel_callback(enable_debug)\n\n    # This enables debugging of async/rtd functions running on the event loop.\n    # Except it doesn't.  VS code refuses to hit breakpoints in them. No idea\n    # why, guess it's just buggy.\n    xloil.get_async_loop().call_soon_threadsafe(enable_debug)\n\n    # Add listener for addin background workers\n    for addin in xloil.xloil_addins.values():\n        addin.event_loop.call_soon_threadsafe(enable_debug)\n    \n    # We monkey-patch all existing threaded functions!\n    for addin in xloil.xloil_addins.values():\n        registrations = addin.functions()\n        for f in registrations:\n            if f.is_threaded:\n                f.func = _debugpy_activate_thread_decorator(f.func)\n\n\ndef _is_debugpy_listening() -> bool:\n    import sys\n    if not 'debugpy' in sys.modules:\n        return False\n\n    import debugpy\n    return debugpy.server.api._adapter_process is not None\n\ndef _debugpy_activate_thread():\n\n    if not _is_debugpy_listening():\n        return\n\n    import debugpy\n    debugpy.debug_this_thread()\n\ndef _debugpy_activate_thread_decorator(fn):\n    \"\"\"\n    If debugpy.listen has not been invoked, just returns its argument\n    \"\"\"\n\n    if not _is_debugpy_listening():\n        return fn\n\n    import functools, debugpy\n\n    already_called = False\n\n    @functools.wraps(fn)\n    def wrap(*args, **kwargs):\n        nonlocal already_called\n        if not already_called:\n            debugpy.debug_this_thread()\n            already_called = True\n        return fn(*args, **kwargs)\n\n    return wrap\n\n\nDEBUGGERS = ['', 'pdb', 'debugpy', 'vscode']\n\n# Keeps a reference to the debug handler used as events only hold weak references\n_PDB_HANDLER = _Handler_pdb_window().call\n\ndef use_debugger(debugger, **kwargs):\n    \"\"\"\n        Selects a debugger for exceptions in user code. Only effects exceptions\n        which are handled by xlOil. Choices are:\n\n        **pdb**\n        \n        opens a console window with pdb active at the exception point\n\n        **vscode** or **debugpy**\n\n        listens\n\n        **None**\n        \n        Turns off exception debugging (does not turn off debugpy)\n\n    \"\"\"\n\n    if debugger is None or debugger == '':\n        xloil.event.UserException.clear()\n        return\n\n    if debugger == 'pdb':\n        xloil.log.debug(\"Setting pdb as exception post-mortem debugger\")\n\n        # No more than one exception handler: clear event first\n        xloil.event.UserException.clear()\n        xloil.event.UserException += _PDB_HANDLER\n\n    elif debugger == \"vscode\" or debugger == \"debugpy\":\n        debugpy_listen(**kwargs)\n\n    else:\n        raise KeyError(f\"Unsupported debugger {debugger}. Choose from: {DEBUGGERS}\")\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/excelfuncs.py",
    "content": "import xloil as xlo\nimport sys\nimport importlib\nimport os\n\n@xlo.func(\n    help=\"Loads functions from a module and registers them in Excel. The functions do not have to be decorated. \"\n         \"Provides an analogue of `from X import Y as Z`\",\n    args={'ModuleName': 'A module name or a full path name to a target py file. If empty, the workbook module '\n                        'with the same name as the calling workbook is (re)loaded.',\n          'From': 'If missing, imports the specified module as normal. If a value or array, register only '\n                  'the specified object names.  If \"*\", all objects are registered.',\n          'To': 'Optionally specifies the Excel function names to register in the same order as `From`. '\n                'Should have the same length as `From`' \n        })\nasync def xloImport(ModuleName:str, From=None, As=None):\n\n    from xloil.importer import _import_file\n\n    caller = xlo.Caller()\n    workbook_name = os.path.splitext(caller.workbook)[0]\n\n    # If no module name provided, try to load (or reload) the corresponding \n    # workbook module\n    if len(ModuleName) == 0:\n        ModuleName = f'xloil_wb_{workbook_name}'\n        # If module does not exist, replace module name with full path \n        if ModuleName in sys.modules:\n            importlib.reload(sys.modules[ModuleName])\n        else:\n            full_path = xlo.app().Workbooks(caller.workbook).FullName\n            module_path = os.path.splitext(full_path)[0] + \".py\"\n            _import_file(module_path, workbook_name=workbook_name)\n    elif From is None:\n        module = importlib.reload(sys.modules[ModuleName]) \\\n                    if ModuleName in sys.modules else \\\n                        _import_file(ModuleName, workbook_name=workbook_name)\n    else:\n        xlo.import_functions(ModuleName, From, As, workbook_name=workbook_name)\n\n    return f\"Loaded {ModuleName}\"\n\ndef _xlo_attr_helper(Object, Name:str, *Args, **Kwargs):\n    attr = getattr(Object, Name)\n\n    import inspect\n    if inspect.ismethod(attr) or inspect.isfunction(attr):\n        return attr(*Args, **Kwargs)\n    else:\n        return attr\n\n@xlo.func(\n    help=\"Returns the named attribute value, or the result of calling it if possible. \"\n         \"ie, `object.attr` or `object.attr(*args, *kwargs)`\",\n    args={'Object': 'The target object',\n          'Name': 'The name of the attribute to be returned.  The attribute can be a '\n                  'bound method, member, property, method, function or class',\n          'Args': 'If the attribute is callable, it will be called using these positional arguments',\n          'Kwargs': 'If the attribute is callable, it will be called using these keyword arguments'\n    })\ndef xloAttr(Object, Name:str, *Args, **Kwargs):\n    return _xlo_attr_helper(Object, Name, *Args, **Kwargs)\n\n@xlo.func(\n    help=\"Returns the value of named attribute or the result of calling the attribute as a Cache object\"\n         \"(cf `xloAttr`). This function is useful to stop default conversion to Excel values, for example \"\n         \"when chaining xloAttr calls\",\n    args={'Object': 'The target object',\n          'Name': 'The name of the attribute to be returned.  The attribute can be a '\n                  'bound method, member, property, method, function or class',\n          'Args': 'If the attribute is callable, it will be called using these positional arguments',\n          'Kwargs': 'If the attribute is callable, it will be called using these keyword arguments'\n    })\ndef xloAttrObj(Object, Name:str, *Args, **Kwargs) -> xlo.Cache:\n    return _xlo_attr_helper(Object, Name, *Args, **Kwargs)\n\n@xlo.func(macro=True,\n    args={\n        'Debugger': \"Choose from 'pdb', 'vscode', or empty string to disable\"\n        })\ndef xloPyDebug(Debugger:str = \"\"):\n    \"\"\"\n    Sets the user-code exception debugger. \n    Pdb opens in a new window.\n    \"\"\"\n\n    if xlo.in_wizard():\n        return\n\n    import xloil.debug\n    if len(Debugger) > 0:\n        xloil.debug.use_debugger(Debugger)\n        return Debugger\n    else:\n        xloil.debug.use_debugger(None)\n        return \"OFF\"\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/func_inspect.py",
    "content": "class Arg:\n    \"\"\"\n    Holds the description of a function argument. Can be used with the `xloil.func`\n    decorator to specify the argument description.\n\n    Examples\n    --------\n\n    ::\n\n        @xloil.func(args = { \n            'a': xloil.Arg(\"A\", \"The First Arg\", default=3),\n            'b': xloil.Arg(\"B\", \"Next Arg\",      typeof=double),\n        })\n        def MyFunc(a, b, c):\n            ...\n\n    \"\"\"\n\n    class _EMPTY:\n        \"\"\" Indicates the absence of a default argument \"\"\"\n        ...\n\n    POSITIONAL    = 0\n    KEYWORD_ARGS  = 1\n    VARIABLE_ARGS = 2\n\n    def __init__(self, name, help=\"\", typeof=None, default=_EMPTY, kind=POSITIONAL):\n        \"\"\"\n        Parameters\n        ----------\n\n        name: str\n            The name of the argument which appears in Excel's function wizard\n        help: str, optional\n            Help string to display in the function wizard\n        typeof: object, optional\n            Selects the type converter used to pass the argument value\n        default: object, optional\n            A default value to pass if the argument is not specified in Excel\n        kind: int, optional\n            Denotes the special *args or **kwargs arguments. For kwargs, xlOil will \n            expect a two-column array in Excel which it will interpret as (key, value) \n            pairs and convert to a dictionary. For *args, xlOil adds a large number of \n            extra trailing optional arguments. Both of these are auto-detected by xlOil \n            so it is unusual to set this parameter explicitly.\n        \"\"\"\n\n        self.typeof = typeof\n        self.name = str(name)\n        self.help = help\n        self.default = default\n        self.kind = kind\n\n    def __str__(self):\n        if self.kind == self.KEYWORD_ARGS:\n            return f\"**{self.name}\"\n        elif self.kind == self.VARIABLE_ARGS:\n            return f\"*{self.name}\"\n        else:\n            default = \"=\" + str(self.default) if self.has_default else \"\"\n            type_ = getattr(self.typeof, \"__name__\", self.typeof) if self.typeof else \"\"\n            return f'{self.name}:{type_}{default}'\n\n    @property\n    def has_default(self):\n        \"\"\" \n        Since 'None' is a fairly likely default value, this property indicates \n        whether there was a user-specified default\n        \"\"\"\n        return self.default is not self._EMPTY\n\n    @classmethod\n    def from_signature(cls, name, param):\n        \"\"\"\n        Constructs an `Arg` from a name and an `inspect.param`\n        \"\"\"\n        import inspect\n\n        kind = param.kind\n        if kind == param.POSITIONAL_ONLY or kind == param.POSITIONAL_OR_KEYWORD:\n            arg = cls(name, \n                      default= cls._EMPTY if param.default is inspect._empty else param.default)\n     \n        elif param.kind == param.VAR_KEYWORD: # can type annotions make any sense here?\n            arg = cls(name, kind=cls.KEYWORD_ARGS)\n\n        elif param.kind == param.VAR_POSITIONAL:\n            arg = cls(name, kind=cls.VARIABLE_ARGS)\n\n        else: \n            raise ValueError(f\"Unrecognised argument '{name}' with type '{kind}'\")\n\n        if param.annotation is not param.empty:\n            arg.typeof = param.annotation\n\n        return arg\n\n\n    @classmethod\n    def full_argspec(cls, func):\n        \"\"\"\n        Returns a list of `Arg` for a given function which describe the function's arguments\n        \"\"\"\n        import inspect\n        sig = inspect.signature(func)\n        params = sig.parameters\n        args = [cls.from_signature(name, param) for name, param in params.items()]\n        ret_type = None if sig.return_annotation is inspect._empty else sig.return_annotation\n        return args, ret_type\n\n    @staticmethod\n    def override_arglist(arglist, replacements):\n        if replacements is None:\n            return arglist\n        elif not isinstance(replacements, dict):\n            replacements = { a.name : a for a in replacements }\n\n        def override_arg(arg):\n            override = replacements.get(arg.name, None)\n            if override is None:\n                return arg\n            elif isinstance(override, str):\n                arg.help = override\n                return arg\n            else:\n                return override\n\n        return [override_arg(arg) for arg in arglist]\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/gui/__init__.py",
    "content": "from xloil import TaskPaneFrame, ExcelGUI, ExcelWindow, Workbook\n\nimport concurrent.futures as futures\nimport concurrent.futures.thread\nimport xloil\nimport asyncio\nimport typing\nimport threading\nimport inspect\nimport sys\n\n_TASK_PANES = set()\n\nclass CustomTaskPane:\n    \"\"\"\n        Base class for custom task panes. xlOil provides two toolkit-specfic\n        implementations: `xloil.gui.pyqt5.QtThreadTaskPane` (pyside is also \n        supported) and `xloil.gui.tkinter.TkThreadTaskPane`.\n        \n        Can be sub-classed to implement task panes with different GUI toolkits.\n\n        Subclasses can implement functions to recieve events:\n\n            on_visible(self, value):\n                Called when the visible state changes, `value` contains the new state.\n                It is not necessary to override this to control pane visibility - the\n                window will be shown/hidden automatically\n\n            on_docked(self):\n                Called when the pane is docked to a new location or undocked\n    \"\"\"\n\n    def __init__(self):\n        self.hwnd = None\n\n    async def _attach_frame_async(self, frame: typing.Awaitable[TaskPaneFrame]):\n        \"\"\"\n            Attaches this *CustomTaskPane* to a *TaskPaneFrame*  causing it \n            to be resized/moved with the pane window.  Called by \n            `xloil.ExcelGUI.attach_frame` and generally should not need to be \n            called directly.\n        \"\"\"\n        self.hwnd, as_parent = await asyncio.wrap_future(self._get_hwnd())\n        self._pane = await frame\n        await self._pane.attach(self, self.hwnd, as_parent)\n        _TASK_PANES.add(self)\n\n    def _attach_frame(self, frame: typing.Awaitable[TaskPaneFrame]):\n        \"\"\"\n            Attaches this *CustomTaskPane* to a *TaskPaneFrame*  causing it \n            to be resized/moved with the pane window.  Called by \n            `xloil.ExcelGUI.attach_frame` and generally should not need to be \n            called directly.\n        \"\"\"\n        self.hwnd, as_parent = self._get_hwnd().result()\n        self._pane = frame.result()\n        self._pane.attach(self, self.hwnd, as_parent).result()\n        _TASK_PANES.add(self)\n        \n    def _get_hwnd(self) -> typing.Awaitable[typing.Tuple[int, bool]]:\n        \"\"\"\n            Should be implemented by derived classes.  The bool argument \n            determines if the window pointed to by hwnd should be reparented\n            into the task pane.\n        \"\"\"\n        raise NotImplementedError()\n\n    def on_destroy(self):\n        \"\"\" Called before the pane is destroyed to release any resources \"\"\"\n        # Release internal task pane pointer\n        self._pane = None\n        # Remove ourselves from pane lookup table\n        _TASK_PANES.discard(self)\n\n    @property\n    def pane(self) -> TaskPaneFrame:\n        \"\"\"Returns the TaskPaneFrame: a reference to the window holding the python GUI\"\"\"\n        return self._pane\n\n    @property\n    def visible(self) -> bool:\n        \"\"\"Returns True if the pane is currently shown\"\"\"\n        return self._pane.visible\n\n    @visible.setter\n    def visible(self, value: bool):\n        self._pane.visible = value\n\n    @property\n    def size(self) -> typing.Tuple[int, int]:\n        \"\"\"Returns a tuple (width, height)\"\"\"\n        return self._pane.size\n\n    @size.setter\n    def size(self, value: typing.Tuple[int, int]):\n        self._pane.size = value\n\n    @property\n    def position(self) -> str:\n        \"\"\"\n        Returns the docking position: one of bottom, floating, left, right, top\n        \"\"\"\n        return self._pane.position\n\ndef find_task_pane(title:str=None, workbook=None, window=None) -> CustomTaskPane:\n    \"\"\"\n        Finds xlOil python task panes attached to the specified window, with the \n        given pane `title`. The primary use of this function is to look for an existing \n        task pane before creating a new one.\n\n        Parameters\n        ----------\n\n        title:\n            if `title` is specified, returns a (case-sensitive) match of a single \n            `xloil.CustomTaskPane` object or None if not found.  Otherwise returns a list \n            of `xloil.CustomTaskPane` objects.\n\n        window: str or `xloil.ExcelWindow`\n            The window title to be searched    \n\n        workbook: str or `xloil.Workbook`:\n            Task panes are linked to Excel's Window objects which can have a many-to-one\n            relationship with workbooks. If a workbook is specified, all task panes \n            associated with that workbook will be searched.\n\n    \"\"\"\n\n    if window is not None:\n        if isinstance(window, str):\n            window = ExcelWindow(window)\n        hwnds = [window.hwnd]\n    elif workbook is not None:\n        if isinstance(workbook, str):\n            workbook = Workbook(workbook)\n        hwnds = [x.hwnd for x in workbook.windows]\n    else:\n        hwnds = [xloil.app().windows.active.hwnd]\n \n    found = [x for x in _TASK_PANES if isinstance(x, CustomTaskPane) and x.pane.window.hwnd in hwnds]\n\n    if title is None:\n        return found\n    else:\n        return next((x for x in found if x.pane.title == title), None)\n\n\ndef _try_create_from_qwidget(obj) -> CustomTaskPane:\n    \"\"\"\n        If obj is a QWidget, returns an Awaitable[QtThreadTaskPane] else None.\n        This is a convenience for Qt users to avoid needing to create a QtThreadTaskPane\n        explicitly\n    \"\"\"\n    try:\n        if 'qtpy' in sys.modules:\n            from qtpy.QtWidgets import QWidget\n            if (isinstance(obj, type) and issubclass(obj, QWidget)) or isinstance(obj, QWidget):\n                from xloil.gui.qtpy import QtThreadTaskPane, Qt_thread\n                return Qt_thread().submit(QtThreadTaskPane, obj).result() \n    except ImportError:\n        pass\n\n    return obj\n\ndef _try_create_from_wxframe(obj) -> CustomTaskPane:\n    if 'wx' in sys.modules:\n        import wx\n        if (isinstance(obj, type) and issubclass(obj, wx.Frame)) or isinstance(obj, wx.Frame):\n            from .wx import WxThreadTaskPane, wx_thread\n            return wx_thread().submit(WxThreadTaskPane, obj).result()\n    return obj\n\ndef _get_pane_name(pane):\n    name = getattr(pane, \"name\", None)\n    if name is None:\n        raise NameError(\"Attach pane must be given a 'name' argument or the pane must \"\n            \"contain a 'name' attribute\")\n    return name\n\nasync def _attach_task_pane_async(\n        gui: ExcelGUI,\n        pane: CustomTaskPane,\n        name: str, \n        window: ExcelWindow, \n        size: tuple, \n        visible: bool):\n    \n    # This is the implementation of ExcelGUI.attach_pane since the async\n    # stuff and checking for Qt is easier on the python side\n    if isinstance(window, str):\n        window = ExcelWindow(window)\n\n    name = name or _get_pane_name(pane)\n     \n    frame_future = gui._create_task_pane_frame(name, window)\n\n    # A little convenience for Qt/Wx users to avoid needing to create a QtThreadTaskPane\n    pane = _try_create_from_qwidget(pane)\n    pane = _try_create_from_wxframe(pane)\n\n    if inspect.isawaitable(pane):\n        pane = await pane\n\n    await pane._attach_frame_async(frame_future)\n    \n    pane.visible = visible\n    if size is not None:\n        pane.size = size\n\n    return pane\n\n\ndef _attach_task_pane(\n        gui: ExcelGUI,\n        pane: CustomTaskPane,\n        name: str, \n        window: ExcelWindow, \n        size: tuple, \n        visible: bool):\n    # This is the implementation of ExcelGUI.attach_pane since the async\n    # stuff and checking for Qt is easier on the python side\n    if isinstance(window, str):\n        window = ExcelWindow(window)\n\n    name = name or _get_pane_name(pane)\n\n    frame_future = gui._create_task_pane_frame(name, window)\n\n    # A little convenience for Qt users to avoid needing to create a QtThreadTaskPane\n    pane = _try_create_from_qwidget(pane)\n    pane = _try_create_from_wxframe(pane)\n\n    pane._attach_frame(frame_future)\n    \n    pane.visible = visible\n    if size is not None:\n        pane.size = size\n\n    return pane\n\nclass _GuiExecutor(futures.Executor):\n    \"\"\"\n        GUIs toolkits like to be accessed from the same thread consistently.\n        This base class creates a thread and manages a command queue.  \n        Subclasses must define a `_main` method to initialise the toolkit \n        and a `_shutdown` method to destroy it.\n    \"\"\"\n\n    def __init__(self, name):\n        import queue\n\n        self._work_queue = queue.SimpleQueue()\n        self._ready = futures.Future()\n        self._thread = threading.Thread(target=self._main_loop, name=name)\n        self._thread.start()\n\n        # PyBye is called before `threading` module teardown, whereas `atexit` comes later.\n        # We definitely want threading available to shut down our threads.\n        xloil.event.PyBye += self.shutdown\n\n\n    def _make_ready(self):\n        \"\"\"\n        Should be called by derive classes to signal that it is safe to add jobs to the queue\n        \"\"\"\n        self._ready.set_result(True)\n\n    def _do_work(self):\n        import queue\n        try:\n            while True:\n                work_item = self._work_queue.get_nowait()\n                if work_item is not None:\n                    work_item.run()\n                    del work_item\n        except queue.Empty:\n            return\n        except Exception as e:\n             xloil.log(f\"{self._thread.name} error running job: {e}\", level='warn')\n\n    def submit(self, fn, *args, **kwargs) -> futures.Future:\n        \"\"\"\n        Schedules the callable, fn, to be executed as ``fn(*args, **kwargs)`` and returns \n        a ``Future`` object representing the execution of the callable.\n        \"\"\"\n\n        if not self._ready.result():\n            raise futures.BrokenExecutor()\n\n        future = futures.Future()\n        work = concurrent.futures.thread._WorkItem(future, fn, args, kwargs)\n\n        # In case we're called from our own thread - don't deadlock, just\n        # execute the function right now.\n        if threading.get_native_id() == self._thread.native_id:\n            work.run()\n        else:\n            self._work_queue.put(work)\n\n        return future\n\n    async def submit_async(self, fn, *args, **kwargs):\n        \"\"\"\n        Behaves as `submit` but wraps the result in an asyncio.Future so it\n        can be awaited.\n        \"\"\"\n        return await asyncio.wrap_future(self.submit(fn, *args, **kwargs))\n\n    def shutdown(self, wait=True, cancel_futures=False):\n        if self._ready.result(): # TODO: implement cancel_futures?\n            self.submit(self._shutdown)\n        if wait:\n            self._thread.join()\n            xloil.log.debug(\"Joined GUI thread '%s'\", self._thread.name)\n            self._thread = None\n\n    def _main_loop(self):\n\n        name = self._thread.name\n        try:\n            xloil.log(f\"Starting executor '{name}'\", level=\"info\")\n            self._main()\n            xloil.log(f\"Finalising executor '{name}'\", level=\"info\")\n            \n        except Exception as e:\n            xloil.log(f\"{name} failed: {e}\", level='error')\n            self._ready.set_result(False)\n            raise\n\n    def _wrap(self, fn, sync=True, discard=False):\n        \"\"\"\n            Called by Tk_thread, Qt_thread to implement their decorator \n            behaviour.\n        \"\"\"\n        if discard:\n            def logged(*arg, **kwargs):\n                try:\n                    return fn(*args, **kwargs)\n                except Exception as e:\n                    xlo.log(\"Error running job on GUI thread: {str(e)}\", level=\"error\")\n            fn = logged\n        \n        if sync:\n            async def wrapped(*args, **kwargs):\n                return await self.submit_async(fn, *args, **kwargs)\n        else:\n            def wrapped(*args, **kwargs):\n                return self.submit(fn, *args, **kwargs)\n\n        return wrapped\n\n\nclass _ConstructInExecutor(type):\n    \"\"\"\n        Metaclass used by CustomTaskPane objects to ensure their ctor is run in \n        the thread associated with the GUI toolkit. The `executor` argument should \n        specify a concurrent.futures.Executor. If None is passed, the functionality of \n        this metaclass is disabled. The default is `executor=True` which means take\n        the executor from a base class, or throw if none is found.\n    \"\"\"\n\n    def __new__(cls, name, bases, namespace, executor:futures.Executor = True):\n        return type.__new__(cls, name, bases, namespace)\n        \n    def __init__(cls, name, bases, namespace, executor:futures.Executor = True):\n        # If default, try to fetch executor from base class\n        if executor == True:\n            cls._executor = next(b._executor for b in bases if type(b) is _ConstructInExecutor)\n        else:\n            cls._executor = executor\n            \n        return type.__init__(cls, name, bases, namespace)\n        \n    def __call__(cls, *args, **kwargs):\n        # Strictly only the __init__ method needs to be in the executor, but\n        # this seems easier than replicating `type.__call__`\n        if cls._executor is None:\n            return type.__call__(cls, *args, **kwargs)\n        else:\n            return cls._executor().submit(\n                lambda: type.__call__(cls, *args, **kwargs)\n            ).result()"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/gui/qt_console.py",
    "content": "import xloil.gui.qtpy\nimport xloil\n\ndef create_qtconsole_inprocess():\n    \"\"\"\n    Opens *qtconsole* using an inprocess ipython kernel. \n    Warning: using qtconsole can trigger a 'feature' in PyQt which causes it\n    to dump core on application exit when it tries to access the python \n    interpreter after xloil has unloaded.\n    \"\"\"\n    from qtconsole.rich_jupyter_widget import RichJupyterWidget\n    from qtconsole.inprocess import QtInProcessKernelManager, QtInProcessRichJupyterWidget\n    from xloil.gui.qtpy import Qt_thread\n    from qtpy.QtWidgets import QMainWindow\n    import asyncio\n    import sys\n    import threading\n\n    xloil.log.debug(\"Starting QtConsole on thread %d\", threading.get_native_id())\n\n    # Need to set these dummy streams as the inprocess kernel calls\n    # flush on stdout and stderr \n    class DummyStream:\n        def write(self, string):\n            xloil.log.debug(string)\n\n        def flush(self):\n            pass\n\n        def readline(self):\n            return None\n\n    sys.stdout = DummyStream()\n    sys.stderr = DummyStream()\n\n    def make_jupyter_widget():\n        kernel_manager = QtInProcessKernelManager()\n        kernel_manager.start_kernel(show_banner=False)\n        kernel = kernel_manager.kernel\n        kernel.gui = 'qt4'\n\n        kernel_client = kernel_manager.client()\n        kernel_client.start_channels()\n\n        ipython_widget = QtInProcessRichJupyterWidget()\n        ipython_widget.kernel_manager = kernel_manager\n        ipython_widget.kernel_client = kernel_client\n        ipython_widget.setObjectName(\"QtConsole\")\n        return ipython_widget\n\n    class MainWindow(QMainWindow):\n\n        def __init__(self):\n            super().__init__()\n            self.jupyter_widget = make_jupyter_widget()\n            self.setCentralWidget(self.jupyter_widget)\n\n        def closeEvent(self, event):\n            try:\n                self.shutdown_kernel()\n                ...\n            except Exception as e:\n                # Throwing from this function causes Qt to dump core\n                xloil.log_except(\"Failed shutting down QtConsole\")\n\n        def shutdown_kernel(self):\n            xloil.log.debug(\"Shutting QtConsole on thread %d\",\n                            threading.get_native_id())\n            # We force the kernels atexit routine to run now, otherwise it \n            # shuts down the SQLite server used to keep history on the wrong \n            # thread and generates \"SQLite objects created in a thread can\n            # only be used in that same thread.\"\n            self.jupyter_widget.kernel_manager.kernel.shell._atexit_once()\n            self.jupyter_widget.kernel_client.stop_channels()\n            self.jupyter_widget.kernel_manager.shutdown_kernel()\n            xloil.log.debug(\"Finished Shutting QtConsole on thread\")\n    \n    from qtpy.QtCore import Qt\n    console = MainWindow()\n\n    # Not doing this seems to make Qt more likely to dump core on exit\n    console.setAttribute(Qt.WA_DeleteOnClose)\n    return console\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/gui/qtpy.py",
    "content": "\"\"\"\n    You must import this module before any other mention of Qt or Pyside: this allows xlOil to \n    create a thread to manage the Qt GUI and the Qt app object.  *All* interaction with the \n    *Qt* must be done on that thread or crashes will ensue.  Use `Qt_thread.submit(...)`\n    or the `@Qt_thread` to ensure functions are run on the thread.\n\"\"\"\nimport sys\nimport os\nimport concurrent.futures as futures\nimport concurrent.futures.thread\nfrom xloil.gui import CustomTaskPane, _GuiExecutor, _ConstructInExecutor\nfrom xloil import log\nimport xloil\nfrom xloil._core import XLOIL_EMBEDDED\nimport threading\nfrom pathlib import Path\n\ndef _create_Qt_app():\n\n    from qtpy import QtCore\n    def qt_msg_handler(msg_type, msg_log_context, msg_string):\n\n        level = 'info'\n        if msg_type == QtCore.QtMsgType.QtDebugMsg:\n            level = 'debug'\n        elif msg_type == QtCore.QtMsgType.QtInfoMsg:\n            level = 'info'\n        elif msg_type == QtCore.QtMsgType.QtWarningMsg:\n            level = 'warn'\n        elif msg_type == QtCore.QtMsgType.QtCriticalMsg or msg_type == QtCore.QtMsgType.QtFatalMsg:\n            level = 'error'\n\n        # Qt raises this on shutdown. No idea why, but don't want it to trigger\n        # a log window popup!\n        if msg_string.startswith('QWindowsBackingStore::flush: GetDC'):\n            level = 'debug'\n\n        log(msg_string, level=level)\n\n    QtCore.qInstallMessageHandler(qt_msg_handler)\n\n    from qtpy.QtWidgets import QApplication\n    \n    #\n    # Attempt to workaround an apparent oversight in Qt initialisation on Windows.\n    # Under Anaconda, Qt is installed outside the usual site-packages location.\n    # A qt.conf file in Anaconda's root dir directs Qt to the correct place.\n    # However under Windows, Qt will only look for this file in the directory \n    # returned by GetModuleFileName or in :/qt/etc/ which is unlikely to exist\n    # or be easily creatable on Windows.  (See https://doc.qt.io/qt-6/qt-conf.html)\n    # In our case GetModuleFileName always returns Excel.exe.\n    # \n    # We do not apply the workaround if QT_QPA_PLATFORM_PLUGIN_PATH has been set\n    #\n    # Should Qt fail to load it will dump core: very unfriendly when embedded in another\n    # application. For unknown reasons, I have not been able to trap the SIGABRT.\n    #\n\n    platform_plugin_dir = Path(sys.prefix) / \"Library/plugins/platforms\"\n    args = []\n    if platform_plugin_dir.exists() and not 'QT_QPA_PLATFORM_PLUGIN_PATH' in os.environ:\n        args = [\"\", \"-platformpluginpath\", str(platform_plugin_dir)]\n    \n    log.info(f\"Starting Qt on thread {threading.get_native_id()}\")\n    app = QApplication(args)\n\n    app.setQuitOnLastWindowClosed(False)\n\n    return app\n\nclass QtExecutor(_GuiExecutor):\n\n    def __init__(self):\n        self._work_signal = None\n        self._app = None\n        super().__init__(\"QtGuiThread\")\n\n    @property\n    def app(self):\n        \"\"\"\n            A reference to the singleton *QApplication* object \n        \"\"\"\n        return self._app\n\n    def submit(self, fn, *args, **kwargs):\n        future = super().submit(fn, *args, **kwargs)\n        if self._work_signal is not None:\n            self._work_signal.timeout.emit()\n        return future\n\n    def _main(self):\n        log.debug(\"Qt: Creating Qt App in executor thread\")\n\n        self._app = _create_Qt_app()\n\n        from qtpy.QtCore import QTimer\n        semaphore = QTimer()\n        semaphore.timeout.connect(self._do_work)\n        self._work_signal = semaphore\n\n        self._make_ready()\n\n        # Run any pending queue items now\n        self._do_work()\n\n        # Thread main loop, run until quit\n        self._app.exec()\n\n        log.debug(\"Qt: Finished running exec loop, finalising Application\")\n\n        # Thread cleanup\n        self._work_signal = None\n        del self._app\n        self._app = None\n\n    def _shutdown(self):\n        log.debug(\"Qt: Recieved shutdown: sending quit call\")\n        self._app.quit()\n\n\n_Qt_thread = None\n\ndef Qt_thread(fn=None, discard=False) -> QtExecutor:\n    \"\"\"\n        All Qt GUI interactions (except signals) must take place on the thread on which \n        the *QApplication* object was created.  This object returns a *concurrent.futures.Executor* \n        which creates the *QApplication* object and can run commands on a dedicated Qt thread. \n        It can also be used a decorator.\n        \n        **All QT interaction must take place via this thread**.\n\n        Examples\n        --------\n            \n        ::\n            \n            future = Qt_thread().submit(my_func, my_args)\n            future.result() # blocks\n\n            @Qt_thread(discard=True)\n            def myfunc():\n                # This is run on the Qt thread and returns a *future* to the result.\n                # By specifying `discard=True` we tell xlOil that we're not going to\n                # keep track of that future and so it should log any exceptions.\n                ... \n\n    \"\"\"\n\n    global _Qt_thread\n\n    if _Qt_thread is None:\n        _Qt_thread = QtExecutor()\n        # Send this blocking job to ensure QApplication is created now\n        _Qt_thread.submit(lambda: 0).result()\n\n    return _Qt_thread if fn is None else _Qt_thread._wrap(fn, discard)\n\n# For safety, initialise Qt when this module is imported\nif XLOIL_EMBEDDED:\n    Qt_thread()\n\nclass QtThreadTaskPane(CustomTaskPane, metaclass=_ConstructInExecutor, executor=Qt_thread):\n    \"\"\"\n        Wraps a Qt *QWidget* to create a `CustomTaskPane` object. The optional `widget` argument \n        must be a type deriving from *QWidget* or an instance of such a type (a lambda which\n        returns a *QWidget* is also acceptable).\n    \"\"\"\n\n    def __init__(self, widget=None):\n        from qtpy.QtWidgets import QWidget\n        if isinstance(widget, QWidget):\n            self._widget = widget\n        elif widget is not None:\n            self._widget = widget()\n        else:\n            self._widget = QWidget()\n    \n    @property\n    def widget(self):\n        \"\"\"\n            This returns the *QWidget* which is root of the the pane's contents.\n            If the class was constructed from a *QWidget*, this is that widget.\n        \"\"\"\n        return self._widget\n\n    def _get_hwnd(self):\n        def prepare(widget):\n            # Need to make the Qt window frameless using Qt's API. When we attach\n            # to the TaskPaneFrame, the attached window is turned into a frameless\n            # child. If Qt is not informed, its geometry manager gets confused\n            # and will core dump if the pane is made too small.\n            from qtpy.QtCore import Qt\n            widget.setWindowFlags(Qt.FramelessWindowHint)\n\n            widget.show() # window handle does not exist before show\n\n            return int(widget.winId()), True\n\n        return Qt_thread().submit(prepare, self._widget)\n\n    def on_destroy(self):\n        # Call super to detach the TaskPaneFrame for a cleaner shutdown\n        super().on_destroy() \n        Qt_thread().submit(lambda: self._widget.destroy()) ## TODO: call close? or del?\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/gui/tk_console.py",
    "content": "import sys\nimport tkinter\n\n# TODO: use sys.__stdin__\n_REAL_STD_IN_OUT = (sys.stdin, sys.stdout, sys.stderr)\n\n#\n# Created with help from https://stackoverflow.com/questions/21811464/\n#\n\nclass TkConsole(tkinter.Frame):\n    \"\"\"\n        A *very* simple console-in-a-text-box. It 'steals' stdin/out/err to \n        allow python REPLs like pdb.post_mortem or code.interact to work\n        in-process. Because of this stealing, opening more than one Console\n        will lead to unexpected results.\n\n        It has no terminal emulation, but it does support command history. \n\n        The widget emits an event <<CommandDone>> when the provided invoke\n        command completes (typically because the REPL is quit by the user)\n\n        Parameters\n        ----------\n        \n        parent:\n            Parent widget\n        invoke:\n            The command to run. If this doesn't start a REPL, then I'm not\n            sure you should be using this class!\n        kwargs:\n            All other kwargs are passed to the tkinter.Text constructor.\n    \"\"\"\n\n    MARK_INPUT = \"input_start\"\n\n    def __init__(self, parent, invoke, **kwargs):\n        super().__init__(parent)\n  \n        self._destroyed = False\n\n        import queue\n        self.stdin_buffer = queue.Queue()\n        \n        # History of commands entered\n        self._history = []\n        self._history_pos = 0\n\n        self._text = self._create_text_widget(kwargs)\n        \n        def run():\n            try:\n                import sys\n                previous_std_in_out = (sys.stdin, sys.stdout, sys.stderr)\n                sys.stdout = self\n                sys.stderr = self\n                sys.stdin  = self\n                invoke()\n            finally:\n                # We avoid resetting the std streams if another instance has already \n                # restored them to the system defaults. This may happen if more than \n                # one Console was opened (inadvisable), then closed in a different order.\n                if not sys.stdin is _REAL_STD_IN_OUT[0]:\n                    sys.stdin, sys.stdout, sys.stderr = previous_std_in_out\n                if not self._destroyed:\n                    self.event_generate(\"<<CommandDone>>\")\n\n        from threading import Thread\n        self._console_thread = Thread(target=run)\n        self._console_thread.start()\n\n    def destroy(self):\n        self._destroyed = True\n        self.stdin_buffer.put(\"\\n\\nexit()\\n\")\n        super().destroy()\n\n    def _press_enter(self, event):\n        \n        input_line = self._text.get(self.MARK_INPUT, \"end\")\n\n        # Add a newline as we stop the normal event handler from being called\n        self._text.insert('end', '\\n')\n        \n        # Send input to our stdin\n        self.stdin_buffer.put(input_line)\n        \n        # Add to history unless it's a blank line\n        stripped_input = input_line.strip()\n        if len(stripped_input) > 0:\n            self._history.append(stripped_input)\n            self._history_pos = len(self._history)\n        \n        return 'break'\n\n    def _press_updown(self, step:int):\n        # Increment history pointer\n        self._history_pos = (self._history_pos - step) % len(self._history)\n        text = self._text\n        # Remove existing input\n        text.delete(self.MARK_INPUT, 'end')\n        # Copy history entry to input mark\n        text.insert(self.MARK_INPUT, self._history[self._history_pos])\n        # Move caret to start of input\n        text.mark_set(\"insert\", self.MARK_INPUT)\n        # Do not let default handler move caret\n        return 'break'\n\n    def _press_left(self, event):\n        # Block attempts to move the caret before the input start mark\n        text = self._text\n        if text.index(\"insert\") == text.index(self.MARK_INPUT):\n            return 'break'\n\n    def _press_up(self, event):\n        return self._press_updown(1)\n\n    def _press_down(self, event):\n        return self._press_updown(-1)\n\n    def _create_text_widget(self, options):\n        \"\"\"\n        Creates a (scrolled) text widget with the following key overrides:\n              * Up/Down arrows insert command history\n              * Backspace / left arrow cannot move beyond input prompt\n              * Enter sends command to the console thread  \n        \"\"\"\n        from tkinter.scrolledtext import ScrolledText\n        text = ScrolledText(self, wrap='word', **options)\n        text.pack(expand=True, fill=tkinter.BOTH)\n\n        text.bind(\"<Return>\", self._press_enter)\n        text.bind(\"<Up>\", self._press_up)\n        text.bind(\"<Down>\", self._press_down)\n        text.bind(\"<Left>\", self._press_left)\n        text.bind(\"<BackSpace>\", self._press_left)\n\n        # Set input mark to 1 char before end (to avoid newline char)\n        text.mark_set(self.MARK_INPUT, \"end-1c\")\n        # Gravity 'left' means the mark maintains position as new text is inserted at \n        # its location\n        text.mark_gravity(self.MARK_INPUT, \"left\")\n\n        return text\n\n    def write(self, string):\n        text = self._text\n        text.insert('end', string)\n        # Move input mark to 1 char before end (to avoid newline char)\n        text.mark_set(self.MARK_INPUT, \"end-1c\")\n        # Move caret to same location\n        text.mark_set(\"insert\", \"end-1c\")\n        # Scroll to end \n        text.see('end')\n\n    def flush(self):\n        pass\n\n    def readline(self):\n        line = self.stdin_buffer.get()\n        return line\n\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/gui/tkinter.py",
    "content": "\"\"\"\n    You must import this module before any other mention of `tkinter`: this allows xlOil to \n    create a thread to manage the Tk GUI and the Tk root object.  *All* interaction with the \n    *Tk* must be done on that thread or crashes will ensue.  Use `Tk_thread.submit(...)`\n    or the `@Tk_thread` to ensure functions are run on the thread.\n\"\"\"\n\nimport xloil\nfrom xloil.gui import CustomTaskPane, _GuiExecutor, _ConstructInExecutor\nfrom xloil._core import XLOIL_EMBEDDED\n\nclass TkExecutor(_GuiExecutor):\n\n    def __init__(self):\n        self._root = None\n        super().__init__(\"TkGuiThread\")\n\n    @property\n    def root(self):\n        return self._root\n\n    def _do_work(self):\n        super()._do_work()\n        self._root.after(200, self._do_work)\n\n    def _main(self):\n        import tkinter as tk\n\n        self._root = tk.Tk(baseName=\"xlOil\")\n        self._root.withdraw()\n            \n        self._make_ready()\n\n        # Run any pending queue items now\n        self._do_work()\n \n        # Thread main loop, run until quit\n        self._root.mainloop()\n\n        # Thread cleanup. Ensure root is deleted here to avoid getting\n        # Tcl_AsyncDelete: async handler deleted by the wrong thread\n        self._root = None\n        import gc\n        gc.collect()\n\n    def _shutdown(self):\n        self._root.destroy()\n\n\n_Tk_thread = None\n\nif XLOIL_EMBEDDED:\n    _Tk_thread = TkExecutor()\n    # Create thread on import - I'm not necessarily a fan of this blocking!\n    _Tk_thread.submit(lambda: 0).result()\n\ndef Tk_thread(fn=None, discard=False) -> TkExecutor:\n    \"\"\"\n        All Tk GUI interactions must take place on the thread on which the root object \n        was created. This function returns a *concurrent.futures.Executor* which creates   \n        the root object and can run commands on the dedicated Tk thread. It can also be \n        used a decorator.\n        \n        **All Tk interaction must take place via this thread**.\n\n        Examples\n        --------\n            \n        ::\n            \n            future = Tk_thread().submit(my_func, my_args)\n            future.result() # blocks\n\n            @Tk_thread(discard=True)\n            def myfunc():\n                # This is run on the Tk thread and returns a *future* to the result.\n                # By specifying `discard=True` we tell xlOil that we're not going to\n                # keep track of that future and so it should log any exceptions.\n                ... \n\n    \"\"\"\n\n    return _Tk_thread if fn is None else _Tk_thread._wrap(fn, discard)\n\n\n\n# Safe now we've created the Tk_thread\nimport tkinter\n\nclass TkThreadTaskPane(CustomTaskPane, metaclass=_ConstructInExecutor, executor=Tk_thread):\n    \"\"\"\n        Wraps a Tk window to create a CustomTaskPane object.\n    \"\"\"\n\n    def __init__(self):\n        self._top_level = tkinter.Toplevel()\n        self._top_level.withdraw() # Create hidden\n\n    @property\n    def top_level(self) -> tkinter.Toplevel:\n        \"\"\"\n            This returns a *tkinter.Toplevel* window into which the pane's contents\n            should be placed.\n        \"\"\"\n        return self._top_level\n\n    def _get_hwnd(self):\n        # Calling winfo_id() on a tk.Toplevel gives the hWnd of a child which \n        # represents the window client area. We want the *actual* top level window\n        # which is the parent. Note we don't combine self.draw and getting\n        # the hwnd in one call because that doesn't work for some reason...\n        from ctypes import windll\n        return Tk_thread().submit(\n            lambda: (windll.user32.GetParent(self._top_level.winfo_id()), True))\n\n    def on_destroy(self):\n        super().on_destroy()\n        Tk_thread().submit(lambda: self._top_level.destroy())\n\n\nfrom .tk_console import TkConsole\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/gui/wx.py",
    "content": "\"\"\"\n    You must import this module before any other mention of `wx`: this allows xlOil to \n    create a thread to manage the wx GUI and the wx root object.  *All* interaction with the \n    *wx* must be done on that thread or crashes will ensue.  Use `wx_thread.submit(...)`\n    or the `@wx_thread` to ensure functions are run on the thread.\n\"\"\"\n\nimport xloil\nfrom xloil.gui import CustomTaskPane, _GuiExecutor, _ConstructInExecutor\nfrom xloil._core import XLOIL_EMBEDDED\nfrom xloil import log\n\n\nclass WxExecutor(_GuiExecutor):\n\n    def __init__(self):\n        self._app = None\n        super().__init__(\"WxGuiThread\")\n\n    @property\n    def app(self):\n        return self._app\n\n    def _do_work(self):\n        super()._do_work()\n        import wx\n        wx.CallLater(200, self._do_work)\n\n    def _main(self):\n\n        import wx\n\n        self._app = wx.App()\n        \n        # Mainloop will immediately exit without at least 1 window\n        hidden = wx.Frame(None, title=\"Hello World\")\n\n        self._make_ready()\n\n        # Run any pending queue items now\n        self._do_work()\n \n        # Thread main loop, run until quit\n        self._app.MainLoop()\n        \n        log.debug(\"Wx: Finished running main loop, finalising Application\")\n\n        # See https://stackoverflow.com/questions/49304429/\n        wx.DisableAsserts()\n\n        for window in wx.GetTopLevelWindows():\n            window.Destroy()\n\n        self._app = None\n\n\n    def _shutdown(self):\n        self._app.ExitMainLoop()\n\n\n_wx_thread = None\n\nif XLOIL_EMBEDDED:\n    _wx_thread = WxExecutor()\n    # Send this blocking no-op to ensure wx is created on our thread now\n    _wx_thread.submit(lambda: 0).result()\n\ndef wx_thread(fn=None, discard=False) -> WxExecutor:\n    \"\"\"\n        All wx GUI interactions must take place on the thread on which the root object \n        was created. This function returns a *concurrent.futures.Executor* which creates   \n        the root object and can run commands on the dedicated wx thread. It can also be \n        used a decorator.\n        \n        **All wx interaction must take place via this thread except CallLater**.\n\n        Examples\n        --------\n            \n        ::\n            \n            future = wx_thread().submit(my_func, my_args)\n            future.result() # blocks\n\n            @wx_thread(discard=True)\n            def myfunc():\n                # This is run on the wx thread and returns a *future* to the result.\n                # By specifying `discard=True` we tell xlOil that we're not going to\n                # keep track of that future and so it should log any exceptions.\n                ... \n\n    \"\"\"\n    global _wx_thread\n    return _wx_thread if fn is None else _wx_thread._wrap(fn, discard)\n\ntry:\n    import wx\nexcept ImportError:\n    from xloil._core import XLOIL_READTHEDOCS\n    if not XLOIL_EMBEDDED:\n        class wx:\n            class Frame:\n                # Placeholder for wx.Frame\n                ...\n\nclass WxThreadTaskPane(CustomTaskPane, metaclass=_ConstructInExecutor, executor=wx_thread):\n    \"\"\"\n        Wraps a wx window to create a CustomTaskPane object.\n    \"\"\"\n\n    def __init__(self, frame=None):\n        \n        if isinstance(frame, wx.Frame):\n            self._frame = frame\n        elif frame is not None:\n            self._frame = frame()\n        else:\n            self._frame = wx.Frame()\n\n    @property\n    def frame(self) -> wx.Frame:\n        \"\"\"\n            This returns a *wx.Frame* window into which the pane's contents\n            should be placed.\n        \"\"\"\n        return self._frame\n\n    def _get_hwnd(self):\n        def prepare(frame):\n            frame.Show()\n            # import wx\n            # frame.Move(wx.Point(0,0))\n            # Unfortunately, Wx windows can't be reparented, so return False\n            return frame.GetHandle(), False\n        return wx_thread().submit(prepare, self._frame)\n\n    def on_destroy(self):\n        super().on_destroy()\n        wx_thread().submit(lambda: self._frame.Destroy())\n        \n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/importer.py",
    "content": "import importlib\nimport importlib.util\nimport importlib.abc\nfrom logging import root\nimport sys\nimport os\nimport inspect\nimport site\nfrom importlib.machinery import SourceFileLoader\nfrom types import ModuleType\nfrom typing import List, Dict\nfrom collections.abc import Iterable\nfrom .register import scan_module\nfrom ._core import StatusBar, Addin, XLOIL_EMBEDDED, Singleton, StatusBarExecutor\nfrom .logging import log, log_except\nfrom ._superreload import superreload\n\n_linked_workbooks = dict() # Stores the workbooks associated with an source file \n_PATH_FINDER = None\n\n\nclass ImportHelper(metaclass=Singleton):\n    \"\"\"\n    Helps manage modules loaded by xlOil's import machinery. In particular,\n    manages the reload-on-modify events for any loaded module.\n    \"\"\"\n    \n    def __init__(self):\n        import xloil_core\n        self._watched = {}\n        try:\n            self._ignore_paths = xloil_core.core_addin().settings['xlOil_Python']['AutoReloadExcludePaths']\n        except KeyError:\n            self._ignore_paths = []\n            \n        self._module_addin_map = dict()\n        self._reloader = superreload\n\n        # Inevitably many files will be imported from the environment's site-packages\n        # directories and it is unlikely that any of these files will be modified at\n        # runtime. To simplify the event structure, create a sub-dir watcher for each\n        # site package location\n        for prefix in site.PREFIXES:\n            event = xloil_core.event.file_change(prefix, subdirs=True)\n            event += self._on_file_modified\n        \n    @property\n    def watched_modules(self) -> Dict[str, str]:\n        \"\"\"\n        Returns a dict of {watched_module_file -> module_name}\n        \"\"\"\n        return self._watched\n    \n    @property\n    def module_addin(self) -> Dict[str, str]:\n        \"\"\"\n        Keeps tracek of which addin loads a particular source file.\n        Returns a dict of {module_path -> addin_path}\n        \"\"\"\n        return self._module_addin_map\n    \n    @property\n    def ignore_paths(self) -> List[str]:\n        \"\"\"\n        List of path prefixes which will be ignored for auto-reloading on modification\n        \"\"\"\n        return self._ignore_paths\n    \n    def reload(self, module, *args, **kwargs):\n        log.debug(f\"Reloading {module}\")\n        return self._reloader(module, *args, **kwargs)\n    \n    def watch_module(self, module: ModuleType):\n        if not module.__spec__:\n            return\n\n        filepath = module.__spec__.origin\n        \n        if filepath == \"frozen\" or any((filepath.startswith(x) for x in self._ignore_paths)):\n            return\n        \n        if filepath in self._watched:\n            return\n                \n        # Any file in one the site package directories will be handled\n        # by the watchers created in the __init__ method\n        if not any((filepath.startswith(x) for x in site.PREFIXES)):\n            import xloil_core\n            event = xloil_core.event.file_change(filepath)\n            event += self._on_file_modified\n        \n        # If _import_and_scan has not written addin info for this module name\n        # we use the core addin as the most likely choice of originator.\n        import xloil_core\n        self._module_addin_map[filepath] = self._module_addin_map.get(\n            module.__name__, \n            xloil_core.core_addin().pathname)\n        self._watched[filepath] = module.__name__\n     \n    def _on_file_modified(self, filepath):\n        module_name = self._watched.get(filepath, None)\n        if module_name is None:\n            return\n        \n        module = sys.modules[module_name]\n        \n        import xloil_core\n   \n        addin_path = self.module_addin[filepath]\n        addin = xloil_core.xloil_addins[addin_path] \n        addin.event_loop.call_soon_threadsafe(self.reload, module)\n\n\ndef linked_workbook() -> str:\n    \"\"\"\n        Returns the full path of the workbook linked to the calling module\n        or None if the module was not loaded with an associated workbook.\n    \"\"\"\n    # Get immediate caller\n    frame = inspect.stack()[1]\n    return _linked_workbooks.get(frame.filename, None)\n\n\ndef source_addin() -> Addin:\n    \"\"\"\n        Returns the full path of the source add-in (XLL file) associated with\n        the current code. That is the add-in which has caused the current code\n        to be executed\n    \"\"\"\n    import xloil_core\n\n    addin_path = None\n\n    # Get the highest level caller we recognise\n    for frame in inspect.stack()[::-1]:\n        addin_path = ImportHelper().module_addin.get(frame.filename, None)\n        if addin_path is not None:\n            break\n\n    if addin_path is None:\n        return xloil_core.core_addin()\n    else:\n        return xloil_core.xloil_addins[addin_path] \n\n\ndef get_event_loop():\n    \"\"\"\n        Returns the background *asyncio* event loop used to load the current add-in. \n        Unless specified in the settings, all add-ins are loaded in the same thread  \n        and event loop.\n    \"\"\"\n    return source_addin().event_loop\n\n\ndef _import_file(path, addin=None, workbook_name:str=None):\n\n    \"\"\"\n    Imports the specifed py file by path as a module without requiring it to be on \n    *sys.path* and without adding its path to *sys.modules*.\n\n    Optionally also adds xlOil linked workbook information.\n    \"\"\"\n\n    root_path, filename = os.path.split(path)\n    filestem = os.path.splitext(filename)[0]\n            \n    module_name = filestem\n    \n    # avoid name collisions with any installed python modules when loading a\n    # workbook modules (e.g. if your workbook was called sys.xlsx)\n    \n    if len(root_path) > 0:\n        if workbook_name is not None:\n            module_name = \"xloil_wb_\" + filestem # Uniquify accross wb?\n        _PATH_FINDER.add_path(module_name, path)\n\n    addin = addin or source_addin()\n\n    ImportHelper().module_addin[path] = addin.pathname\n\n    if workbook_name is not None:\n        _linked_workbooks[path] = workbook_name\n\n    log.info(\"Importing module %s from file '%s' at '%s' for addin '%s'. Linked workbook '%s'\", \n             module_name, filename, root_path, addin, workbook_name)\n\n    # Force a reload if an attempt is made to load a module again.\n    # This can happen if a workbook is closed and reopened - it is\n    # difficult to get python to delete the module. Without a reload\n    # the 'pending funcs' won't be populated for the registration \n    # machinery.\n    if module_name in sys.modules:\n        module = ImportHelper().reload(sys.modules[module_name])\n    else:\n        module = importlib.import_module(module_name)\n\n    return module\n\n\n\ndef _import_and_scan(module_names, addin):\n    \n    import xloil_core\n\n    def work(target):\n        try:\n            # Turn off xloil events to avoid possible synchronisation issues whilst loading\n            xloil_core.event.pause(excel=False)\n            try:\n                if inspect.ismodule(target):\n                    module = importlib.reload(target)\n                \n                elif isinstance(target, str):\n                    ImportHelper().module_addin[target] = addin.pathname\n                    module = importlib.import_module(target)\n                \n                else:\n                    raise ValueError(target)\n            \n            except (ImportError, ModuleNotFoundError) as e:\n                raise ImportError(f\"{e} with sys.path={sys.path}\") from e\n                \n            log.debug(\"Loaded python module '%s' for addin '%s'\", module.__name__, addin.pathname)     \n            scan_module(module, addin)\n            return module\n        \n        finally:\n            xloil_core.event.allow(excel=False)\n            \n    if isinstance(module_names, str) or not isinstance(module_names, Iterable):\n        success_msg = f\"Load {module_names}\"\n        module_names = (module_names,)\n    else:\n        success_msg = \"xlOil module load\"\n        \n\n    executor = StatusBarExecutor(2000)\n    jobs = executor.map(work, module_names, \n                        message=lambda mod: f\"Loading {mod}\", \n                        job_name=success_msg)\n    \n    results = list(jobs)\n\n    for x in results:\n        if isinstance(x, Exception):\n            raise x\n    return results\n\n\ndef _import_file_and_scan(path, addin=None, workbook_name:str=None):\n    \"\"\"\n        Internal use only: called from xlOil Core. Wraps _import_file\n        and scan_module with StatusBar display.\n    \"\"\"\n    import xloil_core\n    \n    with StatusBar(3000) as status:\n        try:            \n            #Turn off xloil events to avoid possible synchronisation issues whilst loading\n            xloil_core.event.pause(excel=False)\n\n            status.msg(f\"Loading {path}...\")\n            module = _import_file(path, addin, workbook_name)\n\n            # Calling import_module will bypass our import hook, so scan_module explicitly\n            n_funcs = scan_module(module, addin)\n            status.msg(f\"Registered {n_funcs} funcs for {path}\")\n\n        except Exception as e:\n            status.msg(f\"Error loading {path}, see log\")\n            raise ImportError(f\"{str(e)} whilst loading {path}\", path=path) from e\n        \n        finally:\n            xloil_core.event.allow(excel=False)\n\ndef import_functions(source:str, names=None, as_names=None, addin:Addin=None, workbook_name:str=None) -> None:\n    \"\"\"\n        Loads functions from the specified source and registers them in Excel. The functions\n        do not have to be decorated, but are imported as if they were decorated with ``xloil.func``.\n        So if the functions have typing annotations, they are respected where possible.\n\n        This function provides an analogue of ``from X import Y as Z`` but with Excel UDFs.\n\n        Note: registering a large number of Excel UDFs will impair the function name-lookup performance \n        (which is by linear search through the name table).\n\n        Parameters\n        ----------\n\n        source: str\n            A module name or full path name to the target py file\n\n        names: [Iterable[str] | dict | str]\n            If not provided, the specified module is imported and any ``xloil.func`` decorated \n            functions are registered, i.e. call ``xloil.scan_module``. \n            \n            If a str or an iterable of str, xlOil registers only the specified names regardless of whether \n            they are decorated. \n            \n            If it is a ``dict``, it is interpreted as a map of source names to registered function\n            names, i.e.``names = keys(), as_names=values()``. \n\n            If it is the string '*', xlOil will try to register all callables in the specified module,\n            including async functions and class constructors.\n\n        as_names: [Iterable[str]]\n            If provided, specifies the Excel function names to register in the same order as `names`.\n            Should have the same length as `names`.  If this is omitted, functions are registered under\n            their python names.\n\n        addin:\n            Optional xlOil.Addin which the registered functions are associated with. If ommitted the\n            currently executing addin is used, or the Core addin if this cannot be determined.\n\n        workbook_name: [str]\n            Optional workbook associated with the registered functions.\n\n    \"\"\"\n    \n    addin = addin or source_addin()\n    \n    module = source if inspect.ismodule(source) else \\\n        _import_file(source, addin, workbook_name)\n\n    log.info(f\"Importing: {names} from {source}\")\n\n    if names is None: \n        scan_module(module, addin)\n        return\n\n    if isinstance(names, str):\n        if names == \"*\":\n            from inspect import getmembers, isfunction, isclass, iscoroutinefunction, isasyncgenfunction\n            \n            source_names = [x[0] for x in getmembers(module, lambda x: \n                isfunction(x) or isclass(x) or iscoroutinefunction(x) or isasyncgenfunction(x))]\n            target_names = source_names\n        else:\n            source_names = [names]\n            target_names = source_names if as_names is None \\\n                else ([as_names] if isinstance(as_names, str) else as_names)\n    else:\n        try:\n            source_names = names.keys()\n            target_names = names.values()\n        except AttributeError:\n            source_names = names\n            target_names = as_names or source_names\n\n    from xloil.register import _register_functions, func\n\n    def get_spec(obj, name):\n        spec = getattr(obj, '_xloil_spec', None) or func(obj, register=False)._xloil_spec\n        spec.name = name\n        return spec\n\n    to_register = [\n        get_spec(getattr(module, source_name), target_name)\n        for source_name, target_name in zip(source_names, target_names)\n    ]\n    \n    _register_functions(to_register, module, addin, append=True)\n\n\nclass _LoadAndScanHook(SourceFileLoader):\n    \n    def __init__(self, fullname: str, path: str) -> None:\n        super().__init__(fullname, path)\n\n\n    def exec_module(self, module):\n\n        # Exec module as normal\n        super().exec_module(module)\n        \n        try:\n            ImportHelper().watch_module(module)\n\n            # Look for xlOil functions to register\n            scan_module(module)\n        except Exception as e:\n            log_except(f\"Import failed: {e}\")\n            raise\n\n \nclass _UrlLoader(importlib.abc.FileLoader, importlib.abc.SourceLoader):\n    \"\"\"\n    Loads a python module from a URL, then runs `scan_module` on the result\n    \"\"\"\n    def get_data(self, path):\n        \n        url = self.get_filename()\n\n        log.debug(\"Loading module name '%s' from URL '%s'\", self.name, url)\n\n        # The core already loads the contents onedrive/sharepoint URLs\n        # so we first try to fetch that cached copy, then otherwise fetch\n        # the URL in the normal way with 'requests' \n        try:\n            from xloil_core import _get_onedrive_source\n            preloaded = _get_onedrive_source(url)\n            return preloaded.encode('utf-8')\n\n        except:\n            import requests\n            response = requests.get(url)\n            return response.text.encode('utf-8')\n\n    def exec_module(self, module):\n        # Exec module as normal\n        super().exec_module(module)\n\n        # Look for xlOil functions to register\n        scan_module(module)\n\n\nclass _SpecifiedPathFinder(importlib.abc.MetaPathFinder):\n    \"\"\"\n    Allows importing a module from a path specified in path_map without\n    needing to add it to sys.paths - essentially a private set of import \n    paths, indexed by module name\n    \"\"\"\n\n    _path_map = dict()\n\n    def find_spec(self, fullname, path, target=None):\n        path = self._path_map.get(fullname, None)\n        if path is None:\n            return None\n\n        loader = None \n\n        if path.startswith(\"http\"):\n            loader = _UrlLoader(fullname, path)\n\n        log.debug(\"Found spec for '%s' with location '%s'\", fullname, path)\n        return importlib.util.spec_from_file_location(\n            fullname, path, \n            loader=loader, submodule_search_locations=[])\n\n    def find_module(self, fullname, path):\n        return None\n\n    def add_path(self, name, path):\n        log.debug(\"Associating module name '%s' with path '%s'\", name, path)\n        self._path_map[name] = path\n\n\ndef _install_import_hook():\n    # Hooks the import mechanism to run register.scan_module on all .py files.\n    # We copy _bootstrap_external._install, replacing the source loader with one which \n    # runs scan_module and install our finder at the start of sys.path_hooks\n\n    from importlib.machinery import (\n        SOURCE_SUFFIXES, BYTECODE_SUFFIXES, FileFinder, \n        ExtensionFileLoader, SourcelessFileLoader\n        )\n    import _imp\n\n    extensions = ExtensionFileLoader, _imp.extension_suffixes()\n    source     = _LoadAndScanHook, SOURCE_SUFFIXES\n    bytecode   = SourcelessFileLoader, BYTECODE_SUFFIXES\n\n    sys.path_hooks.insert(0, FileFinder.path_hook(*[extensions, source, bytecode]))\n\n    importlib.invalidate_caches()\n    sys.path_importer_cache.clear()\n\n    log.debug(\"Installed importlib hook to call scan_module\")\n\n\nif XLOIL_EMBEDDED:\n    \n    _PATH_FINDER = _SpecifiedPathFinder()\n    \n    _install_import_hook()\n\n    # Install a sys.meta_path hook. This allows reloads to work for modules \n    # we import from specific path in _import_file\n    sys.meta_path.append(_PATH_FINDER)\n "
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/jupyter.py",
    "content": "import xloil as xlo\n\nimport asyncio\nimport IPython\nimport pickle\nfrom IPython.display import publish_display_data\nimport jupyter_client\nimport os\nimport re\nimport json\nimport pydoc\n\nfrom . import func_inspect\n\nfrom .jupyter_kernel import _xlOilJupyterImpl\n_unpickle = _xlOilJupyterImpl._unpickle\n_pickle = _xlOilJupyterImpl._pickle\n_FuncDescription = _xlOilJupyterImpl._FuncDescription\n\ndef _remove_ansi_escapes(s):\n    # Escape codes for colours can appear in some jupyter output\n    ansi_escape = re.compile(r'(\\x9B|\\x1B\\[)[0-?]*[ -\\/]*[@-~]')\n    return ansi_escape.sub('', s)\n\n\nclass _FuncDescriptionDecoder(json.JSONDecoder):\n    \"\"\"\n    Deserialises _FuncDescription objects.  Handles 3 cases:\n        * Dict describing a _FuncDescription\n        * Dict describing a func_inspect.Arg\n        * Fully qualified type name as string\n    \"\"\"\n\n    def __init__(self, *args, **kwargs):\n        json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)\n\n    def object_hook(self, dct):\n\n        if 'typeof' in dct:\n            if isinstance(dct['typeof'], str):\n                dct['typeof'] = pydoc.locate(dct['typeof'])\n            try:\n                return func_inspect.Arg(**dct)\n            except TypeError:\n                ...\n\n        try:\n            return _FuncDescription(**dct)\n        except TypeError:\n            ...\n\n        return dct\n\ndef _register_func_description(desc: _FuncDescription, connection):\n        \n    import xloil_core\n    from xloil.register import async_wrapper, arg_to_funcarg, find_return_converter\n    func_name = desc.func_name\n\n    @async_wrapper\n    async def shim(*args, **kwargs):\n        return await connection.invoke(func_name, *args, **kwargs)\n\n    core_funcargs = [arg_to_funcarg(arg) for arg in desc.args]\n\n    spec = xloil_core._FuncSpec(shim, \n        args = core_funcargs,\n        name = desc.name,\n        features = \"rtd\",\n        help = desc.help,\n        category = \"xlOil Jupyter\")\n\n    if desc.return_type is not None:\n        spec.return_converter = find_return_converter(return_type)\n\n    xlo.log(f\"Jupyter registering func: '{str(spec)}'\", level=\"debug\")\n\n    xloil_core._register_functions([spec])\n\n\nclass _VariableWatcher(xlo.RtdPublisher):\n\n    \"\"\" \n    Rtd publisher which monitors a single variable\n    \"\"\"\n\n    def __init__(self, var_name, topic_name, connection): \n        super().__init__()\n        self._name = var_name\n        self._topic = topic_name\n        self._connection = connection ## TODO: weak-ptr?\n\n    def connect(self, num_subscribers):\n        # Although we should only need to connect for the first subscriber,\n        # if things somehow go out of sync its safer to just make another\n        # call to the variable watcher \n        #\n        # Given we refer to it several times, you'd think that making '_xloil_jpy_impl'\n        # a module level global. But NO: the deletion order during teardown means\n        # it's not available when the RTD server wants to tidy up\n        #\n        self._connection.execute(f\"_xloil_jpy_impl._vars.watch('{self._name}')\", silent=True)\n\n    def disconnect(self, num_subscribers):\n        if num_subscribers == 0:\n            self._connection.execute(f\"_xloil_jpy_impl._vars.stop_watch('{self._name}')\", silent=True)\n            return True # Schedule topic for destruction\n\n    def stop(self):\n        self._connection.stop_watch_variable(self._name)\n\n    def done(self):\n        return True\n\n    def topic(self):\n        return self._topic\n\ndef _file_to_string(filepath, indent=\"  \"):\n    \"\"\"\n        Write a file to string with the given indent per line. \n        Used to send code to the jupyter kernel\n    \"\"\"\n\n    result = \"\"\n    with open(filepath, \"r\") as file:\n        for line in file:\n            result += indent + line + '\\n'\n\n    return result\n\nclass JupyterNotReadyError(Exception):\n    pass\n\n_rtd_server_object = None\n\ndef _rtd_server():\n    global _rtd_server_object\n    if _rtd_server_object is None:\n        from xloil.type_converters import get_converter\n        _rtd_server_object = xlo.RtdServer()\n    return _rtd_server_object\n\nclass _JupyterConnection:\n    \n    _pending_messages = dict() # Dict[str -> Future]\n    _watched_variables = dict()\n    _registered_funcs = set()\n    _ready = False # Indicates whether the connection can receive commands  \n\n    def __init__(self, connection_file):\n\n        from jupyter_client.asynchronous import AsyncKernelClient\n\n        self._loop = xlo.get_async_loop()\n        self._client = AsyncKernelClient()\n        self._connection_file = connection_file\n\n        cf = jupyter_client.find_connection_file(self._connection_file)\n        xlo.log(f\"Jupyter: found connection for file {self._connection_file}\", level='debug')\n        self._client.load_connection_file(cf)\n\n    async def connect(self):\n        \n        from queue import Empty\n        \n        self._client.wait_for_ready(timeout=3)\n        # TODO: what if we timeout?\n\n        # Flush shell channel (wait_for_ready doesn't do this for some reason), but we need it \n        # to receive the shell message below\n        while True:    \n            try:\n                msg = await self._client.get_shell_msg(timeout=0.2)\n            except Empty:\n                break\n\n        #\n        # To avoid the remote kernel needing to export or even know about xlOil,\n        # we send a small class by concatenating the files jupyter_kernel.py and\n        # func_inspect.py. We then instantiate that class and assign it to the \n        # variable `xloil` to give consistent syntax for function declaration.\n        # If xloil is actually imported in the kernel, it will overwrite the symbol\n        # and some magic in __init__.py should fix up the names.\n        #\n        \n        xlo.log(f\"Initialising Jupyter connection {self._connection_file}\", level='debug')\n        \n        excel_hwnd = xlo.excel_state().hwnd\n        our_dir = os.path.dirname(os.path.realpath(__file__))\n\n        msg_id = self._client.execute(\n            _file_to_string(os.path.join(our_dir, \"jupyter_kernel.py\"), indent=\"\")\n            + _file_to_string(os.path.join(our_dir, \"func_inspect.py\"), indent=\"    \")\n            + f\"\\n_xloil_jpy_impl = _xlOilJupyterImpl(get_ipython(), {excel_hwnd})\"\n            +  \"\\nimport sys\"\n            +  \"\\nif 'xloil' in sys.modules:\"\n            + f\"\\n    xloil.func = _xloil_jpy_impl.func\"\n            + f\"\\n    xloil.app = _xloil_jpy_impl.app\"\n            +  \"\\nelse:\"\n            + f\"\\n    xloil = _xloil_jpy_impl\"\n        )\n\n        # TODO: retry?\n        # Some examples online suggest get_shell_msg(msg_id) should work. It doesn't, which is \n        # a shame.  It may be possible to use the undocumented _async_recv_reply function instead.\n        msg = None\n        while True:\n            if not await self._client.is_alive():\n                raise Exception(\"Jupyter client died\")\n\n            try:\n                msg = await self._client.get_shell_msg(timeout=1)\n            except Empty:\n                xlo.log(\"Waiting for Jupyter initialisation\", level='debug')\n                continue\n\n            if msg.get('parent_header', {}).get('msg_id', None) == msg_id:\n                if msg['content']['status'] == 'error':\n                    trace = _remove_ansi_escapes(\"\\n\".join(msg['content']['traceback']))\n                    raise Exception(f\"Connection failed: {msg['content']['evalue']} at {trace}\")\n                break\n\n        self._sessionId = msg['header']['session']\n        self._watched_variables.clear()\n        self._ready = True\n\n\n    def close(self):\n\n        # If still ready, i.e. not triggered by a kernel restart, clean up our variables\n        if self._ready:\n            self.execute(\"_xloil_jpy_impl._vars.unhook()\")\n\n        self._ready = False\n\n        # Copy topics because the disconnect for a watched variable will\n        # remove it from the dict\n        variable_topics = [x.topic() for x in self._watched_variables.values()]\n        \n        for topic in variable_topics:\n            _rtd_server().drop(topic)\n        \n        # Remove any stragglers\n        self._watched_variables.clear()\n\n        # Remove all registered functions\n        xlo.deregister_functions(None, self._registered_funcs)\n\n\n    async def wait_for_restart(self):\n\n        session = self._sessionId\n\n        while True:\n            # We'd expect to see exec_state == 'starting', on iopub but sometimes it doesn't \n            # appear (???) so we settle for any exec_state with a new session id.\n            msg = await self._client.get_iopub_msg()\n            exec_state = msg.get('content', {}).get('execution_state', None)\n            session = msg['header']['session']\n            if exec_state is not None and session != self._sessionId:\n                break\n            await asyncio.sleep(1)\n\n        xlo.log(f\"Jupyter restart: new session {session}\", level='info')\n\n        await self.connect()\n\n    def execute(self, *args, **kwargs):\n        \"\"\"\n        Executes asynchronously on the kernel but does not return. Can be\n        called from any thread\n        \"\"\"\n        if not self._ready:\n            raise JupyterNotReadyError()\n\n        async def coro():\n            self._client.execute(*args, **kwargs)\n\n        import asyncio\n        asyncio.run_coroutine_threadsafe(coro(), self._loop)\n\n    async def aexecute(self, command:str, **kwargs):\n        \"\"\"\n        Async run the given command on the kernel. Must be called on same thread \n        as our xloil event loop, e.g. from an RTD function\n        \"\"\"\n        if not self._ready:\n            raise JupyterNotReadyError()\n\n        # TODO: maybe able to use the undocumented _async_recv_reply \n        # method on the client rather than rolling our own\n\n        msg_id = self._client.execute(command, **kwargs)\n        future = self._loop.create_future()\n        self._pending_messages[msg_id] = future\n        return await future\n\n    async def invoke(self, func_name, *args, **kwargs):\n        \"\"\"\n        Must be called on same thread as our xloil event loop, e.g. from an RTD function\n        \"\"\"\n        if not self._ready:\n            raise JupyterNotReadyError()\n\n        # TODO: won't work with cellerror, need to convert that to None or string or?\n\n        args_data = repr(_pickle(args))\n        kwargs_data = repr(_pickle(kwargs))\n\n        return await self.aexecute(\n            f\"_xloil_jpy_impl._function_invoke(\"\n            f\"{func_name}, {args_data}, {kwargs_data})\"\n            )\n\n    def _watch_prefix(self, name):\n        # Just come up with some unique ID for the RTD topic...\n        prefix = self._client.get_connection_info()[\"key\"].decode('utf-8')\n        return f\"{prefix}_{name}\" \n\n    def watch_variable(self, name):\n        \n        if not self._ready:\n            raise JupyterNotReadyError()\n\n        topic = self._watch_prefix(name)\n        if not name in self._watched_variables:\n\n            # TODO: I think that if we don't retain a ref to the watcher it will somehow get\n            # lost by pybind, but can we check this again?\n            watcher = _VariableWatcher(name, topic, self)\n            self._watched_variables[name] = watcher\n\n            xlo.log(f\"Starting variable watch {name}\", level='debug')\n            _rtd_server().start(watcher)\n\n        return _rtd_server().subscribe(topic)\n\n    def stop_watch_variable(self, name):\n        try:\n            del self._watched_variables[name]\n        except KeyError:\n            pass\n\n    def publish_variables(self, updates:dict):\n        for name, value in updates.items():\n            _rtd_server().publish(self._watch_prefix(name), value)\n\n    async def process_messages(self):\n   \n        while await self._client.is_alive():\n            from queue import Empty\n            try:\n                # We communicate over the public iopub channel \n                # TODO: consider using the private comm channel rather\n                msg = await self._client.get_iopub_msg()\n                content = msg['content']\n            except (Empty, KeyError):\n                # Timed out waiting for messages, or msg had no content\n                continue \n            \n            xlo.log(f\"Jupyter Message: {msg['header']}\", level='trace')\n\n            msg_type = msg['header']['msg_type']\n\n            # If kernel is shutting down, break out of loop by returning\n            if msg_type == 'shutdown_reply':\n                xlo.log(f\"Jupyter kernel shutdown: {self._connection_file}\", level='info')\n                self._ready = False\n                return content['restart']\n\n            # Check if this is the reply to one of our pending messages\n            parent_id = msg.get('parent_header', {}).get('msg_id', None)\n            pending = self._pending_messages.get(parent_id, None)\n\n            # Look for xlOil specific message content\n            data = content.get('data', {})\n            xloil_data = data.get('xloil/data', None)\n            meta_type = content.get('metadata', {}).get('type', None)\n\n            # If we matched a pending message, check for an error or a result then\n            # publish the result and pop the pending message. We also will also \n            # match kernel status messages which are replies to our execute request\n            # so in this case we just continue\n            if pending is not None:\n                xlo.log(f\"Jupyter matched '{msg_type}' reply to: {parent_id}\", level='trace')\n                result = None\n                if msg_type == 'error':\n                    result = content['evalue']\n                elif msg_type == 'display_data':\n                    if xloil_data is not None:\n                        result = self._process_xloil_message(meta_type, xloil_data, pending)\n                    else:\n                        result = f\"Unexpected result: {data}\"\n                elif msg_type == 'execute_result':\n                    result = eval(data.get('text/plain', \"MISSING_RESULT\"))\n                else: \n                    continue # Kernel status and other messages\n\n                xlo.log(f\"Jupyter result for request {parent_id}: {result}\", level='trace')\n                pending.set_result(result)\n                self._pending_messages.pop(parent_id)\n                continue\n\n            if xloil_data is None: \n                continue\n\n            self._process_xloil_message(meta_type, xloil_data)\n        \n    def _process_xloil_message(self, message_type, payload, pending=None):\n\n        if message_type == \"VariableChange\":\n            payload = _unpickle(payload)\n            self.publish_variables(payload)\n\n        elif message_type == \"FuncRegister\":\n            # Registrations are sent using JSON serialisation rather than pickle\n            # because the _FuncDescription is not declard in the same python\n            # module on both sides \n            func_descr = json.loads(payload, cls=_FuncDescriptionDecoder)\n            _register_func_description(func_descr, connection=self)\n                \n            # Keep track of our funtions for a clean shutdown\n            self._registered_funcs.add(func_descr.name)\n\n        elif message_type == \"FuncResult\":\n            payload = _unpickle(payload)\n            if pending:\n                return payload\n            else:\n                xlo.log(f\"Unexpected function result: {payload}\")\n        else:\n            raise Exception(f\"Unknown xlOil message: {message_type}\")\n            \n        xlo.log(f\"Jupyter xlOil Msg: {payload}\", level='trace')\n\n\n    # TODO: support 'with'?\n    #def __enter__(self):\n    #def __exit__(self, exc_type, exc_value, traceback)\n\n_connections = dict()\n\nclass _JupyterTopic(xlo.RtdPublisher):\n\n    def __init__(self, topic, connection_file): \n        super().__init__()\n        self._connection = _JupyterConnection(connection_file)\n        self._topic = topic\n        self._task = None \n\n    def connect(self, num_subscribers):\n\n        if self.done():\n            conn = self._connection\n\n            async def run():\n                try:\n                    xlo.log(f\"Awaiting connection to Jupyter kernel {self._topic}\", level=\"debug\")\n                    await conn.connect()\n                    while True:\n                        _connections[self._topic] = conn\n                        _rtd_server().publish(self._topic, self._topic)\n                        restart = await conn.process_messages()\n                        xlo.log(f\"Closing connection to Jupyter kernel {self._topic}\", level=\"debug\")\n                        conn.close()\n                        if not restart:\n                            break\n                        await conn.wait_for_restart()\n                        xlo.log(f\"Restarted connection to Jupyter kernel {self._topic}\", level=\"debug\")\n\n                    _rtd_server().publish(self._topic, \"KernelShutdown\")\n\n                except Exception as e:\n                    _rtd_server().publish(self._topic, e)\n                finally:\n                    conn.close()\n\n            self._task = conn._loop.create_task(run())\n\n    def disconnect(self, num_subscribers):\n        if num_subscribers == 0:\n            self.stop()\n\n            # Cleanup our cache reference\n            del _connections[self._topic]\n\n            # Schedule topic for destruction\n            return True \n\n    def stop(self):\n        if not self._task is None:\n            self._task.cancel()\n        self._connection.close()\n\n    def done(self):\n        return self._task is None or self._task.done()\n\n    def topic(self):\n        return self._topic\n\n\ndef _find_kernel_for_notebook(server, token, filename):\n    import requests\n    r = requests.get(f\"{server}/api/sessions?token={token}\", timeout=1)\n    if r.ok:\n        for session in r.json():\n            if filename in session.get('notebook', {}).get('path', \"\"):\n                kernel_id = session.get('kernel', {}).get('id', \"\")\n                return f\"kernel-{kernel_id}.json\"\n    return None\n\ndef _find_connection_for_notebook(filename):\n    import notebook.notebookapp\n    for server in notebook.notebookapp.list_running_servers():\n        # Note drop trailing slash on server url\n        kernel = _find_kernel_for_notebook(server['url'][:-1], server['token'], filename)\n        if kernel: return kernel    \n    return None\n\n\n@xlo.converter(_JupyterConnection, register=False)\nclass JupyterConnectionLookup:\n    def read(self, x):\n        if isinstance(x, str):\n            conn = _connections.get(x, None)\n            if conn is not None:\n                return conn\n        raise Exception(f\"Expected jupyter connection ref, got '{x}'\")\n\n\n@xlo.func(\n    help=\"Connects to a jupyter (ipython) kernel. Functions created in the kernel \"\n         \"and decorated with xlo.func will be registered with Excel.\",\n    args={\n            'ConnectInfo': \"A file of the form 'kernel-XXX.json' (from %connect_info magic) \"\n                           \"or a URL containing a ipynb file\"\n         }\n)\ndef xloJpyConnect(ConnectInfo: str):\n    from urllib.parse import urlparse\n\n    connection_file = None\n    if re.match('kernel-[a-z0-9\\-]*.json', ConnectInfo, re.IGNORECASE):\n        # Kernel connection file provided\n        connection_file = ConnectInfo\n    else:\n        # Parse as a URL\n        url = urlparse(ConnectInfo)\n        filename = os.path.split(url.path)[1]\n        if os.path.splitext(filename)[1].lower() == '.ipynb':\n            # If there's a token, no need to search\n            if 'token' in url.query:\n                connection_file = _find_kernel_for_notebook(\n                    f\"{url.scheme}://{url.netloc}\", url.query[6:], filename)\n            else: # Search through all local jupyter instances\n                connection_file = _find_connection_for_notebook(filename)\n\n    # TODO: load notebook if not already loaded.  Maybe even load jupyter if not loaded?\n\n    if connection_file is None:\n        raise Exception(f\"Could not find connection for {ConnectInfo}\")\n\n    topic = connection_file.lower()\n    if _rtd_server().peek(topic) is None:\n        conn = _JupyterTopic(topic, connection_file)\n        _rtd_server().start(conn)\n    return _rtd_server().subscribe(topic)\n\n\n@xlo.func(\n    help=\"Fetches the value of the specifed variable from the given jupyter\"\n         \"connection. Updates it live using RTD.\",\n    args={\n        'Connection': 'Connection ref output from xloJpyConnect',\n        'Name': 'Case-sensitive name of a global variable in the jupyter kernel'\n    }\n)\ndef xloJpyWatch(Connection: JupyterConnectionLookup, Name):\n    return Connection.watch_variable(Name)\n\n\n@xlo.func(\n    help=\"Runs the given command in the connected kernel, i.e. runs \"\n         \"command.format(repr(Arg1), ...)\",\n    args={\n        'Connection': 'Connection ref output from xloJpyConnect',\n        'Command': 'A format string which is to be executed',\n    }\n)\nasync def xloJpyRun(Connection:JupyterConnectionLookup, \n                    Command:str, \n                    Arg1=None, Arg2=None, Arg3=None, Arg4=None, \n                    Arg5=None, Arg6=None, Arg7=None, Arg8=None, \n                    Arg9=None, Arg10=None, Arg11=None, Arg12=None):\n    future = Connection.aexecute(\n        Command.format(repr(Arg1), repr(Arg2), repr(Arg3), repr(Arg4), \n                       repr(Arg5), repr(Arg6), repr(Arg7), repr(Arg8), \n                       repr(Arg9), repr(Arg10), repr(Arg11), repr(Arg12)))\n    return await future"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/jupyter_kernel.py",
    "content": "# This file is sent directly to the jupyter kernel so avoid adding\n# imports etc as they will end up in the kernel's global namespace\n\nclass _xlOilJupyterImpl:\n\n    def __init__(self, ipy_shell, excel_hwnd):\n        # Takes a reference to the ipython shell (e.g. from get_ipython())\n        self._excel_hwnd = excel_hwnd\n        self._display_data = ipy_shell.display_pub.publish\n        self._vars = self._MonitoredVariables(ipy_shell)\n\n    @staticmethod\n    def _pickle(obj):\n        import pickle\n        return pickle.dumps(obj, protocol=0).decode('latin1')\n\n    @staticmethod\n    def _unpickle(dump:str):\n        import pickle\n        return pickle.loads(dump.encode('latin1'))\n\n    def _serialise(self, obj):\n        # Simple json serialiser: serialises the class dict whilst skipping the special\n        # Arg._EMPTY type.  Also converts type objects to their fully qualified name\n        import json\n        def f(x):\n            if isinstance(x, type):\n                return x.__qualname__\n            else:\n                return { k: v for k, v in x.__dict__.items() if v is not self.Arg._EMPTY }\n        return json.dumps(obj, default=f)\n\n\n    class _MonitoredVariables:\n        \"\"\"\n        Created within the jupyter kernel to hook the 'post_execute' event and watch\n        for variable changes\n        \"\"\"\n        def __init__(self, ipy_shell):\n\n            self._values = dict()\n            self._shell = ipy_shell\n            self._display_data = ipy_shell.display_pub.publish\n\n            # Hook post_execute\n            ipy_shell.events.register('post_execute', self.post_execute)\n    \n        def post_execute(self):\n            updates = {}\n            # Loop through all global variables looking for changes\n            for name, val in self._values.items():\n                that_val = self._shell.user_ns.get(name, None)\n                # Use is to check for equality rather than == as the latter\n                # may not return a single value e.g. numpy arrays\n                if not that_val is val:\n                    updates[name] = that_val\n                    self._values[name] = that_val\n\n            if len(updates) > 0:\n                self._display_data(\n                    { \"xloil/data\": _xlOilJupyterImpl._pickle(updates) },\n                    { 'type': \"VariableChange\" }\n                )\n\n        def watch(self, name):\n            # Starts monitoring the given variable name\n            self._values[name] = globals().get(name, None)\n            # Run the hook now to publish the variable\n            self.post_execute()\n\n        def stop_watch(self, name):\n            # Stops monitoring the given variable name\n            del self._values[name]\n\n        def unhook(self):\n            self._shell.events.unregister('post_execute', self.post_execute)\n\n    class _FuncDescription:\n        \"\"\"\n            A serialisable func description we can send over Jupyter messaging\n        \"\"\"\n        def __init__(self, func_name, name, help, args, return_type):\n            self.func_name = func_name\n            self.name = name\n            self.help = help\n            self.args = args\n            self.return_type = return_type\n\n    def _function_invoke(self, func, args_data, kwargs_data):\n        args   = self._unpickle(args_data)\n        kwargs = self._unpickle(kwargs_data)\n        result = func(*args, **kwargs)\n        self._display_data(\n            { \"xloil/data\": self._pickle(result) },\n            { 'type': \"FuncResult\" }\n        )\n        #return result # Not used, just in case tho\n\n    def func(self,\n            fn=None,\n            name=None, \n            help=\"\", \n            args=None):\n\n        \"\"\"\n            Replaces xloil.func in jupyter but removes arguments which do not make sense\n            when called from jupyter\n        \"\"\"\n\n        def decorate(fn):\n            \n            func_args, return_type = self.Arg.full_argspec(fn)\n            func_args = self.Arg.override_arglist(func_args, args)\n\n            spec = self._FuncDescription(\n                fn.__name__, \n                name or fn.__name__, \n                help, \n                func_args,\n                return_type)\n        \n            self._display_data(\n                { \"xloil/data\": self._serialise(spec) },\n                { 'type': \"FuncRegister\" }\n            )\n\n            return fn\n\n        return decorate if fn is None else decorate(fn)\n\n    def app(self):\n        \"\"\"\n            Imports xloil and gives access to the connected Excel Application\n        \"\"\"\n        # Importing xloil in the jupyter kernel does some magic, see __init__.py\n        import xloil   \n        return xloil.Application(hwnd=self._excel_hwnd)\n\n    # IMPORTANT: The last (nonblank) line must be indented as the contents  \n    # of func_inspect.py are pasted in here and sent to the kernel. That\n    # means we hide all our internals in the _xlOilJupyterImpl class  "
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/logging.py",
    "content": "import traceback\nimport warnings\nfrom ._core import _LogWriter\n\nlog = _LogWriter()\n\"\"\"\n    An instance of `xloil._LogWriter` which writes a log message to xlOil's log.  The level \n    parameter can be a integer constant from the ``logging`` module or one of the strings\n    *error*, *warn*, *info*, *debug* or *trace*.\n\n    Only messages with a level higher than the xlOil log level which is (initially) set\n    in the xlOil settings file will be output to the log file. Trace output can only\n    be seen with a debug build of xlOil.\n\"\"\"\n\ndef _log_warnings(message, category, filename, lineno, file=None, line=None):\n    log(warnings.formatwarning(message, category, filename, lineno, line), level='warn')\n\nwarnings.showwarning = _log_warnings\n\ndef log_except(msg, level='error'):\n    \"\"\"\n       Logs '{msg}: {stack trace}' with a default level of 'error'\n    \"\"\"\n    log.error(f\"{msg}: {traceback.format_exc()}\")"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/matplotlib.py",
    "content": "try:\n    import matplotlib\n    matplotlib.use('Agg')\n    from matplotlib import pyplot\nexcept ImportError:\n    from ._core import XLOIL_READTHEDOCS\n    if XLOIL_READTHEDOCS:\n        class pyplot:\n            class Figure:\n                # Placeholder for matplotlib.pyplot.Figure\n                ...\n\nfrom xloil import *\n\n@func(macro=True)\ndef xloPyPlot(x, y, width:float=None, height:float=None, **kwargs):\n    fig = pyplot.figure()\n    if width is not None:\n        fig.set_size_inches(width, height)\n    ax = fig.add_subplot(111)\n    ax.plot(x, y, **kwargs)\n    return fig\n\n\n@returner(target=pyplot.Figure, register=True)\nclass ReturnFigure:\n    \"\"\"\n        Inserts a plot as an image associated with the calling cell. A second call\n        removes any image previously inserted by the same calling cell.\n\n        Parameters\n        ----------\n\n        size:  \n            * A tuple (width, height) in points. \n            * \"cell\" to fit to the caller size\n            * \"img\" or None to keep the original image size\n        pos:\n            A tuple (X, Y) in points. The origin is determined by the `origin` argument\n        origin:\n            * \"top\" or None: the top left of the calling range\n            * \"sheet\": the top left of the sheet\n            * \"bottom\": the bottom right of the calling range\n    \"\"\"\n\n    def __init__(self, size=None,  pos=(0, 0), origin:str=None):\n        self._shape = (size, pos, origin)\n\n    def write(self, fig:pyplot.Figure):\n        return insert_cell_image(lambda filename: fig.savefig(filename, format=\"png\"), *self._shape)\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/pandas.py",
    "content": "try:\n    import pandas as pd\n    from dateutil import tz\n\nexcept ImportError:\n    from ._core import XLOIL_READTHEDOCS\n    if XLOIL_READTHEDOCS:\n        class pd:\n            class DataFrame:\n                # Placeholder for pandas.DataFrame\n                ...\n\n            class Timestamp:\n                # Placeholder for pandas.Timestamp\n                ...\n\n\nfrom xloil import converter, to_datetime, ExcelArray, CannotConvert\nimport numpy as np\nfrom collections.abc import Iterable\n\n@converter(pd.DataFrame, register=True)\nclass PDFrame:\n    \"\"\"\n    Converts beteeen data tables with horizontal records and *pandas* DataFrames.\n\n    **PDFrame(element, headings, index)**\n\n    Examples\n    --------\n\n    ::\n\n        @xlo.func\n        def array1(x: xlo.PDFrame):\n            pass\n\n        @xlo.func\n        def array2(y: xlo.PDFrame(headings=True)):\n            pass\n\n        @xlo.func\n        def array3(z: xlo.PDFrame(index='Index')):\n            pass\n            \n    \n    Parameters\n    ----------\n \n    headings: bool / int\n        When reading: if True, interprets the first row as column headings, if\n        an int inprets the first *N* rows as a *MultiIndex* heading,\n        When writing: if True, outputs column headings\n\n    index: bool / index-spec\n        When reading: specifies column(s) which should be treated as the index: \n        xloil calls `DataFrame.set_index(<index>)`, so a column name or list-like\n        of columns names can be given\n        When writing: if explicitly set to False, the index is not output. Any\n        other value causes the index to be output\n\n    dates: list\n        When reading: attempt to convert the named columns from Excel serial \n        date numbers to numpy datetime.\n\n    cache_objects: bool (default False)\n        When writing, if False, any objects which cannot be convertered by a\n        known converter are converted to string via `str(x)`. This prevents a \n        large number of (possibly unhelpful) object refs being created.\n\n    timezone: str (default None)\n        Excel is timezone-naive, so timezone-aware dates must be converted to a\n        localised time.  This is done with tz_convert and this specified timezone.\n        If None, the local timezone is used.\n\n    dtype: type\n        Not currently implemented!\n\n    \"\"\"\n    def __init__(self, headings=True, index=None, cache_objects=False, \n                 dates=None, dtype=None, timezone=None):\n        # TODO: use element_type in the dataframe construction\n        self._element_type = dtype\n        self._headings = headings\n        self._index = index\n        self._cache_objects = cache_objects\n        self._parse_dates = dates\n        self._timezone = timezone if timezone is not None else tz.tzlocal()\n\n    def read(self, x):\n        # A converter should check if provided value is already of the correct type.\n        # This can happen as xlOil expands cache strings before calling user converters\n        if isinstance(x, pd.DataFrame):\n            return x\n\n        elif isinstance(x, ExcelArray):\n\n            n_headings = int(self._headings)\n            if x.nrows < n_headings:\n                raise ArgumentError(f\"Expected at least {n_headings} rows\")\n\n            data = {i: x[n_headings:, i].to_numpy(dims=1) for i in range(x.ncols)}\n            # This will do a copy.  The copy can be avoided by monkey\n            # patching pandas - see stackoverflow\n            df = pd.DataFrame(data, copy=False)\n\n            if n_headings == 1:\n                headings = x[0,:].to_numpy(dims=1)\n                df.columns = headings\n\n            elif n_headings > 1:\n                headings = x[:n_headings,:].to_numpy(dims=2)\n                df.columns = pd.MultiIndex.from_arrays(headings)\n\n            if self._parse_dates is not None:\n                for col in self._parse_dates:\n                    if col in df:\n                        df[col] = to_datetime(df[col].to_numpy().ravel())\n\n            if self._index is not None:\n                df.set_index(self._index, inplace=True)\n\n            return df\n        \n        raise CannotConvert(f\"Unsupported type: {type(x)!r}\")\n\n    def _convert_timezone(self, x: pd.Series):\n       return x.dt.tz_convert(tz=self._timezone).dt.tz_localize(None).to_numpy()\n\n    def write(self, frame: pd.DataFrame):\n\n        if not isinstance(frame, pd.DataFrame):\n            #TODO: converting to frame is not the most efficient option\n            if isinstance(frame, pd.Series):\n                frame = frame.to_frame()\n            else:\n                return frame\n\n        import xloil_core\n        from pandas.api.types import is_datetime64tz_dtype\n\n        columns = [\n            col.to_numpy() if not is_datetime64tz_dtype(col) else self._convert_timezone(col)\n            for _, col in frame.items()\n            ]\n\n        # If outputting the index, we prepare an array for each index level\n        if self._index is not False:\n            index = [\n                frame.index.get_level_values(i).to_numpy()\n                for i in range(frame.index.nlevels)\n                ]\n        else:\n            index = None\n\n        # If outputting the columns, we prepare an array for each column level\n        if self._headings:\n            headings = [\n                frame.columns.get_level_values(i).to_numpy()\n                for i in range(frame.columns.nlevels)\n                ]\n        else:\n            headings = None\n\n        # The index names may be a list of tuple (if index was created from a multi column \n        # index dataframe) or strings or None if no name was given.  We form this into an \n        # array of size column_levels x index_levels\n        index_names = np.empty((frame.columns.nlevels, frame.index.nlevels), dtype=object)\n        for j, name in enumerate(frame.index.names):\n            if isinstance(name, Iterable) and len(name) <= index_names.shape[0]:\n                for i, x in enumerate(name):\n                    index_names[i, j] = x\n            elif name is not None:\n                index_names[0, j] = name\n            \n        return xloil_core._table_converter(\n            frame.shape[1], \n            frame.shape[0],\n            columns=columns,\n            index=index,\n            index_name=index_names.ravel(),\n            headings=headings,\n            cache_objects=self._cache_objects)\n\n\n@converter(target=pd.Timestamp, register=True)\nclass PandasTimestamp:\n    \"\"\"\n        There is no need to use this class directly in annotations, rather \n        use ``pandas.Timestamp``\n    \"\"\"\n\n    def read(self, val):\n        return pd.Timestamp(to_datetime(val))\n\n    def write(self, val):\n        return val.to_pydatetime()\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/pillow.py",
    "content": "from PIL import Image\nimport xloil as xlo\n\n@xlo.returner(target=Image.Image, register=True)\nclass ReturnImage:\n    \n    \"\"\"\n        Inserts an image associated with the calling cell. A second call\n        removes any image previously inserted by the same calling cell.\n\n        Parameters\n        ----------\n\n        size:  \n            * A tuple (width, height) in points. \n            * \"cell\" to fit to the caller size\n            * \"img\" or None to keep the original image size\n        pos:\n            A tuple (X, Y) in points. The origin is determined by the `origin` argument\n        origin:\n            * \"top\" or None: the top left of the calling range\n            * \"sheet\": the top left of the sheet\n            * \"bottom\": the bottom right of the calling range\n    \"\"\"\n    def __init__(self, size=None,  pos=(0, 0), origin:str=None):\n        self._shape = (size, pos, origin)\n\n    def write(self, val):\n        return xlo.insert_cell_image(lambda filename: val.save(filename, format=\"png\"), *self._shape)\n\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/register.py",
    "content": "import inspect\nimport functools\nfrom .type_converters import *\nfrom ._core import *\nfrom .logging import *\nfrom .func_inspect import Arg\nimport contextvars\nimport typing\n\nfrom xloil_core import (\n    _Read_object,\n    _Read_Cache,\n    _Return_Cache,\n    _FuncSpec,\n    _FuncArg,\n    _register_functions\n)\n\n_LANDMARK_TAG = \"_xloil_pending_funcs_\"\n\n# typing.List (no square brackets) is a _SpecialGenericAlias in Py 3.9, but this type \n# doesn't exist in 3.8\n_TYPING_GENERIC_CLASSES = (typing._SpecialGenericAlias, typing._GenericAlias) \\\n    if hasattr(typing, \"_SpecialGenericAlias\") else typing._GenericAlias\n\n\"\"\"\n    Tag used to mark modules which contain functions to register. It is added \n    by the xloil.func decorator to the module's __dict__ and contains a list\n    of functions\n\"\"\"\n\ndef _add_pending_funcs(module, objects):\n    pending = getattr(module, _LANDMARK_TAG, set())\n    pending.update(objects)\n    setattr(module, _LANDMARK_TAG, pending)\n \ndef arg_to_funcarg(arg: Arg) -> _FuncArg:\n\n    # Set the arg converters based on the typeof provided for \n    # each argument. If 'typeof' is a xloil typeconverter object\n    # it's passed through.  If it is a general python type, we\n    # attempt to create a suitable typeconverter\n    # Determine the internal C++ arg converter to run on the Excel values\n    # before they are passed to python.\n\n    flags = \"\"\n    arg_type = arg.typeof\n    converter = None\n    allow_range = False\n\n    if arg.kind == Arg.KEYWORD_ARGS:\n        flags = \"keywords\"\n        return _FuncArg(arg.name, arg.help, None, \"keywords\")\n\n    # FastArray is handled separately as converters/defaults are not used \n    if arg_type is FastArray:\n        flags = \"array\"\n        if arg.has_default:\n            log.warn(f\"Defaults not supported for FastArray parameter {arg.name}\")\n        return _FuncArg(arg.name, arg.help, None, \"array\")\n\n    if arg_type is ExcelValue:\n        # ExcelValue is just the explicit generic type\n        converter = _Read_object()\n    \n    elif arg_type is AllowRange:\n        converter = _Read_object()\n        allow_range = True\n\n    # Prior to Py 3.9, type annotions for builtins looked like typing.List[int]\n    # We resolve this to the base type. \n    # TODO: user-defined converters for these types won't get called\n    elif isinstance(arg_type, _TYPING_GENERIC_CLASSES):\n        type_name = arg_type._name.lower()\n        converter = get_converter(type_name)\n\n    elif not isinstance(arg_type, type):\n        converter = _Read_object()\n\n    else:\n        converter = get_converter(arg_type.__name__)\n\n        # xloil_core.Range is special: the only core class in typing annotations\n        if arg_type is Range:\n            allow_range = True\n            \n        # If internal converter was found, nothing more to do\n        if converter is not None:\n            pass\n        # A designated xloil @converter type contains the internal converter\n        elif unpack_arg_converter(arg_type) is not None:\n            converter, allow_range = unpack_arg_converter(arg_type)\n        # Attempt to find a registered user-converter, otherwise assume the object\n        # should be read from the cache \n        else:\n            converter = arg_converters.get_converter(arg_type)\n            if converter is None:\n                converter = _Read_Cache()\n\n    if allow_range:\n        flags = \"range\"\n \n    if arg.kind == Arg.VARIABLE_ARGS:\n        flags += \",vargs\"\n\n    result = _FuncArg(arg.name, arg.help, converter, flags)\n    if arg.has_default:\n        result.default = arg.default\n\n    log.debug(f\"Interpreted arg '{arg}' => '{result}'\")\n\n    return result\n\n\ndef find_return_converter(ret_type: type):\n    \"\"\"\n    Get an xloil_core return converter for a given type.\n    \"\"\"\n    if not isinstance(ret_type, type):\n        return None\n\n    ret_con = unpack_return_converter(ret_type)\n    if ret_con is None:\n        # TODO: can we chain this with 'or' maybe?\n        ret_con = return_converters.create_returner(ret_type)\n\n        if ret_con is None:\n            ret_con = get_converter(ret_type.__name__, read=False)\n\n        if ret_con is None:\n            ret_con = get_converter(\"object\", read=False)\n\n    return ret_con\n\n# This is a thread-local variable to get Caller to behave like a static\n# but work properly on different threads and when used in an async funcion\n# where normally xlfCaller is not available.\n_async_caller = contextvars.ContextVar('async_caller')\n\nclass Caller:\n    \"\"\"\n    Captures the caller information for a worksheet function. On construction\n    the class queries Excel via the xlfCaller function.\n    \"\"\"\n    @property\n    def sheet(self):\n        \"\"\"\n        Gives the sheet name of the caller or None if not called from a sheet.\n        \"\"\"\n        pass\n    @property\n    def workbook(self):\n        \"\"\"\n        Gives the workbook name of the caller or None if not called from a sheet.\n        If the workbook has been saved, the name will contain a file extension.\n        \"\"\"\n        pass\n    def address(self, a1style=False):\n        \"\"\"\n        Gives the sheet address either in A1 form: 'Sheet!A1' or RC form: 'Sheet!R1C1'\n        \"\"\"\n        pass\n\n    def __new__(self, *args, **kwargs):\n        global _async_caller\n        override = _async_caller.get(None)\n        return override or xloil_core.Caller(*args, **kwargs)\n    \n\ndef async_wrapper(fn):\n    \"\"\"\n    Wraps an async function or generator with a function which runs that generator on the thread's\n    event loop. The wrapped function requires an 'xloil_thread_context' argument which provides a \n    callback object to return a result. xlOil will pass this object automatically to functions \n    declared async.\n\n    This function is used by the `func` decorator and generally should not be invoked\n    directly.\n    \"\"\"\n    import asyncio\n    import traceback\n    @functools.wraps(fn)\n    def synchronised(xloil_thread_context, *args, **kwargs):\n\n        ctx = xloil_thread_context\n        is_async_generator = inspect.isasyncgenfunction(fn)\n        \n        async def run_async():\n            _async_caller.set(ctx.caller)\n            try:\n                if is_async_generator:\n                    async for result in fn(*args, **kwargs):\n                        ctx.set_result(result)\n                else:\n                    result = await fn(*args, **kwargs)\n                    ctx.set_result(result)\n\n            except (asyncio.CancelledError, StopAsyncIteration):\n                ctx.set_done()\n                raise\n            except Exception as e:\n                ctx.set_result(str(e) + \": \" + traceback.format_exc())\n                \n            ctx.set_done()\n            \n        ctx.set_task(asyncio.run_coroutine_threadsafe(run_async(), ctx.loop))\n\n    return synchronised\n\nclass _WorksheetFunc:\n    \"\"\"\n    Decorator class for functions declared using `func`. The class contains \n    the descriptions of the Excel function to be registered\n    \"\"\"\n    def __init__(self, func, spec):\n        self.__wrapped__ = func\n        self._xloil_spec = spec\n        self.__doc__     = spec.help\n        self.__name__    = spec.name\n    def __call__(self, *args, **kwargs):\n        return self.__wrapped__(*args, **kwargs)\n\n\ndef func(fn=None, \n         name=None, \n         help=\"\", \n         args=None,\n         group=\"\", \n         local=None,\n         rtd=None,\n         macro=True, \n         command=False,\n         threaded=False,\n         volatile=False,\n         is_async=False,\n         register=True,\n         errors=None):\n    \"\"\" \n    Decorator which tells xlOil to register the function (or callable) in Excel. \n    If arguments are annotated using 'typing' annotations, xlOil will attempt to \n    convert values received from Excel to the specfied type, raising an exception \n    if this is not possible. The currently available types are\n\n    * **int**\n    * **float**\n    * **str**: Note this disables cache lookup\n    * **bool**\n    * **numpy arrays**: see Array\n    * **CellError**: Excel has various error types such as #NUM!, #N/A!, etc.\n    * **None**: if the argument points to an empty cell\n    * **cached objects**\n    * **datetime.date**\n    * **datetime.datetime**\n    * **dict / kwargs**: this converter expects a two column array of key/value\n      pairs\n    * **arg list / *args**\n\n    If no annotations are specified, xlOil will pass a type from the first \n    eight above types based on the value provided from Excel.\n\n    If a parameter default is given in the function signature, that parameter \n    becomes optional in the declared Excel function.\n\n    If keyword args (`**kwargs`) are specified, xlOil expects a two-column \n    array of (string, value) to be passed. For variable args (`*args`) xlOil\n    adds a large number of trailing optional arguments. The variable argument \n    list is ended by the first missing argument.  If both *kwargs* and *args* \n    are specified, their order is reversed in the Excel function declaration.\n\n    Parameters\n    ----------\n\n    fn: function or Callable:\n        Automatically passed when `func` is used as a decorator\n    name: str\n        Overrides the funtion name registered with Excel otherwise the function's \n        declared name is used.\n    help: str\n        Overrides the help shown in the function wizard otherwise the function's \n        doc-string is used. The wizard cannot display strings longer than 255 chars.\n        Longer help string can be retrieved with `xloHelp`\n    args: dict\n        A dictionary with key names matching function arguments and values specifying\n        information for that argument. The information can be a string, which is \n        interpreted as the help to display in the function wizard or it can be an\n        `xloil.Arg` object which can contain defaults, help and type information. \n    group: str\n        Specifes a category of functions in Excel's function wizard under which\n        this function should be placed.\n    local: bool\n        Functions in a workbook-linked module, e.g. Book1.py, default to \n        workbook-level scope (i.e. not usable outside that workbook) itself. You \n        can override this behaviour with this parameter. It has no effect outside \n        workbook-linked modules.\n    macro: bool\n        If True, registers the function as *Macro Sheet Type*. This grants the \n        function extra priveledges, such as the ability to see un-calced cells  \n        and call Excel.Application functions. This is not the same as a 'VBA Macro' \n        which is a *command*.  *Threaded* functions cannot be declared as macro type.\n    command: bool\n        If True, registers this as a *Command*.  Commands are run outside the \n        calculation cycle on Excel's main thread, have full permissions on the Excel\n        object model and do not return a value. They correspond to VBA's 'Macros' or\n        'Subroutines'.  Unless declared *local*,  XLL commands are hidden and \n        not displayed in dialog boxes for running macros, although their names \n        can be entered anywhere a valid command name is required.  Commands cannot\n        currently be run async since their primary use is writing to the workbook\n        which requires running on Excel's main thread.\n    rtd: bool\n        Determines whether a function declared as async uses native or RTD async.\n        Only RTD functions are calculated in the background in Excel, native async\n        functions will be stopped if calculation is interrupted. Default is True.\n    threaded: bool\n        Declares the function as safe for multi-threaded calculation. The\n        function must be careful when accessing global objects.  Since python\n        (at least CPython) is single-threaded there is no direct performance\n        benefit from enabling this. However, if you make frequent calls to\n        C-based libraries like numpy or pandas you make be able to realise\n        speed gains.\n    volatile: bool\n        Tells Excel to recalculate this function on every calc cycle: the same\n        behaviour as the NOW() and INDIRECT() built-ins.  Due to the performance \n        hit this brings, it is rare that you will need to use this attribute.\n    is_async: bool\n        If true, manually creates an async function. This means your function\n        must take a thread context as its first argument and start its own async\n        task similar to ``xloil.async_wrapper``.  Generally this parameter should\n        not be used and async functions declared using the normal `async def` syntax.\n    errors: str ['propagate', 'accept', '']\n        When *errors* is set to 'propagate', if any function argument is an error \n        code (#N/A!, #NUM!, etc.), that error code is given as the function's return\n        value, otherwise all argument values are handled by the function. Error\n        propagation is consistent with how Excel built-in functions handle errors, \n        it improves performance in the presence of error codes and it allow's Excel's \n        error tracing of function.\n        \n        If *errors* is set to an empty string (the default), the ini file setting \n        'ErrorPropagation' determines the behaviour.  If *errors* is 'accept', error\n        values are passed to the function regardless of the ini file setting.\n    \"\"\"\n\n    def decorate(fn):\n\n        try:\n            func_args, return_type = Arg.full_argspec(fn)\n\n            # For async/rtd functions, the target function passed to the FuncSpec \n            # should not be the 'fn' argument to this decorator. We also wrap threaded\n            # functions if the debugpy debugger is present\n            target_func = fn\n            is_coroutine = inspect.iscoroutinefunction(fn)\n            is_asyncgen = inspect.isasyncgenfunction(fn)\n\n            # Coroutines need to be \"synchronised\" using an async/rtd return object.\n            # Manual async functions need their arguments shuffled as the first one\n            # is the async return.\n            if is_coroutine or is_asyncgen:\n                target_func = async_wrapper(target_func)\n            elif is_async:\n                func_args = func_args[1:]\n            elif threaded:\n                from .debug import _debugpy_activate_thread_decorator\n                target_func = _debugpy_activate_thread_decorator(fn)\n\n            # Determine the 'features' string based on our bool flags\n            features = []\n            local_allowed = True\n\n            if threaded:\n                features.append(\"threaded\")\n                local_allowed = False\n\n            if (is_async or is_coroutine or is_asyncgen):\n                # RTD-async is default unless rtd=False was explicitly specified.\n                if rtd == False:\n                    features.append(\"async\")\n                    local_allowed = False\n                else:\n                    features.append(\"rtd\")\n\n            if command: \n                features.append(\"command\")\n\n            if return_type is FastArray:\n                if any(features):\n                    raise ValueError(f\"FastArray not compatible with {','.join(features)}\")\n                features.append('fastarray')\n                \n            elif macro and not any(features):\n                features.append(\"macro\")\n\n            if local == True and not local_allowed:\n                raise ValueError(f\"'threaded' or 'async' functions cannot be 'local'\")\n\n            # is_local defaults to true unless overridden - the parameter is ignored if \n            # a workbook is not linked to the declaring module\n            is_local = True if local is None else local\n\n            # Optional overrides of function arg information that we read by reflection\n\n            func_args = Arg.override_arglist(func_args, args)\n            core_argspec = [arg_to_funcarg(arg) for arg in func_args]\n\n            propagation = 1 if errors == \"propagate\" else -1 if errors == \"accept\" else 0\n\n            spec = _FuncSpec(\n                func = target_func,\n                args = core_argspec,\n                name = name if name else fn.__name__,\n                features = ','.join(features),\n                help = help if help else (fn.__doc__ if fn.__doc__ else \"\"),\n                category = group if group else \"\",\n                volatile = volatile,\n                local = is_local,\n                errors=propagation)\n\n            if return_type is not None and return_type is not FastArray:\n                spec.return_converter = find_return_converter(return_type)\n\n            # If we are decorating a class, we assume we want to call the class\n            # ctor and return the new object as a cache reference, rather than \n            # trying to convert to Excel values\n            elif inspect.isclass(fn):\n                spec.return_converter = _Return_Cache()\n\n            log(f\"Declared excel func: {str(spec)}\", level=\"debug\")\n  \n            if register: # and inspect.isfunction(fn):\n                _add_pending_funcs(inspect.getmodule(fn), [spec])\n\n            return _WorksheetFunc(fn, spec)\n\n        except Exception as e:\n            fn_name = getattr(fn, \"__name__\", str(fn))\n            log_except(f\"Failed determing spec for '{fn_name}'\")\n            return fn\n\n    return decorate if fn is None else decorate(fn)\n\n   \ndef _clear_pending_registrations(module):\n    \"\"\"\n    Called by the xloil reload hook to start afresh with function registrations\n    \"\"\"\n    if hasattr(module, _LANDMARK_TAG):\n        delattr(module, _LANDMARK_TAG)\n\n\nimport threading\n_scan_module_mutex = threading.Lock()\n\ndef scan_module(module, addin=None):\n    \"\"\"\n        Parses a specified module to look for functions with with the \n        `xloil.func` decorator and register them. Rather than call this\n        manually, it is easer to import xloil.importer which registers a \n        hook on the import function.\n    \"\"\"\n\n    # Enabling this log line generates a large amount of unhelpful output\n    # log.trace(f\"Scanning module {module}\")\n\n    # We quickly discard modules which do not contain xloil declarations \n    pending_funcs = getattr(module, _LANDMARK_TAG, None) \n    if pending_funcs is None or not any(pending_funcs):\n        return 0\n\n    with _scan_module_mutex:\n        # Check the pending funcs haven't been processed by another thread then copy \n        # and clear. Other threads can enter this function triggered by Excel's events\n        if not any(pending_funcs):\n            return 0\n        func_list = list(pending_funcs)\n        pending_funcs.clear()\n\n        log.debug(\"Found %d xloil functions in %s\", len(func_list), module)\n\n        if addin is None:\n            from .importer import source_addin\n            addin = source_addin()\n\n        _register_functions(func_list, module, addin, append=False)\n\n        return len(func_list)\n\n\ndef register_functions(funcs, module=None, append=True):\n    \"\"\"\n        Registers the provided callables and associates them with the given \n        module\n\n        Parameters\n        ----------\n\n        funcs: iterable\n            An iterable of `_WorksheetFunc` (a callable decorated with `func`), \n            callables or `_FuncSpec`.  A callable is registered by using `func`\n            with the default settings. Passing one of the other two allows control \n            over the registration such as changing the function or argument names.\n        module: python module\n            A python module which contains the source of the functions (it does \n            not have to equal the module calling this function). If this module is \n            edited it is automatically reloaded and the functions re-registered.\n            Passing None disables this behaviour.\n        append: bool\n            Whether to append to or overwrite any existing functions associated \n            with the module\n    \"\"\"\n\n    # Check if we have a _FuncSpec, else call the decorator to get one \n    def to_spec(f):\n        if isinstance(f, _FuncSpec):\n            return f\n        elif isinstance(f, _WorksheetFunc):\n            return f._xloil_spec\n        else:\n            return func(f, register=False)._xloil_spec\n\n    to_register = [to_spec(f) for f in funcs]\n\n    # We don't know if the module is in the process of loading. Since scan_module will\n    # overwrite all existing functions, we both register now and add to the pending list \n    # Registering the same function twice is optimised by xlOil to avoid overhead\n    # TODO: check we are called from exec_module for the matching module object\n    if module:\n        _add_pending_funcs(module, to_register)\n\n    from .importer import source_addin\n    addin = source_addin()\n\n    _register_functions(to_register, module, addin, append)\n\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/rtd.py",
    "content": "import xloil as xlo\n\nclass RtdSimplePublisher(xlo.RtdPublisher):\n    \"\"\"\n    Implements the boiler-plate involved in an RtdPublisher for the vanilla case.\n    Just need to implement an exception-safe async run_task which collects the data\n    and publishes it to the RtdServer.\n    \"\"\"\n\n    def __init__(self, topic):\n        # Must call this ctor explicitly or pybind will crash\n        super().__init__()  \n        self._topic = topic\n        self._task = None\n    \n    async def run_task(topic):\n        ...\n\n    def connect(self, num_subscribers):\n        if self.done():\n            self._task = xlo.get_event_loop().create_task(run_task(self._topic))\n                \n    def disconnect(self, num_subscribers):\n        if num_subscribers == 0:\n            self.stop()\n            return True  # Schedules the publisher for destruction\n                \n    def stop(self):\n        if self._task is not None: \n            self._task.cancel()\n        \n    def done(self):\n        return self._task is None or self._task.done()\n            \n    def topic(self):\n        return self._topic\n\n\ndef subscribe(server:xlo.RtdServer, topic:str, coro):\n    \"\"\"\n    Subscribes to `topic` on the given RtdServer, starting the publishing\n    task `coro` if no publisher for `topic` is currently running.\n\n    `coro` must be a coroutine and the string `topic` must be derived from\n    the function's arguments in a way which uniquely identifies the data to \n    be published \n    \"\"\"\n    if server.peek(topic) is None:\n        from .register import async_wrapper, find_return_converter\n        from .func_inspect import Arg\n\n        func_args, return_type = Arg.full_argspec(coro)\n        if any(func_args):\n            raise ValueError(\"Cororoutine should have zero args\")\n\n        return_converter = find_return_converter(return_type)\n\n        wrapped = async_wrapper(coro)\n\n        server.start_task(topic, wrapped, return_converter)\n\n    return server.subscribe(topic)  "
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/stubs/__init__.py",
    "content": ""
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/stubs/xloil_core/__init__.py",
    "content": "\"\"\"\n        The Python plugin for xlOil primarily allows creation of Excel functions and macros \n        backed by Python code. In addition it offers full control over GUI objects and an \n        interface for Excel automation: driving the application in code.\n\n        See the documentation at https://xloil.readthedocs.io\n      \"\"\"\nfrom __future__ import annotations\nimport typing\n\n__all__ = [\n    \"Addin\",\n    \"Address\",\n    \"Application\",\n    \"Caller\",\n    \"CannotConvert\",\n    \"CellError\",\n    \"ComBusyError\",\n    \"ExcelArray\",\n    \"ExcelGUI\",\n    \"ExcelState\",\n    \"ExcelWindow\",\n    \"ExcelWindows\",\n    \"IPyFromExcel\",\n    \"IPyToExcel\",\n    \"ObjectCache\",\n    \"Range\",\n    \"RibbonControl\",\n    \"RtdPublisher\",\n    \"RtdReturn\",\n    \"RtdServer\",\n    \"SpecialCells\",\n    \"StatusBar\",\n    \"TaskPaneFrame\",\n    \"Workbook\",\n    \"Workbooks\",\n    \"Worksheet\",\n    \"Worksheets\",\n    \"active_cell\",\n    \"active_workbook\",\n    \"active_worksheet\",\n    \"all_workbooks\",\n    \"app\",\n    \"cache\",\n    \"call\",\n    \"call_async\",\n    \"check_abort\",\n    \"core_addin\",\n    \"date_formats\",\n    \"deregister_functions\",\n    \"event\",\n    \"excel_callback\",\n    \"excel_state\",\n    \"from_excel_date\",\n    \"get_async_loop\",\n    \"in_wizard\",\n    \"insert_cell_image\",\n    \"run\",\n    \"run_async\",\n    \"selection\",\n    \"to_datetime\",\n    \"xloil_addins\"\n]\n\n\nclass Addin():\n    def __repr__(self) -> str: ...\n    def __str__(self) -> str: ...\n    def functions(self) -> list[_FuncSpec]: \n        \"\"\"\n        Returns a list of all functions declared by this addin.\n        \"\"\"\n    def source_files(self) -> list[str]: ...\n    @property\n    def async_slice(self) -> int:\n        \"\"\"\n                      Sets/gets the time slice in milliseconds for which the asyncio event loop is allowed \n                      to run before being interrupted. The event loop holds the GIL while it is running, so\n                      making this interval too long could impact the performance of other python functions.\n                    \n\n        :type: int\n        \"\"\"\n    @async_slice.setter\n    def async_slice(self, arg1: int) -> None:\n        \"\"\"\n        Sets/gets the time slice in milliseconds for which the asyncio event loop is allowed \n        to run before being interrupted. The event loop holds the GIL while it is running, so\n        making this interval too long could impact the performance of other python functions.\n        \"\"\"\n    @property\n    def async_throttle(self) -> int:\n        \"\"\"\n                      Sets/gets the interval in milliseconds between switches to the asyncio event loop\n                      embedded in this addin. The event loop holds the GIL while it is running, so making\n                      this interval too short could impact the performance of other python functions.\n                    \n\n        :type: int\n        \"\"\"\n    @async_throttle.setter\n    def async_throttle(self, arg1: int) -> None:\n        \"\"\"\n        Sets/gets the interval in milliseconds between switches to the asyncio event loop\n        embedded in this addin. The event loop holds the GIL while it is running, so making\n        this interval too short could impact the performance of other python functions.\n        \"\"\"\n    @property\n    def event_loop(self) -> object:\n        \"\"\"\n                      The asyncio event loop used for background tasks by this addin\n                    \n\n        :type: object\n        \"\"\"\n    @property\n    def pathname(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def settings(self) -> object:\n        \"\"\"\n                      Gives access to the settings in the addin's ini file as nested dictionaries.\n                      These are the settings on load and do not allow for modifications made in the \n                      ribbon toolbar.\n                    \n\n        :type: object\n        \"\"\"\n    @property\n    def settings_file(self) -> str:\n        \"\"\"\n                      The full pathname of the settings ini file used by this addin\n                    \n\n        :type: str\n        \"\"\"\n    pass\nclass Address():\n    \"\"\"\n    Converts cell addresses between different formats. This class\n    only performs manipulation on the address strings, so it is fast\n    and does not need to run on the main thread. However, it does not\n    check the validity of the addresses. \n\n    Parameters\n    ----------\n\n    address: string|tuple\n      either an address string in A1 format e.g. \"D2:R2\" or RC format, \n      e.g. \"R5C3:R6C6\" or a tuple of ints `(row, col)` or \n      `(from_row, from_col, to_row, to_col)`.  A string address may be\n      absolute (contain dollars) and contain a workbook/sheet name, separated\n      by a pling (!).  A tuple follows python conventions so is zero-based.\n\n    sheet: [string]\n      optional sheet name in case it was not passed as part of the address\n    \"\"\"\n    def __call__(self, style: str = 'a1', local: bool = False) -> str: \n        \"\"\"\n        Writes the address to a string in the specified style.\n\n        Parameters\n        ----------\n        style: str\n          The address format: \"a1\" or \"rc\". To produce an absolute / fixed addresses\n          use \"$a$1\", \"$r$c\", \"$a1\", \"a$1\", etc. depending on whether you want\n          both row and column to be fixed.\n        local: bool\n          If True, omits sheet and workbook infomation.\n        \"\"\"\n    def __init__(self, address: object, sheet: object = None) -> None: ...\n    def __iter__(self) -> typing.Iterator[Address]: ...\n    def __str__(self) -> str: ...\n    @property\n    def a1(self) -> str:\n        \"\"\"\n        The address in A1 format\n\n        :type: str\n        \"\"\"\n    @property\n    def a1_fixed(self) -> str:\n        \"\"\"\n        The absolute address in A1 format (i.e. with $s)\n\n        :type: str\n        \"\"\"\n    @property\n    def from_col(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    @property\n    def from_row(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    @property\n    def rc(self) -> str:\n        \"\"\"\n        The address in RC format\n\n        :type: str\n        \"\"\"\n    @property\n    def rc_fixed(self) -> str:\n        \"\"\"\n        The absolute address in RC format (i.e. with $s)\n\n        :type: str\n        \"\"\"\n    @property\n    def sheet(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def to_col(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    @property\n    def to_row(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    @property\n    def tuple(self) -> tuple:\n        \"\"\"\n        :type: tuple\n        \"\"\"\n    pass\nclass Application():\n    \"\"\"\n    Manages a handle to the *Excel.Application* object. This object is the root \n    of Excel's COM interface and supports a wide range of operations.\n\n    In addition to the methods known to python, properties and methods of the \n    Application object can be resolved dynamically at runtime. The available methods\n    will be familiar to VBA programmers and are well documented by Microsoft, \n    see `Object Model Overview <https://docs.microsoft.com/en-us/visualstudio/vsto/excel-object-model-overview>`_\n\n    Note COM methods and properties are in UpperCamelCase, whereas python ones are \n    lower_case.\n\n    Examples\n    --------\n\n    To get the name of the active worksheet:\n\n    ::\n\n        return xlo.app().ActiveWorksheet.Name\n\n    See `Excel.Application <https://docs.microsoft.com/en-us/office/vba/api/excel.Application(object)>`_ \n    \"\"\"\n    def __enter__(self) -> object: ...\n    def __exit__(self, arg0: object, arg1: object, arg2: object) -> None: ...\n    def __getattr__(self, arg0: str) -> object: ...\n    def __init__(self, com: object = None, hwnd: object = None, workbook: object = None) -> None: \n        \"\"\"\n        Creates a new Excel Application if no arguments are specified. Gets a handle to \n        an existing COM Application object based on the arguments.\n\n        To get the parent Excel application if xlOil is embedded, used `xloil.app()`.\n\n        Parameters\n        ----------\n\n        com: \n          Gets a handle to the given com object with class Excel.Appliction (marshalled \n          by `comtypes` or `win32com`).\n        hwnd:\n          Tries to gets a handle to the Excel.Application with given main window handle.\n        workbook:\n          Tries to gets a handle to the Excel.Application which has the specified workbook\n          open.\n        \"\"\"\n    def __setattr__(self, arg0: object, arg1: object) -> None: ...\n    def calculate(self, full: bool = False, rebuild: bool = False) -> None: \n        \"\"\"\n        Calculates all open workbooks\n\n        Parameters\n        ----------\n        full:\n          Forces a full calculation of the data in all open workbooks\n        rebuild:\n          For all open workbooks, forces a full calculation of the data \n          and rebuilds the dependencies. (Implies `full`)\n        \"\"\"\n    def open(self, filepath: str, update_links: bool = True, read_only: bool = False, delimiter: object = None) -> Workbook: \n        \"\"\"\n        Opens a workbook given its full `filepath`.\n\n        Parameters\n        ----------\n\n        filepath: \n          path and filename of the target workbook\n        update_links: \n          if True, attempts to update links to external workbooks\n        read_only: \n          if True, opens the workbook in read-only mode\n        \"\"\"\n    def quit(self, silent: bool = True) -> None: \n        \"\"\"\n        Terminates the application. If `silent` is True, unsaved data\n        in workbooks is discarded, otherwise a prompt is displayed.\n        \"\"\"\n    def range(self, address: str) -> object: \n        \"\"\"\n        Create a range object from an external address such as \"[Book]Sheet!A1\"\n        \"\"\"\n    def run(self, func: str, *args) -> object: \n        \"\"\"\n        Calls VBA's `Application.Run` taking the function name and up to 30 arguments.\n        This can call any user-defined function or macro but not built-in functions.\n\n        The type and order of arguments expected depends on the function being called.\n        \"\"\"\n    def to_com(self, lib: str = '') -> object: \n        \"\"\"\n        Returns a managed COM object which can be used to invoke Excel's full \n        object model. For details of the available calls see the Microsoft \n        documentation on the Excel Object Model. The ``lib`` used to provide COM\n        support can be 'comtypes' or 'win32com'. If omitted, the default is \n        'win32com', unless specified in the XLL's ini file.\n        \"\"\"\n    @property\n    def active_cell(self) -> object:\n        \"\"\"\n                      Returns the currently active cell as a Range or None.\n                  \n\n        :type: object\n        \"\"\"\n    @property\n    def active_workbook(self) -> object:\n        \"\"\"\n                      Returns the currently active workbook or None.\n                  \n\n        :type: object\n        \"\"\"\n    @property\n    def active_worksheet(self) -> object:\n        \"\"\"\n                      Returns the currently active worksheet or None.\n                  \n\n        :type: object\n        \"\"\"\n    @property\n    def enable_events(self) -> bool:\n        \"\"\"\n                    Pauses or resumes Excel's event handling. It can be useful when writing to a sheet\n                    to pause events both for performance and to prevent side effects.\n                  \n\n        :type: bool\n        \"\"\"\n    @enable_events.setter\n    def enable_events(self, arg1: bool) -> None:\n        \"\"\"\n        Pauses or resumes Excel's event handling. It can be useful when writing to a sheet\n        to pause events both for performance and to prevent side effects.\n        \"\"\"\n    @property\n    def has_dynamic_arrays(self) -> bool:\n        \"\"\"\n        :type: bool\n        \"\"\"\n    @property\n    def selection(self) -> object:\n        \"\"\"\n                      Returns the currently active cell as a Range or None.\n                  \n\n        :type: object\n        \"\"\"\n    @property\n    def visible(self) -> bool:\n        \"\"\"\n                    Determines whether the Excel window is visble on the desktop\n                  \n\n        :type: bool\n        \"\"\"\n    @visible.setter\n    def visible(self, arg1: bool) -> None:\n        \"\"\"\n        Determines whether the Excel window is visble on the desktop\n        \"\"\"\n    @property\n    def windows(self) -> ExcelWindows:\n        \"\"\"\n        A collection of all Windows open in this Application\n\n        :type: ExcelWindows\n        \"\"\"\n    @property\n    def workbook_paths(self) -> None:\n        \"\"\"\n        A set of the full path names of all workbooks open in this Application. Does not use COM interface.\n\n        :type: None\n        \"\"\"\n    @property\n    def workbooks(self) -> Workbooks:\n        \"\"\"\n        A collection of all Workbooks open in this Application\n\n        :type: Workbooks\n        \"\"\"\n    pass\nclass Caller():\n    \"\"\"\n    Captures the caller information for a worksheet function. On construction\n    the class queries Excel via the `xlfCaller` function to determine the \n    calling cell or range. If the function was not called from a sheet (e.g. \n    via a macro), most of the methods return `None`.\n    \"\"\"\n    def __init__(self) -> None: ...\n    def __str__(self, arg0: str, arg1: bool) -> str: ...\n    def address(self, style: str = 'a1', local: bool = False) -> str: \n        \"\"\"\n        Writes the address to a string in the specified style.\n\n        Parameters\n        ----------\n        style: str\n          The address format: \"a1\" or \"rc\". To produce an absolute / fixed addresses\n          use \"$a$1\", \"$r$c\", \"$a1\", \"a$1\", etc. depending on whether you want\n          both row and column to be fixed.\n        local: bool\n          If True, omits sheet and workbook infomation.\n        \"\"\"\n    @property\n    def range(self) -> object:\n        \"\"\"\n        Range object corresponding to caller address.  Will raise an exception if caller is not a range\n\n        :type: object\n        \"\"\"\n    @property\n    def sheet_name(self) -> object:\n        \"\"\"\n        Gives the sheet name of the caller or None if not called from a sheet.\n\n        :type: object\n        \"\"\"\n    @property\n    def workbook(self) -> object:\n        \"\"\"\n                    Gives the workbook name of the caller or None if not called from a sheet.\n                    If the workbook has been saved, the name will contain a file extension.\n                  \n\n        :type: object\n        \"\"\"\n    pass\nclass CannotConvert(Exception, BaseException):\n    \"\"\"\n    Should be thrown by a converter when it is unable to handle the \n    provided type.  In a return converter it may not indicate a fatal \n    condition, as xlOil will fallback to another converter.\n    \"\"\"\n    pass\nclass CellError():\n    \"\"\"\n                  Enum-type class which represents an Excel error condition of the \n                  form `#N/A!`, `#NAME!`, etc passed as a function argument. If a \n                  registered function argument does not explicitly specify a type \n                  (e.g. int or str via an annotation), it may be passed a *CellError*, \n                  which it can handle based on the error type.\n\n                  The integer value of a *CellError* corresponds to it's VBA/COM error\n                  number, so for example we can write \n                  `if cell.Value2 == CellError.NA.value: ...`\n                \n\n    Members:\n\n      NULL\n\n      DIV\n\n      VALUE\n\n      REF\n\n      NAME\n\n      NUM\n\n      NA\n\n      GETTING_DATA\n    \"\"\"\n    def __eq__(self, other: object) -> bool: ...\n    def __getstate__(self) -> int: ...\n    def __hash__(self) -> int: ...\n    def __index__(self) -> int: ...\n    def __init__(self, value: int) -> None: ...\n    def __int__(self) -> int: ...\n    def __ne__(self, other: object) -> bool: ...\n    def __repr__(self) -> str: ...\n    def __str__(self) -> str: ...\n    @property\n    def name(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def value(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    DIV: xloil_core.CellError=None # value = <CellError.DIV: -2146826281>\n    GETTING_DATA: xloil_core.CellError=None # value = <CellError.GETTING_DATA: -2146826245>\n    NA: xloil_core.CellError=None # value = <CellError.NA: -2146826246>\n    NAME: xloil_core.CellError=None # value = <CellError.NAME: -2146826259>\n    NULL: xloil_core.CellError=None # value = <CellError.NULL: -2146826288>\n    NUM: xloil_core.CellError=None # value = <CellError.NUM: -2146826252>\n    REF: xloil_core.CellError=None # value = <CellError.REF: -2146826265>\n    VALUE: xloil_core.CellError=None # value = <CellError.VALUE: -2146826273>\n    __members__: dict=None # value = {'NULL': <CellError.NULL: -2146826288>, 'DIV': <CellError.DIV: -2146826281>, 'VALUE': <CellError.VALUE: -2146826273>, 'REF': <CellError.REF: -2146826265>, 'NAME': <CellError.NAME: -2146826259>, 'NUM': <CellError.NUM: -2146826252>, 'NA': <CellError.NA: -2146826246>, 'GETTING_DATA': <CellError.GETTING_DATA: -2146826245>}\n    pass\nclass ComBusyError(Exception, BaseException):\n    pass\nclass ExcelArray():\n    \"\"\"\n    A view of a internal Excel array which can be manipulated without\n    copying the underlying data. It's not a general purpose array class \n    but rather used to create efficiencies in type converters.\n\n    It can be accessed and sliced using the usual syntax (the slice step must be 1):\n\n    ::\n\n        x[1, 1] # The value at 1,1 as int, str, float, etc.\n\n        x[1, :] # The second row as another ExcelArray\n\n        x[:-1, :-1] # A sub-array omitting the last row and column\n    \"\"\"\n    def __getitem__(self, arg0: tuple) -> object: \n        \"\"\"\n        Given a 2-tuple, slices the array to return a sub ExcelArray or a single element.\n        \"\"\"\n    def slice(self, from_row: int, from_col: int, to_row: int, to_col: int) -> ExcelArray: \n        \"\"\"\n        Slices the array \n        \"\"\"\n    def to_numpy(self, dtype: typing.Optional[int] = None, dims: typing.Optional[int] = 2) -> object: \n        \"\"\"\n        Converts the array to a numpy array. If *dtype* is None, xlOil attempts \n        to determine the correct numpy dtype. It raises an exception if values\n        cannot be converted to a specified *dtype*. The array dimension *dims* \n        can be 1 or 2 (default is 2).\n        \"\"\"\n    @property\n    def dims(self) -> int:\n        \"\"\"\n        Property which gives the dimension of the array: 1 or 2\n\n        :type: int\n        \"\"\"\n    @property\n    def ncols(self) -> int:\n        \"\"\"\n        Returns the number of columns in the array\n\n        :type: int\n        \"\"\"\n    @property\n    def nrows(self) -> int:\n        \"\"\"\n        Returns the number of rows in the array\n\n        :type: int\n        \"\"\"\n    @property\n    def shape(self) -> tuple:\n        \"\"\"\n        Returns a tuple (nrows, ncols) like numpy's array.shape\n\n        :type: tuple\n        \"\"\"\n    pass\nclass ExcelGUI():\n    \"\"\"\n    An `ExcelGUI` wraps a COM addin which allows Ribbon customisation and creation\n    of custom task panes. \n\n    The methods of this object are safe to call from any thread; however, since COM calls \n    must be made on Excel's main thread, the methods schedule  those calls and return an \n    *awaitable* future to the result. This could lead to deadlocks if, for example, the \n    future's result is requested synchronously and one of Excel's event handlers is \n    triggered.  For a safer non-blocking approach, use `excel_callback` to invoke code \n    which manipulates the *ExcelGUI* object.\n\n    The object's properties do not return futures and are thread-safe.\n    \"\"\"\n    def __init__(self, name: object = None, ribbon: object = None, funcmap: object = None, connect: bool = True) -> None: \n        \"\"\"\n        Creates an `ExcelGUI` using the specified ribbon customisation XML\n        and optionally connects it to Excel, ready for use.\n\n        When the *ExcelGUI* object is deleted, it unloads the associated COM \n        add-in and so all Ribbon customisation and attached task panes.\n\n        Parameters\n        ----------\n\n        ribbon: str\n            A Ribbon XML string, most easily created with a specialised editor.\n            The XML format is documented on Microsoft's website\n\n        funcmap: Func[str -> callable] or Dict[str, callabe]\n            The ``funcmap`` mapper links callbacks named in the Ribbon XML to\n            python functions. It can be either a dictionary containing named \n            functions or any callable which returns a function given a string.\n            Each return handler should take a single ``RibbonControl``\n            argument which describes the control which raised the callback.\n\n            Callbacks declared async will be executed in the addin's event loop. \n            Other callbacks are executed in Excel's main thread. Async callbacks \n            cannot return values.\n\n        name: str\n            The addin name which will appear in Excel's COM addin list.\n            If None, uses the filename at the call site as the addin name.\n\n        connect: bool\n            If True (the default) initiates a connection request for the addin, \n            which causes Excel to load it and any associated ribbons. The connection\n            is *scheduled* in Excel's main thread when the COM interface is available.\n            Note that COM is not available when xlOil is starting up.\n\n            If you want to call other methods on *ExcelGUI* then to ensure it is \n            connected use `ExcelGUI.connect().result()` to block on the future or\n            use `excel_callback`.\n        \"\"\"\n    def _create_task_pane_frame(self, name: str, progid: object = None, window: object = None) -> _CTPFuture: \n        \"\"\"\n        Used internally to create a custom task pane window which can be populated\n        with a python GUI.  Most users should use `attach_pane(...)` instead.\n\n        A COM `progid` can be specified, but this will prevent displaying a python GUI\n        in the task pane using the xlOil methods. This is a specialised use case.\n        \"\"\"\n    def activate(self, id: str) -> _Future: \n        \"\"\"\n        Activatives the ribbon tab with the specified id.  Returns False if\n        there is no Ribbon or the Ribbon is collapsed.\n        \"\"\"\n    def attach_pane(self, arg0: object, arg1: object, arg2: object, arg3: object, arg4: object) -> object: \n        \"\"\"\n        Given task pane contents (which can be specified in several forms) this function\n        creates a new task pane displaying those contents.\n\n        Returns the instance of `CustomTaskPane`.  If one was passed as the 'pane' argument, \n        that is returned, if a *QWidget* was passed, a `QtThreadTaskPane` is created.\n\n        Parameters\n        ----------\n\n        pane: CustomTaskPane (or QWidget type)\n            Can be an instance of `CustomTaskPane`, a type deriving from `QWidget` or\n            an instance of a `QWidget`. If a QWidget instance is passed, it must have \n            been created on the Qt thread.\n\n        name: \n            The task pane name. Will be displayed above the task pane. If not provided,\n            the 'name' attribute of the task pane is used.\n\n        window: \n            A window title or `xloil.ExcelWindow` object to which the task pane should be\n            attached.  If None, the active window is used.\n\n        size:\n            If provided, a tuple (width, height) used to set the initial pane size\n\n        visible:\n            Determines the initial pane visibility. Defaults to True.\n        \"\"\"\n    def attach_pane_async(self, pane: object, name: object = None, window: object = None, size: object = None, visible: object = True) -> object: \n        \"\"\"\n        Behaves as per `attach_pane`, but returns an *asyncio* coroutine. The\n        `pane` argument may be an awaitable to a `CustomTaskPane`.\n        \"\"\"\n    def connect(self) -> _Future: \n        \"\"\"\n        Connects the underlying COM addin to Excel, No other methods may be called \n        on a `ExcelGUI` object until it has been connected.\n\n        This method is safe to call on an already-connected addin.\n        \"\"\"\n    def create_task_pane(self, name: object, creator: object, window: object = None, size: object = None, visible: object = True) -> object: \n        \"\"\"\n        Deprecated: use `attach_pane`. Note that `create_task_pane` tries to `find_task_pane`\n        before creation whereas `attach_pane` does not.\n        \"\"\"\n    def disconnect(self) -> _Future: \n        \"\"\"\n        Unloads the underlying COM add-in and any ribbon customisation.  Avoid using\n        connect/disconnect to modify the Ribbon as it is not perfomant. Rather hide/show\n        controls with `invalidate` and the vibility callback.\n        \"\"\"\n    def invalidate(self, id: str = '') -> _Future: \n        \"\"\"\n        Invalidates the specified control: this clears the cache of responses\n        to callbacks associated with the control. For example, this can be\n        used to hide a control by forcing its getVisible callback to be invoked,\n        rather than using the cached value.\n\n        If no control ID is specified, all controls are invalidated.\n        \"\"\"\n    @property\n    def connected(self) -> bool:\n        \"\"\"\n        True if the a connection to Excel has been made\n\n        :type: bool\n        \"\"\"\n    @property\n    def name(self) -> str:\n        \"\"\"\n        The name displayed in Excel's COM Addins window\n\n        :type: str\n        \"\"\"\n    pass\nclass ExcelState():\n    \"\"\"\n    Gives information about the Excel application. Cannot be constructed: call\n    ``xloil.excel_state`` to get an instance.\n    \"\"\"\n    @property\n    def hinstance(self) -> int:\n        \"\"\"\n        Excel Win32 HINSTANCE pointer as an int\n\n        :type: int\n        \"\"\"\n    @property\n    def hwnd(self) -> int:\n        \"\"\"\n        Excel Win32 main window handle as an int\n\n        :type: int\n        \"\"\"\n    @property\n    def main_thread_id(self) -> int:\n        \"\"\"\n        Excel main thread ID\n\n        :type: int\n        \"\"\"\n    @property\n    def version(self) -> int:\n        \"\"\"\n        Excel major version\n\n        :type: int\n        \"\"\"\n    pass\nclass ExcelWindow():\n    \"\"\"\n    A document window which displays a view of a workbook.\n    See `Excel.Window <https://docs.microsoft.com/en-us/office/vba/api/excel.WindowWindow>`_ \n    \"\"\"\n    def __getattr__(self, arg0: str) -> object: ...\n    def __setattr__(self, arg0: object, arg1: object) -> None: ...\n    def __str__(self) -> str: ...\n    def to_com(self, lib: str = '') -> object: \n        \"\"\"\n        Returns a managed COM object which can be used to invoke Excel's full \n        object model. For details of the available calls see the Microsoft \n        documentation on the Excel Object Model. The ``lib`` used to provide COM\n        support can be 'comtypes' or 'win32com'. If omitted, the default is \n        'win32com', unless specified in the XLL's ini file.\n        \"\"\"\n    @property\n    def app(self) -> Application:\n        \"\"\"\n                  Returns the parent `xloil.Application` object associated with this object.\n              \n\n        :type: Application\n        \"\"\"\n    @property\n    def hwnd(self) -> int:\n        \"\"\"\n        The Win32 API window handle as an integer\n\n        :type: int\n        \"\"\"\n    @property\n    def name(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def workbook(self) -> Workbook:\n        \"\"\"\n        The workbook being displayed by this window\n\n        :type: Workbook\n        \"\"\"\n    pass\nclass ExcelWindows():\n    \"\"\"\n    A collection of all the document window objects in Excel. A document window \n    shows a view of a Workbook.  The collection is iterable.\n\n    See `Excel.Windows <https://docs.microsoft.com/en-us/office/vba/api/excel.WindowsWindows>`_ \n    \"\"\"\n    def __contains__(self, arg0: str) -> bool: ...\n    def __getitem__(self, arg0: str) -> Worksheet: ...\n    def __iter__(self) -> typing.Iterator[Worksheet]: ...\n    def __len__(self) -> int: ...\n    def get(self, name: str, default: object = None) -> object: \n        \"\"\"\n        Tries to get the named object, returning the default if not found\n        \"\"\"\n    @property\n    def active(self) -> object:\n        \"\"\"\n                        Gives the active (as displayed in the GUI) object in the collection\n                        or None if no object has been activated.\n                      \n\n        :type: object\n        \"\"\"\n    pass\nclass IPyFromExcel():\n    def __call__(self, arg0: object) -> None: ...\n    def __str__(self) -> str: ...\n    pass\nclass IPyToExcel():\n    def __call__(self, arg0: _object) -> _RawExcelValue: ...\n    def __str__(self) -> str: ...\n    pass\nclass ObjectCache():\n    \"\"\"\n    Provides a way to manipulate xlOil's Python object cache\n\n    Examples\n    --------\n\n    ::\n\n        @xlo.func\n        def myfunc(x):\n            return xlo.cache(MyObject(x)) # <-equivalent to cache.add(...)\n\n        @xlo.func\n        def myfunc2(array: xlo.Array(str), i):\n            return xlo.cache[array[i]]   # <-equivalent to cache.get(...)\n    \"\"\"\n    def __call__(self, obj: object, tag: str = '', key: str = '') -> object: \n        \"\"\"\n        Calls `add` method with provided arguments\n        \"\"\"\n    def __contains__(self, arg0: str) -> bool: ...\n    def __getitem__(self, arg0: str) -> object: ...\n    def add(self, obj: object, tag: str = '', key: str = '') -> object: \n        \"\"\"\n        Adds an object to the cache and returns a reference string.\n\n        xlOil automatically adds objects returned from worksheet \n        functions to the cache if they cannot be converted by any \n        registered converter.  So this function is useful to:\n\n           1) force a convertible object, such as an iterable, into the\n              cache\n           2) return a list of cached objects\n           3) create cached objects from outside of worksheet fnctions\n              e.g. in commands / subroutines\n\n        xlOil uses the caller infomation provided by Excel to construct\n        the cache string and manage the cache object lifecycle. When\n        invoked from a worksheet function, this caller info contains \n        the cell reference. xlOil deletes cache objects linked to the \n        cell reference from previous calculation cycles.\n\n        When invoked from a source other than a worksheet function (there\n        are several possibilies, see the help for `xlfCaller`), xlOil\n        again generates a reference string based on the caller info. \n        However, this may not be unique.  In addition, objects with the \n        same caller string will replace those created during a previous \n        calculation cycle. For example, creating cache objects from a button\n        clicked repeatedly will behave differently if Excel recalculates \n        in between the clicks. To override this behaviour, the exact cache\n        `key` can be specified.  For example, use Python's `id` function or\n        the cell address being written to if a command is writing a cache\n        string to the sheet.  When `key` is specified the user is responsible\n        for managing the lifecycle of their cache objects.\n\n\n        Parameters\n        ----------\n\n        obj:\n          The object to cache.  Required.\n\n        tag: str\n          An optional string to append to the cache ref to make it more \n          'friendly'. When returning python objects from functions, \n          xlOil uses the object's type name as a tag\n\n        key: str\n          If specified, use the exact cache key (after prepending by\n          cache uniquifier). The user is responsible for ensuring \n          uniqueness of the cache key.\n        \"\"\"\n    def contains(self, ref: str) -> bool: \n        \"\"\"\n        Returns True if the given reference string links to a valid object\n        \"\"\"\n    def get(self, ref: str, default: object = None) -> object: \n        \"\"\"\n        Fetches an object from the cache given a reference string.\n        Returns `default` if not found\n        \"\"\"\n    def keys(self) -> list: \n        \"\"\"\n        Returns all cache keys as a list of strings\n        \"\"\"\n    def remove(self, ref: str) -> bool: \n        \"\"\"\n        xlOil manages the lifecycle for most cache objects, so this  \n        function should only be called when `add` was invoked with a\n        specified key - in this case the user owns the lifecycle \n        management. \n        \"\"\"\n    pass\nclass Range():\n    \"\"\"\n    Represents a cell, a row, a column or a selection of cells containing a contiguous \n    blocks of cells. (Non contiguous ranges are not currently supported).\n    This class allows direct access to an area on a worksheet. It uses similar \n    syntax to Excel's Range object, supporting the ``cell`` and ``range`` functions,  \n    however indices are zero-based as per python's standard.\n\n    A Range can be accessed and sliced using the usual syntax (the slice step must be 1):\n\n    ::\n\n        x[1, 1] # The *value* at (1, 1) as a python type: int, str, float, etc.\n\n        x[1, :] # The second row as another Range object\n\n        x[:-1, :-1] # A sub-range omitting the last row and column\n\n    Ranges support the iterator protocol with iteration over the individual cells.\n    Iteration takes place column-wise then row-wise within each range area:\n\n    ::\n        \n        for cell in my_range.special_cells(\"constants\", float):\n          cell.value += 1\n\n    See `Excel.Range <https://docs.microsoft.com/en-us/office/vba/api/excel.Range(object)>`_ \n    \"\"\"\n    def __getattr__(self, arg0: str) -> object: ...\n    def __getitem__(self, arg0: object) -> object: \n        \"\"\"\n        Given a 2-tuple, slices the range to return a sub Range or a single element.Uses\n        normal python slicing conventions i.e. [left included, right excluded), negative\n        numbers are offset from the end. If the tuple specifies a single cell, returns\n        the value in that cell, otherwise returns a Range object.\n        \"\"\"\n    def __iadd__(self, arg0: object) -> object: ...\n    def __imul__(self, arg0: object) -> object: ...\n    def __init__(self, address: str) -> None: ...\n    def __isub__(self, arg0: object) -> object: ...\n    def __iter__(self) -> typing.Iterator[Range]: ...\n    def __itruediv__(self, arg0: object) -> object: ...\n    def __len__(self) -> int: ...\n    def __setattr__(self, arg0: object, arg1: object) -> None: ...\n    def __str__(self) -> str: ...\n    def address(self, style: str = 'a1', local: bool = False) -> str: \n        \"\"\"\n        Writes the address to a string in the specified style, e.g. *[Book]SheetNm!A1:Z5*.\n\n        Parameters\n        ----------\n        style: str\n          The address format: \"a1\" or \"rc\". To produce an absolute / fixed addresses\n          use \"$a$1\", \"$r$c\", \"$a1\", \"a$1\", etc. depending on whether you want\n          both row and column to be fixed.\n        local: bool\n          If True, omits sheet and workbook infomation.\n        \"\"\"\n    def cell(self, row: int, col: int) -> Range: \n        \"\"\"\n        Returns a Range object which consists of a single cell. The indices are zero-based \n        from the top left of the parent range.\n        \"\"\"\n    def clear(self) -> None: \n        \"\"\"\n        Clears all values and formatting.  Any cell in the range will then have Empty type.\n        \"\"\"\n    def offset(self, from_row: int, from_col: int, num_rows: object = None, num_cols: object = None) -> Range: \n        \"\"\"\n        Similar to the *range* function, but with different defaults  \n\n        Parameters\n        ----------\n\n        from_row: int\n            Starting row offset from the top left of the parent range. Zero-based, can be negative\n\n        from_col: int\n            Starting row offset from the top left of the parent range. Zero-based, can be negative\n\n        num_rows: int\n            Number of rows in output range. Defaults to 1\n\n        num_cols: int\n            Number of columns in output range. Defaults to 1.\n        \"\"\"\n    def range(self, from_row: int = 0, from_col: int = 0, to_row: object = None, to_col: object = None, num_rows: object = None, num_cols: object = None) -> Range: \n        \"\"\"\n        Creates a subrange using offsets from the top left corner of the parent range.\n        Like Excel's Range function, we allow negative offsets to select ranges outside the\n        parent.\n\n        Parameters\n        ----------\n\n        from_row: int\n            Starting row offset from the top left of the parent range. Zero-based. Can be negative\n\n        from_col: int\n            Starting row offset from the top left of the parent range. Zero-based. Can be negative\n\n        to_row: int\n            End row offset from the top left of the parent range. This row will be *included* in \n            the range. The offset is zero-based and can be negative to select ranges outside the\n            parent range. Do not specify both `to_row` and `num_rows`.\n\n        to_col: int\n            End column offset from the top left of the parent range. This column will be *included*\n            in the range. The offset is zero-based and can be negative to select ranges outside \n            the parent range. Do not specify both `to_col` and `num_cols`.\n\n        num_rows: int\n            Number of rows in output range. Must be positive. If neither `num_rows` or `to_rows` \n            are specified, the range ends at the last row of the parent range.\n\n        num_cols: int\n            Number of columns in output range. Must be positive. If neither `num_cols` or `to_cols` \n            are specified, the range ends at the last column of the parent range.\n        \"\"\"\n    def set(self, arg0: object) -> None: \n        \"\"\"\n        Sets the data in the range to the provided value. If a single value is passed\n        all cells will be set to the value. If a 2d-array is provided, the array will be\n        pasted at the top-left of the range with the remainging cells being set to #N/A.\n        If a 1d array is provided it will be pasted at the top left and repeated down or\n        right depending on orientation.\n        \"\"\"\n    def set_formula(self, formula: object, how: str = '') -> None: \n        \"\"\"\n        The `how` parameter allows setting a range formula in a different way to setting its \n        `formula` property. It's unlikely you will need to use this functionality with modern\n        Excel sheets. \n\n          * *dynamic* (or omitted): identical to setting the `formula` property\n          * *array*: if the target range is larger than one cell and a single string is passed,\n            set this as an array formula for the range\n          * *implicit*: uses old-style implicit intersection - see \"Formula vs Formula2\" on MSDN\n        \"\"\"\n    def special_cells(self, kind: object, values: object) -> object: \n        \"\"\"\n        Returns a sub-range containg only cells of a specificed type or None if none \n        are found.  Behaves like VBA's `SpecialCells <https://learn.microsoft.com/en-us/office/vba/api/excel.range.specialcells>`_.\n        The returned range is likely to be a multi-area range, you can use the `xloil.range.areas`\n        property or a range iterator to step through the returned value.\n\n        Parameters\n        ----------\n\n        kind: xloil.SpecialCells | str\n          The kind of cells to return, a string value is convertered to the corresponding \n          enum value\n\n        values: Optional[type | str | Iterable[type|str]]\n          If `kind` is \"constants\" or \"formulas\", determine which types of cells to return.\n          If the argument is omitted, all constants or formulas will be returned\n          The argument can be one or an iterable of:\n            * \"errors\" or *xloil.CellError*\n            * \"numbers\" or *float*\n            * \"logical\" or *bool*\n            * \"text\" or *str*\n        \"\"\"\n    def to_com(self, lib: str = '') -> object: \n        \"\"\"\n        Returns a managed COM object which can be used to invoke Excel's full \n        object model. For details of the available calls see the Microsoft \n        documentation on the Excel Object Model. The ``lib`` used to provide COM\n        support can be 'comtypes' or 'win32com'. If omitted, the default is \n        'win32com', unless specified in the XLL's ini file.\n        \"\"\"\n    def trim(self) -> Range: \n        \"\"\"\n        Returns a sub-range by trimming to the last non-empty (i.e. not Nil, #N/A or \"\") \n        row and column. The top-left remains the same so the function always returns\n        at least a single cell, even if it's empty.  \n        \"\"\"\n    @property\n    def areas(self) -> object:\n        \"\"\"\n                    For a rectangular range, the property returns a 1-element list containing the range itself.\n                    For a multiple-area range, the property returns a list of the contigous/rectangular sub-ranges.\n                  \n\n        :type: object\n        \"\"\"\n    @property\n    def bounds(self) -> tuple[int, int, int, int]:\n        \"\"\"\n                    Returns a zero-based tuple (top-left-row, top-left-col, bottom-right-row, bottom-right-col)\n                    which defines the Range area (currently only rectangular ranges are supported).\n                  \n\n        :type: tuple[int, int, int, int]\n        \"\"\"\n    @property\n    def column(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    @property\n    def formula(self) -> object:\n        \"\"\"\n                    Get / sets the formula for the range. If the cell contains a constant, this property returns \n                    the value. If the cell is empty, this property returns an empty string. If the cell contains\n                    a formula, the property returns the formula that would be displayed in the formula bar as a\n                    string.  If the range is larger than one cell, the property returns an array of the values  \n                    which would be obtained calling `formula` on each cell.\n                    \n                    When setting, if the range is larger than one cell and a single value is passed that value\n                    is filled into each cell. Alternatively, you can set the formula to an array of the same \n                    dimensions.\n                  \n\n        :type: object\n        \"\"\"\n    @formula.setter\n    def formula(self, arg1: object) -> None:\n        \"\"\"\n        Get / sets the formula for the range. If the cell contains a constant, this property returns \n        the value. If the cell is empty, this property returns an empty string. If the cell contains\n        a formula, the property returns the formula that would be displayed in the formula bar as a\n        string.  If the range is larger than one cell, the property returns an array of the values  \n        which would be obtained calling `formula` on each cell.\n\n        When setting, if the range is larger than one cell and a single value is passed that value\n        is filled into each cell. Alternatively, you can set the formula to an array of the same \n        dimensions.\n        \"\"\"\n    @property\n    def has_formula(self) -> typing.Optional[bool]:\n        \"\"\"\n                  Returns True if every cell in the range contains a formula, False if no cell\n                  contains a formula and None otherwise.\n                  \n\n        :type: typing.Optional[bool]\n        \"\"\"\n    @property\n    def ncols(self) -> int:\n        \"\"\"\n        Returns the number of columns in the range\n\n        :type: int\n        \"\"\"\n    @property\n    def nrows(self) -> int:\n        \"\"\"\n        Returns the number of rows in the range\n\n        :type: int\n        \"\"\"\n    @property\n    def parent(self) -> Worksheet:\n        \"\"\"\n        Returns the parent Worksheet for this Range\n\n        :type: Worksheet\n        \"\"\"\n    @property\n    def row(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    @property\n    def shape(self) -> tuple[int, int]:\n        \"\"\"\n        Returns a tuple (num columns, num rows)\n\n        :type: tuple[int, int]\n        \"\"\"\n    @property\n    def value(self) -> object:\n        \"\"\"\n                    Property which gets or sets the value for a range. A fetched value is converted\n                    to the most appropriate Python type using the normal generic converter.\n\n                    If you use a horizontal array for the assignment, it is duplicated down to fill \n                    the entire rectangle. If you use a vertical array, it is duplicated right to fill \n                    the entire rectangle. If you use a rectangular array, and it is too small for the \n                    rectangular range you want to put it in, that range is padded with #N/As.\n                  \n\n        :type: object\n        \"\"\"\n    @value.setter\n    def value(self, arg1: object) -> None:\n        \"\"\"\n        Property which gets or sets the value for a range. A fetched value is converted\n        to the most appropriate Python type using the normal generic converter.\n\n        If you use a horizontal array for the assignment, it is duplicated down to fill \n        the entire rectangle. If you use a vertical array, it is duplicated right to fill \n        the entire rectangle. If you use a rectangular array, and it is too small for the \n        rectangular range you want to put it in, that range is padded with #N/As.\n        \"\"\"\n    pass\nclass RibbonControl():\n    \"\"\"\n    This object is passed to ribbon callback handlers to indicate which control  \n    raised the callback.\n    \"\"\"\n    @property\n    def id(self) -> str:\n        \"\"\"\n        A string that represents the Id attribute for the control or custom menu item\n\n        :type: str\n        \"\"\"\n    @property\n    def tag(self) -> str:\n        \"\"\"\n        A string that represents the Tag attribute for the control or custom menu item.\n\n        :type: str\n        \"\"\"\n    pass\nclass RtdPublisher():\n    \"\"\"\n    RTD servers use a publisher/subscriber model with the 'topic' as the key\n    The publisher class is linked to a single topic string.\n\n    Typically the publisher will do nothing on construction, but when it detects\n    a subscriber using the connect() method, it creates a background publishing task\n    When disconnect() indicates there are no subscribers, it cancels this task with\n    a call to stop()\n\n    If the task is slow to return or spin up, it could be started the constructor  \n    and kept it running permanently, regardless of subscribers.\n\n    The publisher should call RtdServer.publish() to push values to subscribers.\n    \"\"\"\n    def __init__(self) -> None: \n        \"\"\"\n        This __init__ method must be called explicitly by subclasses or pybind\n        will fatally crash Excel.\n        \"\"\"\n    def connect(self, num_subscribers: int) -> None: \n        \"\"\"\n        Called by the RtdServer when a sheet function subscribes to this \n        topic. Typically a topic will start up its publisher on the first\n        subscriber, i.e. when num_subscribers == 1\n        \"\"\"\n    def disconnect(self, num_subscribers: int) -> bool: \n        \"\"\"\n        Called by the RtdServer when a sheet function disconnects from this \n        topic. This happens when the function arguments are changed the\n        function deleted. Typically a topic will shutdown its publisher \n        when num_subscribers == 0.\n\n        Whilst the topic remains live, it may still receive new connection\n        requests, so generally avoid finalising in this method.\n        \"\"\"\n    def done(self) -> bool: \n        \"\"\"\n        Returns True if the topic can safely be deleted without leaking resources.\n        \"\"\"\n    def stop(self) -> None: \n        \"\"\"\n        Called by the RtdServer to indicate that a topic should shutdown\n        and dependent threads or tasks and finalise resource usage\n        \"\"\"\n    @property\n    def topic(self) -> str:\n        \"\"\"\n        Returns the name of the topic\n\n        :type: str\n        \"\"\"\n    pass\nclass RtdReturn():\n    def set_done(self) -> None: \n        \"\"\"\n        Indicates that the task has completed and the RtdReturn can drop its reference\n        to the task. Further calls to `set_result()` will be ignored.\n        \"\"\"\n    def set_result(self, arg0: object) -> None: ...\n    def set_task(self, task: object) -> None: \n        \"\"\"\n        Set the task object to keep it alive until the task indicates it is done. The\n        task object should respond to the `cancel()` method.\n        \"\"\"\n    @property\n    def caller(self) -> Caller:\n        \"\"\"\n        :type: Caller\n        \"\"\"\n    @property\n    def loop(self) -> object:\n        \"\"\"\n        :type: object\n        \"\"\"\n    pass\nclass RtdServer():\n    \"\"\"\n    An RtdServer allows asynchronous interaction with Excel by posting update\n    notifications which cause Excel to recalcate certain cells.  The python \n    RtdServer object manages an RTD COM server with each new RtdServer creating\n    an underlying COM server. The RtdServer works on a publisher/subscriber\n    model with topics identified by a string. \n\n    A topic publisher is registered using start(). Subsequent calls to subscribe()\n    will connect this topic and tell Excel that the current calling cell should be\n    recalculated when a new value is published.\n\n    RTD sits outside of Excel's normal calc cycle: publishers can publish new values \n    at any time, triggering a re-calc of any cells containing subscribers. Note the\n    re-calc will only happen 'live' if Excel's caclulation mode is set to automatic\n    \"\"\"\n    def __init__(self) -> None: ...\n    def drop(self, arg0: str) -> None: \n        \"\"\"\n        Drops the producer for a topic by calling `RtdPublisher.stop()`, then waits\n        for it to complete and publishes #N/A to all subscribers.\n        \"\"\"\n    def peek(self, topic: str) -> object: \n        \"\"\"\n        Looks up a value for a specified topic, but does not subscribe.\n        If there is no active publisher for the topic, it returns None.\n        If there is no published value, it will return CellError.NA.\n\n        Re-raises exceptions which have been published to the topic.\n\n        This function does not use any Excel API and is safe to call at\n        any time on any thread.\n        \"\"\"\n    def publish(self, topic: str, value: object) -> bool: \n        \"\"\"\n        Publishes a new value for the specified topic and updates all subscribers.\n        This function can be called even if no RtdPublisher has been started.\n\n        This function does not use any Excel API and is safe to call at any time\n        on any thread.\n\n        An Exception object can be passed at the value, this will trigger the debugging\n        hook if it is set. The exception object will be published.\n        \"\"\"\n    def start(self, topic: RtdPublisher) -> None: \n        \"\"\"\n        Registers an RtdPublisher with this manager. The RtdPublisher receives\n        notification when the number of subscribers changes\n        \"\"\"\n    def start_task(self, topic: str, func: object, converter: IPyToExcel = None) -> None: \n        \"\"\"\n        Launch a publishing task for a `topic` given a func and a return converter.\n        The function should take a single `xloil.RtdReturn` argument.\n        \"\"\"\n    def subscribe(self, topic: str) -> object: \n        \"\"\"\n        Subscribes to the specified topic. If no publisher for the topic currently \n        exists, it returns None, but the subscription is held open and will connect\n        to a publisher created later. If there is no published value, it will return \n        CellError.NA.  \n\n        Re-raises exceptions which have been published to the topic.\n\n        This calls Excel's RTD function, which means the calling cell will be\n        recalculated every time a new value is published.\n\n        Calling this function outside of a worksheet function called by Excel may\n        produce undesired results and possibly crash Excel.\n        \"\"\"\n    @property\n    def progid(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    pass\nclass SpecialCells():\n    \"\"\"\n    Members:\n\n      blanks : Empty cells\n\n      constants : Cells containing constants\n\n      formulas : Cells containing formulas\n\n      last_cell : The last cell in the used range\n\n      comments : Cells containing notes\n\n      visible : All visible cells\n\n      all_format : Cells of any format\n\n      same_format : Cells having the same format\n\n      all_validation : Cells having validation criteria\n\n      same_validation : Cells having the same validation criteria\n    \"\"\"\n    def __eq__(self, other: object) -> bool: ...\n    def __getstate__(self) -> int: ...\n    def __hash__(self) -> int: ...\n    def __index__(self) -> int: ...\n    def __init__(self, value: int) -> None: ...\n    def __int__(self) -> int: ...\n    def __ne__(self, other: object) -> bool: ...\n    def __repr__(self) -> str: ...\n    def __str__(self) -> str: ...\n    @property\n    def name(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def value(self) -> int:\n        \"\"\"\n        :type: int\n        \"\"\"\n    __members__: dict=None # value = {'blanks': <SpecialCells.blanks: 4>, 'constants': <SpecialCells.constants: 2>, 'formulas': <SpecialCells.formulas: -4123>, 'last_cell': <SpecialCells.last_cell: 11>, 'comments': <SpecialCells.comments: -4144>, 'visible': <SpecialCells.visible: 12>, 'all_format': <SpecialCells.all_format: -4172>, 'same_format': <SpecialCells.same_format: -4173>, 'all_validation': <SpecialCells.all_validation: -4174>, 'same_validation': <SpecialCells.same_validation: -4175>}\n    all_format: xloil_core.SpecialCells=None # value = <SpecialCells.all_format: -4172>\n    all_validation: xloil_core.SpecialCells=None # value = <SpecialCells.all_validation: -4174>\n    blanks: xloil_core.SpecialCells=None # value = <SpecialCells.blanks: 4>\n    comments: xloil_core.SpecialCells=None # value = <SpecialCells.comments: -4144>\n    constants: xloil_core.SpecialCells=None # value = <SpecialCells.constants: 2>\n    formulas: xloil_core.SpecialCells=None # value = <SpecialCells.formulas: -4123>\n    last_cell: xloil_core.SpecialCells=None # value = <SpecialCells.last_cell: 11>\n    same_format: xloil_core.SpecialCells=None # value = <SpecialCells.same_format: -4173>\n    same_validation: xloil_core.SpecialCells=None # value = <SpecialCells.same_validation: -4175>\n    visible: xloil_core.SpecialCells=None # value = <SpecialCells.visible: 12>\n    pass\nclass StatusBar():\n    \"\"\"\n     \n    Displays status bar messages and clears the status bar (after an optional delay) \n    on context exit.\n\n    Examples\n    --------\n\n    ::\n\n      with StatusBar(1000) as status:\n        status.msg('Doing slow thing')\n        ...\n        status.msg('Done slow thing')\n    \"\"\"\n    def __enter__(self) -> object: ...\n    def __exit__(self, *args) -> None: ...\n    def __init__(self, timeout: int = 0) -> None: \n        \"\"\"\n        Constructs a StatusBar with a timeout specified in milliseconds.  After the \n        StatusBar context exits, any messages will be cleared after the timeout\n        \"\"\"\n    def msg(self, msg: str, timeout: int = 0) -> None: \n        \"\"\"\n        Posts a status bar message, and if `timeout` is non-zero, clears if after\n        the specified number of milliseconds\n        \"\"\"\n    pass\nclass TaskPaneFrame():\n    \"\"\"\n    Manages Excel's underlying custom task pane object into which a python GUI can be\n    drawn. It is unlikely that this object will need to be manipulated directly. Rather \n    use `xloil.gui.CustomTaskPane` which holds the python-side frame contents.\n\n    The methods of this object are safe to call from any thread. COM must be used on \n    Excel's main thread, so the methods all wrap their calls to ensure to this happens.\n    \"\"\"\n    def attach(self, handler: object, hwnd: int, as_parent: bool = True) -> _Future: \n        \"\"\"\n        Associates a `xloil.gui.CustomTaskPane` with this frame. Returns a future\n        with no result.\n        \"\"\"\n    def com_control(self, lib: str = '') -> object: \n        \"\"\"\n        Gets the base COM control of the task pane. The ``lib`` used to provide\n        COM support can be 'comtypes' or 'win32com' (default is win32com). This \n        method is only useful if a custom `progid` was specified during the task\n        pane creation.\n        \"\"\"\n    @property\n    def position(self) -> str:\n        \"\"\"\n                      Gets/sets the dock position, one of: bottom, floating, left, right, top\n                    \n\n        :type: str\n        \"\"\"\n    @position.setter\n    def position(self, arg1: str) -> None:\n        \"\"\"\n        Gets/sets the dock position, one of: bottom, floating, left, right, top\n        \"\"\"\n    @property\n    def size(self) -> tuple[int, int]:\n        \"\"\"\n        Gets/sets the task pane size as a tuple (width, height)\n\n        :type: tuple[int, int]\n        \"\"\"\n    @size.setter\n    def size(self, arg1: tuple) -> None:\n        \"\"\"\n        Gets/sets the task pane size as a tuple (width, height)\n        \"\"\"\n    @property\n    def title(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def visible(self) -> bool:\n        \"\"\"\n        Determines the visibility of the task pane\n\n        :type: bool\n        \"\"\"\n    @visible.setter\n    def visible(self, arg1: bool) -> None:\n        \"\"\"\n        Determines the visibility of the task pane\n        \"\"\"\n    @property\n    def window(self) -> ExcelWindow:\n        \"\"\"\n        Gives the window of the document window to which the frame is attached, can be used to uniquely identify the pane\n\n        :type: ExcelWindow\n        \"\"\"\n    pass\nclass Workbook():\n    \"\"\"\n    A handle to an open Excel workbook.\n    See `Excel.Workbook <https://docs.microsoft.com/en-us/office/vba/api/excel.WorkbookWorkbook>`_ \n    \"\"\"\n    def __enter__(self) -> object: ...\n    def __exit__(self, arg0: object, arg1: object, arg2: object) -> None: ...\n    def __getattr__(self, arg0: str) -> object: ...\n    def __getitem__(self, arg0: object) -> object: \n        \"\"\"\n        If the index is a worksheet name, returns the `Worksheet` object,\n        otherwise treats the string as a workbook address and returns a `Range`.\n        \"\"\"\n    def __setattr__(self, arg0: object, arg1: object) -> None: ...\n    def __str__(self) -> str: ...\n    def add(self, name: object = None, before: object = None, after: object = None) -> Worksheet: \n        \"\"\"\n        Add a worksheet, returning a `Worksheet` object.\n\n        Parameters\n        ----------\n        name: str\n          Names the worksheet, otherwise it will have an Excel-assigned name\n        before: Worksheet\n          Places the new worksheet immediately before this Worksheet object \n        after: Worksheet\n          Places the new worksheet immediately before this Worksheet object.\n          Specifying both `before` and `after` raises an exception.\n        \"\"\"\n    def close(self, save: bool = True) -> None: \n        \"\"\"\n        Closes the workbook. If there are changes to the workbook and the \n        workbook doesn't appear in any other open windows, the `save` argument\n        specifies whether changes should be saved. If set to True, changes are \n        saved to the workbook, if False they are discared.\n        \"\"\"\n    def range(self, address: str) -> object: \n        \"\"\"\n        Create a `Range` object from an address such as \"Sheet!A1\" or a named range\n        \"\"\"\n    def save(self, filepath: str = '') -> None: \n        \"\"\"\n        Saves the Workbook, either to the specified `filepath` or if this is\n        unspecified, to its original source file (an error is raised if the \n        workbook has never been saved).\n        \"\"\"\n    def to_com(self, lib: str = '') -> object: \n        \"\"\"\n        Returns a managed COM object which can be used to invoke Excel's full \n        object model. For details of the available calls see the Microsoft \n        documentation on the Excel Object Model. The ``lib`` used to provide COM\n        support can be 'comtypes' or 'win32com'. If omitted, the default is \n        'win32com', unless specified in the XLL's ini file.\n        \"\"\"\n    def worksheet(self, name: str) -> Worksheet: \n        \"\"\"\n        Returns the named worksheet which is part of this workbook (if it exists)\n        otherwise raises an exception.\n        \"\"\"\n    @property\n    def app(self) -> Application:\n        \"\"\"\n                  Returns the parent `xloil.Application` object associated with this object.\n              \n\n        :type: Application\n        \"\"\"\n    @property\n    def name(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def path(self) -> str:\n        \"\"\"\n        The full path to the workbook, including the filename\n\n        :type: str\n        \"\"\"\n    @property\n    def windows(self) -> ExcelWindows:\n        \"\"\"\n                    A collection object of all windows which are displaying this workbook\n                  \n\n        :type: ExcelWindows\n        \"\"\"\n    @property\n    def worksheets(self) -> Worksheets:\n        \"\"\"\n                    A collection object of all worksheets which are part of this workbook\n                  \n\n        :type: Worksheets\n        \"\"\"\n    pass\nclass Workbooks():\n    \"\"\"\n    A collection of all the Workbook objects that are currently open in the \n    Excel application.  The collection is iterable.\n\n    See `Excel.Workbooks <https://docs.microsoft.com/en-us/office/vba/api/excel.WorkbooksWorkbooks>`_ \n    \"\"\"\n    def __contains__(self, arg0: str) -> bool: ...\n    def __getitem__(self, arg0: str) -> Workbook: ...\n    def __iter__(self) -> typing.Iterator[Workbook]: ...\n    def __len__(self) -> int: ...\n    def add(self) -> Workbook: \n        \"\"\"\n        Creates and returns a new workbook with an Excel-assigned name\n        \"\"\"\n    def get(self, name: str, default: object = None) -> object: \n        \"\"\"\n        Tries to get the named object, returning the default if not found\n        \"\"\"\n    @property\n    def active(self) -> object:\n        \"\"\"\n                        Gives the active (as displayed in the GUI) object in the collection\n                        or None if no object has been activated.\n                      \n\n        :type: object\n        \"\"\"\n    pass\nclass Worksheet():\n    \"\"\"\n    Allows access to ranges and properties of a worksheet. It uses similar \n    syntax to Excel's Worksheet object, supporting the ``cell`` and ``range`` functions, \n    however indices are zero-based as per python's standard.\n\n    See `Excel.Worksheet <https://docs.microsoft.com/en-us/office/vba/api/excel.WorksheetWorksheet>`_ \n    \"\"\"\n    def __getattr__(self, arg0: str) -> object: ...\n    def __getitem__(self, arg0: object) -> object: \n        \"\"\"\n        If the argument is a string, returns the range specified by the local address, \n        equivalent to ``at``.  \n\n        If the argument is a 2-tuple, slices the sheet to return an xloil.Range.\n        Uses normal python slicing conventions, i.e [left included, right excluded), negative\n        numbers are offset from the end.\n        \"\"\"\n    def __setattr__(self, arg0: object, arg1: object) -> None: ...\n    def __setitem__(self, arg0: object, arg1: object) -> None: \n        \"\"\"\n        Slices a range as per __getitem__. If the value being set starts with a equals sign \n        (=), the range formula is set, otherwise the value is set.  To force setting the value\n        assign to `Range.value` instead.\n        \"\"\"\n    def __str__(self) -> str: ...\n    def activate(self) -> None: \n        \"\"\"\n        Makes this worksheet the active sheet\n        \"\"\"\n    def at(self, address: str) -> _ExcelRange: \n        \"\"\"\n        Returns the range specified by the local address, e.g. ``.at('B3:D6')``\n        \"\"\"\n    def calculate(self) -> None: \n        \"\"\"\n        Calculates this worksheet\n        \"\"\"\n    def cell(self, row: int, col: int) -> _ExcelRange: \n        \"\"\"\n        Returns a Range object which consists of a single cell. The indices are zero-based \n        from the top left of the parent range.\n        \"\"\"\n    def range(self, from_row: int = 0, from_col: int = 0, to_row: object = None, to_col: object = None, num_rows: object = None, num_cols: object = None) -> Range: \n        \"\"\"\n        Specifies a range in this worksheet.\n\n        Parameters\n        ----------\n\n        from_row: int\n            Starting row offset from the top left of the parent range. Zero-based.\n\n        from_col: int\n            Starting row offset from the top left of the parent range. Zero-based.\n\n        to_row: int\n            End row offset from the top left of the parent range. This row will be *included* in \n            the range. The offset is zero-based. Do not specify both `to_row` and `num_rows`.\n\n        to_col: int\n            End column offset from the top left of the parent range. This column will be *included*  \n            in the range. The offset is zero-based. Do not specify both `to_col` and `num_cols`.\n\n        num_rows: int\n            Number of rows in output range. Must be positive. If neither `num_rows` or `to_rows` \n            are specified, the range ends at the end of the sheet.\n\n        num_cols: int\n            Number of columns in output range. Must be positive. If neither `num_cols` or `to_cols` \n            are specified, the range ends at the end of the sheet.\n        \"\"\"\n    def to_com(self, lib: str = '') -> object: \n        \"\"\"\n        Returns a managed COM object which can be used to invoke Excel's full \n        object model. For details of the available calls see the Microsoft \n        documentation on the Excel Object Model. The ``lib`` used to provide COM\n        support can be 'comtypes' or 'win32com'. If omitted, the default is \n        'win32com', unless specified in the XLL's ini file.\n        \"\"\"\n    @property\n    def app(self) -> Application:\n        \"\"\"\n                  Returns the parent `xloil.Application` object associated with this object.\n              \n\n        :type: Application\n        \"\"\"\n    @property\n    def name(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def parent(self) -> Workbook:\n        \"\"\"\n        Returns the parent Workbook for this Worksheet\n\n        :type: Workbook\n        \"\"\"\n    @property\n    def used_range(self) -> _ExcelRange:\n        \"\"\"\n        Returns a Range object that represents the used range on the worksheet\n\n        :type: _ExcelRange\n        \"\"\"\n    pass\nclass Worksheets():\n    \"\"\"\n    A collection of all the Worksheet objects in the specified or active workbook. \n    The collection is iterable.\n\n    See `Excel.Worksheets <https://docs.microsoft.com/en-us/office/vba/api/excel.WorksheetsWorksheets>`_ \n    \"\"\"\n    def __contains__(self, arg0: str) -> bool: ...\n    def __getitem__(self, arg0: str) -> Worksheet: ...\n    def __iter__(self) -> typing.Iterator[Worksheet]: ...\n    def __len__(self) -> int: ...\n    def add(self, name: object = None, before: object = None, after: object = None) -> Worksheet: \n        \"\"\"\n        Add a worksheet, returning a `Worksheet` object.\n\n        Parameters\n        ----------\n        name: str\n          Names the worksheet, otherwise it will have an Excel-assigned name\n        before: Worksheet\n          Places the new worksheet immediately before this Worksheet object \n        after: Worksheet\n          Places the new worksheet immediately before this Worksheet object.\n          Specifying both `before` and `after` raises an exception.\n        \"\"\"\n    def get(self, name: str, default: object = None) -> object: \n        \"\"\"\n        Tries to get the named object, returning the default if not found\n        \"\"\"\n    @property\n    def active(self) -> object:\n        \"\"\"\n                        Gives the active (as displayed in the GUI) object in the collection\n                        or None if no object has been activated.\n                      \n\n        :type: object\n        \"\"\"\n    pass\nclass _AddinsDict():\n    \"\"\"\n    A dictionary of all addins using the xlOil_Python plugin keyed\n    by the addin pathname.\n    \"\"\"\n    def __contains__(self, arg0: str) -> bool: ...\n    def __getitem__(self, arg0: str) -> Addin: ...\n    def __iter__(self) -> typing.Iterator[str]: ...\n    def __len__(self) -> int: ...\n    def items(self) -> typing.Iterator[tuple[str, Addin]]: ...\n    def keys(self) -> typing.Iterator[str]: ...\n    def values(self) -> typing.Iterator[Addin]: ...\n    pass\nclass _AsyncReturn():\n    def set_done(self) -> None: ...\n    def set_result(self, arg0: object) -> None: ...\n    def set_task(self, arg0: object) -> None: ...\n    @property\n    def caller(self) -> Caller:\n        \"\"\"\n        :type: Caller\n        \"\"\"\n    @property\n    def loop(self) -> object:\n        \"\"\"\n        :type: object\n        \"\"\"\n    pass\nclass _CTPFuture():\n    \"\"\"\n    A Future represents an eventual result of an asynchronous operation.\n    Future is an awaitable object. Coroutines can await on Future objects \n    until they either have a result or an exception set. This Future cannot\n    be cancelled.\n\n    This class actually wraps a C++ future so does executes in a separate \n    thread unrelated to an `asyncio` event loop. \n    \"\"\"\n    def __await__(self) -> _CTPFutureIter: ...\n    def done(self) -> bool: \n        \"\"\"\n        Return True if the Future is done.  A Future is done if it has a result or an exception.\n        \"\"\"\n    def result(self) -> object: \n        \"\"\"\n        Return the result of the Future, blocking if the Future is not yet done.\n\n        If the Future has a result, its value is returned.\n\n        If the Future has an exception, raises the exception.\n        \"\"\"\n    pass\nclass _CTPFutureIter():\n    def __iter__(self) -> object: ...\n    def __next__(self) -> None: ...\n    pass\nclass _CustomConverter(IPyFromExcel):\n    \"\"\"\n    This is the interface class for custom type converters to allow them\n    to be called from the Core.\n    \"\"\"\n    def __init__(self, callable: object, check_cache: bool = True, name: str = 'custom') -> None: ...\n    pass\nclass _CustomReturn(IPyToExcel):\n    def __init__(self, callable: object, name: str = 'custom') -> None: ...\n    def invoke(self, arg0: object) -> object: ...\n    pass\nclass _CustomReturnConverter():\n    @property\n    def value(self) -> IPyToExcel:\n        \"\"\"\n        :type: IPyToExcel\n        \"\"\"\n    @value.setter\n    def value(self, arg0: IPyToExcel) -> None:\n        pass\n    pass\nclass _DateFormatList():\n    \"\"\"\n    Registers date time formats to try when parsing strings to dates.\n    See `std::get_time` for format syntax.\n    \"\"\"\n    def __bool__(self) -> bool: \n        \"\"\"\n        Check whether the list is nonempty\n        \"\"\"\n    def __contains__(self, x: str) -> bool: \n        \"\"\"\n        Return true the container contains ``x``\n        \"\"\"\n    @typing.overload\n    def __delitem__(self, arg0: int) -> None: \n        \"\"\"\n        Delete the list elements at index ``i``\n\n        Delete list elements using a slice object\n        \"\"\"\n    @typing.overload\n    def __delitem__(self, arg0: slice) -> None: ...\n    def __eq__(self, arg0: _DateFormatList) -> bool: ...\n    @typing.overload\n    def __getitem__(self, arg0: int) -> str: \n        \"\"\"\n        Retrieve list elements using a slice object\n        \"\"\"\n    @typing.overload\n    def __getitem__(self, s: slice) -> _DateFormatList: ...\n    @typing.overload\n    def __init__(self) -> None: \n        \"\"\"\n        Copy constructor\n        \"\"\"\n    @typing.overload\n    def __init__(self, arg0: _DateFormatList) -> None: ...\n    @typing.overload\n    def __init__(self, arg0: typing.Iterable) -> None: ...\n    def __iter__(self) -> typing.Iterator[str]: ...\n    def __len__(self) -> int: ...\n    def __ne__(self, arg0: _DateFormatList) -> bool: ...\n    @typing.overload\n    def __setitem__(self, arg0: int, arg1: str) -> None: \n        \"\"\"\n        Assign list elements using a slice object\n        \"\"\"\n    @typing.overload\n    def __setitem__(self, arg0: slice, arg1: _DateFormatList) -> None: ...\n    def append(self, x: str) -> None: \n        \"\"\"\n        Add an item to the end of the list\n        \"\"\"\n    def clear(self) -> None: \n        \"\"\"\n        Clear the contents\n        \"\"\"\n    def count(self, x: str) -> int: \n        \"\"\"\n        Return the number of times ``x`` appears in the list\n        \"\"\"\n    @typing.overload\n    def extend(self, L: _DateFormatList) -> None: \n        \"\"\"\n        Extend the list by appending all the items in the given list\n\n        Extend the list by appending all the items in the given list\n        \"\"\"\n    @typing.overload\n    def extend(self, L: typing.Iterable) -> None: ...\n    def insert(self, i: int, x: str) -> None: \n        \"\"\"\n        Insert an item at a given position.\n        \"\"\"\n    @typing.overload\n    def pop(self) -> str: \n        \"\"\"\n        Remove and return the last item\n\n        Remove and return the item at index ``i``\n        \"\"\"\n    @typing.overload\n    def pop(self, i: int) -> str: ...\n    def remove(self, x: str) -> None: \n        \"\"\"\n        Remove the first item from the list whose value is x. It is an error if there is no such item.\n        \"\"\"\n    __hash__ = None\n    pass\nclass _ExcelObjFuture():\n    \"\"\"\n    A Future represents an eventual result of an asynchronous operation.\n    Future is an awaitable object. Coroutines can await on Future objects \n    until they either have a result or an exception set. This Future cannot\n    be cancelled.\n\n    This class actually wraps a C++ future so does executes in a separate \n    thread unrelated to an `asyncio` event loop. \n    \"\"\"\n    def __await__(self) -> _ExcelObjFutureIter: ...\n    def done(self) -> bool: \n        \"\"\"\n        Return True if the Future is done.  A Future is done if it has a result or an exception.\n        \"\"\"\n    def result(self) -> object: \n        \"\"\"\n        Return the result of the Future, blocking if the Future is not yet done.\n\n        If the Future has a result, its value is returned.\n\n        If the Future has an exception, raises the exception.\n        \"\"\"\n    pass\nclass _ExcelObjFutureIter():\n    def __iter__(self) -> object: ...\n    def __next__(self) -> None: ...\n    pass\nclass _ExcelRange(Range):\n    pass\nclass _FuncArg():\n    def __init__(self, arg0: str, arg1: str, arg2: IPyFromExcel, arg3: str) -> None: ...\n    def __str__(self) -> str: ...\n    @property\n    def converter(self) -> IPyFromExcel:\n        \"\"\"\n        :type: IPyFromExcel\n        \"\"\"\n    @converter.setter\n    def converter(self, arg0: IPyFromExcel) -> None:\n        pass\n    @property\n    def default(self) -> object:\n        \"\"\"\n        :type: object\n        \"\"\"\n    @default.setter\n    def default(self, arg0: object) -> None:\n        pass\n    @property\n    def flags(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def help(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def name(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    pass\nclass _FuncSpec():\n    def __init__(self, func: typing.Callable, args: list[_FuncArg], name: str = '', features: str = None, help: str = '', category: str = '', local: bool = True, volatile: bool = False, errors: int = 0) -> None: ...\n    def __str__(self) -> str: ...\n    @property\n    def args(self) -> list[_FuncArg]:\n        \"\"\"\n        :type: list[_FuncArg]\n        \"\"\"\n    @property\n    def error_propagation(self) -> bool:\n        \"\"\"\n                      Used internally to control the error propagation setting\n                    \n\n        :type: bool\n        \"\"\"\n    @error_propagation.setter\n    def error_propagation(self, arg1: bool) -> None:\n        \"\"\"\n        Used internally to control the error propagation setting\n        \"\"\"\n    @property\n    def func(self) -> typing.Callable:\n        \"\"\"\n                      Yes you can change the function which is called by Excel! Use\n                      with caution.\n                    \n\n        :type: typing.Callable\n        \"\"\"\n    @func.setter\n    def func(self, arg1: typing.Callable) -> None:\n        \"\"\"\n        Yes you can change the function which is called by Excel! Use\n        with caution.\n        \"\"\"\n    @property\n    def help(self) -> str:\n        \"\"\"\n        :type: str\n        \"\"\"\n    @property\n    def is_async(self) -> bool:\n        \"\"\"\n                      True if the function used Excel's native async\n                    \n\n        :type: bool\n        \"\"\"\n    @property\n    def is_rtd(self) -> bool:\n        \"\"\"\n                      True if the function uses RTD to provide async returns\n                    \n\n        :type: bool\n        \"\"\"\n    @property\n    def is_threaded(self) -> bool:\n        \"\"\"\n                      True if the function can be multi-threaded during Excel calcs\n                    \n\n        :type: bool\n        \"\"\"\n    @property\n    def name(self) -> str:\n        \"\"\"\n                      Writing to name property doesn't make sense when registered\n                    \n\n        :type: str\n        \"\"\"\n    @name.setter\n    def name(self, arg1: str) -> None:\n        \"\"\"\n        Writing to name property doesn't make sense when registered\n        \"\"\"\n    @property\n    def return_converter(self) -> IPyToExcel:\n        \"\"\"\n        :type: IPyToExcel\n        \"\"\"\n    @return_converter.setter\n    def return_converter(self, arg1: IPyToExcel) -> None:\n        pass\n    pass\nclass _Future():\n    def __await__(self) -> _FutureIter: ...\n    def done(self) -> bool: ...\n    def result(self) -> object: ...\n    pass\nclass _FutureIter():\n    def __iter__(self) -> object: ...\n    def __next__(self) -> None: ...\n    pass\nclass _LogWriter():\n    \"\"\"\n    Writes a log message to xlOil's log.  The level parameter can be a level constant \n    from the `logging` module or one of the strings *error*, *warn*, *info*, *debug* or *trace*.\n\n    Only messages with a level higher than the xlOil log level which is initially set\n    to the value in the xlOil settings will be output to the log file. Trace output\n    can only be seen with a debug build of xlOil.\n    \"\"\"\n    def __call__(self, msg: object, *args, **kwargs) -> None: \n        \"\"\"\n        Writes a message to the log at the specifed keyword paramter `level`. The default \n        level is 'info'.  The message can contain format specifiers which are expanded\n        using any additional positional arguments. This allows for lazy contruction of the \n        log string like python's own 'logging' module.\n        \"\"\"\n    def __init__(self) -> None: \n        \"\"\"\n        Do not construct this class - a singleton instance is created by xlOil.\n        \"\"\"\n    def debug(self, msg: object, *args) -> None: \n        \"\"\"\n        Writes a log message at the 'debug' level\n        \"\"\"\n    def error(self, msg: object, *args) -> None: \n        \"\"\"\n        Writes a log message at the 'error' level\n        \"\"\"\n    def flush(self) -> None: \n        \"\"\"\n        Forces a log file 'flush', i.e write pending log messages to the log file.\n        For performance reasons the file is not by default flushed for every message.\n        \"\"\"\n    def info(self, msg: object, *args) -> None: \n        \"\"\"\n        Writes a log message at the 'info' level\n        \"\"\"\n    def trace(self, msg: object, *args) -> None: \n        \"\"\"\n        Writes a log message at the 'trace' level\n        \"\"\"\n    def warn(self, msg: object, *args) -> None: \n        \"\"\"\n        Writes a log message at the 'warn' level\n        \"\"\"\n    @property\n    def flush_on(self) -> str:\n        \"\"\"\n                      Returns or sets the log level which will trigger a 'flush', i.e a writing pending\n                      log messages to the log file.\n                    \n\n        :type: str\n        \"\"\"\n    @flush_on.setter\n    def flush_on(self, arg1: object) -> None:\n        \"\"\"\n        Returns or sets the log level which will trigger a 'flush', i.e a writing pending\n        log messages to the log file.\n        \"\"\"\n    @property\n    def level(self) -> str:\n        \"\"\"\n                      Returns or sets the current log level. The returned value will always be an \n                      integer corresponding to levels in the `logging` module.  The level can be\n                      set to an integer or one of the strings *error*, *warn*, *info*, *debug* or *trace*.\n                    \n\n        :type: str\n        \"\"\"\n    @level.setter\n    def level(self, arg1: object) -> None:\n        \"\"\"\n        Returns or sets the current log level. The returned value will always be an \n        integer corresponding to levels in the `logging` module.  The level can be\n        set to an integer or one of the strings *error*, *warn*, *info*, *debug* or *trace*.\n        \"\"\"\n    @property\n    def level_int(self) -> int:\n        \"\"\"\n                      Returns the log level as an integer corresponding to levels in the `logging` module.\n                      Useful if you want to condition some output based on being above a certain log\n                      level.\n                    \n\n        :type: int\n        \"\"\"\n    @property\n    def levels(self) -> list[str]:\n        \"\"\"\n        A list of the available log levels\n\n        :type: list[str]\n        \"\"\"\n    @property\n    def path(self) -> str:\n        \"\"\"\n        The full pathname of the log file\n\n        :type: str\n        \"\"\"\n    pass\nclass _PyObjectFuture():\n    \"\"\"\n    A Future represents an eventual result of an asynchronous operation.\n    Future is an awaitable object. Coroutines can await on Future objects \n    until they either have a result or an exception set. This Future cannot\n    be cancelled.\n\n    This class actually wraps a C++ future so does executes in a separate \n    thread unrelated to an `asyncio` event loop. \n    \"\"\"\n    def __await__(self) -> _PyObjectFutureIter: ...\n    def done(self) -> bool: \n        \"\"\"\n        Return True if the Future is done.  A Future is done if it has a result or an exception.\n        \"\"\"\n    def result(self) -> object: \n        \"\"\"\n        Return the result of the Future, blocking if the Future is not yet done.\n\n        If the Future has a result, its value is returned.\n\n        If the Future has an exception, raises the exception.\n        \"\"\"\n    pass\nclass _PyObjectFutureIter():\n    def __iter__(self) -> object: ...\n    def __next__(self) -> None: ...\n    pass\nclass _Read_Array_bool_1d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_bool_2d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_datetime_1d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_datetime_2d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_datetime_1d():\n    pass\nclass _Read_Array_datetime_2d():\n    pass\nclass _Read_Array_float_1d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_float_2d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_int_1d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_int_2d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_object_1d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_object_2d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_str_1d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Array_str_2d(IPyFromExcel):\n    def __init__(self, trim: bool = True) -> None: ...\n    pass\nclass _Read_Cache(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_Range(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read__Uncached_bool(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read__Uncached_float(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read__Uncached_int(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read__Uncached_object(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read__Uncached_str(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_bool(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_date(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_datetime(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_dict(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_float(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_int(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_list(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_object(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_str(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Read_tuple(IPyFromExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_Array_bool_1d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_bool_2d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_datetime_1d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_datetime_2d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_datetime_1d():\n    pass\nclass _Return_Array_datetime_2d():\n    pass\nclass _Return_Array_float_1d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_float_2d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_int_1d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_int_2d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_object_1d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_object_2d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_str_1d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Array_str_2d(IPyToExcel):\n    def __init__(self, cache: bool = False) -> None: ...\n    pass\nclass _Return_Cache(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_Single(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_bool(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_date(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_datetime(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_dict(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_float(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_int(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_tuple(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_tuple():\n    pass\nclass _Return_str(IPyToExcel):\n    def __init__(self) -> None: ...\n    pass\nclass _Return_tuple():\n    pass\nclass _TomlTable():\n    def __getitem__(self, arg0: str) -> object: ...\n    pass\nclass _XllRange(Range):\n    pass\ndef _get_onedrive_source(arg0: str) -> str:\n    pass\ndef _register_functions(funcs: list[_FuncSpec], module: object = None, addin: object = None, append: bool = False) -> None:\n    pass\ndef _table_converter(n: int, m: int, columns: object = None, rows: object = None, headings: object = None, index: object = None, index_name: object = None, cache_objects: bool = False) -> _RawExcelValue:\n    \"\"\"\n    For internal use. Converts a table like object (such as a pandas DataFrame) to \n    RawExcelValue suitable for returning to xlOil.\n      \n    n, m:\n      the number of data fields and the length of the fields\n    columns / rows: \n      a iterable of numpy array containing data, specified as columns \n      or rows (not both)\n    headings:\n      optional array of data field headings\n    index:\n      optional data field labels - one per data point\n    index_name:\n      optional headings for the index, should be a 1 dim iteratable of size\n      num_index_levels * num_column_levels\n    cache_objects:\n      if True, place unconvertible objects in the cache and return a ref string\n      if False, call str(x) on unconvertible objects\n    \"\"\"\ndef active_cell() -> object:\n    \"\"\"\n    Returns the currently active cell as a Range or None. Will raise an exception if xlOil\n    has not been loaded as an addin.\n    \"\"\"\ndef active_workbook() -> object:\n    \"\"\"\n    Returns the currently active workbook or None. Will raise an exception if xlOil\n    has not been loaded as an addin.\n    \"\"\"\ndef active_worksheet() -> object:\n    \"\"\"\n    Returns the currently active worksheet or None. Will raise an exception if xlOil\n    has not been loaded as an addin.\n    \"\"\"\ndef all_workbooks() -> Workbooks:\n    \"\"\"\n    Collection of workbooks for the current application. Equivalent to \n    `xloil.app().workbooks`.\n    \"\"\"\ndef app() -> Application:\n    \"\"\"\n    Returns the parent Excel Application object when xlOil is loaded as an\n    addin. Will throw if xlOil has been imported to run automation.\n    \"\"\"\ndef call(func: object, *args) -> object:\n    \"\"\"\n    Calls a built-in worksheet function or command or a user-defined function with the \n    given name. The name is case-insensitive; built-in functions take priority in a name\n    clash.\n\n    The type and order of arguments expected depends on the function being called.  \n\n    `func` can be built-in function number (as an int) which slightly reduces the lookup overhead\n\n    This function must be called from a *non-local worksheet function on the main thread*.\n\n    `call` can also invoke old-style `macro sheet commands <https://docs.excel-dna.net/assets/excel-c-api-excel-4-macro-reference.pdf>`_\n    \"\"\"\ndef call_async(func: object, *args) -> _ExcelObjFuture:\n    \"\"\"\n    Calls a built-in worksheet function or command or a user-defined function with the \n    given name.  See ``xloil.call``.\n\n    Calls to the Excel API must be done on Excel's main thread: this async function\n    can be called from any thread but will require the main thread to be available\n    to return a result.\n\n    Returns an **awaitable**, i.e. a future which holds the result.\n    \"\"\"\ndef check_abort() -> bool:\n    \"\"\"\n    Returns True if the user pressed the Escape key. It is good practice to poll this function \n    during long-running worksheet functions or macros.\n\n    This function runs in XLL context so should not be called from genral code.\n    \"\"\"\ndef core_addin() -> Addin:\n    pass\ndef deregister_functions(funcs: object, module: object = None) -> None:\n    \"\"\"\n    Deregisters worksheet functions linked to specified module. Generally, there\n    is no need to call this directly.\n    \"\"\"\ndef excel_callback(func: object, wait: int = 0, retry: int = 500, api: str = '') -> _PyObjectFuture:\n    \"\"\"\n    Schedules a callback to be run in the main thread. Much of the COM API in unavailable\n    during the calc cycle, in particular anything which involves writing to the sheet.\n    COM is also unavailable whilst xlOil is loading.\n\n    Returns a future which can be awaited.\n\n    Parameters\n    ----------\n\n    func: callable\n    A callable which takes no arguments and returns nothing\n\n    retry : int\n    Millisecond delay between retries if Excel's COM API is busy, e.g. a dialog box\n    is open or it is running a calc cycle.If zero, does no retry\n\n    wait : int\n    Number of milliseconds to wait before first attempting to run this function\n\n    api : str\n    Specify 'xll' or 'com' or both to indicate which APIs the call requires.\n    The default is 'com': 'xll' would only be required in rare cases.\n    \"\"\"\ndef excel_state() -> ExcelState:\n    \"\"\"\n    Gives information about the Excel application, in particular the handles required\n    to interact with Excel via the Win32 API. Only available when xlOil is loaded as \n    an addin.\n    \"\"\"\ndef from_excel_date(arg0: object) -> object:\n    \"\"\"\n    Identical to `xloil.to_datetime`.\n    \"\"\"\ndef get_async_loop() -> object:\n    \"\"\"\n    Returns the asyncio event loop associated with the async background\n    worker thread.  All async / RTD worksheet functions are executed \n    on this event loop.\n    \"\"\"\ndef in_wizard() -> bool:\n    \"\"\"\n    Returns true if the function is being invoked from the function wizard : costly functions \n    should exit in this case to maintain UI responsiveness.  Checking for the wizard is itself \n    not cheap, so use this sparingly.\n    \"\"\"\ndef insert_cell_image(writer: object, size: object = None, pos: object = None, origin: object = None, compress: bool = True) -> str:\n    \"\"\"\n    Inserts an image associated with the calling cell. A second call to this function\n    removes any image previously inserted from the same calling cell.\n\n    Parameters\n    ----------\n\n    writer: \n        a one-arg function which writes the image to a provided filename. The file\n        format must be one that Excel can open.\n    size:  \n        * A tuple (width, height) in points. \n        * \"cell\" to fit to the caller size\n        * \"img\" or None to keep the original image size\n    pos:\n        A tuple (X, Y) in points. The origin is determined by the `origin` argument\n    origin:\n        * \"top\" or None: the top left of the calling range\n        * \"sheet\": the top left of the sheet\n        * \"bottom\": the bottom right of the calling range\n    compress:\n        if True, compresses the resulting image before storing in the sheet\n    \"\"\"\ndef run(func: str, *args) -> object:\n    \"\"\"\n    Calls VBA's `Application.Run` taking the function name and up to 30 arguments.\n    This can call any user-defined function or macro but not built-in functions.\n\n    The type and order of arguments expected depends on the function being called.\n\n    Must be called on Excel's main thread, for example in worksheet function or \n    command.\n    \"\"\"\ndef run_async(func: str, *args) -> _ExcelObjFuture:\n    \"\"\"\n    Calls VBA's `Application.Run` taking the function name and up to 30 arguments.\n    This can call any user-defined function or macro but not built-in functions.\n\n    Calls to the Excel API must be done on Excel's main thread: this async function\n    can be called from any thread but will require the main thread to be available\n    to return a result.\n\n    Returns an **awaitable**, i.e. a future which holds the result.\n    \"\"\"\ndef selection() -> object:\n    \"\"\"\n    Returns the currently selected cells as a Range or None. Will raise an exception if xlOil\n    has not been loaded as an addin.\n    \"\"\"\ndef to_datetime(arg0: object) -> object:\n    \"\"\"\n    Tries to the convert the given object to a `dt.date` or `dt.datetime`:\n\n      * Numbers are assumed to be Excel date serial numbers. \n      * Strings are parsed using the current date conversion settings.\n      * A numpy array of floats is treated as Excel date serial numbers and converted\n        to n array of datetime64[ns].\n      * `dt.datetime` is provided is simply returned.\n\n    Raises `ValueError` if conversion is not possible.\n    \"\"\"\n_return_converter_hook: _CustomReturnConverter=None # value = <xloil_core._CustomReturnConverter object>\ncache: ObjectCache=None # value = <xloil_core.ObjectCache object>\ndate_formats: _DateFormatList=None # value = <xloil_core._DateFormatList object>\nxloil_addins: _AddinsDict=None # value = <xloil_core._AddinsDict object>\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/stubs/xloil_core/event/__init__.py",
    "content": "\"\"\"\n          A module containing event objects which can be hooked to receive events driven by \n          Excel's UI. The events correspond to COM/VBA events and are described in detail\n          in the Excel Application API. The naming convention (including case) of the VBA events\n          has been preserved for ease of search.\n          \n        \n          See :ref:`Events:Introduction` and \n          `Excel.Application <https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#events>`_\n\n          Using the Event Class\n          ---------------------\n\n              * Events are hooked using `+=`, e.g.\n\n              ::\n              \n                  event.NewWorkbook += lambda wb: print(wb_name)\n\n              * Events are unhooked using `-=` and passing a reference to the handler function\n\n              ::\n\n                  event.NewWorkbook += foo\n                  event.NewWorkbook -= foo\n\n              * You should not return anything from an event handler\n\n              * Each event has a `handlers` property listing all currently hooked handlers\n\n              * Where an event has reference parameter, for example the `cancel` bool in\n                `WorkbookBeforePrint`, you need to set the value using `cancel.value=True`.\n                This is because python does not support reference parameters for primitive types.\n\n                ::\n\n                    def no_printing(wbName, cancel):\n                      cancel.value = True\n                    xlo.event.WorkbookBeforePrint += no_printing\n\n              * Workbook and worksheet names are passed a string, Ranges as passed as a \n                :any:`xloil.Range`\n    \n          Python-only Events\n          ------------------\n\n          These events are specific to python and not noted in the Core documentation:\n\n            * PyBye:\n                Fired just before xlOil finalises its embedded python interpreter. \n                All python and xlOil functionality is still available. This event is useful \n                to stop threads as it is called before threading module teardown, whereas \n                python's `atexit` is called afterwards. Has no parameters.\n            * UserException:\n                Fired when an exception is raised in a user-supplied python callback, \n                for example a GUI callback or an RTD publisher. Has no parameters.\n            * file_change:\n                This is a special parameterised event, see the separate documentation\n                for this function.\n\n          Examples\n          --------\n\n          ::\n\n              def greet(workbook, worksheet):\n                  xlo.Range(f\"[{workbook}]{worksheet}!A1\") = \"Hello!\"\n\n              xlo.event.WorkbookNewSheet += greet\n              ...\n              xlo.event.WorkbookNewSheet -= greet\n              \n              print(xlo.event.WorkbookNewSheet.handlers) # Should be empty\n\n\n          ::\n\n              def click_handler(sheet_name, target, cancel):\n                  xlo.worksheets[sheet_name]['A5'].value = target.address()\n    \n              xlo.event.SheetBeforeDoubleClick += click_handler\n\n        \"\"\"\nfrom __future__ import annotations\nimport typing\n\n__all__ = [\n    \"AfterCalculate\",\n    \"ComAddinsUpdate\",\n    \"Event\",\n    \"NewWorkbook\",\n    \"PyBye\",\n    \"SheetActivate\",\n    \"SheetBeforeDoubleClick\",\n    \"SheetBeforeRightClick\",\n    \"SheetCalculate\",\n    \"SheetChange\",\n    \"SheetDeactivate\",\n    \"SheetSelectionChange\",\n    \"UserException\",\n    \"WorkbookActivate\",\n    \"WorkbookAddinInstall\",\n    \"WorkbookAddinUninstall\",\n    \"WorkbookAfterClose\",\n    \"WorkbookAfterSave\",\n    \"WorkbookBeforeClose\",\n    \"WorkbookBeforePrint\",\n    \"WorkbookBeforeSave\",\n    \"WorkbookDeactivate\",\n    \"WorkbookNewSheet\",\n    \"WorkbookOpen\",\n    \"WorkbookRename\",\n    \"XllAdd\",\n    \"XllRemove\",\n    \"allow\",\n    \"file_change\",\n    \"pause\"\n]\n\n\nclass Event():\n    def __iadd__(self, arg0: object) -> Event: ...\n    def __isub__(self, arg0: object) -> Event: ...\n    def add(self, handler: object) -> Event: \n        \"\"\"\n        Registers an event handler callback with this event, equivalent to\n        `event += handler`\n        \"\"\"\n    def clear(self) -> None: \n        \"\"\"\n        Removes all handlers from this event\n        \"\"\"\n    def remove(self, handler: object) -> Event: \n        \"\"\"\n        Deregisters an event handler callback with this event, equivalent to\n        `event -= handler`\n        \"\"\"\n    @property\n    def handlers(self) -> tuple:\n        \"\"\"\n        The tuple of handlers registered for this event. Read-only.\n\n        :type: tuple\n        \"\"\"\n    pass\nclass _bool_ref():\n    @property\n    def value(self) -> bool:\n        \"\"\"\n        :type: bool\n        \"\"\"\n    @value.setter\n    def value(self, arg1: bool) -> None:\n        pass\n    pass\ndef allow(excel: bool = True) -> None:\n    \"\"\"\n    Resumes event handling after a previous call to *pause*.\n\n    If *excel* is True (the default), also calls `Application.EnableEvents = True`\n    (equivalent to `xlo.app().enable_events = True`)\n    \"\"\"\ndef file_change(path: str, action: str = 'modify', subdirs: bool = True) -> Event:\n    \"\"\"\n    This function returns an event specific to the given path and action; the \n    event fires when a watched file or directory changes.  The returned event \n    can be hooked in the usual way using `+=` or `add`. Calling this function \n    with same arguments always returns a reference to the same event object.\n\n    The handler should take a single string argument: the name of the file or \n    directory which changed.\n\n    The event runs on a background thread.\n\n    Parameters\n    ----------\n\n    path: str\n       Can be a file or a directory. If *path* points to a directory, any change\n       to files in that directory, will trigger the event. Changes to the specified \n       directory itself will not trigger the event.\n\n    action: str [\"add\", \"remove\", \"modify\"], default \"modify\"\n       The event will only fire when this type of change is detected:\n\n         *modify*: any update which causes a file's last modified time to change\n         *remove*: file deletion\n         *add*: file creation\n\n       A file rename triggers *remove* followed by *add*.\n\n    subdirs: bool (true)\n       including in subdirectories,\n    \"\"\"\ndef pause(excel: bool = True) -> None:\n    \"\"\"\n    Stops all xlOil event handling - any executing handlers will complete but\n    no further handlers will fire.\n\n    If *excel* is True (the default), also calls `Application.EnableEvents = False`\n    (equivalent to `xlo.app().enable_events = False`)\n    \"\"\"\nAfterCalculate: Event=None # value = <xloil_core.event.Event object>\nComAddinsUpdate: Event=None # value = <xloil_core.event.Event object>\nNewWorkbook: Event=None # value = <xloil_core.event.Event object>\nPyBye: Event=None # value = <xloil_core.event.Event object>\nSheetActivate: Event=None # value = <xloil_core.event.Event object>\nSheetBeforeDoubleClick: Event=None # value = <xloil_core.event.Event object>\nSheetBeforeRightClick: Event=None # value = <xloil_core.event.Event object>\nSheetCalculate: Event=None # value = <xloil_core.event.Event object>\nSheetChange: Event=None # value = <xloil_core.event.Event object>\nSheetDeactivate: Event=None # value = <xloil_core.event.Event object>\nSheetSelectionChange: Event=None # value = <xloil_core.event.Event object>\nUserException: Event=None # value = <xloil_core.event.Event object>\nWorkbookActivate: Event=None # value = <xloil_core.event.Event object>\nWorkbookAddinInstall: Event=None # value = <xloil_core.event.Event object>\nWorkbookAddinUninstall: Event=None # value = <xloil_core.event.Event object>\nWorkbookAfterClose: Event=None # value = <xloil_core.event.Event object>\nWorkbookAfterSave: Event=None # value = <xloil_core.event.Event object>\nWorkbookBeforeClose: Event=None # value = <xloil_core.event.Event object>\nWorkbookBeforePrint: Event=None # value = <xloil_core.event.Event object>\nWorkbookBeforeSave: Event=None # value = <xloil_core.event.Event object>\nWorkbookDeactivate: Event=None # value = <xloil_core.event.Event object>\nWorkbookNewSheet: Event=None # value = <xloil_core.event.Event object>\nWorkbookOpen: Event=None # value = <xloil_core.event.Event object>\nWorkbookRename: Event=None # value = <xloil_core.event.Event object>\nXllAdd: Event=None # value = <xloil_core.event.Event object>\nXllRemove: Event=None # value = <xloil_core.event.Event object>\n"
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/type_converters.py",
    "content": "import inspect\nimport importlib.util\nimport typing\nimport numpy as np\nimport functools\n\nfrom ._core import Range, CellError, CannotConvert\nfrom .logging import *\n\nimport xloil_core\n\nfrom xloil_core import (\n    _return_converter_hook,\n    _CustomConverter,\n    _CustomReturn,\n    _Return_Cache,\n    _Return_Single,\n    _Read_Array_object_2d,\n    _Return_Array_object_2d,\n)\n\n\n\"\"\"\nThis annotation includes all the types which can be passed from xlOil to\na function. There is not need to specify it to xlOil, but it could give \nuseful type-checking information to other software which reads annotations.\n\"\"\"\nExcelValue = typing.Union[bool, int, str, float, np.ndarray, dict, list, CellError]\n\n_READ_CONVERTER_PREFIX   = \"_Read_\"\n_RETURN_CONVERTER_PREFIX = \"_Return_\"\n_UNCACHED_CONVERTER_PREFIX = \"_Uncached_\"\n\ndef get_converter(type_name, read=True, cache=True):\n    \"\"\"\n    Given a type name, attempt to find a type converter with standardised name \n    like `Read_int`.The returned type converter cannot be invoked directly, only \n    passed as a argument to xloil_core functions.\n    \"\"\"\n    direction = _READ_CONVERTER_PREFIX if read else _RETURN_CONVERTER_PREFIX\n    name     = f\"{direction}{type_name}\" if cache else f\"{direction}{_UNCACHED_CONVERTER_PREFIX}{type_name}\" \n    found    = getattr(xloil_core, name, None)\n    return None if found is None else found()\n\ndef _make_typeconverter(base_type, reader=None, writer=None, allow_range=False, source=None):\n    # Only inheriting from one type is supported because inheriting from\n    # certain type pairs e.g. (int, str) will give an \"instance layout conflict\"\n    # error and I don't know which pairs are impacted.  Afaik it's only\n    # C-implemented types\n    class _TypeConverter(base_type):\n        _xloil_arg_reader = (reader, allow_range) if reader is not None else None\n        _xloil_return_writer = writer\n       \n        def __new__(cls, *args, **kwargs):\n            \"\"\"\n            Allows return type converters to be \"called\" in the expected way as\n            if the type converter is an instance\n            \"\"\"\n            return cls.read(*args, **kwargs)\n\n        @classmethod\n        def read(cls, value):\n            \"\"\"\n            Allows return type converters to be \"called\" in the expected way, this\n            function is not used by xlOil directly\n            \"\"\"\n            return cls._xloil_return_writer.invoke(value)\n\n    if source:\n        functools.update_wrapper(_TypeConverter, source, updated=[])\n        #_TypeConverter.__doc__      = source.__doc__\n        #_TypeConverter.__name__     = source.__name__\n        #_TypeConverter.__module__   = source.__module__\n        #_TypeConverter.__qualname__ = source.__qualname__\n    return _TypeConverter\n\ndef unpack_arg_converter(obj):\n    return getattr(obj, \"_xloil_arg_reader\", None)\n\ndef unpack_return_converter(obj):\n    return getattr(obj, \"_xloil_return_writer\", None)\n\ndef _make_metaconverter(base_type, impl, is_returner:bool, allow_range=False, check_cache=True):\n\n    type_name = getattr(base_type, \"__name__\", \"object\")\n\n    if inspect.isclass(impl):\n        #\n        # We use a metaclass approach to allow some linting with nice syntax: \n        # We want to write `def f(x: obj)` and `def g(x: obj(...))` which requires \n        # both of these expressions to evaluate to types identifiable to xloil as\n        # a converter but also subclassing the conversion target to get type checking\n        # and autocomplete. \n        #\n        class MetaConverter(base_type):\n                \n            #__doc__    = impl.__doc__\n            #__name__   = impl.__name__\n            #__qualname__ = impl.__qualname__\n            #__module__ = impl.__module__\n\n            def __init__(self):\n                pass # Never called, but keeps linter quiet\n\n            def __new__(cls, *args, **kwargs):\n                # Construct the inner class with the provided args\n                instance = impl(*args, **kwargs)\n                reader = _CustomConverter(instance.read, check_cache, type_name) \\\n                    if hasattr(instance, \"read\") else None\n                writer = _CustomReturn(instance.write, type_name) \\\n                    if hasattr(instance, \"write\") else None\n                # Embed it in a new Converter which inherits from target\n                return _make_typeconverter(\n                    base_type, \n                    reader,\n                    writer,\n                    allow_range)\n\n        # If the target obj has a no-arg constructor, we want to write:\n        # `def fn(x: target_obj)`, so MetaConverter must be a valid \n        # converter itself. We try to insert the correct attributes\n        try:\n            instance = impl()\n            \n            if hasattr(instance, \"read\"):\n                MetaConverter._xloil_arg_reader = (\n                    _CustomConverter(instance.read, check_cache, type_name), \n                    allow_range)\n            if hasattr(instance, \"write\"):\n                MetaConverter._xloil_return_writer = _CustomReturn(\n                    instance.write, type_name)\n\n        except TypeError:\n            pass\n\n        functools.update_wrapper(MetaConverter, impl, updated=[])\n\n        return MetaConverter\n\n    elif is_returner:\n        return _make_typeconverter(base_type, writer=_CustomReturn(impl, type_name), source=impl)\n\n    else:\n        return _make_typeconverter(\n                    base_type,\n                    _CustomConverter(impl, check_cache, type_name), \n                    None, \n                    allow_range, \n                    source=impl)\n\n\ndef _make_tuple(obj):\n    try:\n        return tuple(obj)\n    except TypeError:\n        return obj, \n\n\nclass _ArgConverters:\n    \n    _converters = dict()\n\n    def add(self, converter, arg_type):\n        \"\"\"\n        Registers a arg converter for a given type\n        \"\"\"\n        internal, _ = unpack_arg_converter(converter)\n        log(f\"Added arg converter for type {arg_type}\", level='info')\n        self._converters[arg_type] = internal\n    \n    def remove(self, arg_type):\n        self._converters.remove(arg_type)\n\n    def get_converter(self, arg_type):\n        \"\"\"\n        Returns a _CustomConverter object which handles the given type or None\n        \"\"\"\n        return self._converters.get(arg_type, None)\n\narg_converters = _ArgConverters()\n\n\ndef converter(\n    target=object, \n    range=False, \n    register=False, \n    direction=\"read\",\n    check_cache=True):\n    \"\"\"\n    Decorator which declares a function or a class to be a type converter\n    which serialises from/to a set of simple types understood by Excel and \n    general python types.\n\n    A type converter class is expected to implement at least one of \n    ``read(self, val)`` and ``write(self, val)``. It may take parameters\n    in its constructor and hold state. \n\n    A function is interpreted as a type reader or writer depending on the \n    *direction* parameter.\n\n    **Readers**\n\n    A *reader* converts function arguments to python types. It should receieve\n    a value of: \n\n      *int*, *bool*, *float*, *str*, `xloil.ExcelArray`, `CellError`, `xloil.Range` (optional) \n\n    and return a python object or raise an exception (ideally `xloil.CannotConvert`).\n\n    If ``range`` is True, xlOil may pass a *Range* or *ExcelArray* object\n    depending on how the function was invoked.  The converter should \n    handle both cases consistently.\n\n    **Writers**\n\n    A return type converter should take a python object and return a simple type\n    which xlOil knows how to return to Excel. It should raise ``CannotConvert`` \n    if it cannot handle the given object.\n\n    Parameters\n    ----------\n\n    target: \n        The type which the converter handles\n\n    register: \n        If True, registers the converter as a handler for ``target`` type, replacing\n        any exsting handlers. For a reader, this means if ``target`` is used as an \n        argument annotation, this converter will be used.  For a writer, it enables \n        ``target`` as an return type annotation *and* it allows xlOil to try to call \n        this converter for Excel functions with no return annotation.\n    \n    range:\n        For readers, setting this flag allows *xloil.Range* arguments to be passed\n\n    direction:\n        When decorating a function, the direction \"read\" or \"write\" determines the\n        converter behaviour\n\n    check_cache:\n        For readers, setting this to False turns off xlOil's automatic cache expansion\n        for string inputs. The converter must manually expand cache strings if desired.\n\n    Examples\n    --------\n    \n    ::\n\n        @converter(double)\n        def arg_sum(x):\n            if isinstance(x, ExcelArray):\n                return np.sum(x.to_numpy())\n            elif isinstance(x, str):\n                raise Error('Unsupported')\n            return x\n\n        @func\n        def pyTest(x: arg_sum):\n            return x\n            \n    \"\"\"\n\n    if direction not in ['read', 'write']:\n        raise ValueError(\"diretion must be 'read' or 'write\")\n\n    def decorate(impl):\n        result = _make_metaconverter(target, impl, direction == \"write\", range, check_cache)\n\n        if bool(register) and target is not typing.Callable:\n\n            global arg_converters, return_converters\n\n            arg_converter = unpack_arg_converter(result)\n            if arg_converter is not None:\n                arg_converters.add(result, target)\n\n            ret_converter = unpack_return_converter(result)\n            if ret_converter is not None:\n                return_converters.add(result, target)\n                if not isinstance(register, bool):\n                    # Is register an iterable of types?\n                    return_converters.add(result, register)\n\n        return result\n    return decorate\n\n\nclass _ReturnConverters:\n    \n    _converters = dict()\n    _registered = False\n\n    def add(self, converter, types):\n        \"\"\"\n        Registers a return converter for a given single or iterable of types.\n        \"\"\"\n       \n        converter_impl = unpack_return_converter(converter)\n\n        name = getattr(converter_impl, \"__name__\", type(converter_impl).__name__)\n        log(f\"Added return converter {name} for types {types}\", level='info')\n\n        if hasattr(type(types), '__iter__'):\n            for t in types:\n                if not isinstance(t, type):\n                    raise TypeError(t)\n                self._converters[t] = converter_impl # TODO: warn log on overwrite\n        elif isinstance(types, type):\n            self._converters[types] = converter_impl\n        else:\n            raise TypeError(types)\n        \n        # Register this singleton object as the custom return converter tried by xlOil \n        # when a func does not specify its return type \n        if not self._registered and _return_converter_hook is not None:\n            _return_converter_hook.value = _CustomReturn(self)\n            self._registered = True\n\n    \n    def remove(self, return_type):\n        self._converters.remove(return_type)\n        if not any(self._converters) and _return_converter_hook is not None:\n            _return_converter_hook.value = None\n            self._registered = False\n\n    def create_returner(self, return_type):\n        \"\"\"\n        Returns a _CustomReturn object which handles the given type or returns None\n        if no handlers can be found.  The _CustomReturn object is an internal xloil_core\n        wrapper for a python-based return converter\n        \"\"\"\n        return self._converters.get(return_type, None)\n\n    def __call__(self, obj):\n        \"\"\"\n        Invoked by xlOil to try to convert the given object\n        \"\"\"\n        for typ, converter in self._converters.items():\n            try:\n                if isinstance(obj, typ):\n                    return converter.invoke(obj)\n            except (CannotConvert):\n                continue\n        \n        raise CannotConvert()\n\n\nreturn_converters = _ReturnConverters()\n\n\ndef returner(target=None, register=False):\n    \"\"\"\n    A proxy for converter(..., direction=\"write\")\n    \"\"\"\n    return converter(target, register=register, direction=\"write\")\n\n\nCache = _make_typeconverter(object, writer=_Return_Cache())\n\"\"\"\nUse `-> xloil.Cache` in a function declaration to force the output to be \nplaced in the python object cache rather than attempting a conversion\n\"\"\"\n\nSingleValue = _make_typeconverter(object, writer=_Return_Single())\n\"\"\"\nUse `-> xloil.SingleValue` in a function declaration to force the output to\nbe a single cell value. Uses the Excel object cache for returned arrays and \nthe Python object cache for unconvertable objects.  \n\nExamples\n--------\n\n::\n\n    @xloil.func\n    def single_val(n:int, m:int) -> xloil.SingleValue:\n        return np.ones((n, m))\n\n\"\"\"\n\nAllowRange = typing.Union[ExcelValue, Range]\n\"\"\"\nThe special AllowRange annotation allows functions to receive the argument\nas an Range object if possible.  It is only possible if the function was invoked\nwith a sheet reference e.g. `=MyFunc(A1:B2)`.  Any other argument types are\nconverted as per `xloil.ExcelValue`.\n\"\"\"\n\nclass FastArray(np.ndarray):\n    \"\"\"\n    Tells Excel to pass a 2-d array of float, which appears in python as a 2-d *numpy.array*\n    of float.  No other types are allowed. This significantly reduces the overhead \n    of passing large array arguments but is less flexible: defaults are not supported and\n    if any value in the input array is not a number, Excel will return #VALUE! before even \n    calling xlOil.This means cache auto-expansion and array auto-trimming are not possible. \n    \n    When used as a return type, the function must return a 2-d *numpy.array* of float and  \n    cannot return error conditions: errors raised will be written to the log, but the   \n    function will return NaN.\n\n    ** Cannot be used in local functions **\n    \"\"\"\n    ...\n\nclass Array(np.ndarray):\n    \"\"\"\n    This object can be used in annotations or @xlo.arg decorators\n    to tell xlOil to attempt to convert an argument to a numpy array.\n\n    You don't use this type directly, ``Array`` is a static instance of \n    this type, so use the syntax as show in the examples below.\n\n    If you don't specify this annotation, xlOil may still pass an array\n    to your function if the user passes a range argument, e.g. A1:B2. In \n    this case you will get a 2-dim Array(object). If you know the data \n    type you want, it is more perfomant to specify it by annotation with \n    ``Array``.\n\n    Examples\n    --------\n\n    ::\n\n        @xlo.func\n        def array1(x: xlo.Array(int)):\n            pass\n\n        @xlo.func\n        def array2(y: xlo.Array(float, dims=1)):\n            pass\n\n        @xlo.func\n        def array3(z: xlo.Array(str, trim=False)):\n            pass\n    \n    Parameters\n    ----------\n\n    *(dtype, dims, trim)* :\n        Element types are converted to numpy dtypes, which means the only supported types are: \n        int, float, bool, str, datetime, object.\n        (Numpy has a richer variety of dtypes than this but Excel does not.) \n        \n        For the float data type, xlOil will convert #N/As to numpy.nan but other values will \n        causes errors.\n\n    dims : int\n        Arrays can be either 1 or 2 dimensional, 2 is the default.  Note the Excel has\n        the following behaviour for writing arrays into an array formula range specified\n        with Ctrl-Alt-Enter:\n        \"If you use a horizontal array for the second argument, it is duplicated down to\n        fill the entire rectangle. If you use a vertical array, it is duplicated right to \n        fill the entire rectangle. If you use a rectangular array, and it is too small for\n        the rectangular range you want to put it in, that range is padded with #N/As.\"\n\n    trim : bool    \n        By default xlOil trims arrays to the last row & column which contain a nonempty\n        string or non-#N/A value. This is generally desirable, but can be disabled with \n        this paramter.  Has no effect when used for return values.\n\n    fast: bool\n        Specifies a `xloil.FastArray`. This can only be used with 2-dim float arrays.\n        See the doc string for the class for more details.\n\n    cache_return: bool\n        If used in a return value annotation, returns a cache reference to the result.\n        This avoids copying the array data back to Excel and can improve performance\n        where the array is passed to another xlOil function.\n\n    \"\"\"\n \n    _xloil_arg_converter = _Read_Array_object_2d(True)\n    _xloil_return_converter = _Return_Array_object_2d(False)\n    _xloil_allow_range = False\n\n    def __new__(cls, dtype=object, dims=2, trim=True, fast=False, cache_return=False):\n        if fast:\n            if dtype is not float or dims !=2:\n                raise Exception(\"The 'fast' parameter can only be used with 2-dim float arrays\")\n            return FastArray\n\n        typename = dtype.__name__ if  dtype is not np.datetime64 else \"datetime\"\n\n        name = f\"{_READ_CONVERTER_PREFIX}Array_{typename}_{dims or 2}d\" \n        arg_conv = getattr(xloil_core, name)(trim)\n\n        name = f\"{_RETURN_CONVERTER_PREFIX}Array_{typename}_{dims or 2}d\" \n        return_conv = getattr(xloil_core, name)(cache_return)\n        type_converter = _make_typeconverter(np.ndarray, arg_conv, return_conv, False)\n        type_converter.__name__ = \"Array\"\n        return type_converter\n     "
  },
  {
    "path": "libs/xlOil_Python/Package/xloil/xloil_ribbon.py",
    "content": "# We use tomlkit as it preserves comments.\nfrom collections import namedtuple\nimport tomlkit as toml\nimport winreg as reg\nimport xloil\nfrom pathlib import Path\nfrom itertools import islice\nimport sys\nimport os\n\nfrom xloil.stubs.xloil_core import CellError\n\n@xloil.func\ndef test_name(x):\n    return x\n\n@xloil.func\nasync def test_name2(x):\n    yield x\n\nclass Settings:\n    \"\"\"\n        Manages accessing and saving the settings file\n    \"\"\"\n    def __init__(self, path):\n        self._doc = toml.parse(Path(path).read_text())\n        self._path = path\n\n    def __getitem__(self, *args):\n        return self._doc.__getitem__(*args)\n\n    def set_env_var(self, name, value):\n        \"\"\" Sets the value of a token in the Python plugin's Environment block \"\"\"\n        table = self._find_table(self.python['Environment'], name)\n        table[name] = value\n\n    def get_env_var(self, name):\n        \"\"\" Returns the value of a token in the Python plugin's Environment block \"\"\"\n        table = self._find_table(self.python['Environment'], name)\n        return table[name]\n\n    def set_addin_env_var(self, name, value):\n        \"\"\" Sets the value of a token in the xlOil addin's Environment block \"\"\"\n        table = self._find_table(self.addin['Environment'], name)\n        table[name] = value\n\n    def get_addin_env_var(self, name):\n        table = self._find_table(self.addin['Environment'], name)\n        return table[name]\n\n    def save(self):\n        with open(self._path, \"w\") as file:\n            toml.dump(self._doc, file)\n\n    @property\n    def python(self):\n        return self._doc['xlOil_Python']\n    \n    @property\n    def addin(self):\n        return self._doc['Addin']\n    \n    @property\n    def path(self):\n        return self._path\n\n    @staticmethod\n    def _find_table(array_of_tables, key):\n        \"\"\"\n            We may have multiple (ordered) tables with the same name, e.g.\n            the enviroment blocks. This function returns the table containing\n            the specified key.\n        \"\"\"\n        # May be just a single table\n        if key in array_of_tables:\n            return array_of_tables\n\n        for table in array_of_tables:\n            if key in table:\n                return table\n        raise KeyError(f\"No table contains {key}\")\n\n_settings = Settings(xloil.source_addin().settings_file)\n\n\n#\n# Log Level Callbacks\n# --------------------\n# \nasync def set_log_level(ctrl, id, index):\n    value = xloil.log.levels[index]\n    xloil.log.level = value # thread safe?\n    _settings['Addin']['LogLevel'] = value\n    _settings.save()\n\ndef get_log_level_count(ctrl):\n    return len(xloil.log.levels)\n\ndef get_log_level(ctrl, i):\n    return xloil.log.levels[i]\n\ndef get_log_level_selected(ctrl):\n    return xloil.log.levels.index(xloil.log.level)\n\n#\n# Date Format Callbacks\n# ---------------------\n#\nasync def set_date_formats(ctrl, value):\n    values = value.split(\";\")\n    _settings['Addin']['DateFormats'] = values\n    _settings.save()\n\n    # Update the formats currently in use\n    xloil.date_formats.clear()\n    xloil.date_formats.extend(values)\n\ndef get_date_formats(ctrl):\n    return \";\".join(_settings['Addin']['DateFormats'])\n\n#\n# User search path callbacks\n# --------------------------\n#\n\nasync def set_user_search_path(ctrl, value):\n    paths = value.split(\";\")\n    for path in paths: \n        if not path in sys.path:\n            sys.path.append(path)\n\n    # Save the settings afterwards in case the above fails\n    _settings.set_env_var(\"XLOIL_PYTHON_PATH\",\";\" if len(value) == 0 else value)\n    _settings.save()\n    \ndef get_user_search_path(ctrl):\n    value = _settings.get_env_var(\"XLOIL_PYTHON_PATH\")\n    xloil.log(f\"Search Path: {value}\")\n    return \"\" if value == \";\" else value\n\n#\n# PYTHONEXECUTABLE path callbacks\n# -------------------------------\n#\n\nasync def set_python_home(ctrl, value):\n    _settings.set_env_var(\"PYTHONEXECUTABLE\", value)\n    _settings.save()\n\n    restart_notify()\n    \ndef get_python_home(ctrl):\n    return _settings.get_env_var(\"PYTHONEXECUTABLE\")\n\n \n#\n# PYTHONPATH callbacks\n# --------------------\n#\n\ndef set_python_path(ctrl, value):\n    _settings.set_env_var(\"PYTHONPATH\", value)\n    _settings.save()\n\n    restart_notify()\n\ndef get_python_path(ctrl):\n    return _settings.get_env_var(\"PYTHONPATH\")\n\n#\n# Python Environment callbacks\n# ----------------------------\n#\n\n_PythonEnv = namedtuple(\"_PythonEnv\", \"name, version, executable\")\n\ndef _find_python_enviroments_from_key(pythons_key):\n\n    environments = []\n    try:\n        i = 0\n        while True:\n            vendor = reg.EnumKey(pythons_key, i)\n            i += 1\n            with reg.OpenKey(pythons_key, vendor) as vendor_key:\n                    \n                try:\n                    j = 0\n                    while True:\n                        version = reg.EnumKey(vendor_key, j)\n                        j += 1\n                        with reg.OpenKey(vendor_key, version) as kVersion:\n                            name = reg.QueryValueEx(kVersion, 'DisplayName')[0]\n                            install_path = reg.OpenKey(kVersion, 'InstallPath')\n                            environments.append(_PythonEnv(\n                                name=name, \n                                version=reg.QueryValueEx(kVersion, 'SysVersion')[0],\n                                executable=reg.QueryValueEx(install_path, 'ExecutablePath')[0]))\n                except OSError:\n                    ...\n    except OSError:\n        ...\n\n    return environments\n\n\ndef _find_conda_environments():\n\n    from pathlib import Path\n    env_file = Path.home() / '.conda' / 'environments.txt'\n    if not env_file.exists():\n        return []\n\n    env_paths = set(x for x in env_file.read_text().split('\\n') if len(x) > 0)\n\n    environments = []\n\n    # TODO: currently not sure of the easiest/best way to get version info\n    for path in env_paths:\n        root, _, env = path.rpartition(os.path.sep + \"envs\" + os.path.sep)\n        exe_path = os.path.join(path, \"python.exe\")\n        if root in env_paths:\n            environments.append(_PythonEnv(\n                name=f'{env} ({os.path.basename(root)})',\n                version=\"?\",\n                executable=exe_path))\n        else:\n            environments.append(_PythonEnv(\n                name=os.path.basename(path),\n                version=\"?\",\n                executable=exe_path))\n\n    return environments\n\ndef _find_env_by_exe(environments, filename):\n    filename = filename.upper()\n    for i in range(len(environments)):\n        if environments[i].executable.upper() == filename.upper():\n            return i\n\n    return None\n\n\ndef _find_python_enviroments():\n\n    roots = [reg.HKEY_LOCAL_MACHINE, reg.HKEY_CURRENT_USER]\n    environments = []\n\n    for root in roots:\n        try:\n            with reg.OpenKey(root, \"Software\\\\Python\") as pythons_key:\n                environments += _find_python_enviroments_from_key(pythons_key)\n        except FileNotFoundError:\n            ... # Reg key doesn't exist, try the next one\n\n    for env in _find_conda_environments():\n        if env.executable not in environments:\n            environments.append(env)\n\n    py_exe = _settings.get_env_var(\"PYTHONEXECUTABLE\")\n\n    # Check if current environment is already described \n    if _find_env_by_exe(environments, py_exe) is None:\n        environments.append(_PythonEnv(\n            name='Current',\n            version=f'{sys.version_info.major}.{sys.version_info.minor}',\n            executable=py_exe))\n\n    return environments\n\n\n_PYTHON_ENVIRONMENTS = _find_python_enviroments()\n\n\nasync def set_python_environment(ctrl, id, index):\n\n    environment = _PYTHON_ENVIRONMENTS[index]\n    exe_path = environment.executable\n\n    xloil_bin_path = Path(exe_path).parent / \"share/xloil\"\n\n    if not xloil_bin_path.exists():\n        xloil.log.error(\"Changed target python environment to '%s', but the xlOil package is missing. \" +\n                        \"Unless it is installed, xlOil will not load correctly when Excel is restarted.\",\n                        exe_path)\n\n    _settings.set_env_var(\"PYTHONEXECUTABLE\", exe_path)\n\n    # Clear the version override if set (it shouldn't generally be required)\n    _settings.set_env_var(\"XLOIL_PYTHON_VERSION\", \"\")\n\n    # This is where we look for the binaries\n    try:\n        _settings.set_addin_env_var(\"XLOIL_PATH\", str(xloil_bin_path))\n    except toml.exceptions.NonExistentKey:\n        ...\n\n    _settings.save()\n\n    # Invalidate controls\n    _ribbon_ui.invalidate(\"PYTHONEXECUTABLE\")\n\n    restart_notify()\n\n\ndef get_python_environment_count(ctrl):\n    return len(_PYTHON_ENVIRONMENTS)\n\n\ndef get_python_environment(ctrl, i):\n    return _PYTHON_ENVIRONMENTS[i].name\n\n\ndef get_python_environment_selected(ctrl):\n    py_home = _settings.get_env_var(\"PYTHONEXECUTABLE\")\n    return _find_env_by_exe(_PYTHON_ENVIRONMENTS, py_home) or (len(_PYTHON_ENVIRONMENTS) - 1)\n\n#\n# Python Load Modules callbacks\n# -----------------------------\n#\n\nasync def set_load_modules(ctrl, value):\n    # Allow a semi-colon separator\n    modules = value.replace(\";\", \",\").split(\",\")\n    _settings.python['LoadModules'] = modules\n    _settings.save()\n\n    # Load any new modules. Catch errors in case of misspelt names\n    import importlib\n    for m in modules:\n        try:\n            if not m in sys.modules:\n                importlib.import_module(m)\n        except Exception as err:\n            xloil.log.warn(f\"Ribbon failed loading module {str(m)}: {str(err)}\")\n\ndef get_load_modules(ctrl):\n    value = _settings.python['LoadModules']\n    return \",\".join(value)\n\n\n#\n# Python Debugger callbacks\n# -------------------------\n#\n\ndef get_debugger_count(ctrl):\n    import xloil.debug\n    return len(xloil.debug.DEBUGGERS)\n\ndef get_debugger(ctrl, i):\n    import xloil.debug\n    return xloil.debug.DEBUGGERS[i]\n\ndef get_debugger_selected(ctrl):\n    import xloil.debug\n    current = _settings.python['Debugger']\n    i = xloil.debug.DEBUGGERS.index(current)\n    return max(i, 0)\n\nasync def set_debugger(ctrl, id, index):\n    import xloil.debug\n\n    choice = xloil.debug.DEBUGGERS[index]\n    _settings.python['Debugger'] = choice\n    _settings.save()\n\n    xloil.debug.use_debugger(\n        choice, \n        port=int(_settings.python['DebugPyPort']))\n\ndef _find_free_port():\n    #https://stackoverflow.com/questions/1365265\n    import socket\n    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n        s.bind(('', 0))\n        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n        return s.getsockname()[1]\n\ndef _is_port_in_use(port: int) -> bool:\n    # https://stackoverflow.com/questions/2470971/\n    import socket\n    try:\n        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n            s.bind(('localhost', port))\n            return False\n    except OSError:\n        return True\n\ndef get_debugpy_port(ctrl):\n    port = int(_settings.python['DebugPyPort'])\n    if _is_port_in_use(port):\n        port = _find_free_port()\n        _settings.python['DebugPyPort'] = port\n        # We don't save the setting as the port may be free next time\n    return port\n\nasync def set_debugpy_port(ctrl, value):\n    _settings.python['DebugPyPort'] = value\n    _settings.save()\n\n\n#\n# Open Log callback\n# -----------------\n#\n\nasync def press_open_log(ctrl):\n    xloil.log.flush()\n    import os\n    os.startfile(xloil.log.path)\n\n#\n# Open Console callbacks\n# ----------------------\n#\nasync def press_open_console(ctrl):\n\n    def open_console(root):\n        from xloil.gui.tkinter import TkConsole\n        import tkinter\n        import code\n\n        top_level = tkinter.Toplevel(root)\n        console = TkConsole(top_level, code.interact,\n            fg='white', bg='black', font='Consolas', insertbackground='red')\n        console.pack(expand=True, fill=tkinter.BOTH)\n        console.bind(\"<<CommandDone>>\", lambda e: top_level.destroy())\n\n        top_level.deiconify()\n\n    from xloil.gui.tkinter import Tk_thread\n    await Tk_thread().submit_async(open_console, Tk_thread().root)\n\n\ntheConsoleQt=None\n\nasync def press_open_qtconsole(ctrl):\n\n    def open_console():\n        global theConsoleQt\n        from xloil.gui.qt_console import create_qtconsole_inprocess\n        console = create_qtconsole_inprocess()\n        console.show()\n        theConsoleQt = console\n\n    from xloil.gui.qtpy import Qt_thread\n    await Qt_thread().submit_async(open_console)\n\n\n#\n# Restart Notify callbacks\n# ------------------------\n#\n_restart_label_visible = False\n\ndef restart_notify():\n    global _restart_label_visible, _ribbon_ui\n    _restart_label_visible = True\n    _ribbon_ui.invalidate(\"RestartLabel\")\n\ndef get_restart_label_visible(ctrl):\n    global _restart_label_visible\n    return _restart_label_visible\n\n\n\ndef set_error_propagation(ctrl, value):\n    _settings.addin['ErrorPropagation'] = value\n    _settings.save()\n    # TODO: enable this when the settings update is live otherwise the behaviour is a little unexpected\n    #for func in xloil.core_addin().functions():\n    #   func.error_propagation = value\n\n\ndef get_error_propagation(ctrl):\n    return bool(_settings.addin.get('ErrorPropagation', False))\n\ndef _fix_name_errors(ctrl):    \n    xloil.fix_name_errors(xloil.active_workbook())\n\n\n#\n# Ribbon creation\n# ---------------\n#\n\ndef _ribbon_func_map(func: str):\n    # Just finds the function with the given name in this module \n    xloil.log.debug(f\"Calling xlOil Ribbon '{func}'...\")\n    return globals()[func]\n\n_ribbon_ui = xloil.ExcelGUI(ribbon=r'''\n    <customUI xmlns=\"http://schemas.microsoft.com/office/2009/07/customui\">\n      <ribbon>\n        <tabs>\n          <tab id=\"tab0\" label=\"xlOil Py\">\n            <group id=\"grp0\" autoScale=\"false\" centerVertically=\"false\" label=\"Environment\">\n              <dropDown id=\"ddc0\" label=\"Environment\" \n                screentip=\"Python environments listed in the Windows Registry\"\n                supertip=\"Environment changes only take effect after restarting Excel\"\n                onAction=\"set_python_environment\"\n                getItemCount=\"get_python_environment_count\"\n                getItemLabel=\"get_python_environment\"\n                getSelectedItemIndex=\"get_python_environment_selected\" />\n              <editBox id=\"PYTHONEXECUTABLE\" label=\"PYTHONEXECUTABLE\" \n                screentip=\"The location of python.exe in the distribution\"\n                supertip=\"Environment changes only take effect after restarting Excel\"\n                sizeString=\"c:/a/path/is/this/size\"\n                getText=\"get_python_home\" \n                onChange=\"set_python_home\" />\n              <editBox id=\"PYTHONPATH\" label=\"PYTHONPATH\" sizeString=\"c:/a/path/is/this/size\"\n                screentip=\"A semi-colon separated list of module search directories\"\n                supertip=\"Prefer to use this for system paths and add user directories to the Search Paths\"\n                getText=\"get_python_path\" \n                onChange=\"set_python_path\" />\n            </group>\n            <group id=\"grp1\" autoScale=\"false\" centerVertically=\"false\" label=\"Modules\">\n              <editBox id=\"ebx3\" label=\"Load Modules\" sizeString=\"a module; another module; another\"\n                screentip=\"Python modules to load\"\n                supertip=\"The modules must be available on python's sys.path. Use a comma to separate.\"\n                getText=\"get_load_modules\" \n                onChange=\"set_load_modules\"/>\n              <editBox id=\"ebx4\" label=\"Search Paths\" sizeString=\"a module; another module; another\"\n                screentip=\"Paths added to python's sys.path\"\n                supertip=\"Prefer to add user directories here rather than editing PYTHONPATH directly. Use the usual semi-colon (;) separator and the path separator (\\)\"\n                getText=\"get_user_search_path\"\n                onChange=\"set_user_search_path\"/>\n              <labelControl id=\"RestartLabel\" label=\"!Restart Required!\" \n                getVisible=\"get_restart_label_visible\" />\n            </group>\n            <group id=\"grp2\" autoScale=\"false\" centerVertically=\"false\" label=\"Debugging\" >\n              <button id=\"btn5\" size=\"large\" label=\"Console\" imageMso=\"ContainerGallery\" \n                onAction=\"press_open_console\"/>\n              <button id=\"qtconsole\" size=\"large\" label=\"QtConsole\" imageMso=\"ContainerGallery\" \n                onAction=\"press_open_qtconsole\"\n                screentip=\"Opens a Jupyter console to an inprocess kernel\"\n                supertip=\"The console is connected to the Excel application, so can register functions and manipulate workbooks\"/>\n              <button id=\"btn6\" size=\"large\" label=\"Open Log\" imageMso=\"ZoomCurrent75\" \n                onAction=\"press_open_log\"\n                screentip=\"Opens the log file\"\n                supertip=\"Uses the editor configured to open '.log' files\"/>\n              <dropDown id=\"ddc8\" label=\"Log Level\" \n                screentip=\"The threshold level to control which messages are written to the log file\"\n                getSelectedItemIndex=\"get_log_level_selected\" \n                getItemCount=\"get_log_level_count\"\n                getItemLabel=\"get_log_level\"\n                onAction=\"set_log_level\" >\n              </dropDown>\n              <dropDown id=\"ddc9\" label=\"Debugger\" \n                screentip=\"Debugger used\"\n                supertip=\"Check the documentation for details on debugging\"\n                getSelectedItemIndex=\"get_debugger_selected\" \n                getItemCount=\"get_debugger_count\"\n                getItemLabel=\"get_debugger\"\n                onAction=\"set_debugger\" >\n              </dropDown>\n              <editBox id=\"ebxDebugPy\" label=\"DebugPy Port\"\n                screentip=\"Connection port used if the debugpy/vscode debugger is selected\"\n                getText=\"get_debugpy_port\"\n                onChange=\"set_debugpy_port\"/>\n            </group>\n            <group id=\"grp3\" autoScale=\"false\" centerVertically=\"false\" label=\"Other\" >\n              <editBox id=\"ebxDateFormats\" label=\"Date Formats\" \n                screentip=\"Date formats tried when parsing strings as dates\"\n                supertip=\"Uses 'std::get_time' formats: %Y year, %m month number, %b month name, etc.\" \n                getText=\"get_date_formats\" \n                onChange=\"set_date_formats\"/>\n              <checkBox id=\"cbxPropagation\" label=\"Propagate Errors\"\n                screentip=\"If enabled, any error code (eg. \\#NUM!) arguments are passed through as the function's return \n                            value, otherwise all argument values are handled by the function\"\n                supertip=\"(requires restart)\"\n                getPressed=\"get_error_propagation\"              \n                onAction=\"set_error_propagation\"/>\n              <button id=\"fixNameErrors\" size=\"normal\" label=\"Fix #NAME!\" imageMso=\"ErrorChecking\" \n                onAction=\"_fix_name_errors\"\n                screentip=\"Marks #NAME! errors in current workbook for recalculation.\"\n                supertip=\"These errors cannot simply be resolved just by Ctrl-Alt-F9. May not be performant in \n                          large workbooks with many errors.\"/>\n            </group>\n          </tab>\n        </tabs>\n      </ribbon>\n    </customUI>\n    ''', \n    funcmap=_ribbon_func_map)"
  },
  {
    "path": "libs/xlOil_Python/PyAddin.cpp",
    "content": "#include \"PyAddin.h\"\n#include \"EventLoop.h\"\n#include \"PyCore.h\"\n#include \"PyFunctionRegister.h\"\n#include \"PyHelpers.h\"\n#include <xlOil/Interface.h>\n#include <xlOil/DynamicRegister.h>\n#include <xlOil/Log.h>\n#include <xlOil/StringUtils.h>\n#include <xlOil/State.h>\n#define TOML_ABI_NAMESPACES 0\n#include <toml++/toml.h>\n#include <pybind11/stl.h>\n#include <datetime.h> // From CPython\n\nusing std::vector;\nusing std::wstring;\nusing std::string;\nusing std::shared_ptr;\nusing std::make_shared;\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      std::map<wstring, std::shared_ptr<PyAddin>> theAddins;\n    }\n\n    PyAddin::PyAddin(AddinContext& ctx,\n                     bool separateThread,\n                     const std::string_view& comLib,\n                     const std::wstring_view& wbPattern,\n                     const bool useLoaderThread)\n      : _context(&ctx)\n      , thread(separateThread ? make_shared<EventLoop>() : theCoreAddin()->thread)\n      , _comBinder(comLib)\n      , _loadOnThread(useLoaderThread)\n      , _propagateErrors(false)\n    {\n      if (!wbPattern.empty())\n      {\n        _workbookPattern = wbPattern;\n        const auto star = _workbookPattern.find(L'*');\n        if (star == wstring::npos)\n        {\n          XLO_WARN(\"WorkbookModule should be of the form '*foo.py' where '*'\"\n            \"will be replaced by the full workbook path with file extension removed\");\n        }\n        else // Replace the star so we can use formatStr later\n          _workbookPattern.replace(star, 1, wstring(L\"%s\"));\n      }\n      if (ctx.settings())\n        _propagateErrors = (*ctx.settings())[\"Addin\"][\"ErrorPropagation\"].value_or(false);\n    }\n\n    void PyAddin::unload()\n    {\n      thread->shutdown();\n      // TODO: how to synchronise this?\n      _context = 0;\n      thread.reset();\n    }\n\n    AddinContext& PyAddin::context()\n    {\n      if (!_context)\n        XLO_THROW(\"Attempt to access stale Addin object\");\n      return *_context;\n    }\n\n    const AddinContext& PyAddin::context() const\n    {\n      if (!_context)\n        XLO_THROW(\"Attempt to access stale Addin object\");\n      return *_context;\n    }\n\n    const std::wstring& PyAddin::pathName() const\n    {\n      return context().pathName();\n    }\n\n    std::wstring PyAddin::getLocalModulePath(const wchar_t* workbookPath) const\n    {\n      // Substitute in to find target module name, removing extension\n      auto fileExtn = wcsrchr(workbookPath, L'.');\n      return formatStr(_workbookPattern.c_str(),\n        fileExtn ? wstring(workbookPath, fileExtn).c_str() : workbookPath);\n    }\n\n    void PyAddin::importModule(\n      const pybind11::object& module, \n      bool backgroundThread)\n    {\n      if (backgroundThread)\n        thread->callback(\"xloil.importer\", \"_import_and_scan\", module, self());\n      else\n        pybind11::module::import(\"xloil.importer\").attr(\"_import_and_scan\")(module, self());\n    }\n\n    void PyAddin::importFile(\n      const wchar_t* filePath, \n      const wchar_t* linkedWorkbook, \n      bool backgroundThread)\n    {\n      // TODO: would be ideal if we didn't have to get the gil here\n      py::gil_scoped_acquire get_gil;\n      if (backgroundThread)\n        thread->callback(\"xloil.importer\", \"_import_file_and_scan\",\n          filePath, self(), linkedWorkbook);\n      else\n        pybind11::module::import(\"xloil.importer\").attr(\"_import_file_and_scan\")(\n          filePath, self(), linkedWorkbook);\n    }\n\n    pybind11::object PyAddin::self() const\n    {\n      return py::cast(shared_from_this());\n    }\n\n    std::shared_ptr<FuncSource> PyAddin::findSource(const wchar_t* sourcePath) const\n    {\n      auto found = context().sources().find(sourcePath);\n      if (found != context().sources().end())\n        return found->second;\n      return std::shared_ptr<FuncSource>();\n    }\n\n    PyAddin& findAddin(const wchar_t* xllPath)\n    {\n      const auto found = xllPath ? theAddins.find(xllPath) : theAddins.end();\n      if (found == theAddins.end())\n        XLO_THROW(L\"Could not find python addin for {}\", xllPath);\n      return *found->second;\n    }\n    \n    std::map<wstring, std::shared_ptr<PyAddin>>& getAddins()\n    {\n      return theAddins;\n    }\n\n    std::shared_ptr<EventLoop> getEventLoop()\n    {\n      const auto id = std::this_thread::get_id();\n      for (auto& [key, addin] : theAddins)\n        if (addin->thread->thread().get_id() == id)\n          return addin->thread;\n      if (isMainThread())\n        return theCoreAddin()->thread;\n      XLO_THROW(\"Internal: could not find addin associated with current thread\");\n    }\n\n    auto findAllAddinFuncs(PyAddin& addin)\n    {\n      vector<shared_ptr<PyFuncInfo>> funcInfo;\n      for (auto&[name, source] : addin.context().sources())\n      {\n        auto pySource = std::dynamic_pointer_cast<RegisteredModule>(source);\n        if (!pySource)\n          continue; // Unexpected - give warning?\n\n        for (auto& funcSpec : pySource->functions())\n        {\n          auto pySpec = std::static_pointer_cast<const DynamicSpec>(funcSpec);\n          auto pyFuncInfo = std::static_pointer_cast<const PyFuncInfo>(pySpec->context());\n          funcInfo.push_back(std::const_pointer_cast<PyFuncInfo>(pyFuncInfo));\n        }\n      }\n      return funcInfo;\n    }\n\n    // TODO: replace with pybind11::bind_map\n    template<class TMap>\n    class PyWrapMap\n    {\n    private:\n      const TMap& _map;\n\n    public:\n      PyWrapMap(const TMap& mapRef) : _map(mapRef) {}\n\n      auto keys() const\n      {\n        return py::make_key_iterator(_map.begin(), _map.end());\n      }\n      auto values() const\n      {\n        return py::make_value_iterator(_map.begin(), _map.end());\n      }\n      auto items() const\n      {\n        return py::make_iterator(_map.begin(), _map.end());\n      }\n\n      auto getItem(const typename TMap::key_type& key) const\n      {\n        auto found = _map.find(key);\n        if (found == _map.end())\n          throw py::key_error(utf16ToUtf8(key));\n        return found->second;\n      }\n      size_t len() const { return _map.size(); }\n\n      bool contains(const typename TMap::key_type& key) const\n      {\n        return _map.find(key) != _map.end();\n      }\n\n      using this_t = PyWrapMap<TMap>;\n      static void bind(py::module& mod, const char* name)\n      {\n        py::class_<this_t>(mod, name, \n           R\"(\n             A dictionary of all addins using the xlOil_Python plugin keyed\n             by the addin pathname.\n           )\")\n          .def(\"__getitem__\", &this_t::getItem)\n          .def(\"__len__\", &this_t::len)\n          .def(\"__iter__\", &this_t::keys)\n          .def(\"__contains__\", &this_t::contains)\n          .def(\"items\", &this_t::items)\n          .def(\"values\", &this_t::values)\n          .def(\"keys\", &this_t::keys);\n      }\n    };\n\n    py::object tomlNodeToPyObject(const toml::node& node)\n    {\n      using toml::node_type;\n      \n      switch (node.type())\n      {\n      case node_type::table:          return py::cast(py::ReferenceHolder(node.as_table()));\n      case node_type::string:         return py::cast(**node.as_string());\n      case node_type::integer:        return py::cast(**node.as_integer());\n      case node_type::floating_point: return py::cast(**node.as_floating_point());\n      case node_type::boolean:        return py::cast(**node.as_boolean());\n      case node_type::none:           return py::none();\n      case node_type::date:\n      {\n        const auto& date = **node.as_date();\n        return PySteal<>(PyDate_FromDate(date.year, date.month, date.day));\n      }\n      case node_type::time:\n      {\n        const auto& time = **node.as_time();\n        return PySteal<>(PyTime_FromTime(time.hour, time.minute, time.second, time.nanosecond * 100));\n      }\n      case node_type::date_time:\n      {\n        const auto& datetime = **node.as_date_time();\n        return PySteal<>(PyDateTime_FromDateAndTime(\n          datetime.date.year, datetime.date.month, datetime.date.day,\n          datetime.time.hour, datetime.time.minute, datetime.time.second,\n          datetime.time.nanosecond * 100));\n      }\n      \n      case node_type::array:\n      {\n        const auto& array = *node.as_array();\n        auto list = py::list(array.size());\n        for (size_t i = 0; i < array.size(); ++i)\n          list[i] = tomlNodeToPyObject(array[i]);\n        return list;\n      }\n      default:\n        // We support all types as of Sept 2022, so if we get here something \n        // was corrupted or a new type has been added..\n        throw py::type_error(\"Unsupported toml node type\");\n      }\n    }\n    auto tomlTableGetItem(toml::table& table, const char* name)\n    {\n      const auto* node = table.get(name);\n      if (!node)\n        throw py::key_error(name);\n      return tomlNodeToPyObject(*node);\n    }\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        py::class_<toml::table, py::ReferenceHolder<toml::table>>(mod, \"_TomlTable\")\n          .def(\"__getitem__\", tomlTableGetItem);\n\n        py::class_<PyAddin, shared_ptr<PyAddin>>(mod, \"Addin\")\n          .def(\"__repr__\", &PyAddin::pathName)\n          .def(\"__str__\", &PyAddin::pathName)\n          .def_property_readonly(\"pathname\", &PyAddin::pathName)\n          .def_property_readonly(\"event_loop\",\n            [](PyAddin& addin) { return addin.thread->loop(); },\n            R\"(\n              The asyncio event loop used for background tasks by this addin\n            )\")\n          .def_property_readonly(\"settings_file\",\n            [](PyAddin& addin) { return string(*addin.context().settings()->source().path); },\n            R\"(\n              The full pathname of the settings ini file used by this addin\n            )\")\n          .def_property_readonly(\"settings\",\n            [](PyAddin& addin) { return py::cast(py::ReferenceHolder(addin.context().settings())); },\n            R\"(\n              Gives access to the settings in the addin's ini file as nested dictionaries.\n              These are the settings on load and do not allow for modifications made in the \n              ribbon toolbar.\n            )\")\n          .def_property(\"async_slice\",\n            [](PyAddin& self) { return self.thread->asyncioTimeout; },\n            [](PyAddin& self, unsigned value) { self.thread->asyncioTimeout = value; },\n            R\"(\n              Sets/gets the time slice in milliseconds for which the asyncio event loop is allowed \n              to run before being interrupted. The event loop holds the GIL while it is running, so\n              making this interval too long could impact the performance of other python functions.\n            )\")\n          .def_property(\"async_throttle\",\n            [](PyAddin& self) { return self.thread->sleepTime; },\n            [](PyAddin& self, unsigned value) { self.thread->sleepTime = value; },\n            R\"(\n              Sets/gets the interval in milliseconds between switches to the asyncio event loop\n              embedded in this addin. The event loop holds the GIL while it is running, so making\n              this interval too short could impact the performance of other python functions.\n            )\")\n          .def(\"functions\", findAllAddinFuncs,\n            R\"(\n              Returns a list of all functions declared by this addin.\n            )\")\n          .def(\"source_files\",\n            [](PyAddin& addin)\n            {\n              vector<wstring> sources;\n              for (auto& item : addin.context().sources())\n                sources.push_back(item.first);\n              return sources;\n            });\n\n        PyWrapMap<decltype(theAddins)>::bind(mod, \"_AddinsDict\");\n\n        mod.def(\"core_addin\", theCoreAddin);\n        mod.add_object(\"xloil_addins\", \n          py::cast(new PyWrapMap(theAddins), py::return_value_policy::take_ownership));\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyAddin.h",
    "content": "#pragma once\n#include <pybind11/pybind11.h>\n#include <memory>\n#include <string>\n#include <map>\n\nnamespace xloil\n{\n  class AddinContext; class FuncSource;\n  namespace Python { class EventLoop; }\n}\n\nnamespace xloil\n{\n  namespace Python\n  {\n    /// <summary>\n    /// Holds a python addin context. Each XLL which uses xlOil_Python has a \n    /// separate context to keep track of the functions it registers. It also\n    /// has separate thread and event loop on which all importing is done\n    /// </summary>\n    class PyAddin : public std::enable_shared_from_this<PyAddin>\n    {\n    public:\n      PyAddin(\n        AddinContext&, \n        bool separateThread,\n        const std::string_view& comLib, \n        const std::wstring_view& wbPattern = std::wstring_view(),\n        const bool useLoaderThread = true);\n\n      /// <summary>\n      /// \"Guts\" the addin object in the case that a detach message is received\n      /// from xlOil core. This ensures any remaining references fail gracefully\n      /// </summary>\n      void unload();\n\n      std::shared_ptr<EventLoop> thread;\n     \n      /// <summary>\n      /// Gets the addin pathname\n      /// </summary>\n      const std::wstring& pathName() const;\n\n      /// <summary>\n      /// Given a workbook path, returns the expected location of its local \n      /// module (i.e. py file), based on the pattern specified in the ini file.\n      /// </summary>\n      std::wstring getLocalModulePath(const wchar_t* workbookPath) const;\n\n      /// <summary>\n      /// Imports / reloads the specified modules and scans them for functions\n      /// to register. The argument is passed to `xloil.importer._import_and_scan`\n      /// so a module, string or enumerable of the these can be given. \n      /// </summary>\n      void importModule(const pybind11::object& module, bool backgroundThread=true);\n\n      /// <summary>\n      /// Imports the specified py file without registering it as module in \n      /// `sys.modules`, then scans for functions to register.  Optionally\n      /// specifies a linked workbook which is passed back when functions are\n      /// registered\n      /// </summary>\n      void importFile(\n        const wchar_t* filePath, const wchar_t* linkedWorkbook, bool backgroundThread = true);\n\n      std::shared_ptr<FuncSource> findSource(const wchar_t* sourcePath) const;\n      \n      bool loadLocalModules() const { return !_workbookPattern.empty(); }\n      bool useLoaderThread() const { return _loadOnThread; }\n\n      /// <summary>\n      /// Returns the python com support library specified in the addin's \n      /// settings, e.g. 'win32com'\n      /// </summary>\n      const std::string& comBinder() const { return _comBinder; }\n\n      AddinContext& context();\n      const AddinContext& context() const;\n\n      bool propagateErrors() const { return _propagateErrors; }\n\n    private:\n      std::wstring _workbookPattern;\n      AddinContext* _context;\n      std::string _comBinder;\n      bool _loadOnThread;\n      bool _propagateErrors;\n\n      pybind11::object self() const;\n    };\n\n    /// <summary>\n    /// Only called from Main.cpp on plugin startup\n    /// </summary>\n    std::map<std::wstring, std::shared_ptr<PyAddin>>& getAddins();\n\n    /// <summary>\n    /// Returns the PyAddin object corresponding to the given XLL,\n    /// or throws if none found.\n    /// </summary>\n    PyAddin& findAddin(const wchar_t* xllPath);\n    \n    /// <summary>\n    /// Gets the event loop associated with the current thread or throws\n    /// </summary>\n    /// <returns></returns>\n    std::shared_ptr<EventLoop> getEventLoop();\n\n    /// <summary>\n    /// The core context corresponds to xlOil.dll - it always exists and is\n    /// used for loading any modules specified in the core settings and addin \n    /// non-specific stuff such as workbook modules and jupyter functions. \n    /// </summary>\n    /// <returns></returns>\n    const std::shared_ptr<PyAddin>& theCoreAddin();\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyAddress.cpp",
    "content": "#include \"PyCore.h\"\n#include \"PyHelpers.h\"\n#include <xlOil/ExcelRef.h>\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::wstring;\n\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    AddressStyle parseAddressStyle(const std::string_view& style)\n    {\n      if (style == \"\" || style == \"a1\")\n        return AddressStyle::A1;\n      else if (style == \"$a1\")\n        return AddressStyle::A1 | AddressStyle::COL_FIXED;\n      else if (style == \"a$1\")\n        return AddressStyle::A1 | AddressStyle::ROW_FIXED;\n      else if (style == \"$a$1\")\n        return AddressStyle::A1 | AddressStyle::ROW_FIXED | AddressStyle::COL_FIXED;\n      else if (style == \"rc\")\n        return AddressStyle::RC;\n      else if (style == \"$rc\")\n        return AddressStyle::RC | AddressStyle::ROW_FIXED;\n      else if (style == \"r$c\")\n        return AddressStyle::RC | AddressStyle::COL_FIXED;\n      else if (style == \"$r$c\")\n        return AddressStyle::RC | AddressStyle::ROW_FIXED | AddressStyle::COL_FIXED;\n      \n      XLO_THROW(\"Unknown address style '{}'\", style);\n    }\n\n    namespace\n    {\n      class ParsedAddress\n      {\n      public:\n        friend class ParsedAddressIter;\n\n        ParsedAddress(\n          const msxll::XLREF12& ref,\n          const std::wstring& sheetName)\n          : ParsedAddress(ref)\n        {\n          _sheetName = sheetName;\n        }\n\n        ParsedAddress(const msxll::XLREF12& ref)\n          : _ref(ref)\n        {\n          _isRange = _ref.rwFirst != _ref.rwLast || _ref.colFirst != _ref.colLast;\n        }\n\n        ParsedAddress(const py::object& address, const py::object& sheetName)\n        {\n          if (PyUnicode_Check(address.ptr()))\n            addressToXlRef(to_wstring(address.ptr()), _ref, &_sheetName);\n\n          else if (PyIterable_Check(address.ptr()))\n          {\n            auto iter = py::iter(address);\n            _ref.rwFirst = py::cast<int>(*iter++);\n            _ref.colFirst = py::cast<int>(*iter++);\n            if (iter != py::iterator::sentinel())\n            {\n              _ref.rwLast = py::cast<int>(*iter++);\n              _ref.colLast = py::cast<int>(*iter++);\n            }\n            else\n            {\n              _ref.rwLast = _ref.rwFirst;\n              _ref.colLast = _ref.colFirst;\n            }\n          }\n          else\n            throw py::value_error(\"address\");\n\n          if (!sheetName.is_none())\n            _sheetName = to_wstring(sheetName);\n\n          _isRange = _ref.rwFirst != _ref.rwLast || _ref.colFirst != _ref.colLast;\n        }\n\n        auto fromRow() const { return _ref.rwFirst; }\n        auto fromCol() const { return _ref.colFirst; }\n        auto toRow()   const { return _ref.rwLast; }\n        auto toCol()   const { return _ref.colLast; }\n        auto sheet()   const { return _sheetName; }\n\n        auto tuple() const\n        {\n          if (_isRange)\n            return py::make_tuple(\n              _ref.rwFirst, _ref.colFirst,\n              _ref.rwLast, _ref.colLast);\n          else\n            return py::make_tuple(_ref.rwFirst, _ref.colFirst);\n        }\n\n        auto string(AddressStyle style) const\n        {\n          wchar_t buf[XL_FULL_ADDRESS_RC_MAX_LEN];\n          auto nWritten = xlrefToAddress(_ref, buf, sizeof(buf),\n            _sheetName, style);\n          return std::wstring(buf, nWritten);\n        }\n\n        auto address(std::string& style, const bool local) const\n        {\n          toLower(style);\n          auto s = parseAddressStyle(style);\n          if (local)\n            s |= AddressStyle::LOCAL;\n          return string(s);\n        }\n\n        auto iter() const;\n\n      private:\n        msxll::XLREF12 _ref;\n        bool _isRange;\n        std::wstring _sheetName;\n      };\n\n      class ParsedAddressIter\n      {\n      private:\n        msxll::XLREF12 _parent;\n        ParsedAddress _current;\n\n      public:\n        ParsedAddressIter(\n          const ParsedAddress& r,\n          int i, int j)\n          : _parent(r._ref)\n          , _current(msxll::XLREF12{ i, i, j, j }, r.sheet())\n        {\n        }\n\n        // Ctor for end iterator\n        ParsedAddressIter(const ParsedAddress& r)\n          : _parent(r._ref)\n          , _current(msxll::XLREF12{\n              r.toRow() + 1, r.toRow() + 1,\n              r.fromCol(), r.fromCol()\n            })\n        {\n        }\n\n        ParsedAddressIter& operator++()\n        {\n          ++_current._ref.colFirst;\n          ++_current._ref.colLast;\n          if (_current._ref.colFirst == _parent.colLast)\n          {\n            _current._ref.colFirst = _parent.colFirst;\n            _current._ref.colLast = _parent.colFirst;\n            ++_current._ref.rwFirst;\n            ++_current._ref.rwLast;\n          }\n\n          return (*this);\n        }\n\n        const ParsedAddress& operator*() const\n        {\n          return _current;\n        }\n\n        bool operator==(const ParsedAddressIter& that)\n        {\n          return memcmp(&_current._ref, &that._current._ref,\n            sizeof(msxll::XLREF12)) == 0;\n        }\n      };\n\n      auto ParsedAddress::iter() const\n      {\n        auto begin = ParsedAddressIter(*this, fromRow(), fromCol());\n        auto end = ParsedAddressIter(*this);\n        return py::make_iterator(std::move(begin), std::move(end));\n      }\n\n      static int theBinder = addBinder([](pybind11::module& mod)\n        {\n          py::class_<ParsedAddress>(mod, \"Address\",\n            R\"(\n            Converts cell addresses between different formats. This class\n            only performs manipulation on the address strings, so it is fast\n            and does not need to run on the main thread. However, it does not\n            check the validity of the addresses. \n\n            Parameters\n            ----------\n\n            address: string|tuple\n              either an address string in A1 format e.g. \"D2:R2\" or RC format, \n              e.g. \"R5C3:R6C6\" or a tuple of ints `(row, col)` or \n              `(from_row, from_col, to_row, to_col)`.  A string address may be\n              absolute (contain dollars) and contain a workbook/sheet name, separated\n              by a pling (!).  A tuple follows python conventions so is zero-based.\n\n            sheet: [string]\n              optional sheet name in case it was not passed as part of the address\n\n            )\")\n            .def(py::init<const py::object&, const py::object& >(),\n              py::arg(\"address\"),\n              py::arg(\"sheet\") = py::none())\n            .def(\"__str__\", [](ParsedAddress& x) { return x.string(AddressStyle::A1); })\n            .def(\"__iter__\",\n              &ParsedAddress::iter)\n            .def(\"__call__\",\n              &ParsedAddress::address,\n              py::arg(\"style\") = \"a1\",\n              py::arg(\"local\") = false,\n              R\"(\n              Writes the address to a string in the specified style.\n\n              Parameters\n              ----------\n              style: str\n                The address format: \"a1\" or \"rc\". To produce an absolute / fixed addresses\n                use \"$a$1\", \"$r$c\", \"$a1\", \"a$1\", etc. depending on whether you want\n                both row and column to be fixed.\n              local: bool\n                If True, omits sheet and workbook infomation.\n\n              )\")\n            .def_property_readonly(\"a1\",\n              [](ParsedAddress& x) { return x.string(AddressStyle::A1); },\n              \"The address in A1 format\")\n            .def_property_readonly(\"a1_fixed\",\n              [](ParsedAddress& x) { return x.string(AddressStyle::A1 | AddressStyle::ROW_FIXED | AddressStyle::COL_FIXED); },\n              \"The absolute address in A1 format (i.e. with $s)\")\n            .def_property_readonly(\"rc\",\n              [](ParsedAddress& x) { return x.string(AddressStyle::RC); },\n              \"The address in RC format\")\n            .def_property_readonly(\"rc_fixed\",\n              [](ParsedAddress& x) { return x.string(AddressStyle::RC | AddressStyle::ROW_FIXED | AddressStyle::COL_FIXED); },\n              \"The absolute address in RC format (i.e. with $s)\")\n            .def_property_readonly(\"tuple\", &ParsedAddress::tuple)\n            .def_property_readonly(\"from_row\", &ParsedAddress::fromRow)\n            .def_property_readonly(\"from_col\", &ParsedAddress::fromCol)\n            .def_property_readonly(\"to_row\", &ParsedAddress::toRow)\n            .def_property_readonly(\"to_col\", &ParsedAddress::toCol)\n            .def_property_readonly(\"sheet\", &ParsedAddress::sheet);\n\n        });\n    }\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/PyAddress.h",
    "content": "#include <xloil/EnumHelper.h>\n#include <string>\n\nnamespace xloil\n{\n  namespace Python\n  {\n    AddressStyle parseAddressStyle(const std::string_view& style);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyAppCallRun.cpp",
    "content": "#include \"PyAppCallRun.h\"\n#include \"PyHelpers.h\"\n#include \"TypeConversion/BasicTypes.h\"\n#include \"PyFuture.h\"\n#include \"PyCore.h\"\n#include <xloil/ExcelCall.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/AppObjects.h>\n#include <future>\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::wstring;\nusing std::string;\n\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    /// <summary>\n    /// Wraps the usual FromPyObj but converts None to Missing, which seems\n    /// more useful in the context and Range to ExcelRef which is necessary to\n    /// call many of the macro sheet commands.\n    /// </summary>\n    struct ArgFromPyObj\n    {\n      auto operator()(const py::object& obj) const\n      {\n        auto p = (PyObject*)obj.ptr();\n        if (p == Py_None)\n        {\n          return ExcelObj(ExcelType::Missing);\n        }\n        else if (isRangeType(p))\n        {\n          auto* range = obj.cast<Range*>();\n          return ExcelObj(refFromRange(*range));\n        }\n        else\n          return FromPyObjOrError()(p);\n      }\n    };\n\n    // Convert all args to Excel objects\n    auto argConvertHelper(const py::args& args)\n    {\n      auto nArgs = args.size();\n\n      vector<ExcelObj> xlArgs;\n      xlArgs.reserve(nArgs);\n\n      // Convert args with None->Missing Arg and Range->ExcelRef\n      for (auto i = 0u; i < nArgs; ++i)\n        xlArgs.emplace_back(ArgFromPyObj()(args[i]));\n\n      return std::move(xlArgs);\n    }\n\n\n    using ExcelObjFuture = PyFuture<ExcelObj, PyFromAny>;\n\n    auto callXllAsync(const py::object& func, const py::args& args)\n    {\n      // Space to convert all args to Excel objects\n      auto nArgs = args.size();\n      vector<ExcelObj> xlArgs;\n      xlArgs.reserve(nArgs);\n\n      // func can be a string or Excel function number\n      int funcNum;\n      if (PyLong_Check(func.ptr()))\n      {\n        funcNum = PyLong_AsLong(func.ptr());\n        if (funcNum < 0)\n          throw py::value_error(\"Not an Excel function: \" + std::to_string(funcNum));\n      }\n      else\n      {\n        const auto funcName = (string)py::str(func);\n        funcNum = excelFuncNumber(funcName.c_str());\n        // If we don't recognise the function name as as built-in, we try\n        // to run a UDF.\n        if (funcNum < 0)\n        {\n          funcNum = msxll::xlUDF;\n          xlArgs.insert(xlArgs.begin(), ExcelObj(funcName));\n        }\n      }\n\n      // Convert args with None->Missing Arg and Range->ExcelRef\n      for (auto i = 0u; i < nArgs; ++i)\n        xlArgs.emplace_back(ArgFromPyObj()(args[i]));\n\n      py::gil_scoped_release releaseGil;\n\n      // Run the function on the main thread\n      return ExcelObjFuture(runExcelThread([funcNum, args = std::move(xlArgs)]()\n      {\n        ExcelObj result;\n        auto ret = xloil::callExcelRaw(funcNum, &result, args.size(), args.begin());\n        if (ret != 0)\n        {\n          if (ret == msxll::xlretInvXloper && funcNum == msxll::xlUDF)\n            result = formatStr(L\"#Unrecognised function '%s'\", args[0].toString().c_str());\n          else\n            result = wstring(L\"#\") + xlRetCodeToString(ret);\n        }\n        return std::move(result);\n      }, ExcelRunQueue::XLL_API));\n    }\n\n    auto callXll(const py::object& func, const py::args& args)\n    {\n      return callXllAsync(func, args).result();\n    }\n\n    py::object applicationRun(Application& app, const wstring& funcName, const py::args& args)\n    {\n      vector<ExcelObj> xlArgs = argConvertHelper(args);\n\n      ExcelObj result;\n      {\n        py::gil_scoped_release releaseGil;\n\n        const ExcelObj* argsP[30];\n        for (size_t i = 0; i < args.size(); ++i)\n          argsP[i] = &xlArgs[i];\n        result = app.run(funcName, args.size(), argsP);\n      }\n      return PySteal(PyFromAny()(result));\n    }\n\n    ExcelObjFuture applicationRunAsync(Application& app, const wstring& funcName, const py::args& args)\n    {\n      vector<ExcelObj> xlArgs = argConvertHelper(args);\n\n      py::gil_scoped_release releaseGil;\n\n      return ExcelObjFuture(runExcelThread([\n        funcName = std::move(funcName),\n        args = std::move(xlArgs),\n        xlApp = app\n      ]() {\n        const ExcelObj* argsP[30];\n        for (size_t i = 0; i < args.size(); ++i)\n          argsP[i] = &args[i];\n        return const_cast<Application&>(xlApp).run(funcName, args.size(), argsP);\n      }));\n    }\n\n    auto appRunAsync(const wstring& func, const py::args& args)\n    {\n      return applicationRunAsync(thisApp(), func, args);\n    }\n\n    auto appRun(const wstring& func, const py::args& args)\n    {\n      return appRunAsync(func, args).result();\n    }\n\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        ExcelObjFuture::bind(mod, \"_ExcelObjFuture\");\n\n        mod.def(\"run\", \n          appRun, \n          R\"(\n            Calls VBA's `Application.Run` taking the function name and up to 30 arguments.\n            This can call any user-defined function or macro but not built-in functions.\n\n            The type and order of arguments expected depends on the function being called.\n\n            Must be called on Excel's main thread, for example in worksheet function or \n            command.\n          )\",\n          py::arg(\"func\"));\n\n        mod.def(\"run_async\", \n          appRunAsync, \n          R\"(\n            Calls VBA's `Application.Run` taking the function name and up to 30 arguments.\n            This can call any user-defined function or macro but not built-in functions.\n\n            Calls to the Excel API must be done on Excel's main thread: this async function\n            can be called from any thread but will require the main thread to be available\n            to return a result.\n\n            Returns an **awaitable**, i.e. a future which holds the result.\n          )\",\n          py::arg(\"func\"));\n\n        mod.def(\"call\", \n          callXll, \n          R\"(\n            Calls a built-in worksheet function or command or a user-defined function with the \n            given name. The name is case-insensitive; built-in functions take priority in a name\n            clash.\n            \n            The type and order of arguments expected depends on the function being called.  \n\n            `func` can be built-in function number (as an int) which slightly reduces the lookup overhead\n\n            This function must be called from a *non-local worksheet function on the main thread*.\n\n            `call` can also invoke old-style `macro sheet commands <https://docs.excel-dna.net/assets/excel-c-api-excel-4-macro-reference.pdf>`_\n          )\",\n          py::arg(\"func\"));\n\n        mod.def(\"call_async\", \n          callXllAsync, \n          R\"(\n            Calls a built-in worksheet function or command or a user-defined function with the \n            given name.  See ``xloil.call``.\n\n            Calls to the Excel API must be done on Excel's main thread: this async function\n            can be called from any thread but will require the main thread to be available\n            to return a result.\n            \n            Returns an **awaitable**, i.e. a future which holds the result.\n          )\",\n          py::arg(\"func\"));\n\n        mod.def(\"check_abort\", \n          checkAbort,\n          R\"(\n          Returns True if the user pressed the Escape key. It is good practice to poll this function \n          during long-running worksheet functions or macros.\n\n          This function runs in XLL context so should not be called from genral code.\n          )\");\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyAppCallRun.h",
    "content": "#pragma once\n\n#include <pybind11/pybind11.h>\n#include <string>\n\nnamespace xloil { class Application; }\n\nnamespace xloil\n{\n  namespace Python\n  {\n    pybind11::object applicationRun(\n      Application& app, const std::wstring& func, const pybind11::args& args);\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/PyAppObjects.cpp",
    "content": "#include \"PyCore.h\"\n#include \"PyHelpers.h\"\n#include \"TypeConversion/BasicTypes.h\"\n#include \"PyCOM.h\"\n#include \"PyCore.h\"\n#include \"PyAppCallRun.h\"\n#include \"PyAddress.h\"\n#include <xlOil/AppObjects.h>\n#include <xlOil/State.h>\n\nusing std::shared_ptr;\nusing std::wstring_view;\nusing std::vector;\nusing std::wstring;\nusing std::string;\nusing std::move;\nnamespace py = pybind11;\nusing call_release_gil = py::call_guard<py::gil_scoped_release>;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    PyTypeObject *theRangeType, *theXllRangeType, *theExcelRangeType;\n    \n    bool isRangeType(const PyObject* obj)\n    {\n      const auto* type = Py_TYPE(obj);\n      return (type == theRangeType || type == theXllRangeType || type == theExcelRangeType);\n    }\n\n    namespace\n    {\n      std::unordered_map<std::string, SpecialCells> theSpecialCellsEntries;\n\n      SpecialCells specialCellsFromString(const std::string& value)\n      {\n        auto found = theSpecialCellsEntries.find(value);\n        if (found != theSpecialCellsEntries.end())\n          return found->second;\n        throw py::value_error(value);\n      }\n\n      auto range_Construct(const wchar_t* address)\n      {\n        py::gil_scoped_release noGil; \n        return new ExcelRange(address);\n      }\n\n      /// <summary>\n      /// Creates a Range object in python given a helper functor. The \n      /// helper functor should not need the GIL. The reason for this function\n      /// is that we do not want to hold the GIL and access Excel's COM API\n      /// simutaneously \n      /// </summary>\n      template<class F>\n      py::object createPyRange(F&& f)\n      {\n        return py::cast([&] {\n          py::gil_scoped_release noGil;\n          return new ExcelRange(f());\n        }(), py::return_value_policy::take_ownership);\n      }\n\n      // Works like the Range.Range function in VBA except is zero-based\n      template <class T>\n      inline auto range_subRange(const T& r,\n        int fromR, int fromC,\n        const py::object& toR,   const py::object& toC,\n        const py::object& nRows, const py::object& nCols)\n      {\n        const auto toRow = !toR.is_none() \n          ? toR.cast<int>() \n          : (!nRows.is_none() \n            ? fromR + nRows.cast<int>() - 1 \n            : Range::TO_END);\n        const auto toCol = !toC.is_none() \n          ? toC.cast<int>() \n          : (!nCols.is_none() \n            ? fromC + nCols.cast<int>() - 1 \n            : Range::TO_END);\n        py::gil_scoped_release noGil;\n        return r.range(fromR, fromC, toRow, toCol);\n      }\n\n      inline auto range_offset(const Range& r,\n        int fromR, int fromC,\n        const py::object& nRows, const py::object& nCols)\n      {\n        const auto toRow = fromR + (!nRows.is_none() ? nRows.cast<int>() - 1 : 0);\n        const auto toCol = fromC + (!nCols.is_none() ? nCols.cast<int>() - 1 : 0);\n        py::gil_scoped_release noGil;\n        return r.range(fromR, fromC, toRow, toCol);\n      }\n\n      inline auto convertExcelObj(ExcelObj&& val)\n      {\n        return PySteal(PyFromAnyNoTrim()(val));\n      }\n\n      auto range_GetValue(const Range& r)\n      {\n        // TODO: converting Variant->ExcelObj->Python is not very efficient!\n        ExcelObj val;\n        {\n          py::gil_scoped_release noGil;\n          val = r.value();\n        }\n        return convertExcelObj(std::move(val));\n      }\n\n      void range_SetValue(Range& r, py::object pyVal)\n      {\n        // Optimise r1.value = r2\n        if (isRangeType(pyVal.ptr()))\n        {\n          const auto& range = py::cast<const Range&>(pyVal);\n          py::gil_scoped_release noGil;\n          r.set(range.value());\n        }\n        else\n        {\n          // TODO: converting Python->ExcelObj->Variant is not very efficient!\n          const auto val(FromPyObj()(pyVal.ptr()));\n          // Must release gil when setting values in as this may trigger calcs \n          // which call back into other python functions.\n          py::gil_scoped_release noGil;\n          r.set(val);\n        }\n      };\n\n      void range_Clear(Range& r)\n      {\n        py::gil_scoped_release noGil;\n        r.clear();\n      }\n      \n      auto range_Address(Range& r, std::string& style, const bool local)\n      {\n        toLower(style);\n        auto s = parseAddressStyle(style);\n        if (local)\n          s |= AddressStyle::LOCAL;\n        return r.address(s);\n      }\n\n      auto range_GetFormula(Range& r)\n      {\n        // XllRange::formula only works from non-local functions so to \n        // minimise surpise, we convert to a COM range and call 'formula'\n        ExcelObj val;\n        {\n          py::gil_scoped_release noGil; \n          val = ExcelRange(r).formula();\n        }\n        return convertExcelObj(std::move(val));\n      }\n\n      void range_SetFormula(Range& r, const py::object& pyVal)\n      { \n        const auto val(FromPyObj()(pyVal.ptr()));\n        py::gil_scoped_release noGil;\n        ExcelRange(r).setFormula(val);\n      }\n\n      void range_SetFormulaExtra(Range& r, const py::object& pyVal, std::string& how)\n      {\n        const auto val(FromPyObj()(pyVal.ptr()));\n        py::gil_scoped_release noGil;\n        toLower(how);\n        ExcelRange::SetFormulaMode mode;\n        if (how == \"\" || how == \"dynamic\")\n          mode = ExcelRange::DYNAMIC_ARRAY;\n        else if (how == \"array\")\n          mode = ExcelRange::ARRAY_FORMULA;\n        else if (how == \"implicit\")\n          mode = ExcelRange::OLD_ARRAY;\n        else\n          throw py::value_error(how);\n        ExcelRange(r).setFormula(val, mode);\n      }\n\n      py::object range_getItem(const Range& range, const py::object& loc)\n      {\n        size_t fromRow, fromCol, toRow, toCol, nRows, nCols;\n        std::tie(nRows, nCols) = range.shape();\n        const bool singleValue = getItemIndexReader2d(loc, nRows, nCols,\n          fromRow, fromCol, toRow, toCol);\n        return singleValue\n          ? convertExcelObj(range.value((int)fromRow, (int)fromCol))\n          : py::cast(range.range((int)fromRow, (int)fromCol, (int)toRow - 1, (int)toCol - 1));\n      }\n\n      int specialCellsValueHelper(const py::handle& values, int existing = 0)\n      {\n        auto p = values.ptr();\n        if (PyUnicode_Check(p))\n        {\n          auto str = to_string(p);\n          toLower(str);\n          if (str.find(\",\") != string::npos)\n          {\n            XLO_THROW(\"Not supported\");\n          }\n          if (str == \"errors\")\n            return existing | int(ExcelType::Err);\n          else if (str == \"numbers\")\n            return existing | int(ExcelType::Num);\n          else if (str == \"logical\")\n            return existing | int(ExcelType::Bool);\n          else if (str == \"text\")\n            return existing | int(ExcelType::Str);\n        }\n        else if (PyType_Check(values.ptr()))\n        {\n          if ((PyTypeObject*)p == &PyUnicode_Type)\n            return existing | int(ExcelType::Str);\n          else if ((PyTypeObject*)p == theCellErrorType)\n            return existing | int(ExcelType::Err);\n          else if ((PyTypeObject*)p == &PyFloat_Type)\n            return existing | int(ExcelType::Num);\n          else if ((PyTypeObject*)p == &PyBool_Type)\n            return existing | int(ExcelType::Bool);\n        }\n        else if (PyIterable_Check(values.ptr()))\n        {\n          auto iter = py::iter(values);\n          while (iter != py::iterator::sentinel())\n          {\n            existing = specialCellsValueHelper(*iter, existing);\n            ++iter;\n          }\n          return existing;\n        }\n\n        throw py::value_error(\"values\");\n      }\n\n      py::object range_SpecialCells(\n        Range& r,\n        const py::object& type, \n        const py::object& values)\n      {\n        const auto specialCellsType = PyUnicode_Check(type.ptr())\n          ? specialCellsFromString(to_string(type))\n          : py::cast<SpecialCells>(type);\n\n        int cellValues = 0;\n        if (!values.is_none())\n          cellValues = specialCellsValueHelper(values);\n\n        py::gil_scoped_release noGil;\n        auto result = ExcelRange(r).specialCells(\n          specialCellsType, (ExcelType)cellValues);\n        if (!result.valid())\n          return py::none();\n        else\n          return py::cast(result);\n      }\n\n      py::object range_Areas(Range& r)\n      {\n        if (r.nAreas() == 1)\n          return py::make_tuple(py::cast(r));\n\n        // If nAreas > 1, we must already be a com range\n        auto excelRange = dynamic_cast<ExcelRange*>(&r);\n        if (!excelRange)\n          XLO_THROW(\"Internal Error: unexpected range\");\n\n        vector<ExcelRange> areas;\n        {\n          py::gil_scoped_release noGil;\n          areas = excelRange->areas().list();\n        }\n\n        return py::cast(areas);\n      }\n\n      pybind11::typing::Iterator<xloil::Range> range_Iter(Range& r)\n      {\n        auto noGil = std::make_unique<py::gil_scoped_release>();\n\n        auto excelRange = dynamic_cast<ExcelRange*>(&r);\n        if (excelRange)\n        {\n          auto begin = excelRange->begin();\n          auto end = excelRange->end();\n          noGil.reset();\n          return py::make_iterator(std::move(begin), std::move(end));\n        }\n        auto xllRange = dynamic_cast<XllRange*>(&r);\n        if (xllRange)\n        {\n          auto begin = xllRange->begin();\n          auto end = xllRange->end();\n          noGil.reset();\n          return py::make_iterator(std::move(begin), std::move(end));\n        }\n\n        XLO_THROW(\"Range Iterator: internal error, unexpected type\");\n      }\n      // This is clearly not a very optimised implementation as the values\n      // must be converted to / from ExcelObj and possibly Variant several times. \n      // However, it's not clear the that effort of writing ExcelObj and Variant  \n      // operators for all relevant types would give worthwhile performance gains.\n      auto range_InplaceArithmetic(\n        const char* operation,\n        py::object& self,\n        const py::object& value)\n      {\n        auto oper = py::module::import(\"operator\").attr(operation);\n        auto& range = py::cast<Range&>(self);\n        auto lhs = range_GetValue(range);\n        lhs = oper(lhs, value);\n        range_SetValue(range, lhs);\n        return self;\n      }\n\n      // TODO: do this with templates in C++20\n#define XLOIL_RANGE_OPERATOR(op) \\\n  [](py::object& self, const py::object& v) { return range_InplaceArithmetic(op, self, v); }\n\n      inline Range* worksheet_subRange(const ExcelWorksheet& ws,\n        int fromR, int fromC,\n        const py::object& toR, const py::object& toC,\n        const py::object& nRows, const py::object& nCols)\n      {\n        return new ExcelRange(range_subRange<ExcelWorksheet>(\n          ws, fromR, fromC, toR, toC, nRows, nCols));\n      }\n\n      auto Worksheet_sliceHelper(\n        const ExcelWorksheet& ws, const py::object& loc)\n      {\n        if (PyUnicode_Check(loc.ptr()))\n        {\n          const auto address = to_wstring(loc);\n          py::gil_scoped_release noGil;\n          return ws.range(address);\n        }\n        else\n        {\n          size_t fromRow, fromCol, toRow, toCol, nRows, nCols;\n          std::tie(nRows, nCols) = ws.shape();\n          getItemIndexReader2d(loc, nRows, nCols,\n            fromRow, fromCol, toRow, toCol);\n\n          py::gil_scoped_release noGil;\n          return ws.range(\n            (int)fromRow, (int)fromCol, (int)toRow - 1, (int)toCol - 1);\n        }\n      }\n\n      py::object worksheet_GetItem(\n        const ExcelWorksheet& ws, const py::object& loc)\n      {\n        return py::cast(Worksheet_sliceHelper(ws, loc));\n      }\n\n      void worksheet_SetItem(\n        const ExcelWorksheet& ws, \n        const py::object& loc, \n        const py::object& pyValue)\n      {\n        ExcelObj value;\n\n        if (isRangeType(pyValue.ptr()))\n        {\n          const auto& range = py::cast<const Range&>(pyValue);\n          py::gil_scoped_release noGil;\n          value = range.value();\n        }\n        else\n          value = FromPyObj()(pyValue.ptr());\n\n        auto sliced = Worksheet_sliceHelper(ws, loc);\n\n        py::gil_scoped_release noGil;\n        if (value.asStringView()._Starts_with(L\"=\"))\n          sliced.setFormula(value);\n        else\n          sliced.set(value);\n      }\n\n      py::object application_range(const Application& app, const std::wstring& address)\n      {\n        return createPyRange([&]() { return ExcelRange(address, app); });\n      }\n\n      py::object workbook_range(const ExcelWorkbook& wb, const std::wstring& address)\n      {\n        return application_range(wb.app(), address);\n      }\n\n      py::object workbook_GetItem(const ExcelWorkbook& wb, const py::object& loc)\n      {\n        // Somewhat unfortunately, since ExcelRange is a virtual child of the \n        // Range class declared in pybind, we need to pass a ptr to py::cast\n        // which python can own, so we need to copy it (but with an rval ref)\n        if (PyLong_Check(loc.ptr()))\n        {\n          auto i = PyLong_AsLong(loc.ptr());\n          auto worksheets = wb.worksheets();\n          if (i < 0 || i >= (long)worksheets.count())\n            throw py::index_error();\n\n          return py::cast(wb.worksheets().list()[i]);\n        }\n        else\n        {\n          // If loc string contains '!' it must an address. Otherwise it\n          // might be a worksheet name. If it isn't that it may be a named\n          // range we just pass it to Application.Range\n          auto address = to_wstring(loc);\n          if (address.empty())\n            throw py::value_error();\n          else if (address.find(L'!') != wstring::npos)\n            return workbook_range(wb, address);\n          else \n          {\n            ExcelWorksheet ws(nullptr);\n            bool isSheet;\n            {\n              py::gil_scoped_release noGil;\n              // Remove quotes around worksheet name - these appear in\n              // addresses if the sheet name contains spaces\n              if (address[0] == L'\\'' && address.length() > 2)\n                address = address.substr(1, address.length() - 2);\n              isSheet = wb.worksheets().tryGet(address, ws);\n            }\n            if (isSheet)\n              return py::cast(ws);\n            else\n              return workbook_range(wb, address);\n          }\n        }\n      }\n\n      py::object Workbook_SetItem(\n        const ExcelWorkbook& wb, const py::object& loc, py::object& value)\n      {\n        auto item = workbook_GetItem(wb, loc);\n        auto hasSet = PyObject_GetAttrString(item.ptr(), \"set\");\n        if (!hasSet)\n          throw py::index_error(\"When using `workbook[X] = Y`, the index X must resolve to a Range\");\n        PySteal(hasSet)(value);\n      }\n\n      py::object Context_Enter(const py::object& x)\n      {\n        return x;\n      }\n\n      void Workbook_Exit(\n        ExcelWorkbook& wb, \n        const py::object& /*exc_type*/, \n        const py::object& /*exc_val*/, \n        const py::object& /*exc_tb*/)\n      {\n        // Close *without* saving - saving must be done explicitly\n        wb.close(false); \n      }\n\n      void Application_Exit(\n        Application& app,\n        const py::object& /*exc_type*/,\n        const py::object& /*exc_val*/,\n        const py::object& /*exc_tb*/)\n      {\n        // Close *without* saving - saving must be done explicitly\n        app.quit(true);\n      }\n\n      Application application_Construct(\n        const py::object& com,\n        const py::object& hwnd,\n        const py::object& wbName)\n      {\n        size_t hWnd = 0;\n        wstring workbook;\n\n        if (!com.is_none())\n        {\n          // TODO: we could get the underlying COM ptr depending on use of comtypes/pywin32\n          hWnd = py::cast<size_t>(com.attr(\"hWnd\")());\n        }\n        else if (!hwnd.is_none())\n          hWnd = py::cast<size_t>(hwnd);\n        else if (!wbName.is_none())\n          workbook = to_wstring(wbName);\n\n        py::gil_scoped_release noGil;\n        if (hWnd != 0)\n          return Application(hWnd);\n        else if (!workbook.empty())\n          return Application(workbook.c_str());\n        else\n          return Application();\n      }\n\n      auto application_Open(\n        Application& app,\n        const wstring& filepath,\n        bool updateLinks,\n        bool readOnly,\n        const py::object& delimiter)\n      {\n        auto delim = delimiter.is_none() ? wchar_t(0) : to_wstring(delimiter).front();\n        py::gil_scoped_release noGil;\n        return app.open(filepath, updateLinks, readOnly, delim);\n      }\n\n      template<class T>\n      py::object castInvalidToNone(T obj)\n      {\n        return obj.valid() ? py::cast(obj) : py::none();\n      }\n\n      auto application_ActiveWorksheet(Application& app)\n      {\n        ExcelWorksheet obj;\n        {\n          py::gil_scoped_release noGil;\n          obj = app.activeWorksheet();\n        }\n        return castInvalidToNone(obj);\n      }\n\n      auto application_ActiveWorkbook(Application& app)\n      {\n        ExcelWorkbook obj;\n        {\n          py::gil_scoped_release noGil;\n          obj = app.workbooks().active();\n        }\n        return castInvalidToNone(obj);\n      }\n\n      auto application_ActiveCell(Application& app)\n      {\n        ExcelRange obj;\n        {\n          py::gil_scoped_release noGil;\n          obj = app.activeCell();\n        }\n        return castInvalidToNone(obj);\n      }\n\n      auto application_Selection(Application& app)\n      {\n        ExcelRange obj;\n        {\n          py::gil_scoped_release noGil;\n          obj = app.selection();\n        }\n        return castInvalidToNone(obj);\n      }\n\n      auto application_Run(Application& app, const std::wstring& func, const pybind11::args& args)\n      {\n        return applicationRun(app, func, args);\n      }\n\n      auto CallerInfo_Ctor()\n      {\n        if (!isCallerInfoSafe())\n          throw py::value_error(\"CallerInfo is not available in this context\");\n        return CallerInfo();\n      }\n\n      auto CallerInfo_Address(const CallerInfo& self, std::string& style, bool local)\n      {\n        toLower(style);\n        auto s = parseAddressStyle(style);\n        if (local)\n          s |= AddressStyle::LOCAL;\n\n        py::gil_scoped_release noGil;\n        return self.address(s);\n      }\n\n      template<class T>\n      struct BindCollection\n      {\n        T _collection;\n\n        template<class V> BindCollection(const V& x)\n          : _collection(x)\n        {}\n\n        using value_t = decltype(_collection.get(wstring()));\n\n        auto getitem(const wstring& name)\n        {\n          try\n          {\n            py::gil_scoped_release noGil;\n            return _collection.get(name.c_str());\n          }\n          catch (...)\n          {\n            throw py::key_error();\n          }\n        }\n\n        py::object getdefaulted(const wchar_t* name, const py::object& defaultVal)\n        {\n          value_t result(nullptr);\n          if (_collection.tryGet(name, result))\n            return py::cast(result);\n          return defaultVal;\n        }\n\n        auto iter()\n        {\n          auto noGil = std::make_unique<py::gil_scoped_release>();\n          auto begin = _collection.begin();\n          auto end = _collection.end();\n          noGil.reset();\n\n          return py::make_iterator(std::move(begin), std::move(end));\n        }\n\n        size_t count() const { return _collection.count(); }\n\n        bool contains(const wchar_t* name) const\n        {\n          value_t result(nullptr);\n          return _collection.tryGet(name, result);\n        }\n\n        template<class K>\n        static auto _bind(K&& klass)\n        {\n          using this_t = BindCollection<T>;\n\n          return klass\n            .def(\"__getitem__\", &getitem)\n            .def(\"__iter__\", &iter)\n            .def(\"__len__\", &count)\n            .def(\"__contains__\", &contains)\n            .def(\"get\",\n              &getdefaulted,\n              R\"(\n                Tries to get the named object, returning the default if not found\n              )\",\n              py::arg(\"name\"),\n              py::arg(\"default\") = py::none());\n        }\n\n        static auto startBinding(\n          const py::module& mod,\n          const char* name,\n          const char* doc = nullptr)\n        {\n          return _bind(\n            py::class_<BindCollection<T>>(mod, name, doc));\n        }\n      };\n\n      template<class T>\n      struct BindCollectionWithActive : public BindCollection<T>\n      {\n        using BindCollection<T>::BindCollection;\n\n        py::object active()\n        {\n          value_t obj(nullptr);\n          {\n            py::gil_scoped_release noGil;\n            obj = _collection.active();\n          }\n          if (!obj.valid())\n            return py::none();\n          return py::cast(std::move(obj));\n        }\n\n        static auto startBinding(\n          const py::module& mod,\n          const char* name,\n          const char* doc = nullptr)\n        {\n          return BindCollection<T>::_bind(\n            py::class_<BindCollectionWithActive<T>>(mod, name, doc))\n            .def_property_readonly(\"active\",\n              &active,\n              R\"(\n                Gives the active (as displayed in the GUI) object in the collection\n                or None if no object has been activated.\n              )\");\n        }\n      };\n\n      ExcelWorksheet addWorksheetToWorkbook(\n        const ExcelWorkbook& wb,\n        const py::object& name,\n        const py::object& before,\n        const py::object& after)\n      {\n        auto cName   = name.is_none()   ? wstring() : to_wstring(name);\n        auto cBefore = before.is_none() ? ExcelWorksheet(nullptr) : before.cast<ExcelWorksheet>();\n        auto cAfter  = after.is_none()  ? ExcelWorksheet(nullptr) : after.cast<ExcelWorksheet>();\n\n        py::gil_scoped_release noGil;\n        return wb.add(cName, cBefore, cAfter);\n      }\n\n      auto addWorksheetToCollection(\n        BindCollectionWithActive<Worksheets>& worksheets,\n        const py::object& name,\n        const py::object& before,\n        const py::object& after)\n      {\n        return addWorksheetToWorkbook(\n          worksheets._collection.parent(), \n          name, before, after);\n      }\n\n      template<class T>\n      auto toCom(T& p, const char* binder)\n      {\n        return comToPy(p.com(), binder);\n      }\n\n      template<>\n      auto toCom(Range& range, const char* binder)\n      {\n        // Constructing an ExcelRange from another ExcelRange is cheap\n        return comToPy(ExcelRange(range).com(), binder);\n      }\n\n      template<class T>\n      auto getComAttr(T& p, const char* attrName)\n      {\n        return py::getattr(toCom(p, \"\"), attrName);\n      }\n\n      template<class T>\n      void setComAttr(py::object& self, const py::object& attrName, const py::object& value)\n      {\n        if (PyBaseObject_Type.tp_setattro(self.ptr(), attrName.ptr(), value.ptr()) == 0)\n          return;\n        PyErr_Clear();\n        py::setattr(toCom(py::cast<T&>(self), \"\"), attrName, value);\n      }\n    } // namespace anon\n\n    static int theBinder = addBinder([](py::module& mod)\n    {\n      static constexpr const char* toComDocString = R\"(\n          Returns a managed COM object which can be used to invoke Excel's full \n          object model. For details of the available calls see the Microsoft \n          documentation on the Excel Object Model. The ``lib`` used to provide COM\n          support can be 'comtypes' or 'win32com'. If omitted, the default is \n          'win32com', unless specified in the XLL's ini file.\n      )\";\n      static constexpr const char* appDocString = R\"(\n          Returns the parent `xloil.Application` object associated with this object.\n      )\";\n      static constexpr const char* workbookAddDocString = R\"(\n        Add a worksheet, returning a `Worksheet` object.\n\n        Parameters\n        ----------\n        name: str\n          Names the worksheet, otherwise it will have an Excel-assigned name\n        before: Worksheet\n          Places the new worksheet immediately before this Worksheet object \n        after: Worksheet\n          Places the new worksheet immediately before this Worksheet object.\n          Specifying both `before` and `after` raises an exception.\n      )\";\n\n#define XLO_CITE_API_SUFFIX(what, suffix) \"See `Excel.\" #what \" <https://docs.microsoft.com/en-us/office/vba/api/excel.\" #what #suffix\">`_ \"\n#define XLO_CITE_API(what) XLO_CITE_API_SUFFIX(what, what)\n      \n      auto specialCellsEnum = py::BetterEnum<SpecialCells>(mod, \"SpecialCells\")\n        .value(\"blanks\", SpecialCells::Blanks, \"Empty cells\")\n        .value(\"constants\", SpecialCells::Constants, \"Cells containing constants\")\n        .value(\"formulas\", SpecialCells::Formulas, \"Cells containing formulas\")\n        .value(\"last_cell\", SpecialCells::LastCell, \"The last cell in the used range\")\n        .value(\"comments\", SpecialCells::Comments, \"Cells containing notes\")\n        .value(\"visible\", SpecialCells::Visible, \"All visible cells\")\n        .value(\"all_format\", SpecialCells::AllFormatConditions, \"Cells of any format\")\n        .value(\"same_format\", SpecialCells::SameFormatConditions, \"Cells having the same format\")\n        .value(\"all_validation\", SpecialCells::AllValidation, \"Cells having validation criteria\")\n        .value(\"same_validation\", SpecialCells::SameValidation, \"Cells having the same validation criteria\");\n\n      theSpecialCellsEntries = specialCellsEnum.entries;\n\n      // It used to be possible to support string conversion via \n      //    py::implicitly_convertible<std::string, Enum>()\n      // But this seems to be perma-broken with the follow issue open for years:\n      // https://github.com/pybind/pybind11/issues/2114\n      // Leaving this note here in case a hero emerges to tackle the pybind issue.\n\n\n      // We \"forward declare\" all our classes before defining their functions\n      // so that when the definition happens pybind knows about the python types\n      // being returned and can generate the correct docstring and type hints\n      \n      auto declare_Application = py::class_<Application>(mod, \"Application\",\n        R\"(\n          Manages a handle to the *Excel.Application* object. This object is the root \n          of Excel's COM interface and supports a wide range of operations.\n\n          In addition to the methods known to python, properties and methods of the \n          Application object can be resolved dynamically at runtime. The available methods\n          will be familiar to VBA programmers and are well documented by Microsoft, \n          see `Object Model Overview <https://docs.microsoft.com/en-us/visualstudio/vsto/excel-object-model-overview>`_\n\n          Note COM methods and properties are in UpperCamelCase, whereas python ones are \n          lower_case.\n\n          Examples\n          --------\n\n          To get the name of the active worksheet:\n\n          ::\n\n              return xlo.app().ActiveWorksheet.Name\n\n          )\" XLO_CITE_API_SUFFIX(Application, (object)));\n\n      auto declare_Range = py::class_<Range>(mod, \"Range\", R\"(\n          Represents a cell, a row, a column or a selection of cells containing a contiguous \n          blocks of cells. (Non contiguous ranges are not currently supported).\n          This class allows direct access to an area on a worksheet. It uses similar \n          syntax to Excel's Range object, supporting the ``cell`` and ``range`` functions,  \n          however indices are zero-based as per python's standard.\n\n          A Range can be accessed and sliced using the usual syntax (the slice step must be 1):\n\n          ::\n\n              x[1, 1] # The *value* at (1, 1) as a python type: int, str, float, etc.\n\n              x[1, :] # The second row as another Range object\n\n              x[:-1, :-1] # A sub-range omitting the last row and column\n\n          Ranges support the iterator protocol with iteration over the individual cells.\n          Iteration takes place column-wise then row-wise within each range area:\n\n          ::\n              \n              for cell in my_range.special_cells(\"constants\", float):\n                cell.value += 1\n \n          )\" XLO_CITE_API_SUFFIX(Range, (object)));\n\n      auto declare_Worksheet = py::class_<ExcelWorksheet>(mod, \"Worksheet\",\n        R\"(\n          Allows access to ranges and properties of a worksheet. It uses similar \n          syntax to Excel's Worksheet object, supporting the ``cell`` and ``range`` functions, \n          however indices are zero-based as per python's standard.\n\n          )\" XLO_CITE_API(Worksheet));\n\n      auto declare_Workbook = py::class_<ExcelWorkbook>(mod, \"Workbook\",\n        R\"(\n          A handle to an open Excel workbook.\n          )\" XLO_CITE_API(Workbook));\n\n      auto declare_Window = py::class_<ExcelWindow>(mod, \"ExcelWindow\",\n        R\"(\n          A document window which displays a view of a workbook.\n          )\" XLO_CITE_API(Window));\n\n      using PyWorkbooks = BindCollectionWithActive<Workbooks>;\n      using PyWindows = BindCollectionWithActive<Windows>;\n      using PyWorksheets = BindCollectionWithActive<Worksheets>;\n\n      PyWorkbooks::startBinding(mod, \"Workbooks\",\n        R\"(\n          A collection of all the Workbook objects that are currently open in the \n          Excel application.  The collection is iterable.\n          \n          )\" XLO_CITE_API(Workbooks))\n        .def(\"add\",\n          [](PyWorkbooks& self) { return self._collection.add(); },\n          R\"(\n            Creates and returns a new workbook with an Excel-assigned name\n          )\");\n\n      PyWindows::startBinding(mod, \"ExcelWindows\",\n        R\"(\n          A collection of all the document window objects in Excel. A document window \n          shows a view of a Workbook.  The collection is iterable.\n\n          )\" XLO_CITE_API(Windows));\n\n      PyWorksheets::startBinding(mod, \"Worksheets\",\n        R\"(\n          A collection of all the Worksheet objects in the specified or active workbook. \n          The collection is iterable.\n\n          )\" XLO_CITE_API(Worksheets))\n        .def(\"add\",\n          addWorksheetToCollection,\n          workbookAddDocString,\n          py::arg(\"name\") = py::none(),\n          py::arg(\"before\") = py::none(),\n          py::arg(\"after\") = py::none());\n\n      declare_Range\n        .def(py::init(std::function(range_Construct)), \n          py::arg(\"address\"))\n        .def(\"range\", \n          range_subRange<Range>,\n          R\"(\n            Creates a subrange using offsets from the top left corner of the parent range.\n            Like Excel's Range function, we allow negative offsets to select ranges outside the\n            parent.\n\n            Parameters\n            ----------\n\n            from_row: int\n                Starting row offset from the top left of the parent range. Zero-based. Can be negative\n\n            from_col: int\n                Starting row offset from the top left of the parent range. Zero-based. Can be negative\n\n            to_row: int\n                End row offset from the top left of the parent range. This row will be *included* in \n                the range. The offset is zero-based and can be negative to select ranges outside the\n                parent range. Do not specify both `to_row` and `num_rows`.\n\n            to_col: int\n                End column offset from the top left of the parent range. This column will be *included*\n                in the range. The offset is zero-based and can be negative to select ranges outside \n                the parent range. Do not specify both `to_col` and `num_cols`.\n\n            num_rows: int\n                Number of rows in output range. Must be positive. If neither `num_rows` or `to_rows` \n                are specified, the range ends at the last row of the parent range.\n\n            num_cols: int\n                Number of columns in output range. Must be positive. If neither `num_cols` or `to_cols` \n                are specified, the range ends at the last column of the parent range.\n          )\",\n          py::arg(\"from_row\") = 0,\n          py::arg(\"from_col\") = 0,\n          py::arg(\"to_row\")   = py::none(),\n          py::arg(\"to_col\")   = py::none(),\n          py::arg(\"num_rows\") = py::none(),\n          py::arg(\"num_cols\") = py::none())\n        .def(\"offset\",\n          range_offset,\n          R\"(\n            Similar to the *range* function, but with different defaults  \n\n            Parameters\n            ----------\n\n            from_row: int\n                Starting row offset from the top left of the parent range. Zero-based, can be negative\n\n            from_col: int\n                Starting row offset from the top left of the parent range. Zero-based, can be negative\n\n            num_rows: int\n                Number of rows in output range. Defaults to 1\n\n            num_cols: int\n                Number of columns in output range. Defaults to 1.\n          )\",\n          py::arg(\"from_row\"),\n          py::arg(\"from_col\"),\n          py::arg(\"num_rows\") = py::none(),\n          py::arg(\"num_cols\") = py::none())\n        .def(\"cell\", \n          &Range::cell,\n          call_release_gil(),\n          R\"(\n            Returns a Range object which consists of a single cell. The indices are zero-based \n            from the top left of the parent range.\n          )\",\n          py::arg(\"row\"),\n          py::arg(\"col\"))\n        .def(\"trim\",\n          &Range::trim,\n          call_release_gil(),\n          R\"(\n            Returns a sub-range by trimming to the last non-empty (i.e. not Nil, #N/A or \"\") \n            row and column. The top-left remains the same so the function always returns\n            at least a single cell, even if it's empty.  \n          )\")\n        .def(\"__iter__\", \n          range_Iter)\n        .def(\"__getitem__\", \n          range_getItem,\n          R\"(\n            Given a 2-tuple, slices the range to return a sub Range or a single element.Uses\n            normal python slicing conventions i.e. [left included, right excluded), negative\n            numbers are offset from the end. If the tuple specifies a single cell, returns\n            the value in that cell, otherwise returns a Range object.\n          )\")\n        .def(\"__len__\", \n          [](const Range& r) { return r.nRows() * r.nCols(); },\n          call_release_gil())\n        .def(\"__str__\", \n          [](const Range& r) { return r.address(); },\n          call_release_gil())\n        .def(\"__iadd__\", XLOIL_RANGE_OPERATOR(\"iadd\"))\n        .def(\"__isub__\", XLOIL_RANGE_OPERATOR(\"isub\"))\n        .def(\"__imul__\", XLOIL_RANGE_OPERATOR(\"imul\"))\n        .def(\"__itruediv__\", XLOIL_RANGE_OPERATOR(\"itruediv\"))\n        .def_property(\"value\",\n          range_GetValue, range_SetValue,\n          R\"(\n            Property which gets or sets the value for a range. A fetched value is converted\n            to the most appropriate Python type using the normal generic converter.\n\n            If you use a horizontal array for the assignment, it is duplicated down to fill \n            the entire rectangle. If you use a vertical array, it is duplicated right to fill \n            the entire rectangle. If you use a rectangular array, and it is too small for the \n            rectangular range you want to put it in, that range is padded with #N/As.\n          )\",\n          py::return_value_policy::automatic)\n        .def(\"set\", \n          range_SetValue,\n          R\"(\n            Sets the data in the range to the provided value. If a single value is passed\n            all cells will be set to the value. If a 2d-array is provided, the array will be\n            pasted at the top-left of the range with the remainging cells being set to #N/A.\n            If a 1d array is provided it will be pasted at the top left and repeated down or\n            right depending on orientation.\n          )\")\n        .def(\"clear\",\n          range_Clear,\n          R\"(\n            Clears all values and formatting.  Any cell in the range will then have Empty type.\n          )\")\n        .def(\"address\", \n          range_Address,\n          call_release_gil(),\n          R\"(\n            Writes the address to a string in the specified style, e.g. *[Book]SheetNm!A1:Z5*.\n\n            Parameters\n            ----------\n            style: str\n              The address format: \"a1\" or \"rc\". To produce an absolute / fixed addresses\n              use \"$a$1\", \"$r$c\", \"$a1\", \"a$1\", etc. depending on whether you want\n              both row and column to be fixed.\n            local: bool\n              If True, omits sheet and workbook infomation.\n          )\",\n          py::arg(\"style\") = \"a1\",\n          py::arg(\"local\") = false)\n        .def(\"special_cells\", \n          range_SpecialCells, \n          py::arg(\"kind\"),\n          py::arg(\"values\"),\n          R\"(\n            Returns a sub-range containg only cells of a specificed type or None if none \n            are found.  Behaves like VBA's `SpecialCells <https://learn.microsoft.com/en-us/office/vba/api/excel.range.specialcells>`_.\n            The returned range is likely to be a multi-area range, you can use the `xloil.range.areas`\n            property or a range iterator to step through the returned value.\n\n            Parameters\n            ----------\n\n            kind: xloil.SpecialCells | str\n              The kind of cells to return, a string value is convertered to the corresponding \n              enum value\n\n            values: Optional[type | str | Iterable[type|str]]\n              If `kind` is \"constants\" or \"formulas\", determine which types of cells to return.\n              If the argument is omitted, all constants or formulas will be returned\n              The argument can be one or an iterable of:\n                * \"errors\" or *xloil.CellError*\n                * \"numbers\" or *float*\n                * \"logical\" or *bool*\n                * \"text\" or *str*\n          )\")\n        .def_property_readonly(\"nrows\", \n          &Range::nRows,\n          call_release_gil(),\n          \"Returns the number of rows in the range\")\n        .def_property_readonly(\"ncols\", \n          &Range::nCols,\n          call_release_gil(),\n          \"Returns the number of columns in the range\")\n        .def_property_readonly(\"shape\", \n          &Range::shape,\n          call_release_gil(),\n          \"Returns a tuple (num columns, num rows)\")\n        .def_property_readonly(\"row\", \n          [](Range& r) { return std::get<0>(r.bounds()); },\n          call_release_gil())\n        .def_property_readonly(\"column\",\n          [](Range& r) { return std::get<1>(r.bounds()); },\n          call_release_gil())\n        .def_property_readonly(\"bounds\", \n          &Range::bounds,\n          call_release_gil(),\n          R\"(\n            Returns a zero-based tuple (top-left-row, top-left-col, bottom-right-row, bottom-right-col)\n            which defines the Range area (currently only rectangular ranges are supported).\n          )\")\n        .def_property_readonly(\"areas\",\n          &range_Areas,\n          R\"(\n            For a rectangular range, the property returns a 1-element list containing the range itself.\n            For a multiple-area range, the property returns a list of the contigous/rectangular sub-ranges.\n          )\")\n        .def_property(\"formula\", \n          range_GetFormula, range_SetFormula,\n          R\"(\n            Get / sets the formula for the range. If the cell contains a constant, this property returns \n            the value. If the cell is empty, this property returns an empty string. If the cell contains\n            a formula, the property returns the formula that would be displayed in the formula bar as a\n            string.  If the range is larger than one cell, the property returns an array of the values  \n            which would be obtained calling `formula` on each cell.\n            \n            When setting, if the range is larger than one cell and a single value is passed that value\n            is filled into each cell. Alternatively, you can set the formula to an array of the same \n            dimensions.\n          )\")\n        .def(\"set_formula\", range_SetFormulaExtra, \n          R\"(\n            The `how` parameter allows setting a range formula in a different way to setting its \n            `formula` property. It's unlikely you will need to use this functionality with modern\n            Excel sheets. \n\n              * *dynamic* (or omitted): identical to setting the `formula` property\n              * *array*: if the target range is larger than one cell and a single string is passed,\n                set this as an array formula for the range\n              * *implicit*: uses old-style implicit intersection - see \"Formula vs Formula2\" on MSDN\n\n          )\", \n          py::arg(\"formula\"), \n          py::arg(\"how\") = \"\")\n        .def_property_readonly(\"has_formula\", &Range::hasFormula,\n          R\"(\n          Returns True if every cell in the range contains a formula, False if no cell\n          contains a formula and None otherwise.\n          )\")\n        .def(\"to_com\", \n          toCom<Range>,\n          toComDocString, \n          py::arg(\"lib\") = \"\")\n        .def(\"__getattr__\",\n          getComAttr<Range>)\n        .def(\"__setattr__\",\n          setComAttr<Range>)\n        .def_property_readonly(\"parent\", \n          [](const Range& r) { return ExcelRange(r).parent(); },\n          call_release_gil(),\n          \"Returns the parent Worksheet for this Range\");\n\n      theRangeType = (PyTypeObject*)declare_Range.ptr();\n\n      theExcelRangeType = (PyTypeObject*)\n        py::class_<ExcelRange, Range>(mod, \"_ExcelRange\").ptr();\n\n      theXllRangeType = (PyTypeObject*)\n        py::class_<XllRange, Range>(mod, \"_XllRange\").ptr();\n\n      declare_Worksheet\n        .def(\"__str__\", \n          &ExcelWorksheet::name,\n          call_release_gil())\n        .def_property_readonly(\"name\", \n          &ExcelWorksheet::name,\n          call_release_gil())\n        .def_property_readonly(\"parent\", \n          &ExcelWorksheet::parent,\n          call_release_gil(),\n          \"Returns the parent Workbook for this Worksheet\")\n        .def_property_readonly(\"app\", \n          &ExcelWorksheet::app,\n          call_release_gil(),\n          appDocString)\n        .def(\"__getitem__\", \n          worksheet_GetItem,\n          R\"(\n            If the argument is a string, returns the range specified by the local address, \n            equivalent to ``at``.  \n            \n            If the argument is a 2-tuple, slices the sheet to return an xloil.Range.\n            Uses normal python slicing conventions, i.e [left included, right excluded), negative\n            numbers are offset from the end.\n          )\")\n        .def(\"__setitem__\", \n          worksheet_SetItem, \n          R\"(\n            Slices a range as per __getitem__. If the value being set starts with a equals sign \n            (=), the range formula is set, otherwise the value is set.  To force setting the value\n            assign to `Range.value` instead.\n          )\")\n        .def(\"range\", \n          worksheet_subRange,\n          R\"(\n            Specifies a range in this worksheet.\n\n            Parameters\n            ----------\n\n            from_row: int\n                Starting row offset from the top left of the parent range. Zero-based.\n\n            from_col: int\n                Starting row offset from the top left of the parent range. Zero-based.\n\n            to_row: int\n                End row offset from the top left of the parent range. This row will be *included* in \n                the range. The offset is zero-based. Do not specify both `to_row` and `num_rows`.\n\n            to_col: int\n                End column offset from the top left of the parent range. This column will be *included*  \n                in the range. The offset is zero-based. Do not specify both `to_col` and `num_cols`.\n\n            num_rows: int\n                Number of rows in output range. Must be positive. If neither `num_rows` or `to_rows` \n                are specified, the range ends at the end of the sheet.\n\n            num_cols: int\n                Number of columns in output range. Must be positive. If neither `num_cols` or `to_cols` \n                are specified, the range ends at the end of the sheet.\n          )\",\n          py::arg(\"from_row\") = 0,\n          py::arg(\"from_col\") = 0,\n          py::arg(\"to_row\") = py::none(),\n          py::arg(\"to_col\") = py::none(),\n          py::arg(\"num_rows\") = py::none(),\n          py::arg(\"num_cols\") = py::none())\n        .def(\"cell\", \n          [](const ExcelWorksheet& self, int row, int col)\n          {\n            return new ExcelRange(self.cell(row, col));\n          },\n          call_release_gil(),\n          R\"(\n            Returns a Range object which consists of a single cell. The indices are zero-based \n            from the top left of the parent range.\n          )\",\n          py::arg(\"row\"),\n          py::arg(\"col\"))\n        .def(\"at\",\n          [](const ExcelWorksheet& self, const wstring& address)\n          {\n            return self.range(address);\n          },\n          call_release_gil(),\n          \"Returns the range specified by the local address, e.g. ``.at('B3:D6')``\",\n          py::arg(\"address\"))\n        .def(\"calculate\", \n          &ExcelWorksheet::calculate,\n          call_release_gil(),\n          \"Calculates this worksheet\")\n        .def(\"activate\", \n          &ExcelWorksheet::activate,\n          call_release_gil(),\n          \"Makes this worksheet the active sheet\")\n        .def_property_readonly(\"used_range\",\n          &ExcelWorksheet::usedRange,\n          call_release_gil(),\n          \"Returns a Range object that represents the used range on the worksheet\")\n        .def(\"to_com\", \n          toCom<ExcelWorksheet>, \n          toComDocString, \n          py::arg(\"lib\") = \"\")\n        .def(\"__getattr__\",\n          getComAttr<ExcelWorksheet>)\n        .def(\"__setattr__\",\n          setComAttr<ExcelWorksheet>);\n        \n      declare_Workbook\n        .def(\"__str__\", \n          &ExcelWorkbook::name,\n          call_release_gil())\n        .def_property_readonly(\n          \"name\", \n          &ExcelWorkbook::name,\n          call_release_gil())\n        .def_property_readonly(\n          \"path\",\n          &ExcelWorkbook::path,\n          call_release_gil(),\n          \"The full path to the workbook, including the filename\")\n        .def_property_readonly(\"worksheets\",\n          [](ExcelWorkbook& wb) { return PyWorksheets(wb); },\n          call_release_gil(),\n          R\"(\n            A collection object of all worksheets which are part of this workbook\n          )\")\n        .def_property_readonly(\n          \"windows\",\n          [](ExcelWorkbook& wb) { return PyWindows(wb); },\n          call_release_gil(),\n          R\"(\n            A collection object of all windows which are displaying this workbook\n          )\")\n        .def_property_readonly(\"app\", \n          &ExcelWorkbook::app,\n          call_release_gil(),\n          appDocString)\n        .def(\"worksheet\", \n          &ExcelWorkbook::worksheet,\n          call_release_gil(),\n          R\"(\n            Returns the named worksheet which is part of this workbook (if it exists)\n            otherwise raises an exception.\n          )\",\n          py::arg(\"name\"))\n        .def(\"range\", \n          workbook_range, \n          \"Create a `Range` object from an address such as \\\"Sheet!A1\\\" or a named range\",\n          py::arg(\"address\"))\n        .def(\"__getitem__\", \n          workbook_GetItem,\n          R\"(\n            If the index is a worksheet name, returns the `Worksheet` object,\n            otherwise treats the string as a workbook address and returns a `Range`.\n          )\")\n        .def(\"to_com\", \n          toCom<ExcelWorkbook>, \n          toComDocString,\n          py::arg(\"lib\") = \"\")\n        .def(\"__getattr__\",\n          getComAttr<ExcelWorkbook>)\n        .def(\"__setattr__\",\n          setComAttr<ExcelWorkbook>)\n        .def(\"add\", \n          addWorksheetToWorkbook,\n          workbookAddDocString,\n          py::arg(\"name\") = py::none(), \n          py::arg(\"before\") = py::none(), \n          py::arg(\"after\") = py::none())\n        .def(\"save\", \n          &ExcelWorkbook::save, \n          call_release_gil(),\n          R\"(\n            Saves the Workbook, either to the specified `filepath` or if this is\n            unspecified, to its original source file (an error is raised if the \n            workbook has never been saved).\n          )\",\n          py::arg(\"filepath\") = \"\")\n        .def(\"close\", \n          &ExcelWorkbook::close,\n          call_release_gil(),\n          R\"(\n            Closes the workbook. If there are changes to the workbook and the \n            workbook doesn't appear in any other open windows, the `save` argument\n            specifies whether changes should be saved. If set to True, changes are \n            saved to the workbook, if False they are discared.\n          )\",\n          py::arg(\"save\")=true)\n        .def(\"__enter__\", Context_Enter)\n        .def(\"__exit__\", Workbook_Exit);\n\n      declare_Window\n        .def(\"__str__\", \n          &ExcelWindow::name, \n          call_release_gil())\n        .def_property_readonly(\"hwnd\", \n          &ExcelWindow::hwnd, \n          call_release_gil(),\n          \"The Win32 API window handle as an integer\")\n        .def_property_readonly(\"name\", \n          &ExcelWindow::name,\n          call_release_gil())\n        .def_property_readonly(\"workbook\", \n          &ExcelWindow::workbook,\n          call_release_gil(),\n          \"The workbook being displayed by this window\")\n        .def_property_readonly(\"app\", \n          &ExcelWindow::app,\n          call_release_gil(),\n          appDocString)\n        .def(\"to_com\", \n          toCom<ExcelWindow>, \n          toComDocString, \n          py::arg(\"lib\") = \"\")\n        .def(\"__getattr__\",\n          getComAttr<ExcelWindow>)\n        .def(\"__setattr__\",\n          setComAttr<ExcelWindow>);\n\n      declare_Application\n        .def(py::init(std::function(application_Construct)),\n          R\"(\n            Creates a new Excel Application if no arguments are specified. Gets a handle to \n            an existing COM Application object based on the arguments.\n \n            To get the parent Excel application if xlOil is embedded, used `xloil.app()`.\n\n            Parameters\n            ----------\n            \n            com: \n              Gets a handle to the given com object with class Excel.Appliction (marshalled \n              by `comtypes` or `win32com`).\n            hwnd:\n              Tries to gets a handle to the Excel.Application with given main window handle.\n            workbook:\n              Tries to gets a handle to the Excel.Application which has the specified workbook\n              open.\n          )\",\n          py::arg(\"com\") = py::none(),\n          py::arg(\"hwnd\") = py::none(),\n          py::arg(\"workbook\") = py::none())\n        .def_property_readonly(\"workbooks\",\n          [](Application& app) { return PyWorkbooks(app); },\n          call_release_gil(),\n          \"A collection of all Workbooks open in this Application\")\n        .def_property_readonly(\"windows\",\n          [](Application& app) { return PyWindows(app); },\n          call_release_gil(),\n          \"A collection of all Windows open in this Application\")\n        .def_property_readonly(\"workbook_paths\",\n          [](Application& app) { app.workbookPaths(); },\n          call_release_gil(),\n          \"A set of the full path names of all workbooks open in this Application. \"\n          \"Does not use COM interface.\")\n        .def(\"to_com\",\n          toCom<Application>,\n          toComDocString,\n          py::arg(\"lib\") = \"\")\n        .def(\"__getattr__\", \n          getComAttr<Application>)\n        .def(\"__setattr__\",\n          setComAttr<Application>)\n        .def_property(\"visible\",\n          &Application::getVisible,\n          [](Application& app, bool x) { app.setVisible(x); },\n          call_release_gil(),\n          R\"(\n            Determines whether the Excel window is visble on the desktop\n          )\")\n        .def_property(\"enable_events\",\n          &Application::getEnableEvents,\n          [](Application& app, bool x) { app.setEnableEvents(x); },\n          call_release_gil(),\n          R\"(\n            Pauses or resumes Excel's event handling. It can be useful when writing to a sheet\n            to pause events both for performance and to prevent side effects.\n          )\")\n        .def(\"range\",\n          application_range,\n          \"Create a range object from an external address such as \\\"[Book]Sheet!A1\\\"\",\n          py::arg(\"address\"))\n        .def(\"open\",\n          application_Open,\n          R\"(\n            Opens a workbook given its full `filepath`.\n\n            Parameters\n            ----------\n\n            filepath: \n              path and filename of the target workbook\n            update_links: \n              if True, attempts to update links to external workbooks\n            read_only: \n              if True, opens the workbook in read-only mode\n          )\",\n          py::arg(\"filepath\"),\n          py::arg(\"update_links\") = true,\n          py::arg(\"read_only\") = false,\n          py::arg(\"delimiter\") = py::none())\n        .def(\"calculate\",\n          &Application::calculate,\n          call_release_gil(),\n          R\"(\n            Calculates all open workbooks\n\n            Parameters\n            ----------\n            full:\n              Forces a full calculation of the data in all open workbooks\n            rebuild:\n              For all open workbooks, forces a full calculation of the data \n              and rebuilds the dependencies. (Implies `full`)\n          )\",\n          py::arg(\"full\") = false,\n          py::arg(\"rebuild\") = false)\n        .def(\"quit\",\n          &Application::quit,\n          call_release_gil(),\n          R\"(\n            Terminates the application. If `silent` is True, unsaved data\n            in workbooks is discarded, otherwise a prompt is displayed.\n          )\",\n          py::arg(\"silent\") = true)\n        .def(\"run\",\n          application_Run,\n          R\"(\n            Calls VBA's `Application.Run` taking the function name and up to 30 arguments.\n            This can call any user-defined function or macro but not built-in functions.\n\n            The type and order of arguments expected depends on the function being called.\n          )\",\n          py::arg(\"func\"))\n        .def_property_readonly(\"selection\", &Application::selection)\n\n        .def_property_readonly(\"active_worksheet\",\n          application_ActiveWorksheet,\n          R\"(\n              Returns the currently active worksheet or None.\n          )\")\n        .def_property_readonly(\"active_workbook\",\n          application_ActiveWorkbook,\n          R\"(\n              Returns the currently active workbook or None.\n          )\")\n        .def_property_readonly(\"active_cell\",\n          application_ActiveCell,\n          R\"(\n              Returns the currently active cell as a Range or None.\n          )\")\n        .def_property_readonly(\"selection\",\n          application_Selection,\n          R\"(\n              Returns the currently active cell as a Range or None.\n          )\")\n        .def_property_readonly(\"has_dynamic_arrays\", \n          []() { return Environment::excelProcess().supportsDynamicArrays; })\n        .def(\"__enter__\", Context_Enter)\n        .def(\"__exit__\", Application_Exit);\n\n      py::class_<CallerInfo>(mod, \n        \"Caller\", R\"(\n          Captures the caller information for a worksheet function. On construction\n          the class queries Excel via the `xlfCaller` function to determine the \n          calling cell or range. If the function was not called from a sheet (e.g. \n          via a macro), most of the methods return `None`.\n        )\")\n        .def(py::init(&CallerInfo_Ctor))\n        .def(\"__str__\", CallerInfo_Address)\n        .def_property_readonly(\"sheet_name\",\n          [](const CallerInfo& self)\n          {\n            const auto name = self.sheetName();\n            return name.empty() ? (py::object)py::none() : py::wstr(name);\n          },\n          \"Gives the sheet name of the caller or None if not called from a sheet.\")\n        .def_property_readonly(\"workbook\",\n          [](const CallerInfo& self)\n          {\n            const auto name = self.workbook();\n            return name.empty() ? (py::object)py::none() : py::wstr(name);\n          },\n          R\"(\n            Gives the workbook name of the caller or None if not called from a sheet.\n            If the workbook has been saved, the name will contain a file extension.\n          )\")\n        .def(\"address\",\n          CallerInfo_Address,\n          R\"(\n            Writes the address to a string in the specified style.\n\n            Parameters\n            ----------\n            style: str\n              The address format: \"a1\" or \"rc\". To produce an absolute / fixed addresses\n              use \"$a$1\", \"$r$c\", \"$a1\", \"a$1\", etc. depending on whether you want\n              both row and column to be fixed.\n            local: bool\n              If True, omits sheet and workbook infomation.\n          )\",\n          py::arg(\"style\") = \"a1\",\n          py::arg(\"local\") = false)\n        .def_property_readonly(\"range\",\n          [](const CallerInfo& self)\n          {\n            return createPyRange([&]() { return self.address(); });\n          },\n          \"Range object corresponding to caller address.  Will raise an exception if caller is not a range\");\n\n      mod.def(\"active_worksheet\", \n        []() { return application_ActiveWorksheet(thisApp()); },\n        R\"(\n          Returns the currently active worksheet or None. Will raise an exception if xlOil\n          has not been loaded as an addin.\n        )\");\n\n      mod.def(\"active_workbook\", \n        []() { return application_ActiveWorkbook(thisApp()); },\n        R\"(\n          Returns the currently active workbook or None. Will raise an exception if xlOil\n          has not been loaded as an addin.\n        )\");\n\n      mod.def(\"active_cell\",\n        []() { return application_ActiveCell(thisApp()); },\n        R\"(\n          Returns the currently active cell as a Range or None. Will raise an exception if xlOil\n          has not been loaded as an addin.\n        )\");\n\n      mod.def(\"selection\",\n        []() { return application_Selection(thisApp()); },\n        R\"(\n          Returns the currently selected cells as a Range or None. Will raise an exception if xlOil\n          has not been loaded as an addin.\n        )\");\n\n      mod.def(\"app\", thisApp, py::return_value_policy::reference,\n        R\"(\n          Returns the parent Excel Application object when xlOil is loaded as an\n          addin. Will throw if xlOil has been imported to run automation.\n        )\");\n\n      mod.def(\"all_workbooks\", []() { return PyWorkbooks(thisApp()); },\n        R\"(\n          Collection of workbooks for the current application. Equivalent to \n          `xloil.app().workbooks`.\n        )\");\n    }, 50); \n    // Up the priority of this binding to 50 as there are other places where app \n    // objects are returned and pybind needs to know the python types beforehand\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/PyCOM.cpp",
    "content": "\n#include \"PyHelpers.h\"\n#include \"PyCore.h\"\n#include \"PyImage.h\"\n#include \"PyEvents.h\"\n#include \"PyAddin.h\"\n#include <xlOil/ExcelTypeLib.h>\n#include <xloil/Log.h>\n#include <xlOil/Caller.h>\n#include <xloil/Throw.h>\n#include <xlOil/AppObjects.h>\n#include <xlOilHelpers/Environment.h>\n#include <fcntl.h>\n\nusing std::vector;\nusing std::string;\nusing std::wstring;\nusing std::make_pair;\nusing std::to_string;\n\n\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    //\n    // Some things I tried to add an image that don't work\n    // \n    // Using the temp file handle directly rather than passing the filename to Python\n    // requres converting the Windows handle to a C file descriptor int.  That can\n    // be done with:\n    // \n    //   _open_osfhandle((intptr_t)tempFileHandle, _O_APPEND);\n    //   auto file = PyFile_FromFd(..., nullptr, \"w\", 0, nullptr, nullptr, nullptr, true);\n    //   file.attr(\"close\")();\n    // \n    // However _open_osfhandle needs to be called in the same C-runtime as Python, which\n    // requires calling _Py_open_osfhandle_noraise() but this function is only exposed in\n    // Python >= 3.10 and is not part of the stable ABI.\n    //\n    // Adding a Forms.Image.1 control and setting its Picture property could avoid the temp\n    // file write:\n    // \n    //   auto imageObj = shapes->AddOLEObject(_variant_t(L\"Forms.Image.1\"), vtMissing, vtMissing, \n    //                           VARIANT_FALSE, vtMissing, vtMissing, vtMissing, 0, 0, 100, 100);\n    //   MSForms::IImage* imagePtr;\n    //   imageObj->OLEFormat->Object->QueryInterface(&imagePtr);\n    //   imagePtr->Picture = PicturePtr(pictureFromPilImage(image));\n    // \n    // Unfortunately AddOLEObject fails (for any choice of control). This may be a security \n    // issue or it may not be callable from a worksheet function.  In any case using AddPicture2\n    // gives an object which behaves like a picture to the user (e.g. resize controls).\n    // \n\n    auto writeCellImage(\n      const py::object& saveFunction, \n      const py::object& size,\n      const py::object& position,\n      const py::object& coordinates,\n      bool compress)\n    {\n      try\n      {\n        if (!isMainThread())\n          XLO_THROW(\"writeCellImage: must be called on main thread\");\n\n        CallerInfo callerInfo;\n        ExcelRange callerRange(callerInfo.address());\n        auto& caller = callerRange.com();\n\n        // AddPicture2 takes -1 to retain the size of the existing file\n        float width = -1, height = -1; \n        if (PyUnicode_Check(size.ptr()))\n        {\n          string sz = toLower((string)py::str(size));\n          if (strcmp(sz.c_str(), \"cell\") == 0)\n          { \n            width = float(caller.Width);\n            height = float(caller.Height);\n          }\n          else if (strcmp(sz.c_str(), \"img\") == 0)\n          {} // Matches the default\n          else\n            throw py::value_error(\"Size argument is invalid\");\n        }\n        else if (!size.is_none())\n        {\n          auto sizePair = size.cast<py::tuple>();\n          width = sizePair[0].cast<float>();\n          height = sizePair[1].cast<float>();\n        }\n\n        float posX = 0, posY = 0;\n        if (!position.is_none())\n        {\n          auto pos = position.cast<py::tuple>();\n          posX = pos[0].cast<float>();\n          posY = pos[1].cast<float>();\n        }\n\n        string coord;\n        if (!coordinates.is_none())\n          coord = toLower((string)py::str(coordinates));\n \n        float absX, absY;\n        if (coord.empty() || strcmp(coord.c_str(), \"top\") == 0)\n        {\n          absX = float(caller.Left) + posX;\n          absY = float(caller.Top) + posY;\n        }\n        else if (strcmp(coord.c_str(), \"sheet\") == 0)\n        {\n          absX = posX;\n          absY = posY;\n        }\n        else if (strcmp(coord.c_str(), \"bottom\") == 0)\n        {\n          absX = float(caller.Left) + float(caller.Width) + posX;\n          absY = float(caller.Top) + float(caller.Height) + posY;\n        }\n        else\n          throw py::value_error(\"Coord argument '\" + coord + \"' is invalid. Should be {top, sheet, bottom}\");\n\n        py::gil_scoped_release releaseGil;\n\n        XLO_DEBUG(\"WriteCellImage: writing to x={}, y={}, w={}, h={}\", absX, absY, width, height);\n\n        // Create temp file and call the file write function. Release\n        // the GIL in case any file system issues cause a delay\n        wstring tempFileName;\n        HANDLE tempFileHandle;\n        std::tie(tempFileHandle, tempFileName) = Helpers::makeTempFile();\n        CloseHandle(tempFileHandle);\n\n        XLO_DEBUG(L\"WriteCellImage: using temp file '{}'\", tempFileName);\n\n        // Need the GIL back again to call the provided saveFunction\n        {\n          py::gil_scoped_acquire getGil;\n          checkUserException([&]() {saveFunction(tempFileName); });\n        }\n\n        auto shapes = caller.Worksheet->Shapes;\n        const auto shapeName = wstring(L\"XLOIMG_\") + callerInfo.localAddress();;\n\n        XLO_DEBUG(L\"WriteCellImage: Calling AddPicture with name '{}'\", shapeName);\n\n        // I don't think it's possible to check if the shape exists prior to deletion\n        // so we have to catch the error unfortunately.\n        // TODO: copy size info from existing image?\n        try\n        {\n          shapes->Item(shapeName.c_str())->Delete();\n        }\n        catch (_com_error) {}\n\n        auto newPic = shapes->AddPicture2(\n          _bstr_t(tempFileName.c_str()),\n          Office::MsoTriState::msoFalse,\n          Office::MsoTriState::msoTrue,\n          absX, absY,\n          width, height,\n          compress ? Office::msoPictureCompressTrue : Office::msoPictureCompressFalse);\n\n        newPic->Name = shapeName.c_str();\n\n        // Remove temporary file in a separate thread.\n        auto future = std::async(std::launch::async, [file = std::move(tempFileName)]() {\n          DeleteFile(file.c_str());\n        });\n \n        return shapeName;\n      }\n      XLO_RETHROW_COM_ERROR;\n    }\n\n    namespace\n    {\n      constexpr auto EXCEL_TLB_LCID  = 0;\n      constexpr auto EXCEL_TLB_MAJOR = 1;\n      constexpr auto EXCEL_TLB_MINOR = 4;\n\n      py::object comObjectWithComtypes(\n        IUnknown* p, const char* iface, const wchar_t* clsid)\n      {\n        // Important note: does not call QI on provided IUnknown, assumes it is a hanging reference\n        auto comtypes = py::module::import(\"comtypes.client\");\n\n        auto libidVer = py::tuple(3);\n        libidVer[0] = LIBID_STR_Excel;\n        libidVer[1] = EXCEL_TLB_MAJOR;\n        libidVer[2] = EXCEL_TLB_MINOR;\n        auto typelib = comtypes.attr(\"GetModule\")(libidVer);\n\n        auto ptrType = typelib.attr(iface);\n\n        auto ctypesPtr = py::module::import(\"ctypes\").attr(\"POINTER\")(ptrType)(\n          PySteal<py::object>(PyLong_FromVoidPtr(p)));\n\n        return comtypes.attr(\"_manage\")(ctypesPtr, clsid, 1);\n      }\n\n      auto find_PyCom_PyObjectFromIUnknown()\n      {\n        // Do a GetProcAddress for 'PyCom_PyObjectFromIUnknown' in pythoncom.dll\n\n        const std::wstring pythoncomDLL = py::module::import(\"pythoncom\").attr(\"__file__\").cast<std::wstring>();\n        auto pythoncom = LoadLibrary(pythoncomDLL.c_str());\n        if (!pythoncom)\n          XLO_THROW(L\"Failed to load pythoncom DLL '{}'\", pythoncomDLL);\n        \n        auto funcAddress = GetProcAddress(pythoncom, \"PyCom_PyObjectFromIUnknown\");\n        if (!funcAddress)\n          XLO_THROW(L\"Failed to find PyCom_PyObjectFromIUnknown in pythoncom DLL '{}'\", pythoncomDLL);\n\n        auto gencache = py::module::import(\"win32com.client.gencache\");\n        gencache.attr(\"EnsureModule\")(LIBID_STR_Excel, EXCEL_TLB_LCID, EXCEL_TLB_MAJOR, EXCEL_TLB_MINOR);\n\n        typedef PyObject* (*FuncType)(IUnknown*, REFIID riid, BOOL);\n        return (FuncType)funcAddress;\n      }\n\n      py::object comObjectWithPyCom(\n        IUnknown* p, const char* iface, const wchar_t* clsid)\n      {\n        // Calls QI on provided IUnknown\n        static auto bindFunction = find_PyCom_PyObjectFromIUnknown();\n        auto dispatchPtr = PySteal<py::object>(bindFunction(p, IID_IDispatch, true));\n\n        auto targetType =\n          py::module::import(\"win32com.client.gencache\").attr(\"GetModuleForCLSID\")(clsid).attr(iface);\n\n        return targetType(dispatchPtr);\n      }\n\n      py::object marshalCom(\n        const char* binderLib, IUnknown* p, const char* interfaceName, const GUID& clsid)\n      {\n        if (!binderLib || binderLib[0] == 0)\n          return marshalCom(\n            theCoreAddin() ? theCoreAddin()->comBinder().c_str() : \"win32com\",\n            p, interfaceName, clsid);\n        \n        // Convert our CLSID to a string, 128 chars should be plenty\n        wchar_t clsidStr[128];\n        StringFromGUID2(clsid, clsidStr, _countof(clsidStr));\n\n        if (_stricmp(binderLib, \"comtypes\") == 0)\n        {\n          // Must pass a appropriately QI'd hanging ref for comtypes\n          IUnknown* q;\n          if (p->QueryInterface(clsid, (void**)&q) != 0)\n            XLO_THROW(\"Internal: failed to find COM interface '{}' for '{}'\", interfaceName, binderLib);\n          return comObjectWithComtypes(q, interfaceName, clsidStr);\n        }\n        else if (_stricmp(binderLib, \"win32com\") == 0)\n          return comObjectWithPyCom(p, interfaceName, clsidStr);\n\n        throw py::key_error(formatStr(\n          \"Unsupported COM lib '%s', supported: 'win32com', 'comtypes'\", binderLib));\n      }\n    }\n\n    py::object comToPy(Excel::_Application& p, const char* binder)\n    {\n      return marshalCom(binder, &p, \"_Application\", __uuidof(Excel::_Application));\n    }\n    pybind11::object comToPy(Excel::Window& p, const char* binder)\n    {\n      return marshalCom(binder, &p, \"Window\", __uuidof(Excel::Window));\n    }\n    pybind11::object comToPy(Excel::_Workbook& p, const char* binder)\n    {\n      return marshalCom(binder, &p, \"_Workbook\", __uuidof(Excel::_Workbook));\n    }\n    pybind11::object comToPy(Excel::_Worksheet& p, const char* binder)\n    {\n      return marshalCom(binder, &p, \"_Worksheet\", __uuidof(Excel::_Worksheet));\n    }\n    pybind11::object comToPy(Excel::Range& p, const char* binder)\n    {\n      return marshalCom(binder, &p, \"Range\", __uuidof(Excel::Range));\n    }\n    pybind11::object comToPy(IDispatch& p, const char* binder)\n    {\n      return marshalCom(binder, &p, \"IDispatch\", __uuidof(IDispatch));\n    }\n\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        mod.def(\"insert_cell_image\", \n          writeCellImage, \n          R\"(\n            Inserts an image associated with the calling cell. A second call to this function\n            removes any image previously inserted from the same calling cell.\n\n            Parameters\n            ----------\n\n            writer: \n                a one-arg function which writes the image to a provided filename. The file\n                format must be one that Excel can open.\n            size:  \n                * A tuple (width, height) in points. \n                * \"cell\" to fit to the caller size\n                * \"img\" or None to keep the original image size\n            pos:\n                A tuple (X, Y) in points. The origin is determined by the `origin` argument\n            origin:\n                * \"top\" or None: the top left of the calling range\n                * \"sheet\": the top left of the sheet\n                * \"bottom\": the bottom right of the calling range\n            compress:\n                if True, compresses the resulting image before storing in the sheet\n          )\",\n          py::arg(\"writer\"),\n          py::arg(\"size\") = py::none(),\n          py::arg(\"pos\") = py::none(),\n          py::arg(\"origin\") = py::none(),\n          py::arg(\"compress\") = true);\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/PyCOM.h",
    "content": "#pragma once\n#include \"PyHelpers.h\"\n\nstruct IDispatch;\n\nnamespace Excel \n{ \n  struct _Application; struct Window; struct _Workbook; struct _Worksheet; struct Range; \n}\n\nnamespace xloil\n{\n  namespace Python\n  {\n    pybind11::object comToPy(Excel::_Application& p, const char* comlib =nullptr);\n    pybind11::object comToPy(Excel::Window& p, const char* comlib = nullptr);\n    pybind11::object comToPy(Excel::_Workbook& p, const char* comlib = nullptr);\n    pybind11::object comToPy(Excel::_Worksheet& p, const char* comlib = nullptr);\n    pybind11::object comToPy(Excel::Range& p, const char* comlib = nullptr);\n    pybind11::object comToPy(IDispatch& p, const char* comlib = nullptr);\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/PyCache.cpp",
    "content": "#include <xlOil/ExcelObjCache.h>\n#include <xlOil/ObjectCache.h>\n#include \"PyCore.h\"\n#include \"TypeConversion/BasicTypes.h\"\n#include \"PyCache.h\"\n\nnamespace py = pybind11;\nusing std::wstring;\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  template<>\n  struct CacheUniquifier<py::object>\n  {\n    static constexpr wchar_t value = L'\\x6B23';\n  };\n  using pyCacheUnquifier = CacheUniquifier<py::object>;\n\n  namespace Python {\n\n    namespace\n    {\n      /// <summary>\n      /// This odd singleton is constructed and owned by the core module which ensures\n      /// deleted when the core module is garbage collected and the interpreter is \n      /// still active and GIL is held.\n      /// </summary>\n      class PyCache\n      {\n        using cache_type = ObjectCache<py::object, CacheUniquifier<py::object>>;\n\n        PyCache()\n          : _cache(cache_type::create(false))\n        {\n          _workbookCloseHandler = std::static_pointer_cast<const void>(\n            xloil::Event::WorkbookAfterClose().bind(\n              [this](auto wbName)\n          {\n            py::gil_scoped_acquire getGil;\n            _cache->onWorkbookClose(wbName);\n          }));\n        }\n\n        // Just to prevent any potential errors!\n        PyCache(const PyCache& that) = delete;\n\n        static PyCache* _theInstance;\n\n      public:\n\n        ~PyCache()\n        {\n          _theInstance = nullptr;\n          XLO_DEBUG(\"Python object cache destroyed\");\n        }\n\n        static PyCache* construct()\n        {\n          _theInstance = new PyCache();\n          return _theInstance;\n        }\n\n        static PyCache& instance()\n        {\n          assert(_theInstance);\n          return *_theInstance;\n        }\n\n        py::object add(py::object& obj, const wstring& tag, const wstring& key)\n        {\n          const auto cacheKey = key.empty()\n            ? _cache->add(std::move(obj), CallerInfo(), tag)\n            : _cache->add(std::move(obj), key);\n          return PySteal(detail::PyFromString()(cacheKey.cast<PStringRef>()));\n        }\n        py::object getitem(const std::wstring_view& str)\n        {\n          auto result = get(str);\n          if (result.is_none())\n            throw pybind11::key_error(utf16ToUtf8(str));\n          return result;\n        }\n        py::object get(const std::wstring_view& str, const py::object& default = py::none())\n        {\n          const ExcelObj* xlObj = getCached<ExcelObj>(str);\n          if (xlObj)\n            return PySteal(PyFromAny()(*xlObj));\n\n          auto* obj = _cache->fetch(str);\n          return obj ? *obj : default;\n        }\n        bool remove(const std::wstring& cacheRef)\n        {\n          return _cache->erase(cacheRef);\n        }\n        bool contains(const std::wstring_view& str)\n        {\n          return _cache->fetch(str);\n        }\n\n        py::list keys() const\n        {\n          py::list out;\n          for (auto& [key, cellCache] : *_cache)\n            for (uint16_t i = 0u; i < cellCache.count(); ++i)\n              out.append(py::wstr(_cache->writeKey(key, i)));\n          return out;\n        }\n\n        shared_ptr<cache_type> _cache;\n        shared_ptr<const void> _workbookCloseHandler;\n      };\n\n      PyCache* PyCache::_theInstance = nullptr;\n    }\n\n    ExcelObj pyCacheAdd(const py::object& obj, const wchar_t* caller)\n    {\n      // Decorate the cache ref with the python object name to \n      // help users keep track\n      auto name = utf8ToUtf16(obj.ptr()->ob_type->tp_name);\n      return PyCache::instance()._cache->add(\n        py::object(obj),\n        caller ? CallerInfo(ExcelObj(caller)) : CallerInfo(),\n        name);\n    }\n\n    bool pyCacheGet(const std::wstring_view& str, py::object& obj)\n    {\n      auto& cache = *PyCache::instance()._cache;\n      if (!cache.valid(str))\n        return false;\n\n      const auto* p = cache.fetch(str);\n      if (!p)\n        return false;\n\n      obj = *p;\n      return true;\n    }\n\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        py::class_<PyCache>(mod, \"ObjectCache\", R\"(\n            Provides a way to manipulate xlOil's Python object cache\n\n            Examples\n            --------\n\n            ::\n        \n                @xlo.func\n                def myfunc(x):\n                    return xlo.cache(MyObject(x)) # <-equivalent to cache.add(...)\n\n                @xlo.func\n                def myfunc2(array: xlo.Array(str), i):\n                    return xlo.cache[array[i]]   # <-equivalent to cache.get(...)\n\n          )\")\n          .def(\"add\", \n            &PyCache::add, \n            R\"(\n              Adds an object to the cache and returns a reference string.\n\n              xlOil automatically adds objects returned from worksheet \n              functions to the cache if they cannot be converted by any \n              registered converter.  So this function is useful to:\n              \n                 1) force a convertible object, such as an iterable, into the\n                    cache\n                 2) return a list of cached objects\n                 3) create cached objects from outside of worksheet fnctions\n                    e.g. in commands / subroutines\n\n              xlOil uses the caller infomation provided by Excel to construct\n              the cache string and manage the cache object lifecycle. When\n              invoked from a worksheet function, this caller info contains \n              the cell reference. xlOil deletes cache objects linked to the \n              cell reference from previous calculation cycles.\n\n              When invoked from a source other than a worksheet function (there\n              are several possibilies, see the help for `xlfCaller`), xlOil\n              again generates a reference string based on the caller info. \n              However, this may not be unique.  In addition, objects with the \n              same caller string will replace those created during a previous \n              calculation cycle. For example, creating cache objects from a button\n              clicked repeatedly will behave differently if Excel recalculates \n              in between the clicks. To override this behaviour, the exact cache\n              `key` can be specified.  For example, use Python's `id` function or\n              the cell address being written to if a command is writing a cache\n              string to the sheet.  When `key` is specified the user is responsible\n              for managing the lifecycle of their cache objects.\n \n\n              Parameters\n              ----------\n\n              obj:\n                The object to cache.  Required.\n\n              tag: str\n                An optional string to append to the cache ref to make it more \n                'friendly'. When returning python objects from functions, \n                xlOil uses the object's type name as a tag\n\n              key: str\n                If specified, use the exact cache key (after prepending by\n                cache uniquifier). The user is responsible for ensuring \n                uniqueness of the cache key.\n            )\",\n            py::arg(\"obj\"), py::arg(\"tag\") = \"\", py::arg(\"key\")=\"\")\n          .def(\"remove\", &PyCache::remove, py::arg(\"ref\"),\n            R\"(\n              xlOil manages the lifecycle for most cache objects, so this  \n              function should only be called when `add` was invoked with a\n              specified key - in this case the user owns the lifecycle \n              management. \n            )\")\n          .def(\"get\", \n            &PyCache::get, \n            R\"(\n              Fetches an object from the cache given a reference string.\n              Returns `default` if not found\n            )\",\n            py::arg(\"ref\"), py::arg(\"default\") = py::none())\n          .def(\"contains\", \n            &PyCache::contains, \n            \"Returns True if the given reference string links to a valid object\",\n            py::arg(\"ref\"))\n          .def(\"keys\", \n            &PyCache::keys,\n            \"Returns all cache keys as a list of strings\")\n          .def(\"__contains__\", &PyCache::contains)\n          .def(\"__getitem__\", &PyCache::getitem)\n          .def(\"__call__\", \n            &PyCache::add, \n            \"Calls `add` method with provided arguments\",\n            py::arg(\"obj\"), py::arg(\"tag\")=\"\", py::arg(\"key\")=\"\");\n\n        mod.add_object(\"cache\", py::cast(PyCache::construct()));\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyCache.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Caller.h>\n\nnamespace pybind11 { class object; }\nnamespace xloil \n{\n  namespace Python \n  {\n    /// <summary>\n    /// Adds a python object to the cache, returning a cache reference\n    /// string in an ExcelObj. Must hold the GIL to call.\n    /// </summary>\n    ExcelObj pyCacheAdd(const pybind11::object& obj, const wchar_t* caller = nullptr);\n\n    /// <summary>\n    /// Tries to fetch an object give a cache reference string, returning\n    /// true if sucessful. Must hold the GIL to call.\n    /// </summary>\n    bool pyCacheGet(const std::wstring_view& cacheStr, pybind11::object& obj);\n\n    static constexpr uint16_t CACHE_KEY_MAX_LEN = XL_FULL_ADDRESS_RC_MAX_LEN;\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyCore.cpp",
    "content": "#include \"PyCore.h\"\n#include \"PyHelpers.h\"\n#include \"PyEvents.h\"\n#include \"EventLoop.h\"\n#include \"PyFuture.h\"\n#include \"TypeConversion/Numpy.h\"\n#include <TypeConversion/BasicTypes.h>\n#include <xloil/Caller.h>\n#include <xloil/State.h>\n#include <xlOil/StringUtils.h>\n#include <map>\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::wstring;\nusing std::string;\nnamespace py = pybind11;\nusing std::make_pair;\nusing ExcelProcessInfo = xloil::Environment::ExcelProcessInfo;\n\nnamespace xloil \n{\n  namespace Python \n  {\n    PyTypeObject* theCellErrorType;\n    PyObject*     cannotConvertException;\n    PyTypeObject* theExcelObjType;\n\n    bool isErrorType(const PyObject* obj)\n    {\n      return Py_TYPE(obj) == theCellErrorType;\n    }\n\n    bool isExcelObjType(const PyObject* obj)\n    {\n      return Py_TYPE(obj) == theExcelObjType;\n    }\n\n    namespace\n    {\n      using BinderFunc = std::function<void(pybind11::module&)>;\n\n      void initialiseCore(py::module& mod);\n   \n      class BinderRegistry\n      {\n      public:\n        static BinderRegistry& get() {\n          static BinderRegistry instance;\n          return instance;\n        }\n\n        auto add(BinderFunc f, size_t priority)\n        {\n          return theFunctions.insert(make_pair(priority, f));\n        }\n\n        void bindAll(py::module& mod)\n        {\n          std::for_each(theFunctions.rbegin(), theFunctions.rend(),\n            [&mod](auto f) { f.second(mod); });\n        }\n      private:\n        BinderRegistry() {}\n        std::multimap<size_t, BinderFunc> theFunctions;\n      };\n    }\n\n    PyObject* buildInjectedModule()\n    {\n      auto mod = py::module::create_extension_module(\n        theInjectedModuleName, nullptr, new PyModuleDef());\n      initialiseCore(mod);\n      BinderRegistry::get().bindAll(mod);\n      return mod.release().ptr();\n    }\n\n    // This unfortunate block of code is a copy of PYBIND11_MODULE with the name of \n    // the module tweaked. This allows the module name to be consistent across the \n    // various xloil_PythonXX.pyd implemenations which reduces surprise and makes \n    // the documentation nicer\n\n#define XLO_NAMED_MODULE(name, variable, ModuleName)                                                           \\\n    static ::pybind11::module_::module_def PYBIND11_CONCAT(pybind11_module_def_, name); \\\n    static void PYBIND11_CONCAT(pybind11_init_, name)(::pybind11::module_ &);           \\\n    PYBIND11_PLUGIN_IMPL(name) {                                                        \\\n        PYBIND11_CHECK_PYTHON_VERSION                                                   \\\n        PYBIND11_ENSURE_INTERNALS_READY                                                 \\\n        auto m = ::pybind11::module_::create_extension_module(                          \\\n            ModuleName, nullptr, &PYBIND11_CONCAT(pybind11_module_def_, name));         \\\n        try {                                                                           \\\n            PYBIND11_CONCAT(pybind11_init_, name)(m);                                   \\\n            return m.ptr();                                                             \\\n        }                                                                               \\\n        PYBIND11_CATCH_INIT_EXCEPTIONS                                                  \\\n    }                                                                                   \\\n    void PYBIND11_CONCAT(pybind11_init_, name)(::pybind11::module_ & (variable))\n\n\n    XLO_NAMED_MODULE(XLO_PROJECT_NAME, mod, theInjectedModuleName)\n    {\n      mod.doc() = R\"(\n        The Python plugin for xlOil primarily allows creation of Excel functions and macros \n        backed by Python code. In addition it offers full control over GUI objects and an \n        interface for Excel automation: driving the application in code.\n\n        See the documentation at https://xloil.readthedocs.io\n      )\";\n\n      initialiseCore(mod);\n      BinderRegistry::get().bindAll(mod);\n    }\n\n    int addBinder(std::function<void(pybind11::module&)> binder, size_t priority)\n    {\n      BinderRegistry::get().add(binder, priority);\n      return 0;\n    }\n\n    namespace \n    {\n      struct CannotConvert {};\n\n      /// <summary>\n      /// Gets rid of any #, /, ? or ! chars from the cell errors to \n      /// produce a valid python symbol.\n      /// </summary>\n      auto cellErrorSymbol(CellError e)\n      {\n        auto wstr = enumAsWCString(e);\n        string str;\n        for (auto c = wstr; *c != L'0'; ++c)\n        {\n          if (*c != L'#' && *c != L'/' && *c != L'?' && *c != L'!')\n            str.push_back((char)*c);\n        }\n        return str;\n      }\n\n      void initialiseCore(pybind11::module& mod)\n      {\n        XLO_DEBUG(\"Python importing numpy\");\n        if (!importNumpy())\n          throw py::error_already_set();\n\n        importDatetime();\n\n        theExcelObjType = (PyTypeObject*)py::class_<ExcelObj>(\n          mod, \n          \"_RawExcelValue\"\n          R\"(\n            Wrapper for an already-converted Excel value ready to be returned directly\n            to Excel. For internal use in type converters.\n          )\").ptr();\n\n        // Bind the two base classes for python converters\n        py::class_<IPyFromExcel, shared_ptr<IPyFromExcel>>(mod, \"IPyFromExcel\")\n          .def(\"__call__\",\n            [](const IPyFromExcel& /*self*/, const py::object& /*arg*/)\n            {\n              XLO_THROW(\"Internal IPyFromExcel converters cannot be called from python\");\n            })\n          .def(\"__str__\", [](const IPyFromExcel& self) { return self.name(); });\n\n        py::class_<IPyToExcel, shared_ptr<IPyToExcel>>(mod, \"IPyToExcel\")\n          .def(\"__str__\", [](const IPyToExcel& self) { return self.name(); })\n          .def(\"__call__\", &IPyToExcel::operator());\n\n        mod.def(\"in_wizard\", &inFunctionWizard,\n          R\"(\n            Returns true if the function is being invoked from the function wizard : costly functions \n            should exit in this case to maintain UI responsiveness.  Checking for the wizard is itself \n            not cheap, so use this sparingly.\n          )\");\n\n        PyFuture<PyObject*>::bind(mod, \"_PyObjectFuture\");\n\n        py::class_<ExcelProcessInfo>(mod, \"ExcelState\", \n          R\"(\n            Gives information about the Excel application. Cannot be constructed: call\n            ``xloil.excel_state`` to get an instance.\n          )\")\n          .def_readonly(\"version\", \n            &ExcelProcessInfo::version, \n            \"Excel major version\")\n          .def_property_readonly(\"hinstance\",\n            [](const ExcelProcessInfo& p) { return (intptr_t)p.hInstance; },\n            \"Excel Win32 HINSTANCE pointer as an int\")\n          .def_readonly(\"hwnd\",\n            &ExcelProcessInfo::hWnd,\n            \"Excel Win32 main window handle as an int\")\n          .def_readonly(\"main_thread_id\",\n            &ExcelProcessInfo::mainThreadId,\n            \"Excel main thread ID\");\n\n        mod.def(\"excel_state\", \n          Environment::excelProcess, \n          R\"(\n            Gives information about the Excel application, in particular the handles required\n            to interact with Excel via the Win32 API. Only available when xlOil is loaded as \n            an addin.\n          )\",\n          py::return_value_policy::reference);\n\n        {\n          auto e = py::exception<CannotConvert>(mod, \"CannotConvert\");\n          e.doc() = R\"(\n            Should be thrown by a converter when it is unable to handle the \n            provided type.  In a return converter it may not indicate a fatal \n            condition, as xlOil will fallback to another converter.\n          )\";\n          cannotConvertException = e.ptr();\n        }\n\n        // TODO: move to basictypes but beware of pybind declaration order!\n        {\n          // Bind CellError type to xloil::CellError enum\n          auto eType = py::BetterEnum<CellError>(mod, \"CellError\", 0x800a07D0,\n            R\"(\n              Enum-type class which represents an Excel error condition of the \n              form `#N/A!`, `#NAME!`, etc passed as a function argument. If a \n              registered function argument does not explicitly specify a type \n              (e.g. int or str via an annotation), it may be passed a *CellError*, \n              which it can handle based on the error type.\n\n              The integer value of a *CellError* corresponds to it's VBA/COM error\n              number, so for example we can write \n              `if cell.Value2 == CellError.NA.value: ...`\n            )\");\n          \n          for (auto e : theCellErrors)\n            eType.value(cellErrorSymbol(e).c_str(), e);\n\n          theCellErrorType = (PyTypeObject*)eType.ptr();\n        }\n      }\n    }\n} }"
  },
  {
    "path": "libs/xlOil_Python/PyCore.h",
    "content": "#pragma once\n#include \"TypeConversion/ConverterInterface.h\"\n#include <pybind11/pybind11.h>\n#include <functional>\n\n//struct _typeobject;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    constexpr char* const theInjectedModuleName = \"xloil_core\";\n    constexpr char* const theReadConverterPrefix = \"_Read_\";\n    constexpr char* const theReturnConverterPrefix = \"_Return_\";\n\n    extern PyTypeObject* theCellErrorType;\n\n    // TODO: constexpr string concat instead of relying on macros?\n#define XLOPY_UNCACHED_PREFIX \"_Uncached_\"\n\n    PyObject* buildInjectedModule();\n\n    /// <summary>\n    /// Registers a binder, that is, a function which binds types in the\n    /// xlOil core module. This should be called from a static initialiser.\n    /// Higher priority items are bound first, this allows coarse control\n    /// over dependencies.\n    /// </summary>\n    int addBinder(\n      std::function<void(pybind11::module&)> binder, size_t priority=1);\n\n    /// <summary>\n    /// Declare a class of type IPyFromExcel which handles the \n    /// specified type. Returns a reference to the bound class.\n    /// </summary>\n    template <class T>\n    auto bindPyConverter(pybind11::module& mod, const char* type)\n    {\n      // TODO: static string concat?\n      return pybind11::class_<T, IPyFromExcel, std::shared_ptr<T>>\n        (mod, (theReadConverterPrefix + std::string(type)).c_str());\n    }\n\n    /// <summary>\n    /// Declare a class of type IPyToExcel which handles the \n    /// specified type. Returns a reference to the bound class.\n    /// </summary>\n    template <class T>\n    auto bindXlConverter(pybind11::module& mod, const char* type)\n    {\n      return pybind11::class_<T, IPyToExcel, std::shared_ptr<T>>(mod, \n        (theReturnConverterPrefix + std::string(type)).c_str());\n    }\n\n    extern PyObject* cannotConvertException;\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyEvents.cpp",
    "content": "#include \"PyEvents.h\"\n#include <xlOil/Events.h>\n#include <xlOil/Log.h>\n#include <xlOil/Range.h>\n#include <xlOil/AppObjects.h>\n#include \"PyHelpers.h\"\n#include \"PyCore.h\"\n#include <list>\n#include <boost/preprocessor/seq/for_each.hpp>\n#include <boost/preprocessor/stringize.hpp>\n#include <xloil/Interface.h>\n#include <filesystem>\n\nnamespace py = pybind11;\nusing std::unordered_map;\nusing std::shared_ptr;\nusing std::string;\nusing std::wstring;\nnamespace fs = std::filesystem;\n\nnamespace std \n{\n  bool operator==(const py::weakref& lhs, const py::weakref& rhs)\n  {\n    return lhs.is(rhs);\n  }\n}\n\nnamespace xloil \n{\n  namespace Python \n  {\n    XLOIL_DEFINE_EVENT(Event_PyBye);\n    XLOIL_DEFINE_EVENT(Event_PyUserException);\n\n    class IPyEvent;\n\n    // GLOBALS\n    namespace {\n      std::unordered_map<wstring, shared_ptr<IPyEvent>> theDirChangeEvents;\n      auto theDirChangeEventsCleanup = Event_PyBye().bind([]() { theDirChangeEvents.clear(); });\n\n      std::atomic<bool> theEventsAreEnabled = true;\n    }\n\n    namespace\n    {\n      /// <summary>\n      /// This struct is designed to hold a reference to an arithmetic type so\n      /// it can be modified in Python, otherwise arithmetic types are immutable.\n      /// </summary>\n      template <class T>\n      struct ArithmeticRef\n      {\n        T& value;\n      };\n\n      /// <summary>\n      /// Some template magic which I don't fully understand to replace a \n      /// non-const ref to an arithmetic type with ArithmeticRef.\n      /// </summary>\n      template<class T, bool = std::is_arithmetic<std::remove_reference_t<T>>::value>\n      struct ReplaceArithmeticRef\n      {\n        auto operator()(T x) const { return x; }\n      };\n      template<class T>\n      struct ReplaceArithmeticRef<const T&, false>\n      {\n        const T& operator()(const T& x) const { return x; }\n      };\n      template<class T>\n      struct ReplaceArithmeticRef<T&, true>\n      {\n        auto operator()(T& x) const {\n          return ArithmeticRef<T> { x };\n        }\n      };\n    }\n    \n    class IPyEvent\n    {\n    public:\n      virtual ~IPyEvent()\n      {\n        if (!_handlers.empty())\n        {\n          py::gil_scoped_acquire getGil;\n          unbind();\n          _handlers.clear();\n        }\n      }\n\n      virtual const wchar_t* name() const = 0;\n\n      py::tuple handlers() const\n      {\n        py::tuple result(_handlers.size());\n        auto i = 0;\n        for (auto iHandler = _handlers.begin(); iHandler != _handlers.end(); ++iHandler)\n          result[i] = *iHandler;\n        return result;\n      }\n\n      IPyEvent& add(const py::object& obj)\n      {\n        // This is called by weakref when the ref count goes to zero\n        py::object callback;\n        if (_handlers.empty())\n        {\n          bind();\n          callback = py::cpp_function([this](py::object& ref) { this->remove(ref); });\n        }\n        else\n          callback = _handlers.back().attr(\"__callback__\");\n\n        XLO_INFO(L\"Event {} added handler {}\", name(), (void*)obj.ptr());\n\n        // We use a weakref to avoid dangling pointers to event handlers.\n        // For bound methods, we need the WeakMethod class to avoid them\n        // being immediately deleted.\n        if (py::hasattr(obj, \"__self__\"))\n          _handlers.push_back(py::module::import(\"weakref\").attr(\"WeakMethod\")(obj, callback));\n        else\n          _handlers.push_back(py::weakref(obj, callback));\n\n        return *this;\n      }\n\n      IPyEvent& remove(const py::object& obj)\n      {\n        _handlers.remove(obj);\n        // Unhook ourselves from the core for efficiency if there are no handlers\n        XLO_INFO(L\"Event {} removed handler {}\", name(), (void*)obj.ptr());\n        if (_handlers.empty())\n        {\n          unbind();\n          XLO_DEBUG(L\"No more python handlers for event {}\", name());\n        }\n        return *this;\n      }\n\n      void clear()\n      {\n        unbind();\n        _handlers.clear();\n      }\n\n      virtual void bind() = 0;\n      virtual void unbind() {} // Why?\n\n    protected:\n      IPyEvent()\n      {}\n\n      std::list<py::weakref> _handlers;\n    };\n\n    template<class TEvent, bool, class F> class PyEvent {};\n\n    // Specialisation to allow capture of the arguments to the event handler\n    template<class TEvent, bool TAllowUserException, class R, class... Args>\n    class PyEvent<TEvent, TAllowUserException, std::function<R(Args...)>> : public IPyEvent\n    {\n    public:\n      PyEvent(TEvent& event)\n        : _event(event)\n        , _coreEventHandler(nullptr)\n      {}\n\n      void unbind() override\n      {\n        _event -= _coreEventHandler;\n      }\n\n      const wchar_t* name() const override\n      {\n        return  _event.name().c_str();\n      }\n\n      void bind() override\n      {\n        _coreEventHandler = _event += [this](Args... args) { this->fire(args...); };\n      }\n\n      void fire(Args... args) const\n      {\n        if (!theEventsAreEnabled)\n          return;\n\n        try\n        {\n          py::gil_scoped_acquire get_gil;\n          for (auto& h : _handlers)\n          {\n            auto handler = h();\n            // See above for the purpose of ReplaceArithmeticRef\n            if (!handler.is_none())\n              handler(ReplaceArithmeticRef<Args>()(args)...);\n          }\n        }\n        catch (const py::error_already_set& e)\n        {\n          // Avoid recursion if we actually are Event_PyUserException!\n          if constexpr(TAllowUserException)\n            Event_PyUserException().fire(e.type(), e.value(), e.trace());\n          XLO_ERROR(L\"During Event {0}: {1}\", _event.name(), utf8ToUtf16(e.what()));\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(L\"During Event {0}: {1}\", _event.name(), utf8ToUtf16(e.what()));\n        }\n      }\n\n    private:\n      TEvent& _event;\n      typename TEvent::handler_id _coreEventHandler;\n    };\n\n    class PyDirectoryWatch: public IPyEvent\n    {\n    public:\n      PyDirectoryWatch(\n          const std::wstring_view& objectPath, \n          Event::FileAction action, \n          bool subDirs)\n        : _coreEventHandler(nullptr)\n      {\n        auto path = fs::path(objectPath);\n        if (fs::is_directory(path))\n        {\n          _directory = path;\n          _watchSubDirs = subDirs;\n        }\n        else\n        {\n          _filename = path.filename();\n          _directory = path.remove_filename();\n          _watchSubDirs = false;\n        }\n        _name = _directory / _filename;\n        _action = action;\n      }\n\n      void unbind() override\n      {\n        _coreEventHandler.reset();\n      }\n\n      const wchar_t* name() const override\n      {\n        return _name.c_str(); // Include the filename silly\n      }\n\n      void bind() override\n      {\n        _coreEventHandler = Event::DirectoryChange(_directory, _watchSubDirs)->bind(\n          [this](const wchar_t* directory, const wchar_t* filename, Event::FileAction action) \n          { \n            this->fire(directory, filename, action);\n          });\n      }\n\n      void fire(const wchar_t* directory, const wchar_t* filename, Event::FileAction action) const\n      {\n        if (!theEventsAreEnabled)\n          return;\n\n        // Check out action and filename (if specified) match, if not, we don't \n        // need to acquire the gil.\n        if (action != _action || (!_filename.empty() && _filename != filename))\n          return;\n\n        const auto target = fs::path(directory) / filename;\n\n        try\n        {\n          // Note if _handlers is empty the event will already have been unbound\n          py::gil_scoped_acquire get_gil;\n          for (auto& h : _handlers)\n          {\n            auto handler = h(); // Get strong ref\n            if (!handler.is_none())\n              handler(target.c_str());\n          }\n        }\n        catch (const py::error_already_set& e)\n        {\n          Event_PyUserException().fire(e.type(), e.value(), e.trace());\n          XLO_ERROR(L\"During Event {0}: {1}\", name(), utf8ToUtf16(e.what()));\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(L\"During Event {0}: {1}\", name(), utf8ToUtf16(e.what()));\n        }\n      }\n\n    private:\n      fs::path _directory;\n      wstring _filename;\n      wstring _name;\n      Event::FileAction _action;\n      bool _watchSubDirs;\n      shared_ptr<const void> _coreEventHandler;\n    };\n\n    void setAllowPyEvents(bool value)\n    {\n      theEventsAreEnabled = value;\n    }\n\n    namespace\n    {\n      template<class TEvent>\n      auto makeEvent(TEvent& event)\n      {\n        return new PyEvent<TEvent, true, typename TEvent::handler>(event);\n      }\n\n      /// <summary>\n      /// Binds an event which does not fire the UserException handler - useful\n      /// to avoid circular event calls\n      /// </summary>\n      template<class TEvent>\n      auto makeEventNoUserExcept(TEvent& event)\n      {\n        return new PyEvent<TEvent, false, typename TEvent::handler>(event);\n      }\n\n      void bindEvent(\n        py::module& mod, \n        const wchar_t* name, \n        IPyEvent* event)\n      {\n        auto u8name = utf16ToUtf8(name);\n        mod.add_object(u8name.c_str(), \n          py::cast(shared_ptr<IPyEvent>(event), py::return_value_policy::take_ownership));\n      }\n\n      /// <summary>\n      /// ArithmeticRef is designed to hold a reference to an arithmetic type so\n      /// it can be modified in Python, otherwise arithmetic types are immutable.\n      /// Python doesn't allow override of the '=' operator so we have to just\n      /// expose the 'value property'\n      /// </summary>\n      template<class T>\n      void bindArithmeticRef(py::module& mod)\n      {\n        const auto name = \"_\" + string(typeid(T).name()) + \"_ref\";\n        using RefType = ArithmeticRef<T>;\n        py::class_<RefType>(mod, name.c_str())\n          .def_property(\"value\",\n            [](const RefType& self) { return self.value; },\n            [](RefType& self, T val) { self.value = val; });\n      }      \n      \n      void setEnableEvents(bool value, bool excelEvents)\n      {\n        py::gil_scoped_release releaseGil;\n        XLO_DEBUG(\"Events enabled: Excel={}, xlOil={}\", !excelEvents || value, value);\n        setAllowPyEvents(value);\n        if (excelEvents)\n          runExcelThread([=]() { \n            thisApp().setEnableEvents(value); \n          });\n      }\n\n      auto getDirectoryChangeEvent(const wstring& path, wstring& action, bool subDirs)\n      {\n        using Event::FileAction;\n        toLower(action);\n        FileAction act;\n        if (action == L\"add\")\n          act = FileAction::Add;\n        else if (action == L\"delete\")\n          act = FileAction::Delete;\n        else if (action == L\"modify\")\n          act = FileAction::Modify;\n        else\n          throw py::value_error(\"action\");\n\n        auto key = path + L'_' + action;\n        // TODO: actually use the \"action\" parameter!\n        auto found = theDirChangeEvents.find(key);\n        if (found != theDirChangeEvents.end())\n          return found->second;\n        \n        auto result = shared_ptr<IPyEvent>(new PyDirectoryWatch(path, act, subDirs));\n        theDirChangeEvents[key] = result;\n        return result;\n      }\n\n      static int theBinder = addBinder([](pybind11::module& mod)\n      {\n        auto eventMod = mod.def_submodule(\"event\");\n        eventMod.doc() = R\"(\n          A module containing event objects which can be hooked to receive events driven by \n          Excel's UI. The events correspond to COM/VBA events and are described in detail\n          in the Excel Application API. The naming convention (including case) of the VBA events\n          has been preserved for ease of search.\n          \n        \n          See :ref:`Events:Introduction` and \n          `Excel.Application <https://docs.microsoft.com/en-us/office/vba/api/excel.application(object)#events>`_\n\n          Using the Event Class\n          ---------------------\n\n              * Events are hooked using `+=`, e.g.\n\n              ::\n              \n                  event.NewWorkbook += lambda wb: print(wb_name)\n\n              * Events are unhooked using `-=` and passing a reference to the handler function\n\n              ::\n\n                  event.NewWorkbook += foo\n                  event.NewWorkbook -= foo\n\n              * You should not return anything from an event handler\n\n              * Each event has a `handlers` property listing all currently hooked handlers\n\n              * Where an event has reference parameter, for example the `cancel` bool in\n                `WorkbookBeforePrint`, you need to set the value using `cancel.value=True`.\n                This is because python does not support reference parameters for primitive types.\n\n                ::\n\n                    def no_printing(wbName, cancel):\n                      cancel.value = True\n                    xlo.event.WorkbookBeforePrint += no_printing\n\n              * Workbook and worksheet names are passed a string, Ranges as passed as a \n                :any:`xloil.Range`\n    \n          Python-only Events\n          ------------------\n\n          These events are specific to python and not noted in the Core documentation:\n\n            * PyBye:\n                Fired just before xlOil finalises its embedded python interpreter. \n                All python and xlOil functionality is still available. This event is useful \n                to stop threads as it is called before threading module teardown, whereas \n                python's `atexit` is called afterwards. Has no parameters.\n            * UserException:\n                Fired when an exception is raised in a user-supplied python callback, \n                for example a GUI callback or an RTD publisher. Has no parameters.\n            * file_change:\n                This is a special parameterised event, see the separate documentation\n                for this function.\n\n          Examples\n          --------\n\n          ::\n\n              def greet(workbook, worksheet):\n                  xlo.Range(f\"[{workbook}]{worksheet}!A1\") = \"Hello!\"\n\n              xlo.event.WorkbookNewSheet += greet\n              ...\n              xlo.event.WorkbookNewSheet -= greet\n              \n              print(xlo.event.WorkbookNewSheet.handlers) # Should be empty\n\n\n          ::\n\n              def click_handler(sheet_name, target, cancel):\n                  xlo.worksheets[sheet_name]['A5'].value = target.address()\n    \n              xlo.event.SheetBeforeDoubleClick += click_handler\n\n        )\";\n\n        eventMod.def(\"allow\", \n          [](bool excel) { setEnableEvents(true, excel); },\n          R\"(\n            Resumes event handling after a previous call to *pause*.\n\n            If *excel* is True (the default), also calls `Application.EnableEvents = True`\n            (equivalent to `xlo.app().enable_events = True`)\n          )\",\n          py::arg(\"excel\") = true);\n\n        eventMod.def(\"pause\", \n          [](bool excel) { setEnableEvents(false, excel); },\n          R\"(\n            Stops all xlOil event handling - any executing handlers will complete but\n            no further handlers will fire.\n\n            If *excel* is True (the default), also calls `Application.EnableEvents = False`\n            (equivalent to `xlo.app().enable_events = False`)\n          )\",\n          py::arg(\"excel\")=true);\n\n        bindArithmeticRef<bool>(eventMod);\n\n        py::class_<IPyEvent, shared_ptr<IPyEvent>>(eventMod, \"Event\")\n          .def(\"__iadd__\", &IPyEvent::add)\n          .def(\"__isub__\", &IPyEvent::remove)\n          .def(\n            \"add\", \n            &IPyEvent::add,\n            R\"(\n              Registers an event handler callback with this event, equivalent to\n              `event += handler`\n            )\", py::arg(\"handler\"))\n          .def(\n            \"remove\", \n            &IPyEvent::remove,\n            R\"(\n              Deregisters an event handler callback with this event, equivalent to\n              `event -= handler`\n            )\", py::arg(\"handler\"))\n          .def_property_readonly(\n            \"handlers\", \n            &IPyEvent::handlers,\n            \"The tuple of handlers registered for this event. Read-only.\")\n          .def(\n            \"clear\", \n            &IPyEvent::clear,\n            \"Removes all handlers from this event\");\n\n        // TODO: how to set doc string for each event?\n#define XLO_PY_EVENT(r, _, NAME) \\\n        bindEvent(eventMod, XLO_WSTR(NAME), makeEvent(xloil::Event::NAME()));\n\n        BOOST_PP_SEQ_FOR_EACH(XLO_PY_EVENT, _, XLOIL_STATIC_EVENTS)\n#undef XLO_PY_EVENT\n\n        bindEvent(eventMod, \n          L\"UserException\",\n          makeEventNoUserExcept(Event_PyUserException()));\n\n        bindEvent(eventMod, \n          L\"PyBye\",\n          makeEventNoUserExcept(Event_PyBye()));\n\n        eventMod.def(\n          \"file_change\", \n          getDirectoryChangeEvent, \n          R\"(\n            This function returns an event specific to the given path and action; the \n            event fires when a watched file or directory changes.  The returned event \n            can be hooked in the usual way using `+=` or `add`. Calling this function \n            with same arguments always returns a reference to the same event object.\n\n            The handler should take a single string argument: the name of the file or \n            directory which changed.\n\n            The event runs on a background thread.\n\n            Parameters\n            ----------\n\n            path: str\n               Can be a file or a directory. If *path* points to a directory, any change\n               to files in that directory, will trigger the event. Changes to the specified \n               directory itself will not trigger the event.\n\n            action: str [\"add\", \"remove\", \"modify\"], default \"modify\"\n               The event will only fire when this type of change is detected:\n\n                 *modify*: any update which causes a file's last modified time to change\n                 *remove*: file deletion\n                 *add*: file creation\n\n               A file rename triggers *remove* followed by *add*.\n\n            subdirs: bool (true)\n               including in subdirectories,\n          )\",\n          py::arg(\"path\"), \n          py::arg(\"action\") = \"modify\",\n          py::arg(\"subdirs\") = true);\n      });\n    }\n\n    void raiseUserException(const pybind11::error_already_set& e)\n    {\n      // Acquire gil here as if debug logging is enabled, the event base class\n      // will try to write out the event parameters as strings.\n      py::gil_scoped_acquire gilAcquired;\n      Event_PyUserException().fire(e.type(), e.value(), e.trace());\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyEvents.h",
    "content": "#pragma once\n#include <xlOil/Events.h>\nnamespace pybind11 {\n  class object; class error_already_set;\n}\nnamespace xloil\n{\n  namespace Python\n  {\n    /// <summary>\n    /// An event triggered when the Python plugin is about to close\n    /// but before the Python interpreter is stopped.\n    /// </summary>\n    Event::Event<void(void)>& Event_PyBye();\n\n    /// <summary>\n    /// Fired when an exception occurs in user-defined code and passes the\n    /// (type, value, traceback) argument triple as per sys.exec_info().\n    /// Allows custom handling of user exceptions, e.g. opening a debugger.\n    /// </summary>\n    Event::Event<void(\n      const pybind11::object&, \n      const pybind11::object&, \n      const pybind11::object&)>&\n        Event_PyUserException();\n\n    void raiseUserException(const pybind11::error_already_set& e);\n    \n    /// <summary>\n    /// If *false* is passed, disables all xlOil_Python event handling. By\n    /// default, events are enabled. Threadsafe.\n    /// </summary>\n    void setAllowPyEvents(bool value);\n\n    template<class F, class... Args>\n    auto checkUserException(F&& f, Args... args)\n    {\n      try\n      {\n        return f(std::forward<Args>(args)...);\n      }\n      catch (const pybind11::error_already_set& e)\n      {\n        raiseUserException(e);\n        throw;\n      }\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyFunctionRegister.cpp",
    "content": "#include \"PyFunctionRegister.h\"\n#include \"PyCore.h\"\n#include \"TypeConversion/BasicTypes.h\"\n#include \"TypeConversion/PyDictType.h\"\n#include \"PySource.h\"\n#include \"AsyncFunctions.h\"\n#include \"PyEvents.h\"\n#include \"PyAddin.h\"\n#include <xloil/StaticRegister.h>\n#include <xloil/DynamicRegister.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/Caller.h>\n#include <xloil/FPArray.h>\n#include <xloil/RtdServer.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/Interface.h>\n#include <pybind11/stl.h>\n\n#include <map>\n#include <filesystem>\n\nnamespace fs = std::filesystem;\nusing std::shared_ptr;\nusing std::vector;\nusing std::pair;\nusing std::map;\nusing std::wstring;\nusing std::wstring_view;\nusing std::string;\nusing std::move;\nusing std::make_shared;\nusing std::make_pair;\nusing std::unique_ptr;\nusing std::weak_ptr;\nnamespace py = pybind11;\nusing namespace pybind11::literals;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    constexpr wchar_t* XLOPY_ANON_SOURCE = L\"[PyFuncs]\";\n    constexpr char* XLOPY_CLEANUP_FUNCTION = \"_xloil_unload\";\n\n    unsigned readFuncFeatures(\n      const string& features,\n      PyFuncInfo& info,\n      bool isVolatile,\n      bool& isLocalFunc)\n    {\n      unsigned funcOpts = isVolatile ? FuncInfo::VOLATILE : 0;\n\n      if (features.find(\"macro\") != string::npos)\n        funcOpts |= FuncInfo::MACRO_TYPE;\n      if (features.find(\"fastarray\") != string::npos)\n        funcOpts |= FuncInfo::ARRAY;\n      if (features.find(\"command\") != string::npos)\n        funcOpts |= FuncInfo::COMMAND;\n      if (features.find(\"threaded\") != string::npos)\n      {\n        funcOpts |= FuncInfo::THREAD_SAFE;\n        isLocalFunc = false;\n      }\n      if (features.find(\"rtd\") != string::npos)\n      {\n        info.isRtdAsync = true;\n      }\n      if (features.find(\"async\") != string::npos)\n      {\n        info.isAsync = true;\n        isLocalFunc = false;\n        if (funcOpts > 0)\n          XLO_THROW(\"Async cannot be used with other function features like command, macro, etc\");\n      }\n\n      return funcOpts;\n    }\n\n    PyFuncInfo::PyFuncInfo(\n      const pybind11::function& func,\n      const std::vector<PyFuncArg>& args,\n      const std::wstring& name,\n      const std::string& features,\n      const std::wstring& help,\n      const std::wstring& category,\n      bool isLocal,\n      bool isVolatile,\n      unsigned errorPropagation)\n      : _info(new FuncInfo())\n      , _func(func)\n      , _args(args)\n      , isLocalFunc(isLocal)\n      , isRtdAsync(false)\n      , isAsync(false)\n      , _hasKeywordArgs(false)\n      , _hasVariableArgs(false)\n      , _numPositionalArgs(0)\n      , _propagateErrors(errorPropagation > 0 ? ALWAYS : errorPropagation < 0 ? NEVER : 0)\n    {\n      _info->name = name.empty()\n        ? py::wstr(func.attr(\"__name__\"))\n        : name;\n\n      _info->help = help;\n      _info->category = category;\n\n      if (!func.ptr() || func.is_none())\n        XLO_THROW(L\"No python function specified for {0}\", name);\n\n      py::gil_scoped_release releaseGil;\n\n      _info->options = readFuncFeatures(features, *this, isVolatile, isLocalFunc);\n\n      if (!_info->isValid())\n        XLO_THROW(\"Invalid combination of function features: '{}'\", features);\n    }\n\n    PyFuncInfo::~PyFuncInfo()\n    {\n      py::gil_scoped_acquire getGil;\n      returnConverter.reset();\n      _args.clear();\n      _func = py::object();\n    }\n\n    void PyFuncInfo::setReturnConverter(const std::shared_ptr<const IPyToExcel>& conv)\n    {\n      returnConverter = conv;\n    }\n\n\n    struct CommandReturn\n    {\n      using return_type = int;\n\n      CommandReturn(const IPyToExcel*) {}\n\n      int operator()(PyObject* /*retVal*/) const\n      {\n        return 1; // Ignore return value\n      }\n\n      int operator()(const char* err, const PyFuncInfo* info) const\n      {\n        XLO_ERROR(L\"{0}: {1}\", info->name(), utf8ToUtf16(err));\n        return 0;\n      }\n\n      int operator()(CellError, const PyFuncInfo* info) const\n      {\n        XLO_ERROR(L\"{0}: unknown error\", info->name());\n        return 0;\n      }\n    };\n\n    struct FPArrayReturn\n    {\n      using return_type = FPArray*;\n\n      FPArrayReturn(const IPyToExcel*) {}\n\n      FPArray* operator()(PyObject* retVal) const\n      {\n        return numpyToFPArray(retVal).get();\n      }\n\n      FPArray* operator()(const char* err, const PyFuncInfo* info) const\n      {\n        XLO_ERROR(L\"{0}: {1}\", info->name(), utf8ToUtf16(err));\n        return FPArray::empty();\n      }\n\n      FPArray* operator()(CellError, const PyFuncInfo* info) const\n      {\n        XLO_ERROR(L\"{0}: unknown error\", info->name());\n        return FPArray::empty();\n      }\n    };\n\n    struct ExcelObjReturn\n    {\n      using return_type = ExcelObj*;\n\n      const IPyToExcel* _returnConverter;\n\n      ExcelObjReturn(const IPyToExcel* returnConverter)\n        : _returnConverter(returnConverter)\n      {}\n\n      ExcelObj* operator()(PyObject* retVal) const\n      {\n        // Static is OK since we have the GIL and are single-threaded so can\n        // must be on Excel's main thread. The args array is large enough:\n        // we cannot register a function with more arguments than that.\n        static ExcelObj result;\n\n        result = _returnConverter\n          ? (*_returnConverter)(retVal)\n          : FromPyObj()(retVal);\n\n        return (*this)(result);\n      }\n\n      template<class T> ExcelObj* operator()(T&& x, const PyFuncInfo* = nullptr) const\n      {\n        // No need to include function name in error messages since the calling function\n        // is usually clear in a worksheet\n        return returnValue(std::forward<T>(x));\n      }\n    };\n\n    struct ExcelObjThreadSafeReturn\n    {\n      using return_type = ExcelObj*;\n\n      const IPyToExcel* _returnConverter;\n\n      ExcelObjThreadSafeReturn(const IPyToExcel* returnConverter)\n        : _returnConverter(returnConverter)\n      {}\n\n      ExcelObj* operator()(PyObject* retVal) const\n      {\n        return returnValue(_returnConverter\n          ? (*_returnConverter)(retVal)\n          : FromPyObj()(retVal));\n      }\n\n      template<class T> ExcelObj* operator()(T&& x, const PyFuncInfo* = nullptr) const\n      {\n        // No need to include function name in error messages since the calling function\n        // is usually clear in a worksheet\n        return returnValue(std::forward<T>(x));\n      }\n    };\n\n    template<class TReturn = ExcelObjReturn>\n    typename TReturn::return_type pythonCallback(\n      const PyFuncInfo* info,\n      const ExcelObj** xlArgs) noexcept\n    {\n      TReturn returner(info->getReturnConverter().get());\n\n      unique_ptr<InXllContext> xllContext(\n        info->isLocalFunc ? nullptr : new InXllContext());\n\n      try\n      {\n        if (info->propagateErrors() )\n        {\n          for (auto j = 0u; j < info->info()->args.size(); ++j)\n            if (xlArgs[j]->isType(ExcelType::Err))\n              return returner(xlArgs[j]->cast<CellError>(), info);\n        }\n\n        py::gil_scoped_acquire gilAcquired;\n        PyErr_Clear(); // TODO: required?\n        return returner(info->invoke([&](auto i) -> auto& { return *xlArgs[i]; }).ptr());\n      }\n      catch (const py::error_already_set& e)\n      {\n        raiseUserException(e);\n        return returner(e.what(), info);\n      }\n      catch (const std::exception& e)\n      {\n        return returner(e.what(), info);\n      }\n      catch (...)\n      {\n        return returner(CellError::Value, info);\n      }\n    }\n\n    shared_ptr<const DynamicSpec>\n      PyFuncInfo::createSpec(\n        const std::shared_ptr<PyFuncInfo>& func, \n        const PyAddin& addin)\n    {\n      // We implement this as a static function taking a shared_ptr rather than using \n      // shared_from_this with PyFuncInfo as the latter causes pybind to catch a \n      // std::bad_weak_ptr during construction which seems rather un-C++ like and irksome\n      func->writeExcelArgumentDescription();\n\n      func->setErrorPropagation(addin.propagateErrors());\n      // TODO: function name prefix implement here\n\n      auto cfunc = std::const_pointer_cast<const PyFuncInfo>(func);\n      if (func->isAsync)\n        return make_shared<DynamicSpec>(func->info(), &pythonAsyncCallback, cfunc);\n      else if (func->isRtdAsync)\n        return make_shared<DynamicSpec>(func->info(), &pythonRtdCallback, cfunc);\n      else if (func->isThreadSafe())\n        return make_shared<DynamicSpec>(func->info(), &pythonCallback<ExcelObjThreadSafeReturn>, cfunc);\n      else if (func->isCommand())\n        return make_shared<DynamicSpec>(func->info(), &pythonCallback<CommandReturn>, cfunc);\n      else if (func->isFPArray())\n        return make_shared<DynamicSpec>(func->info(), &pythonCallback<FPArrayReturn>, cfunc);\n      else\n        return make_shared<DynamicSpec>(func->info(), &pythonCallback<>, cfunc);\n    }\n\n    void PyFuncInfo::writeExcelArgumentDescription()\n    {\n      const auto numArgs = (uint16_t)_args.size();\n      _numPositionalArgs = numArgs;\n\n      if (numArgs == 0)\n        return;\n\n      auto lastArg = _args.end() - 1;\n\n      if (lastArg->isKeywords())\n      {\n        _hasKeywordArgs = true;\n        --_numPositionalArgs;\n        if (_numPositionalArgs > 0)\n          --lastArg;\n      }\n\n      if (lastArg->isVargs())\n      {\n        if (_hasKeywordArgs)\n          std::iter_swap(lastArg, _args.end() - 1);\n        _hasVariableArgs = true;\n        --_numPositionalArgs;\n      }\n\n      auto& registerArgs = _info->args;\n\n      registerArgs.reserve(\n        numArgs\n        + (isAsync ? 1 : 0) \n        + (_hasVariableArgs ? 100 : 0));\n\n      if (isAsync)\n        registerArgs.emplace_back(wstring_view(), wstring_view(), FuncArg::AsyncHandle);\n\n      for (auto& arg : _args)\n      {\n        int flags = FuncArg::Obj;\n\n        if (arg.isArray())\n          flags = FuncArg::Array;\n        else if (arg.flags.find(\"range\") != string::npos)\n          flags |= FuncArg::Range;\n\n        if (arg.default)\n          flags |= FuncArg::Optional;\n\n        auto help = arg.help;\n        // If no help string has been provided, give a type hint based on \n        // the arg converter\n        if (help.empty() && arg.converter)\n        {\n          wstring argType = utf8ToUtf16(arg.converter->name());\n          if (arg.default)\n          {\n            arg.help = formatStr(L\"[%s]\", argType.c_str());\n            // Could do this but we'd need to reacquire the GIL\n            //arg.help = formatStr(L\"[%s]='%s'\", argType.c_str(), pyToWStr(arg.default).c_str());\n          }\n          else\n            arg.help = formatStr(L\"<%s>\", argType.c_str());\n        }\n\n        registerArgs.emplace_back(\n          arg.name,\n          std::move(help),\n          flags);\n      }\n\n      if (_hasVariableArgs)\n      {\n        // Note that having 255 args means the concatenated argument names will certainly\n        // exceed 255 chars, which will generate a notification in the log file\n#ifdef _WIN64\n        int numVariableArgs = XL_MAX_VBA_FUNCTION_ARGS - numArgs;\n#else\n        int numVariableArgs = 16u - numArgs; // Due to thunker limitations!\n#endif\n        if (numVariableArgs < 0)\n          XLO_THROW(\"Cannot construct variable arg list as max number of UDF args has been exceeded\");\n        auto varArgType = registerArgs.back().type | FuncArg::Optional;\n        for (auto i = 1; i < numVariableArgs + 1; ++i)\n        {\n          registerArgs.emplace_back(\n            isLocalFunc ? formatStr(L\"a%d\", i) : L\".\",\n            formatStr(L\"[%s-%d]\", _args.back().name.c_str(), i),\n            varArgType);\n        }\n      }\n    }\n\n    //TODO: Refactor Python FileSource\n    // It might be better for lifetime management if the whole FileSource interface was exposed\n    // via the core, then a reference to the FileSource can be held and closed by the module itself\n\n    /// <summary>\n    /// If provided, a linked workbook can be used for local functions\n    /// </summary>\n    /// <param name=\"modulePath\"></param>\n    /// <param name=\"workbookName\"></param>\n    RegisteredModule::RegisteredModule(\n      const wstring& modulePath,\n      const std::weak_ptr<PyAddin>& addin,\n      const wchar_t* workbookName)\n      : LinkedSource(\n        modulePath.c_str(),\n        modulePath != XLOPY_ANON_SOURCE,\n        workbookName)\n      , _linkedWorkbook(workbookName)\n      , _addin(addin)\n    {}\n\n    RegisteredModule::~RegisteredModule()\n    {\n      try\n      {\n        if (!_module || name() == XLOPY_ANON_SOURCE)\n          return;\n\n        // TODO: cancel running async tasks?\n        py::gil_scoped_acquire getGil;\n\n        // Call module cleanup function\n        if (py::hasattr(_module, XLOPY_CLEANUP_FUNCTION))\n          _module.attr(XLOPY_CLEANUP_FUNCTION)();\n\n        auto success = unloadModule(_module.release());\n\n        XLO_DEBUG(L\"Python module unload {1} for '{0}'\",\n          filename(), success ? L\"succeeded\" : L\"failed\");\n      }\n      catch (const std::exception& e)\n      {\n        XLO_ERROR(\"Error unloading python module '{0}': {1}\",\n          utf16ToUtf8(filename()), e.what());\n      }\n    }\n\n    void RegisteredModule::registerPyFuncs(\n      const py::handle& pyModule,\n      const vector<shared_ptr<PyFuncInfo>>& functions,\n      const bool append)\n    {\n      // This function takes a handle from .release() rather than a py::object\n      // to avoid needing the GIL to change the refcount.\n      _module = py::reinterpret_steal<py::object>(pyModule);\n      vector<shared_ptr<const WorksheetFuncSpec>> nonLocal, localFuncs;\n\n      auto addin = _addin.lock();\n\n      bool usesRtdAsync = false;\n\n      for (auto& f : functions)\n      {\n        if (!_linkedWorkbook)\n          f->isLocalFunc = false;\n        auto spec = PyFuncInfo::createSpec(f, *addin);\n\n        if (f->isLocalFunc)\n          localFuncs.emplace_back(std::move(spec));\n        else\n          nonLocal.emplace_back(std::move(spec));\n\n        if (f->isRtdAsync)\n          usesRtdAsync = true;\n      }\n\n      // Prime the RTD pump now as a background task to avoid it blocking \n      // in calculation later.\n      if (usesRtdAsync) // TODO: don't run it now?\n        runExcelThread([]() { rtdAsync(shared_ptr<IRtdAsyncTask>()); });\n\n      registerFuncs(nonLocal, append);\n      if (!localFuncs.empty())\n        registerLocal(localFuncs, append);\n    }\n\n    void RegisteredModule::reload()\n    {\n      // TODO: avoid watching the file in this case!\n      // Changes to non-local modules will be detected by the auto-reloader in\n      // xloil.importer, so we can ignore them here.\n      if (linkedWorkbook().empty())\n        return;\n\n      auto addin = _addin.lock();\n      // Rescan the module, passing in the module handle if it exists\n      if (_module && !_module.is_none())\n      {\n        py::gil_scoped_acquire get_gil;\n        addin->importModule(_module);\n      }\n      else\n        addin->importFile(name().c_str(), linkedWorkbook().c_str()); // gets the gil itself\n    }\n\n    void RegisteredModule::renameWorkbook(const wchar_t* newPathName)\n    {\n      if (!_linkedWorkbook) // Should never be called without a linked wb\n        return;\n\n      auto addin = _addin.lock();\n      // This is all great but...background thread?\n      addin->context().erase(shared_from_this());\n\n      const auto newSourcePath = addin->getLocalModulePath(newPathName);\n      const auto& currentSourcePath = name();\n\n      XLO_INFO(L\"Workbook rename: copying source '{0}' to '{1}'\",\n        currentSourcePath, newSourcePath);\n\n      std::error_code ec;\n      if (fs::copy_file(currentSourcePath, newSourcePath, ec))\n      {\n        const auto wbName = wcsrchr(newPathName, '\\\\') + 1;\n        auto newSource = make_shared<RegisteredModule>(newSourcePath, addin, wbName);\n        addin->context().addSource(newSource);\n        addin->importFile(newSourcePath.c_str(), newPathName);\n      }\n      else\n        XLO_WARN(L\"Failed to copy workbook source '{0}' to '{1}' because: {3}\",\n          currentSourcePath, newSourcePath, utf8ToUtf16(ec.message()));\n    }\n\n    std::shared_ptr<RegisteredModule>\n      FunctionRegistry::addModule(\n        const weak_ptr<PyAddin>& addin,\n        const std::wstring& modulePath,\n        const wchar_t* workbookName)\n    {\n      auto addin_ptr = addin.lock();\n\n      if (!addin_ptr)\n        XLO_THROW(\"FunctionRegistry internal error: empty addin provided\");\n\n      auto source = addin_ptr->findSource(modulePath.c_str());\n      if (source)\n        return std::static_pointer_cast<RegisteredModule>(source);\n\n      auto fileSrc = make_shared<RegisteredModule>(modulePath, addin, workbookName);\n     \n      addin_ptr->context().addSource(fileSrc);\n\n      XLO_DEBUG(L\"Registered Python module '{}' with linked workbook '{}' for addin '{}'\",\n        modulePath, workbookName ? workbookName : L\"none\", addin_ptr->pathName());\n\n      return fileSrc;\n    }\n\n    PyFuncArg::PyFuncArg(\n      std::wstring&& name, \n      std::wstring&& help, \n      const std::shared_ptr<IPyFromExcel>& converter,\n      std::string&& flags)\n      : name(move(name))\n      , help(move(help))\n      , converter(converter)\n      , flags(move(flags))\n    {\n      if (isArray())\n        this->converter.reset(createFPArrayConverter());\n\n      else if (!converter && !isKeywords())\n        XLO_THROW(L\"No converter for arg '{}'\", this->name);\n    \n      // TODO: create FuncArg in the FuncInfo at this stage?\n    }\n\n    std::string PyFuncArg::str() const\n    {\n      return formatStr(\"%s:%s (%s)\", utf16ToUtf8(name).c_str(), converter->name(), flags.c_str());\n    }\n\n    namespace\n    {\n      // Check if the provided module has a file attribute and return if present,\n      // otherwise use the generic \"anon\" source\n      auto getModulePath(const py::object& module)\n      {\n        return !module.is_none() && py::hasattr(module, \"__file__\")\n          ? module.attr(\"__file__\").cast<wstring>()\n          : XLOPY_ANON_SOURCE;\n      }\n    }\n\n    void registerFunctions(\n      const vector<shared_ptr<PyFuncInfo>>& functions,\n      py::object& module,\n      const py::object& addinContext,\n      const bool append)\n    {\n      // Called from python so we have the GIL\n      // A \"null\" module handle is used by jupyter\n      const auto modulePath = getModulePath(module);\n\n      auto& context = addinContext.is_none()\n        ? theCoreAddin()\n        : py::cast<shared_ptr<PyAddin>>(addinContext);\n\n      py::gil_scoped_release releaseGil;\n      auto registeredMod = FunctionRegistry::addModule(\n        weak_ptr<PyAddin>(context),\n        modulePath,\n        nullptr);\n\n      registeredMod->registerPyFuncs(module.release(), functions, append);\n    }\n\n    void deregisterFunctions(\n      const py::object& functionNames,\n      const py::object& moduleHandle)\n    {\n      // Called from python so we have the GIL\n\n      const auto modulePath = getModulePath(moduleHandle);\n\n      auto [foundSource, foundAddin] = AddinContext::findSource(modulePath.c_str());\n\n      if (!foundSource)\n      {\n        XLO_WARN(L\"Call to deregisterFunctions with unknown source '{0}'\", modulePath);\n        return;\n      }\n\n      vector<wstring> funcNames;\n      if (PyUnicode_Check(functionNames.ptr()))\n        funcNames.push_back(to_wstring(functionNames));\n      else\n      {\n        auto iter = py::iter(functionNames);\n        while (iter != py::iterator::sentinel())\n        {\n          funcNames.push_back(iter->cast<wstring>());\n          ++iter;\n        }\n      }\n\n      py::gil_scoped_release releaseGil;\n\n      for (auto& func : funcNames)\n        foundSource->deregister(func);\n    }\n\n    namespace\n    {\n      string pyFuncInfoToString(const PyFuncInfo& info)\n      {\n        string result = utf16ToUtf8(info.info()->name) + \"(\";\n        for (auto& arg : info.args())\n          result += utf16ToUtf8(arg.name) \n            + (arg.converter ? formatStr(\": %s, \", arg.converter->name()) : \", \");\n        if (!info.args().empty())\n          result.resize(result.size() - 2);\n        result.push_back(')');\n        if (info.getReturnConverter())\n          result += formatStr(\" -> %s\", info.getReturnConverter()->name());\n        return result;\n      }\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n          py::class_<PyFuncArg>(mod, \"_FuncArg\")\n            .def(py::init<wstring&&, wstring&&, const std::shared_ptr<IPyFromExcel>&, string&&>())\n            .def_readonly(\"name\", &PyFuncArg::name)\n            .def_readonly(\"help\", &PyFuncArg::help)\n            .def_readwrite(\"converter\", &PyFuncArg::converter)\n            .def_readwrite(\"default\", &PyFuncArg::default)\n            .def_readonly(\"flags\", &PyFuncArg::flags)\n            .def(\"__str__\", &PyFuncArg::str);\n\n        py::class_<PyFuncInfo, shared_ptr<PyFuncInfo>>(mod, \"_FuncSpec\")\n          .def(py::init<py::function, vector<PyFuncArg>, wstring, string, wstring, wstring, bool, bool, unsigned>(),\n            py::arg(\"func\"),\n            py::arg(\"args\"),\n            py::arg(\"name\") = \"\",\n            py::arg(\"features\") = py::none(),\n            py::arg(\"help\") = \"\",\n            py::arg(\"category\") = \"\",\n            py::arg(\"local\") = true,\n            py::arg(\"volatile\") = false,\n            py::arg(\"errors\") = 0)\n          .def(\"__str__\", pyFuncInfoToString)\n          .def_property(\"return_converter\",\n            &PyFuncInfo::getReturnConverter,\n            &PyFuncInfo::setReturnConverter)\n          .def_property(\"error_propagation\",\n            &PyFuncInfo::getErrorPropagation,\n            &PyFuncInfo::setErrorPropagation,\n            R\"(\n              Used internally to control the error propagation setting\n            )\")\n          .def_property_readonly(\"args\",\n            [](const PyFuncInfo& self) { return self.args(); })\n          .def_property(\"name\",\n            [](const PyFuncInfo& self) { return self.info()->name; },\n            [](const PyFuncInfo& self, wstring&& value) { self.info()->name = std::move(value); },\n            R\"(\n              Writing to name property doesn't make sense when registered\n            )\")\n          .def_property_readonly(\"help\",\n            [](const PyFuncInfo& self) { return self.info()->help; })\n          .def_property(\"func\",\n            &PyFuncInfo::func, &PyFuncInfo::setFunc,\n            R\"(\n              Yes you can change the function which is called by Excel! Use\n              with caution.\n            )\")\n          .def_property_readonly(\"is_threaded\",\n            &PyFuncInfo::isThreadSafe,\n            R\"(\n              True if the function can be multi-threaded during Excel calcs\n            )\")\n          .def_property_readonly(\"is_rtd\",\n            [](const PyFuncInfo& self) { return self.isRtdAsync; },\n            R\"(\n              True if the function uses RTD to provide async returns\n            )\")\n          .def_property_readonly(\"is_async\",\n            [](const PyFuncInfo& self) { return self.isAsync; },\n            R\"(\n              True if the function used Excel's native async\n            )\");\n          \n\n        mod.def(\"_register_functions\", &registerFunctions,\n          py::arg(\"funcs\"),\n          py::arg(\"module\") = py::none(),\n          py::arg(\"addin\") = py::none(),\n          py::arg(\"append\") = false);\n\n        mod.def(\"deregister_functions\",\n          &deregisterFunctions,\n          R\"(\n            Deregisters worksheet functions linked to specified module. Generally, there\n            is no need to call this directly.\n          )\",\n          py::arg(\"funcs\"),\n          py::arg(\"module\") = py::none());\n      }, 20); // Need to declare before PyAddin\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyFunctionRegister.h",
    "content": "#pragma once\n#include \"PyCore.h\"\n#include \"TypeConversion/PyDictType.h\"\n#include <xlOil/Register.h>\n#include <xlOil/Throw.h>\n#include <xlOil/Interface.h>\n#include <map>\n#include <string>\n#include <pybind11/pybind11.h>\n\nnamespace xloil {\n  class AddinContext;\n  struct FuncInfo;\n  class ExcelObj;\n  class DynamicSpec;\n  template <class T> class IConvertToExcel;\n}\nnamespace xloil\n{\n  namespace Python\n  {\n    class RegisteredModule; \n    class IPyFromExcel; \n    class IPyToExcel;\n    class PyAddin;\n\n    namespace FunctionRegistry\n    {\n      /// <summary>\n      /// Adds the specified module to the specified context if the module\n      /// has not already been read. If the module already exists, just \n      /// returns a reference to it.\n      /// </summary>\n      std::shared_ptr<RegisteredModule>\n        addModule(\n          const std::weak_ptr<PyAddin>& context,\n          const std::wstring& modulePath,\n          const wchar_t* workbookName);\n    };\n\n    struct PyFuncArg\n    {\n      PyFuncArg(\n        std::wstring&& name, \n        std::wstring&& help, \n        const std::shared_ptr<IPyFromExcel>& converter,\n        std::string&& flags);\n\n      std::shared_ptr<IPyFromExcel> converter;\n      std::wstring name;\n      std::wstring help;\n      pybind11::object default;\n      std::string flags;\n\n      bool isKeywords() const {\n        return flags.find(\"keywords\") != std::string::npos;\n      }\n\n      bool isVargs() const {\n        return flags.find(\"vargs\") != std::string::npos;\n      }\n\n      bool isArray() const {\n        return flags.find(\"array\") != std::string::npos;\n      }\n      std::string str() const;\n    };\n\n    class PyFuncInfo\n    {\n    public:\n      PyFuncInfo(\n        const pybind11::function& func,\n        const std::vector<PyFuncArg>& args,\n        const std::wstring& name,\n        const std::string& features,\n        const std::wstring& help,\n        const std::wstring& category,\n        bool isLocal,\n        bool isVolatile,\n        unsigned errorPropagation);\n\n      ~PyFuncInfo();\n\n      const auto& name() const { return _info->name; }\n\n      auto& args() { return _args; }\n      const auto& args() const { return _args; }\n\n      auto getReturnConverter() const { return returnConverter; }\n      void setReturnConverter(const std::shared_ptr<const IPyToExcel>& conv);\n      auto getErrorPropagation() const { return (_propagateErrors & ADDIN) > 0; }\n      void setErrorPropagation(bool x) { _propagateErrors |= x ? ADDIN : ~ADDIN; }\n\n      bool isLocalFunc;\n      bool isAsync;\n      bool isRtdAsync;\n      bool isThreadSafe() const { return (_info->options & FuncInfo::THREAD_SAFE) != 0; }\n      bool isCommand()    const { return (_info->options & FuncInfo::COMMAND) != 0; }\n      bool isFPArray()    const { return (_info->options & FuncInfo::ARRAY) != 0; }\n      bool propagateErrors() const \n      { \n        auto x = (_propagateErrors & (ALWAYS | NEVER | ADDIN));\n        return x > 0 && x < NEVER;\n      }\n\n      const std::shared_ptr<FuncInfo>& info() const { return _info; }\n\n      const pybind11::function& func() const { return _func; }\n      void setFunc(const pybind11::function& f) { _func = f; }\n\n      static std::shared_ptr<const DynamicSpec> \n        createSpec(\n          const std::shared_ptr<PyFuncInfo>& funcInfo,\n          const PyAddin& addin);\n\n      /// <summary>\n      /// Convert the array of ExcelObj arguments to PyObject values, with \n      /// option kwargs.\n      /// </summary>\n      /// <param name=\"xlArgs\">Size must be equal to `args().size()`</param>\n      /// <param name=\"pyArgs\">Size must equal `argArraySize()`</param>\n      /// <param name=\"kwargs\"></param>\n      template<class TXlArgs, class TPyArgs>\n      void convertArgs(\n        TXlArgs xlArgs,\n        TPyArgs& pyArgs,\n        pybind11::object& kwargs) const\n      {\n        assert(pyArgs.capacity() >= _numPositionalArgs + (isRtdAsync || isAsync ? 1u : 0u));\n\n        size_t i = 0;\n        try\n        {\n          for (; i < _numPositionalArgs; ++i)\n          {\n            auto* defaultValue = _args[i].default.ptr();\n            pyArgs.push_back((*_args[i].converter)(xlArgs(i), defaultValue));\n          }\n\n          if (_hasKeywordArgs)\n          {\n            if (!xlArgs(i).isMissing())\n              kwargs = PySteal<>(readKeywordArgs(xlArgs(i)));\n            ++i;\n          }\n\n          if (_hasVariableArgs)\n          {\n            auto& converter = *_args[i].converter;\n            const auto* defaultValue = _args[i].default.ptr();\n#ifdef _WIN64\n            const auto maxArgs = XL_MAX_VBA_FUNCTION_ARGS - _args.size();\n#else\n            const auto maxArgs = 16 - _args.size();\n#endif\n            for (auto iVarg = i; iVarg < maxArgs && !xlArgs(iVarg).isMissing(); ++iVarg)\n              pyArgs.push_back(converter(xlArgs(iVarg), defaultValue));\n          }\n        }\n        catch (const std::exception& e)\n        {\n          // We give the arg number 1-based as it's more natural\n          XLO_THROW(L\"Error in arg {1} '{0}': {2}\",\n            _args[i].name, std::to_wstring(i + 1), utf8ToUtf16(e.what()));\n        }\n      }\n\n      template<class TXlArgs>\n      auto invoke(TXlArgs&& xlArgs) const\n      {\n        PyCallArgs<> pyArgs;\n        py::object kwargs;\n\n        convertArgs(\n          std::forward<TXlArgs>(xlArgs),\n          pyArgs,\n          kwargs);\n\n        return pyArgs.call(_func, kwargs);\n      }\n\n    private:\n      std::shared_ptr<const IPyToExcel> returnConverter;\n      std::vector<PyFuncArg> _args;\n      std::shared_ptr<FuncInfo> _info;\n      pybind11::function _func;\n      bool _hasKeywordArgs;\n      bool _hasVariableArgs;\n      uint16_t _numPositionalArgs;\n      unsigned _propagateErrors;\n\n      void writeExcelArgumentDescription();\n\n      enum Propagation\n      {\n        ALWAYS = 1 << 2,\n        NEVER  = 1 << 3,\n        ADDIN  = 1  // Set if error propagation is enabled by the addin\n      };\n    };\n\n    class RegisteredModule : public LinkedSource\n    {\n    public:\n      /// <summary>\n      /// If provided, a linked workbook can be used for local functions\n      /// </summary>\n      /// <param name=\"modulePath\"></param>\n      /// <param name=\"workbookName\"></param>\n      RegisteredModule(\n        const std::wstring& modulePath,\n        const std::weak_ptr<PyAddin>& addin,\n        const wchar_t* workbookName);\n\n      ~RegisteredModule();\n\n      void registerPyFuncs(\n        const pybind11::handle& pyModule,\n        const std::vector<std::shared_ptr<PyFuncInfo>>& functions,\n        const bool append);\n\n      void reload() override;\n\n      void renameWorkbook(const wchar_t* newPathName) override;\n\n    private:\n      bool _linkedWorkbook;\n      std::weak_ptr<PyAddin> _addin;\n      pybind11::object _module;\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyFuture.h",
    "content": "\n#pragma once\n#include \"PyHelpers.h\"\n#include <future>\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace detail\n    {\n      class StopIteration : public pybind11::builtin_exception\n      {\n        PyObject* _value;\n      public:\n        using builtin_exception::builtin_exception;\n        StopIteration(PyObject* value) : StopIteration(\"\") { _value = value; }\n        void set_error() const override { PyErr_SetObject(PyExc_StopIteration, _value); }\n        // Is PyErr_SetObject stealing the ref?  If not, need to add a decref; \n      };\n\n      struct CastFutureConverter\n      {\n        template<class T> auto operator()(T x) { return py::cast(x).release().ptr(); }\n        template<>        auto operator()(PyObject* x) { return x; }\n      };\n    }\n    /// <summary>\n    /// This is not a fully flexible wrapper for a std::future.  At the time of writing (Nov 2021)\n    /// there is an active pybind11 PR to add async capabilities.\n    /// </summary>\n    /// <typeparam name=\"TValType\"></typeparam>\n    /// <typeparam name=\"TConverter\"></typeparam>\n    template <class TValType, class TConverter = detail::CastFutureConverter>\n    class PyFuture\n    {\n      // We follow the recipe in the following link to get a python async object\n      // https://stackoverflow.com/questions/51029111/python-how-to-implement-a-c-function-as-awaitable-coroutine\n      // \n      //   * Define __await__ to return an iterator. This could be *self* but we want to\n      //     avoid the PyFuture object being recognised as an iterator by return converters\n      //   * Define the iterator's __iter__ to return self\n      //   * Define the iterator's __next__ to return None until the future is ready, then to \n      //     raise StopIteration, passing the result value\n      //\n\n    public:\n      using this_type = PyFuture<TValType, TConverter>;\n\n      struct Iter\n      {\n        std::future<TValType> _future;\n\n        /// <summary>\n        /// Return None until the future is ready, then raises StopIteration, passing the result value \n        /// </summary>\n        void next()\n        {\n          TValType value;\n          {\n            pybind11::gil_scoped_release releaseGil;\n\n            if (!_future.valid())\n              throw pybind11::value_error();\n\n            if (!_future._Is_ready())\n              return;\n\n            value = _future.get();\n          }\n          throw detail::StopIteration(TConverter()(value));\n        };\n      };\n\n      Iter _iter;\n\n      /// <summary>\n      /// Consumes a std::future<T> to give a PyFuture<T>\n      /// </summary>\n      /// <param name=\"future\"></param>\n      PyFuture(std::future<TValType>&& future)\n        : _iter{ std::move(future) }\n      {}\n\n      /// <summary>\n      /// Synchronously gets the result from the future. Blocking.\n      /// </summary>\n      /// <returns></returns>\n      pybind11::object result()\n      {\n        TValType value;\n        {\n          pybind11::gil_scoped_release releaseGil;\n          if (!_iter._future.valid())\n            throw pybind11::value_error();\n          _iter._future.wait();\n          value = _iter._future.get();\n        }\n        return PySteal(TConverter()(value));\n      }\n\n      bool done()\n      {\n        return !_iter._future.valid() || _iter._future._Is_ready();\n      }\n\n      Iter& await() { return _iter; }\n\n      static void bind(pybind11::module& mod, const std::string& name)\n      {\n        pybind11::class_<Iter>(mod, (name + \"Iter\").c_str())\n          .def(\"__next__\", &Iter::next)\n          .def(\"__iter__\", [](pybind11::object self) { return self; });\n\n        pybind11::class_<this_type>(mod, name.c_str(), R\"(\n            A Future represents an eventual result of an asynchronous operation.\n            Future is an awaitable object. Coroutines can await on Future objects \n            until they either have a result or an exception set. This Future cannot\n            be cancelled.\n\n            This class actually wraps a C++ future so does executes in a separate \n            thread unrelated to an `asyncio` event loop. \n          )\")\n          .def(\"__await__\", &await, pybind11::return_value_policy::reference_internal)\n          .def(\"result\", \n            &result,\n            R\"(\n              Return the result of the Future, blocking if the Future is not yet done.\n\n              If the Future has a result, its value is returned.\n\n              If the Future has an exception, raises the exception.\n            )\")\n          .def(\"done\", \n            &done,\n            R\"(\n              Return True if the Future is done.  A Future is done if it has a result or an exception.\n            )\");\n      }\n    };\n\n    template <>\n    class PyFuture<void, void>\n    {\n    public:\n      using this_type = PyFuture<void, void>;\n\n      struct Iter\n      {\n        std::future<void> _future;\n\n        /// <summary>\n        /// Return None until the future is ready, then raises StopIteration, passing the result None \n        /// </summary>\n        void next()\n        {\n          {\n            pybind11::gil_scoped_release releaseGil;\n\n            if (!_future.valid())\n              throw pybind11::value_error();\n\n            if (!_future._Is_ready())\n              return;\n\n            _future.get(); // Ensure shared state is free'd\n          }\n          throw detail::StopIteration(Py_None);\n        };\n      };\n\n      Iter _iter;\n\n      PyFuture() = default;\n\n      /// <summary>\n      /// Consumes a std::future<T> to give a PyFuture<T>\n      /// </summary>\n      /// <param name=\"future\"></param>\n      PyFuture(std::future<void>&& future)\n        : _iter{ std::move(future) }\n      {}\n\n      /// <summary>\n      /// Synchronously gets the result from the future. Blocking.\n      /// </summary>\n      /// <returns></returns>\n      pybind11::object result()\n      {\n        {\n          pybind11::gil_scoped_release releaseGil;\n          if (!_iter._future.valid())\n            throw pybind11::value_error();\n          _iter._future.get();\n        }\n        return pybind11::none();\n      }\n\n      bool done()\n      {\n        return !_iter._future.valid() || _iter._future._Is_ready();\n      }\n\n      Iter& await() { return _iter; }\n\n      static void bind(pybind11::module& mod)\n      {\n        pybind11::class_<Iter>(mod, \"_FutureIter\")\n          .def(\"__next__\", &Iter::next)\n          .def(\"__iter__\", [](pybind11::object self) { return self; });\n\n        pybind11::class_<this_type>(mod, \"_Future\")\n          .def(\"__await__\", &await, pybind11::return_value_policy::reference_internal)\n          .def(\"result\", &result)\n          .def(\"done\", &done);\n      }\n    };\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/PyHelpers.cpp",
    "content": "#include \"PyHelpers.h\"\n\nnamespace py = pybind11;\nusing std::wstring;\n\n\nstd::wstring to_wstring(const PyObject* p)\n{\n  Py_ssize_t len;\n  wchar_t* wstr;\n  if (!p)\n    return wstring();\n  else if (PyUnicode_Check(p))\n    wstr = PyUnicode_AsWideCharString((PyObject*)p, &len);\n  else\n  {\n    auto str = PyObject_Str((PyObject*)p);\n    if (!str)\n      throw py::error_already_set();\n    wstr = PyUnicode_AsWideCharString(str, &len);\n    Py_XDECREF(str);\n  }\n\n  if (!wstr)\n    throw py::error_already_set();\n\n  auto freer = std::unique_ptr<wchar_t, void(*)(void*)>(wstr, PyMem_Free);\n  return wstring(wstr, len);\n}\n\nnamespace xloil {\n  namespace Python\n  {\n    bool getItemIndexReader1d(\n      const pybind11::object& index,\n      const size_t size, size_t& from, size_t& to)\n    {\n      if (index.is_none())\n      {\n        from = 0;\n        to = size;\n      }\n      else if (PySlice_Check(index.ptr()))\n      {\n        size_t sliceLength, step;\n        index.cast<pybind11::slice>().compute(size, &from, &to, &step, &sliceLength);\n        if (step != 1)\n          XLO_THROW(\"Slice step size must be 1\");\n      }\n      else\n      {\n        from = PyLong_AsLong(index.ptr());\n        if (from == -1 && PyErr_Occurred())\n          XLO_THROW(\"Could not read index as a slice or int\");\n        to = from + 1;\n        return true;\n      }\n      return false;\n    }\n\n    bool getItemIndexReader2d(\n      const pybind11::tuple& loc,\n      const size_t nRows, const size_t nCols,\n      size_t& fromRow, size_t& fromCol,\n      size_t& toRow, size_t& toCol)\n    {\n      if (loc.size() != 2)\n        XLO_THROW(\"Expecting tuple of size 2\");\n\n      auto singleElement = getItemIndexReader1d(loc[0], nRows, fromRow, toRow);\n      singleElement &= getItemIndexReader1d(loc[1], nCols, fromCol, toCol);\n      return singleElement;\n    }\n\n    PyObject* fastCall(\n      PyObject* func, PyObject* const* args, size_t nArgs, PyObject* kwargs) noexcept\n    {\n#if PY_VERSION_HEX < 0x03080000\n      auto argTuple = PyTuple_New(nArgs);\n      if (!argTuple)\n        return nullptr;\n\n      for (auto i = 0u; i < nArgs; ++i)\n      {\n        PyTuple_SET_ITEM(argTuple, i, args[i]);\n        Py_XINCREF(args[i]);\n      }\n\n      auto retVal = PyObject_Call(func, argTuple, kwargs);\n\n      Py_XDECREF(argTuple);\n#else\n      \n#if PY_VERSION_HEX < 0x03090000\n#  define PyObject_VectorcallDict _PyObject_FastCallDict \n#  define PyObject_Vectorcall _PyObject_Vectorcall \n#endif\n\n      auto retVal = kwargs\n        ? PyObject_VectorcallDict(func, args, nArgs | PY_VECTORCALL_ARGUMENTS_OFFSET, kwargs)\n        : PyObject_Vectorcall(func, args, nArgs | PY_VECTORCALL_ARGUMENTS_OFFSET, nullptr);\n#endif\n      return retVal;\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyHelpers.h",
    "content": "#pragma once\n// Include corecrt fixes this issue in pybind11 \n// https://github.com/microsoft/onnxruntime/issues/9735\n#include <corecrt.h>\n#include \"CPython.h\"\n#include <xloil/StringUtils.h>\n#include <xloil/ExcelThread.h>\n#include <xloil/Throw.h>\n#include <pybind11/pybind11.h>\n#include <pybind11/stl.h>\n#include <string>\n\n/// Returns true if the object implements __iter__, compare with PyIter_Check which\n/// tests if an object is an iterator. It seems useful, wonder why it's not in the API?\n#define PyIterable_Check(obj) (obj)->ob_type->tp_iter != NULL\n\n\n/// <summary>\n/// Converts a PyObject to a str, then to a C++ string\n/// </summary>\ninline auto to_string(const PyObject* p)\n{\n  return (std::string)pybind11::str(pybind11::handle((PyObject*)p));\n}\n/// <summary>\n/// Converts a PyObject to a str, then to a C++ wstring\n/// </summary>\nstd::wstring to_wstring(const PyObject* p);\n\nnamespace pybind11\n{\n  /// <summary>\n  /// A non-owning holder class used to bind references to static C++ objects\n  /// </summary>\n  template< typename T >\n  class ReferenceHolder\n  {\n  public:\n    explicit ReferenceHolder(T* ptr = nullptr) : ptr_(ptr) {}\n\n    T* get() const { return ptr_; }\n    T* operator-> () const { return ptr_; }\n\n  private:\n    T* ptr_;\n  };\n\n  inline auto to_string(const pybind11::object& p)\n  {\n    return to_string(p.ptr());\n  }\n\n  inline std::wstring to_wstring(const pybind11::object& p)\n  {\n    return to_wstring(p.ptr());\n  }\n\n  /// <summary>\n  /// If you're absolutely sure the the given PyObject is a pybind wrapper \n  /// for a <typeparam ref =\"T\"/> (for example because you checked p->ob_type)\n  /// then you can call this to safe a lot of messing around and a copy in\n  /// `py::cast`.  The type *T* must be move-constructible.\n  /// </summary>\n  /// <returns></returns>\n  template<class T>\n  inline auto unsafe_move(const PyObject* p)\n  {\n    auto v_h = ((py::detail::instance*)p)->get_value_and_holder();\n    return T(std::move(*v_h.value_ptr<T>()));\n  }\n\n  /// <summary>\n  /// A hack to pybind's enum code to allow us to do two things:\n  /// \n  /// 1. patch up the enum value to be the correct COM error code whilst \n  ///    allowing the enum to be created from  the values in CellError, which \n  ///    correspond to the XLL error codes. This \n  ///    allows us to write code like `if cell.Value2 == CellError.NAME.value`\n  /// 2. access the enum's entries to enable a fromString function\n  /// </summary>\n  /// \n  template<class TEnum>\n  class BetterEnum : public class_<TEnum> {\n  public:\n    using Base = class_<TEnum>;\n    using Base::attr;\n    using Base::def;\n    using Base::def_property_readonly;\n    using Base::def_property_readonly_static;\n    using Underlying = typename std::underlying_type<TEnum>::type;\n    using Scalar = int;\n\n    template <typename... Extra>\n    BetterEnum(const handle& scope, const char* name, const int patchValue = 0, const Extra &...extra)\n      : class_<TEnum>(scope, name, extra...)\n      , m_base(*this, scope)\n    {\n      constexpr bool is_arithmetic = false;\n      constexpr bool is_convertible = false;\n      m_base.init(is_arithmetic, is_convertible);\n\n      def(py::init([](Scalar i) {\n        return static_cast<TEnum>(i);\n        }),\n        py::arg(\"value\"));\n\n      auto valuePatcher = [patchValue](TEnum value) {\n        return (int)(patchValue + (unsigned)value);\n        };\n\n      def_property_readonly(\"value\", valuePatcher);\n      def(\"__int__\", valuePatcher);\n      def(\"__index__\", valuePatcher);\n    }\n\n    /// Add an enumeration entry\n    auto value(char const* name, TEnum value, const char* doc = nullptr)\n    {\n      m_base.value(name, py::cast(value, py::return_value_policy::copy), doc);\n      entries[name] = value;\n      return *this;\n    }\n\n    std::unordered_map<std::string, TEnum> entries;\n\n  private:\n    detail::enum_base m_base;\n  };\n}\n\nPYBIND11_DECLARE_HOLDER_TYPE(T, pybind11::ReferenceHolder<T>, true);\n\nnamespace xloil\n{\n  namespace Python\n  {\n    inline PyObject* PyCheck(PyObject* obj)\n    {\n      if (!obj)\n        throw pybind11::error_already_set();\n      return obj;\n    }\n    template<class TType = pybind11::object> inline TType PySteal(PyObject* obj)\n    {\n      if (!obj)\n        throw pybind11::error_already_set();\n      return pybind11::reinterpret_steal<TType>(obj);\n    }\n    template<class TType = pybind11::object> inline TType PyBorrow(PyObject* obj)\n    {\n      if (!obj)\n        throw pybind11::error_already_set();\n      return pybind11::reinterpret_borrow<TType>(obj);\n    }\n\n    /// <summary>\n    /// Gets a proper reference to a weakref. Strangely, this functionality is missing\n    /// in pybind11\n    /// </summary>\n    inline pybind11::object PyBorrow(const pybind11::weakref& wr)\n    {\n#if PY_VERSION_HEX < 0x030d0000\n      return PyBorrow(PyWeakref_GetObject(wr.ptr()));\n#else\n      PyObject* result;\n      if (PyWeakref_GetRef(wr.ptr(), &result) == -1)\n        throw pybind11::error_already_set();\n      return pybind11::reinterpret_steal<pybind11::object>(result);\n#endif\n    }\n\n    /// <summary>\n    /// If PyErr_Occurred is true, returns the error message, else an empty string\n    /// </summary>\n    inline std::wstring pyErrIfOccurred(bool clear = true)\n    {\n      const auto result = PyErr_Occurred()\n        ? utf8ToUtf16(pybind11::detail::error_fetch_and_normalize(\"\").format_value_and_trace())\n        : std::wstring();\n      if (clear)\n        PyErr_Clear();\n      return result;\n    }\n\n    /// <summary>\n    /// Reads an argument to __getitem__ i.e. [] using the following rules\n    ///     None => entire array\n    ///     Slice [a:b] => compute indices using python rules\n    ///     int => single value (0-based)\n    /// Modifies the <param ref=\"from\"/> and <param ref=\"to\"/> arguments\n    /// to indicate the extent of the sliced array. Only handles slices with\n    /// stride = 1.\n    /// </summary>\n    /// <param name=\"index\"></param>\n    /// <param name=\"size\">The size of the object being indexed</param>\n    /// <param name=\"from\"></param>\n    /// <param name=\"to\"></param>\n    /// <returns>Returns true if only a single element is accessed</returns>\n    bool getItemIndexReader1d(\n      const pybind11::object& index,\n      const size_t size, size_t& from, size_t& to);\n\n    /// <summary>\n    /// Take a 2-tuple of indeices and applies <see ref=\"getItemIndexReader1d\"/> in \n    /// each dimension\n    /// </summary>\n    /// <param name=\"loc\"></param>\n    /// <param name=\"nRows\">The first dimension of the object being indexed</param>\n    /// <param name=\"nCols\">The second dimension of the object being indexed</param>\n    /// <param name=\"fromRow\"></param>\n    /// <param name=\"fromCol\"></param>\n    /// <param name=\"toRow\"></param>\n    /// <param name=\"toCol\"></param>\n    /// <returns>Returns true if only a single element is accessed/returns>\n    bool getItemIndexReader2d(\n      const pybind11::tuple& loc,\n      const size_t nRows, const size_t nCols,\n      size_t& fromRow, size_t& fromCol,\n      size_t& toRow, size_t& toCol);\n\n    /// <summary>\n    /// Holds a py::object and ensures the GIL is held when the holder is destroyed\n    /// and the underlying py::object is decref'd \n    /// </summary>\n    class PyObjectHolder : public pybind11::detail::object_api<PyObjectHolder>\n    {\n      pybind11::object _obj;\n    public:\n      PyObjectHolder(const pybind11::object& obj)\n        : _obj(obj)\n      {}\n      ~PyObjectHolder()\n      {\n        if (!_obj)\n          return;\n        pybind11::gil_scoped_acquire getGil;\n        _obj = std::move(pybind11::object());\n      }\n      operator pybind11::object() const { return _obj; }\n\n      /// Return the underlying ``PyObject *`` pointer\n      PyObject* ptr() const { return _obj.ptr(); }\n      PyObject*& ptr() { return _obj.ptr(); }\n    };\n\n\n    /// <summary>\n    /// Wraps a class member function to ensure it is executed on Excel's main\n    /// thread (with no GIL) Used for pybind: e.g. mod.def(\"bar\", MainThreadWrap(&Foo::bar))\n    /// </summary>\n    template<class Return, class Class, class... Args>\n    constexpr auto MainThreadWrap(Return(Class::* f)(Args...) const)\n    {\n      return [f](Class* self, Args... args)\n      {\n        auto fut = runExcelThread([=]()\n        {\n          return (self->*f)(args...);\n        });\n        py::gil_scoped_release release;\n        return fut.get();\n      };\n    }\n\n    template<class Return, class Class, class... Args>\n    constexpr auto MainThreadWrap(Return(Class::* f)(Args...))\n    {\n      return [f](Class* self, Args... args)\n      {\n        auto fut = runExcelThread([=]()\n        {\n          return (self->*f)(args...);\n        });\n        py::gil_scoped_release release;\n        return fut.get();\n      };\n    }\n\n    template<class F, class T, class Return, class... Args>\n    constexpr auto MainThreadWrap(\n      F&& f,\n      Return(T::*)(Args...) const)\n    {\n      return [f](Args... args)\n      {\n        auto fut = runExcelThread([=]()\n        {\n          return f(args...);\n        });\n        py::gil_scoped_release release;\n        return fut.get();\n      };\n    }\n\n    template<class F>\n    constexpr auto MainThreadWrap(F&& f)\n    {\n      return MainThreadWrap(f, (decltype(&F::operator())) nullptr);\n    }\n\n    /// <summary>\n    /// Returns a dangling reference\n    /// </summary>\n    PyObject* fastCall(\n      PyObject* func, PyObject* const* args, size_t nArgs, PyObject* kwargs) noexcept;\n\n    /// <summary>\n    /// Manages an array of args suitable for a Python FastCall, this includes the \n    /// leading offset to allow easy fiddling of the 'self' parameter for onward calls.\n    /// Python can optimise onward calls to PyObject_Vectorcall if we leave a free \n    /// entry at the start of the arg array For Py 3.7 and earlier, vector call is not\n    /// available.\n    /// \n    /// The array is held on the stack, so a maximum size must be specified. \n    /// </summary>\n    template<\n      size_t TSize = 255, // = XL_MAX_UDF_ARGS\n#if PY_VERSION_HEX < 0x03080000\n      size_t TOffset = 1u\n#else\n      size_t TOffset = 0u\n#endif\n    >\n      class PyCallArgs\n    {\n      // Use array<PyObject*> as an array<py::object> would result in TSize dtor calls\n      std::array<PyObject*, TSize + TOffset>  _store;\n      size_t _size = TOffset;\n\n    public:\n      ~PyCallArgs()\n      {\n        clear();\n      }\n\n      /// <summary>\n      /// Steals a ref\n      /// </summary>\n      void push_back(PyObject* p)\n      {\n        assert(_size <= TSize);\n        _store[_size++] = p;\n      }\n\n      void push_back(const pybind11::object& obj)\n      {\n        auto p = obj.ptr();\n        Py_XINCREF(p);\n        push_back(p);\n      }\n\n      constexpr auto begin() const\n      {\n        return _store.begin();\n      }\n\n      auto end() const\n      {\n        return begin() + _size;\n      }\n\n      size_t nArgs() const { return _size - TOffset; }\n\n      constexpr size_t capacity() const { return TSize; }\n\n      void clear()\n      {\n        const auto last = end();\n        for (auto p = _store.begin() + TOffset; p != last; ++p)\n          Py_DECREF(*p);\n        _size = TOffset;\n      }\n\n      pybind11::object call(const pybind11::object& func, const pybind11::object& kwargs)\n      {\n        return PySteal(fastCall(func.ptr(), _store.data() + TOffset, nArgs(), kwargs.ptr()));\n      }\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyImage.cpp",
    "content": "#include \"PyImage.h\"\n#include \"PyHelpers.h\"\n#include <xlOil/State.h>\n\n#define WIN32_LEAN_AND_MEAN\n#include <Windows.h>\n#include <olectl.h>\n\nnamespace py = pybind11;\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      // Ensure handle is cleaned on exception\n      struct HandleDC\n      {\n        HandleDC(HDC h_) : h(h_) {}\n        ~HandleDC() { DeleteDC(h); }\n        HDC h;\n      };\n      struct HandleBitmap\n      {\n        HandleBitmap(HBITMAP h_) : h(h_) {}\n        ~HandleBitmap() { DeleteObject(h); }\n        void release() { h = nullptr; }\n        HBITMAP h;\n      };\n    }\n    IPictureDisp* pictureFromPilImage(const py::object& image)\n    {\n      // If PIL hasn't been imported, it's definitely not a PIL image!\n      const auto sysModules = PyBorrow<py::dict>(PySys_GetObject(\"modules\"));\n      if (!sysModules.contains(\"PIL\"))\n        return nullptr;\n\n      // Import PIL, and check if object is an instance of a PIL Image\n      auto PIL = py::module::import(\"PIL.Image\");\n      auto pilImageType = PIL.attr(\"Image\");\n      if (!py::isinstance(image, pilImageType))\n        return nullptr;\n      \n      // We have an Image, so get its size\n      const auto size = py::cast<py::tuple>(image.attr(\"size\"));\n      const auto width = py::cast<int>(size[0]);\n      const auto height = py::cast<int>(size[1]);\n\n      // Retrieve the handle to a display device context for the Excel window \n      const auto hwnd = (HWND)Environment::excelProcess().hWnd;\n      auto hdcWindow = GetDC(hwnd);\n\n      // Create a colour compatible device context and bitmap to receive the image\n      auto memoryDC = HandleDC(CreateCompatibleDC(hdcWindow));\n      auto bitmap = HandleBitmap(CreateCompatibleBitmap(hdcWindow, width, height));\n\n      // Select our new bitmap in the device context\n      SelectObject(memoryDC.h, bitmap.h);\n      \n      // No longer need the Excel window DC\n      ReleaseDC(hwnd, hdcWindow);\n\n      // Create a Device Independent Bitmap in PIL and copy it to the device context\n      auto ImageWin = py::module::import(\"PIL.ImageWin\");\n      auto dib = ImageWin.attr(\"Dib\")(image);\n      dib.attr(\"expose\")((intptr_t)memoryDC.h);\n     \n      // Get the (updated) palette from our device context\n      auto palette = (HPALETTE)GetCurrentObject(memoryDC.h, OBJ_PAL);\n\n      //SelectObject(memoryDC, oldbmp); Doesn't seem to be required\n      \n      // Call OleCreatePictureIndirect to create a IPictureDisp\n      PICTDESC pd;\n      pd.picType        = PICTYPE_BITMAP;\n      pd.cbSizeofstruct = sizeof(PICTDESC);\n      pd.bmp.hbitmap    = bitmap.h;\n      pd.bmp.hpal       = palette;\n      void* result;\n      OleCreatePictureIndirect(&pd, __uuidof(IPictureDisp), TRUE, &result);\n\n      // Release bitmap handle\n      bitmap.release();\n\n      return (IPictureDisp*)result;\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyImage.h",
    "content": "#pragma once\n#include <pybind11/pybind11.h>\n\nstruct IPictureDisp;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    IPictureDisp* pictureFromPilImage(const pybind11::object& image);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyLogWriter.cpp",
    "content": "#include \"PyCore.h\"\n#include \"PyAddin.h\"\n#include \"PyHelpers.h\"\n#include <xlOil/Log.h>\n#include <xlOil/StringUtils.h>\n#include <xlOil/Interface.h>\n#include <xlOilHelpers/Settings.h>\n#include <pybind11/stl.h>\n\nusing std::shared_ptr;\nusing std::wstring_view;\nusing std::vector;\nusing std::wstring;\nusing std::string;\nnamespace py = pybind11;\n\n#if PY_VERSION_HEX < 0x030B0000\ninline auto PyFrame_GetLasti(PyFrameObject* frame) { return frame->f_lasti; }\n#endif\n#if PY_VERSION_HEX < 0x03090000\ninline auto PyFrame_GetCode(PyFrameObject* frame) { return frame->f_code; }\n#endif\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      // The numerical values of the python log levels align nicely with spdlog\n      // so we can translate with a factor of 10.\n      // https://docs.python.org/3/library/logging.html#levels\n\n      class LogWriter\n      {\n      public:\n\n        /// <summary>\n        /// Allows intial match like 'warn' for 'warning'\n        /// </summary>\n        /// <param name=\"target\"></param>\n        /// <returns></returns>\n        spdlog::level::level_enum levelFromStr(const std::string& target)\n        {\n          using namespace spdlog::level;\n          int iLevel = 0;\n          for (const auto& level_str : SPDLOG_LEVEL_NAMES)\n          {\n            if (strncmp(target.c_str(), level_str, target.length()) == 0)\n              return static_cast<level_enum>(iLevel);\n            iLevel++;\n          }\n          return off;\n        }\n\n        spdlog::level::level_enum toSpdLogLevel(const py::object& level)\n        {\n          if (PyLong_Check(level.ptr()))\n          {\n            return spdlog::level::level_enum(\n              std::min(PyLong_AsUnsignedLong(level.ptr()) / 10, 6ul));\n          }\n          return levelFromStr(toLower((string)py::str(level)));\n        }\n\n        void writeToLog(const py::object& msg, const py::args& args, const py::kwargs& kwargs)\n        {\n          spdlog::level::level_enum level = spdlog::level::info;\n          if (kwargs.contains(\"level\"))\n            level = toSpdLogLevel(kwargs[\"level\"]);\n          writeToLogImpl(msg, args, level);\n        }\n\n        void writeToLogImpl(const py::object& msg, const py::args& args, spdlog::level::level_enum level)\n        {\n          if (!spdlog::default_logger_raw()->should_log(level))\n            return;\n\n          auto frame = PyEval_GetFrame();\n          spdlog::source_loc source{ __FILE__, __LINE__, SPDLOG_FUNCTION };\n          if (frame)\n          {\n            PyCodeObject* code = PyFrame_GetCode(frame); // Guaranteed never null\n            source.line = PyCode_Addr2Line(code, PyFrame_GetLasti(frame));\n            source.filename = PyUnicode_AsUTF8(code->co_filename);\n            source.funcname = PyUnicode_AsUTF8(code->co_name);\n          }\n\n          const string message = to_string(args.size() > 0\n            ? PySteal<>(PyUnicode_Format(msg.ptr(), args.ptr()))\n            : msg);\n  \n          py::gil_scoped_release releaseGil;\n          spdlog::default_logger_raw()->log(\n            source,\n            level,\n            message);\n        }\n\n        void flush()\n        {\n          py::gil_scoped_release releaseGil;\n          spdlog::default_logger()->flush();\n        }\n\n        void trace(const py::object& msg, const py::args& args) { writeToLogImpl(msg, args, spdlog::level::trace); }\n        void debug(const py::object& msg, const py::args& args) { writeToLogImpl(msg, args, spdlog::level::debug); }\n        void info(const py::object& msg,  const py::args& args) { writeToLogImpl(msg, args, spdlog::level::info); }\n        void warn(const py::object& msg,  const py::args& args) { writeToLogImpl(msg, args, spdlog::level::warn); }\n        void error(const py::object& msg, const py::args& args) { writeToLogImpl(msg, args, spdlog::level::err); }\n\n        auto getLogLevel()\n        {\n          const char* levelNames[] SPDLOG_LEVEL_NAMES;\n          auto level = spdlog::default_logger()->level();\n          return levelNames[level];\n        }\n\n        unsigned getLogLevelInt()\n        {\n          auto level = spdlog::default_logger()->level();\n          return level * 10;\n        }\n\n        void setLogLevel(const py::object& level)\n        {\n          spdlog::default_logger()->set_level(toSpdLogLevel(level));\n        }\n\n        auto getFlushLevel()\n        {\n          const char* levelNames[] SPDLOG_LEVEL_NAMES;\n          auto level = spdlog::default_logger()->flush_level();\n          return levelNames[level];\n        }\n\n        void setFlushLevel(const py::object& level)\n        {\n          spdlog::default_logger()->flush_on(toSpdLogLevel(level));\n        }\n\n        auto levels()\n        {\n          // TODO: could be a static pyobject\n          return vector<string> SPDLOG_LEVEL_NAMES;\n        }\n\n        auto logFilePath()\n        {\n          if (theCoreAddin())\n            return theCoreAddin()->context().logFile();\n          return wstring();\n        }\n      };\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        py::class_<LogWriter>(mod,\n          \"_LogWriter\", R\"(\n            Writes a log message to xlOil's log.  The level parameter can be a level constant \n            from the `logging` module or one of the strings *error*, *warn*, *info*, *debug* or *trace*.\n\n            Only messages with a level higher than the xlOil log level which is initially set\n            to the value in the xlOil settings will be output to the log file. Trace output\n            can only be seen with a debug build of xlOil.\n          )\")\n          .def(py::init<>(), R\"(\n            Do not construct this class - a singleton instance is created by xlOil.\n          )\")\n          .def(\"__call__\",\n            &LogWriter::writeToLog,\n            R\"(\n              Writes a message to the log at the specifed keyword paramter `level`. The default \n              level is 'info'.  The message can contain format specifiers which are expanded\n              using any additional positional arguments. This allows for lazy contruction of the \n              log string like python's own 'logging' module.\n            )\",\n            py::arg(\"msg\"))\n          .def(\"flush\", &LogWriter::flush,\n            R\"(\n              Forces a log file 'flush', i.e write pending log messages to the log file.\n              For performance reasons the file is not by default flushed for every message.\n            )\")\n          .def(\"trace\", &LogWriter::trace,\n            \"Writes a log message at the 'trace' level\",\n            py::arg(\"msg\"))\n          .def(\"debug\", &LogWriter::debug,\n            \"Writes a log message at the 'debug' level\",\n            py::arg(\"msg\"))\n          .def(\"info\", &LogWriter::info,\n            \"Writes a log message at the 'info' level\",\n            py::arg(\"msg\"))\n          .def(\"warn\", &LogWriter::warn,\n            \"Writes a log message at the 'warn' level\",\n            py::arg(\"msg\"))\n          .def(\"error\", &LogWriter::error,\n            \"Writes a log message at the 'error' level\",\n            py::arg(\"msg\"))\n          .def_property(\"level\",\n            &LogWriter::getLogLevel,\n            &LogWriter::setLogLevel,\n            R\"(\n              Returns or sets the current log level. The returned value will always be an \n              integer corresponding to levels in the `logging` module.  The level can be\n              set to an integer or one of the strings *error*, *warn*, *info*, *debug* or *trace*.\n            )\")\n          .def_property_readonly(\"level_int\", &LogWriter::getLogLevelInt,\n            R\"(\n              Returns the log level as an integer corresponding to levels in the `logging` module.\n              Useful if you want to condition some output based on being above a certain log\n              level.\n            )\")\n          .def_property_readonly(\"levels\",\n            &LogWriter::levels,\n            \"A list of the available log levels\")\n          .def_property(\"flush_on\",\n            &LogWriter::getFlushLevel,\n            &LogWriter::setFlushLevel,\n            R\"(\n              Returns or sets the log level which will trigger a 'flush', i.e a writing pending\n              log messages to the log file.\n            )\")\n          .def_property_readonly(\"path\",\n            &LogWriter::logFilePath,\n            \"The full pathname of the log file\");\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyObjectGC.cpp",
    "content": "\n#include <pybind11/pybind11.h>\n#include <list>\n#include <mutex>\n#include <thread>\n\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n\n    class GarbageCollector\n    {\n    public:\n      static GarbageCollector& instance()\n      {\n        static GarbageCollector gc;\n        return gc;\n      }\n\n      void add(PyObject* obj)\n      {\n        bool trashFull = false;\n        {\n          std::scoped_lock(_lock);\n          _trash.push_back(obj);\n          trashFull = _trash.size() == 10;\n        }\n        if (trashFull)\n          _flag.notify_one();\n      }\n    private:\n      std::list<PyObject*> _trash;\n      std::mutex _lock;\n      std::condition_variable _flag;\n      std::thread _gcThread;\n      std::atomic<bool> _running;\n\n      GarbageCollector()\n      {\n        _running = true;\n        _gcThread = std::thread([gc = this] \n        {\n          std::unique_lock<std::mutex> lock(gc->_lock);\n          do \n          {\n            // Need to acquire lock before calling wait(lock)\n            lock.lock();\n            gc->_flag.wait(lock);\n            if (gc->_trash.empty())\n              continue;\n\n            decltype(_trash) chute;\n            std::swap(chute, gc->_trash);\n            lock.unlock();\n            {\n              py::gil_scoped_acquire getGil;\n              for (auto obj : chute)\n                Py_XDECREF(obj);\n            }\n            chute.clear();\n          } while (gc->_running);\n        });\n      }\n      ~GarbageCollector()\n      {\n        _running = false;\n        _flag.notify_one();\n        _gcThread.join();\n      }\n    };\n\n    class objectGC : py::handle\n    {\n    public:\n      //objectGC() = default;\n      objectGC(py::handle h, bool is_borrowed) \n        : py::handle(h) \n      { \n        if (is_borrowed) inc_ref(); \n      }\n      /// Copy constructor; always increases the reference count\n      objectGC(const objectGC& o) : py::handle(o) { inc_ref(); }\n      /// Move constructor; steals the object from ``other`` and preserves its reference count\n      objectGC(objectGC&& other) noexcept { m_ptr = other.m_ptr; other.m_ptr = nullptr; }\n      ~objectGC()\n      {\n        GarbageCollector::instance().add(m_ptr);\n      }\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyRibbon.cpp",
    "content": "#include \"TypeConversion/BasicTypes.h\"\n#include \"PyHelpers.h\"\n#include \"PyCore.h\"\n#include \"PyEvents.h\"\n#include \"PyImage.h\"\n#include \"EventLoop.h\"\n#include \"PyFuture.h\"\n#include \"PyCom.h\"\n#include \"PyAddin.h\"\n\n#include <xloil/ExcelUI.h>\n#include <xlOil/AppObjects.h>\n#include <xloil/ExcelThread.h>\n#include <xloil/RtdServer.h>\n#include <pybind11/pybind11.h>\n#include <OleAuto.h>\n#include <filesystem>\n\nnamespace py = pybind11;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing std::wstring;\nusing std::vector;\nusing std::make_shared;\nusing std::make_unique;\nusing std::pair;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      struct PyRibbonControl\n      {\n        PyRibbonControl(const RibbonControl& ctrl)\n        {\n          if (ctrl.Id)  Id  = ctrl.Id;\n          if (ctrl.Tag) Tag = ctrl.Tag;\n        }\n        wstring Id;\n        wstring Tag;\n      };\n\n      constexpr static pair<ICustomTaskPane::DockPosition, const char*> positionNames[] = {\n        pair(ICustomTaskPane::Bottom, \"bottom\"),\n        pair(ICustomTaskPane::Floating, \"floating\"),\n        pair(ICustomTaskPane::Left, \"left\"),\n        pair(ICustomTaskPane::Right, \"right\"),\n        pair(ICustomTaskPane::Top, \"top\")\n      };\n\n      const char* TaskPane_getPosition(ICustomTaskPane& self)\n      {\n        py::gil_scoped_release noGil;\n        auto position = runExcelThread([&]() {\n          return self.getPosition();\n        }).get();\n        for (auto posName : positionNames)\n        {\n          if (position == posName.first)\n            return posName.second;\n        }\n        return \"\";\n      }\n\n      void TaskPane_setPosition(ICustomTaskPane& self, std::string position)\n      {\n#pragma warning(disable: 4244)\n        std::transform(position.begin(), position.end(), position.begin(), ::tolower);\n        for (auto posName : positionNames)\n        {\n          if (position == posName.second)\n          {\n            runExcelThread([&, location = posName.first]() {\n              self.setPosition(location);\n            });\n            return;\n          }\n        }\n        throw new py::value_error(\"Unrecognised position: '\" + position + \"'\");\n      }\n      /// <summary>\n      /// Expects funcNameMap to be either a function of name -> handler or a \n      /// dict of names and handler.  The handler function arguments vary depending\n      /// on what type of ribbon callback is requested\n      /// </summary>\n      auto makeRibbonNameMapper(const py::object& funcNameMap)\n      {\n        auto pyMapper = PyDict_Check(funcNameMap.ptr())\n          ? funcNameMap.attr(\"__getitem__\")\n          : funcNameMap;\n        \n        return [pyMapper = PyObjectHolder(pyMapper), eventLoop = getEventLoop().get()](\n          const wchar_t* name)\n        {\n          try\n          {  \n            return [&, funcname=wstring(name)](\n              const RibbonControl& ctrl, VARIANT* vRet, int nArgs, VARIANT** vArgs)\n              {\n                try\n                {\n                  // Converting via an ExcelObj is not optimal, but avoids building\n                  // a VARIANT converter. Since very few VARIANT types can appear in\n                  // callbacks this might be a feasible approach when IPictureDisp\n                  // support is introduced.\n                  py::gil_scoped_acquire getGil;\n                  auto callback = pyMapper(funcname);\n\n                  py::tuple args(nArgs);\n                  for (auto i = 0; i < nArgs; ++i)\n                    args[i] = PyFromAny()(variantToExcelObj(*vArgs[i]));\n                  \n                  auto pyRet = callback(PyRibbonControl(ctrl), *args);\n                  auto isAsync = py::module::import(\"inspect\").attr(\"iscoroutine\")(pyRet).cast<bool>();\n\n                  if (isAsync)\n                  {\n                    if (vRet)\n                      XLO_THROW(\"Ribbon callback functions which return a value cannot be async\");\n                    eventLoop->runAsync(pyRet);\n                  }\n                  else if (vRet && !pyRet.is_none())\n                  {\n                    auto picture = pictureFromPilImage(pyRet);\n                    if (picture)\n                    {\n                      VariantInit(vRet);\n                      vRet->pdispVal = (IDispatch*)picture;\n                      vRet->vt = VT_DISPATCH;\n                    }\n                    else\n                      excelObjToVariant(vRet, FromPyObjOrError()(pyRet.ptr()));\n                  }\n                }\n                catch (const py::error_already_set& e)\n                {\n                  raiseUserException(e);\n                  throw;\n                }\n              };\n          }\n          catch (const py::error_already_set& e)\n          {\n            raiseUserException(e);\n            throw;\n          }\n        };\n      }\n\n      using VoidFuture = PyFuture<void, void>;\n      using CTPFuture = PyFuture<shared_ptr<ICustomTaskPane>>;\n\n      class ComAddin\n      {\n      public:\n        ComAddin(\n          const py::object& name, \n          const py::object& xml, \n          const py::object& funcmap,\n          bool connect)\n        {\n          if (name.is_none())\n          {\n            // The returned pointers here do not need to be freed or decref'd\n            auto frame = PyEval_GetFrame();\n            if (!frame)\n              throw py::cast_error();\n#if PY_VERSION_HEX >= 0x03090000\n            auto code = PyFrame_GetCode(frame);\n#else\n            auto code = frame->f_code;\n#endif\n            std::filesystem::path filePath(to_wstring(code->co_filename));\n            _name = filePath.filename().stem();\n          }\n          else\n            _name = to_wstring(name);\n\n          if (!xml.is_none())\n          {\n            _xml = to_wstring(xml);\n            _functionMap = funcmap;\n          }\n\n          if (connect)\n            _initialConnection = this->connect();\n        }\n\n        ~ComAddin()\n        {\n          // If we have an addin object, transfer ownership to a functor which can\n          // safely close the addin on the main thresad.\n          if (_addin)\n            runExcelThread([addin = _addin]() { addin->close(); }).get();\n        }\n\n        VoidFuture connect()\n        {\n          auto ribbonMap = _functionMap.is_none()\n            ? IComAddin::RibbonMap()\n            : makeRibbonNameMapper(_functionMap);\n          _functionMap = py::object();\n\n          return runExcelThread([this, mapper = std::move(ribbonMap)]() mutable\n          {\n            if (!_addin)\n              _addin = makeComAddin(_name.c_str(), nullptr);\n            _addin->connect(_xml.c_str(), mapper);\n            _connected = true;\n          });\n        }\n\n        VoidFuture disconnect()\n        {\n          if (!_connected || !_addin)\n          {\n             std::promise<void> p; \n             p.set_value(); \n             return p.get_future();\n          }\n          return runExcelThread([this]() mutable \n          {\n            _addin->disconnect(); \n            _connected = false;\n          });\n        }\n\n        VoidFuture invalidate(const wstring& id)\n        {\n          return runExcelThread([addin = addin(), id]() { addin->ribbonInvalidate(id.c_str()); });\n        }\n\n        VoidFuture activate(const wstring& id)\n        {\n          return runExcelThread([addin = addin(), id]() { addin->ribbonActivate(id.c_str()); });\n        }\n\n        CTPFuture createTaskPaneFrame(\n          const std::wstring& name,\n          const py::object& window,\n          const py::object& progId)\n        {\n          auto progIdStr = progId.is_none() ? wstring() : to_wstring(progId).c_str();\n          auto winPtr = window.is_none() ? ExcelWindow(nullptr) : window.cast<ExcelWindow>();\n\n          return runExcelThread([addin = addin(), name, winPtr, progIdStr]()\n          {\n            return addin->createTaskPane(\n              name.c_str(), \n              &winPtr, \n              progIdStr.empty() ? nullptr : progIdStr.c_str());\n          });\n        }\n\n        IComAddin* addin()\n        {\n          if (!_addin || !_connected) XLO_THROW(\"Addin disconnected\");\n          return _addin.get();\n        }\n\n        auto name() const { return _name; }\n\n        bool connected() const { return _connected; }\n\n      private:\n        shared_ptr<IComAddin> _addin;\n        wstring _name;\n        wstring _xml;\n        py::object _functionMap;\n        std::atomic<bool> _connected;\n        VoidFuture _initialConnection;\n      };\n    \n      auto attachTaskPaneAsync(\n        const py::object& comAddin,\n        const py::object& pane,\n        const py::object& name,\n        const py::object& window,\n        const py::object& size,\n        const py::object& visible)\n      {\n        auto attachPane = py::module::import(\"xloil.gui\").attr(\"_attach_task_pane_async\");\n        return attachPane(comAddin, pane, name, window, size, visible);\n      }\n\n      auto attachTaskPane(\n        const py::object& comAddin,\n        const py::object& pane,\n        const py::object& name,\n        const py::object& window,\n        const py::object& size,\n        const py::object& visible)\n      {\n        auto attachPane = py::module::import(\"xloil.gui\").attr(\"_attach_task_pane\");\n        return attachPane(comAddin, pane, name, window, size, visible);\n      }\n      \n      auto createTaskPane(\n        const py::object& comAddin,\n        const py::object& name,\n        const py::object& pane,\n        const py::object& window,\n        const py::object& size,\n        const py::object& visible)\n      {\n        PyErr_WarnEx(PyExc_DeprecationWarning,\n          \"createTaskPane is deprecated, use attach_pane instead.\",\n          2);\n\n        auto guiModule = py::module::import(\"xloil.gui\");\n\n        auto findPane = guiModule.attr(\"find_task_pane\");\n        auto found = findPane(name);\n        if (!found.is_none())\n          return found;\n\n        return attachTaskPane(comAddin, pane, name, window, size, visible);\n      }\n\n      class PyTaskPaneHandler : public ICustomTaskPaneEvents\n      {\n      public:\n        PyTaskPaneHandler(const py::object& eventHandler)\n          : _handler(eventHandler)\n        {\n          _hasOnVisible = py::hasattr(eventHandler, \"on_visible\");\n          _hasOnDocked  = py::hasattr(eventHandler, \"on_docked\");\n          _hasOnDestroy = py::hasattr(eventHandler, \"on_destroy\");\n        }\n        ~PyTaskPaneHandler()\n        {\n          py::gil_scoped_acquire gil;\n          _handler.dec_ref();\n        }\n        void onVisible(bool c) override\n        {\n          if (!_hasOnVisible) return;\n          py::gil_scoped_acquire gil;\n          auto handler = PyBorrow(_handler);\n          if (handler.is_none()) return;\n          checkUserException([=]() { handler.attr(\"on_visible\")(c); });\n        }\n        void onDocked() override\n        {\n          if (!_hasOnDocked) return;\n          py::gil_scoped_acquire gil;\n          auto handler = PyBorrow(_handler);\n          if (handler.is_none()) return;\n          checkUserException([=]() { handler.attr(\"on_docked\")(); });\n        }\n        void onDestroy() override\n        {\n          if (!_hasOnDestroy) return;\n          py::gil_scoped_acquire gil;\n          auto handler = PyBorrow(_handler);\n          if (handler.is_none()) return;\n          checkUserException([=]() { handler.attr(\"on_destroy\")(); });\n        }\n        py::weakref _handler;\n        bool _hasOnVisible, _hasOnDocked, _hasOnDestroy;\n      };\n\n      VoidFuture TaskPaneFrame_attach(\n        ICustomTaskPane& self, \n        const py::object& eventHandler, \n        size_t hwnd,\n        bool asParent)\n      {\n        return runExcelThread([\n          &self, \n          hwnd, asParent,\n          handler = make_shared<PyTaskPaneHandler>(eventHandler)\n        ]()\n        {\n          self.listen(handler);\n          self.attach(hwnd, asParent);\n        });\n      }\n \n      void setTaskPaneSize(ICustomTaskPane* pane, const py::tuple& pair)\n      {\n        runExcelThread([pane, w = pair[0].cast<int>(), h = pair[1].cast<int>()]\n        {\n          pane->setSize(w, h);\n        });\n      }\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        CTPFuture::bind(mod, \"_CTPFuture\");\n        VoidFuture::bind(mod);\n\n        py::class_<PyRibbonControl>(mod,\n          \"RibbonControl\", R\"(\n            This object is passed to ribbon callback handlers to indicate which control  \n            raised the callback.\n          )\")\n          .def_readonly(\"id\", \n            &PyRibbonControl::Id,\n            \"A string that represents the Id attribute for the control or custom menu item\")\n          .def_readonly(\"tag\", \n            &PyRibbonControl::Tag,\n            \"A string that represents the Tag attribute for the control or custom menu item.\");\n\n        py::class_<ICustomTaskPane, shared_ptr<ICustomTaskPane>>(mod, \n          \"TaskPaneFrame\", R\"(\n            Manages Excel's underlying custom task pane object into which a python GUI can be\n            drawn. It is unlikely that this object will need to be manipulated directly. Rather \n            use `xloil.gui.CustomTaskPane` which holds the python-side frame contents.\n\n            The methods of this object are safe to call from any thread. COM must be used on \n            Excel's main thread, so the methods all wrap their calls to ensure to this happens.\n          )\")\n          .def_property_readonly(\"window\", \n            MainThreadWrap(&ICustomTaskPane::window),\n            \"Gives the window of the document window to which the frame is attached, can be \"\n            \"used to uniquely identify the pane\")\n          .def_property(\"visible\", \n            MainThreadWrap(&ICustomTaskPane::getVisible), \n            MainThreadWrap(&ICustomTaskPane::setVisible),\n            \"Determines the visibility of the task pane\")\n          .def_property(\"size\", \n            MainThreadWrap(&ICustomTaskPane::getSize), \n            setTaskPaneSize,\n            \"Gets/sets the task pane size as a tuple (width, height)\")\n          .def_property_readonly(\"title\", \n            MainThreadWrap(&ICustomTaskPane::getTitle))\n          .def_property(\"position\",\n            TaskPane_getPosition,\n            TaskPane_setPosition,\n            R\"(\n              Gets/sets the dock position, one of: bottom, floating, left, right, top\n            )\")\n          .def(\"com_control\", \n            [](ICustomTaskPane& self, const char* binder)\n            {\n              py::gil_scoped_release noGil;\n              return comToPy(*self.content(), binder);\n            },\n            R\"(\n              Gets the base COM control of the task pane. The ``lib`` used to provide\n              COM support can be 'comtypes' or 'win32com' (default is win32com). This \n              method is only useful if a custom `progid` was specified during the task\n              pane creation.\n            )\",\n            py::arg(\"lib\") = \"\")\n          .def(\"attach\", \n            &TaskPaneFrame_attach,\n            R\"( \n              Associates a `xloil.gui.CustomTaskPane` with this frame. Returns a future\n              with no result.\n            )\",\n            py::arg(\"handler\"), \n            py::arg(\"hwnd\"),\n            py::arg(\"as_parent\")=true);\n\n        py::class_<ComAddin>(mod, \n          \"ExcelGUI\", R\"(\n            An `ExcelGUI` wraps a COM addin which allows Ribbon customisation and creation\n            of custom task panes. \n\n            The methods of this object are safe to call from any thread; however, since COM calls \n            must be made on Excel's main thread, the methods schedule  those calls and return an \n            *awaitable* future to the result. This could lead to deadlocks if, for example, the \n            future's result is requested synchronously and one of Excel's event handlers is \n            triggered.  For a safer non-blocking approach, use `excel_callback` to invoke code \n            which manipulates the *ExcelGUI* object.\n\n            The object's properties do not return futures and are thread-safe.\n          )\")\n          .def(py::init<py::object, py::object, py::object, bool>(),\n            R\"(\n              Creates an `ExcelGUI` using the specified ribbon customisation XML\n              and optionally connects it to Excel, ready for use.\n\n              When the *ExcelGUI* object is deleted, it unloads the associated COM \n              add-in and so all Ribbon customisation and attached task panes.\n\n              Parameters\n              ----------\n\n              ribbon: str\n                  A Ribbon XML string, most easily created with a specialised editor.\n                  The XML format is documented on Microsoft's website\n\n              funcmap: Func[str -> callable] or Dict[str, callabe]\n                  The ``funcmap`` mapper links callbacks named in the Ribbon XML to\n                  python functions. It can be either a dictionary containing named \n                  functions or any callable which returns a function given a string.\n                  Each return handler should take a single ``RibbonControl``\n                  argument which describes the control which raised the callback.\n\n                  Callbacks declared async will be executed in the addin's event loop. \n                  Other callbacks are executed in Excel's main thread. Async callbacks \n                  cannot return values.\n\n              name: str\n                  The addin name which will appear in Excel's COM addin list.\n                  If None, uses the filename at the call site as the addin name.\n\n              connect: bool\n                  If True (the default) initiates a connection request for the addin, \n                  which causes Excel to load it and any associated ribbons. The connection\n                  is *scheduled* in Excel's main thread when the COM interface is available.\n                  Note that COM is not available when xlOil is starting up.\n\n                  If you want to call other methods on *ExcelGUI* then to ensure it is \n                  connected use `ExcelGUI.connect().result()` to block on the future or\n                  use `excel_callback`.\n            )\",\n            py::arg(\"name\") = py::none(),\n            py::arg(\"ribbon\") = py::none(),\n            py::arg(\"funcmap\") = py::none(),\n            py::arg(\"connect\" ) = true)\n          .def(\"connect\",\n            &ComAddin::connect,\n            R\"(\n              Connects the underlying COM addin to Excel, No other methods may be called \n              on a `ExcelGUI` object until it has been connected.\n\n              This method is safe to call on an already-connected addin.\n            )\")\n          .def(\"disconnect\",\n            &ComAddin::disconnect,\n            R\"(\n              Unloads the underlying COM add-in and any ribbon customisation.  Avoid using\n              connect/disconnect to modify the Ribbon as it is not perfomant. Rather hide/show\n              controls with `invalidate` and the vibility callback.\n            )\")\n          .def(\"invalidate\",\n            &ComAddin::invalidate,\n            R\"(\n              Invalidates the specified control: this clears the cache of responses\n              to callbacks associated with the control. For example, this can be\n              used to hide a control by forcing its getVisible callback to be invoked,\n              rather than using the cached value.\n\n              If no control ID is specified, all controls are invalidated.\n            )\",\n            py::arg(\"id\") = \"\")\n          .def(\"activate\",\n            &ComAddin::activate,\n            R\"(\n              Activatives the ribbon tab with the specified id.  Returns False if\n              there is no Ribbon or the Ribbon is collapsed.\n            )\",\n            py::arg(\"id\"))\n          .def(\"_create_task_pane_frame\",\n            &ComAddin::createTaskPaneFrame,\n            R\"(\n              Used internally to create a custom task pane window which can be populated\n              with a python GUI.  Most users should use `attach_pane(...)` instead.\n\n              A COM `progid` can be specified, but this will prevent displaying a python GUI\n              in the task pane using the xlOil methods. This is a specialised use case.\n            )\",\n            py::arg(\"name\"), \n            py::arg(\"progid\") = py::none(), \n            py::arg(\"window\") = py::none())\n          .def(\"attach_pane_async\", \n            attachTaskPaneAsync,\n            R\"(\n              Behaves as per `attach_pane`, but returns an *asyncio* coroutine. The\n              `pane` argument may be an awaitable to a `CustomTaskPane`.\n            )\", \n            py::arg(\"pane\"),\n            py::arg(\"name\") = py::none(),\n            py::arg(\"window\")=py::none(),\n            py::arg(\"size\")=py::none(),\n            py::arg(\"visible\")=true)\n          .def(\"attach_pane\",\n            attachTaskPane,\n            R\"(\n              Given task pane contents (which can be specified in several forms) this function\n              creates a new task pane displaying those contents.\n\n              Returns the instance of `CustomTaskPane`.  If one was passed as the 'pane' argument, \n              that is returned, if a *QWidget* was passed, a `QtThreadTaskPane` is created.\n\n              Parameters\n              ----------\n\n              pane: CustomTaskPane (or QWidget type)\n                  Can be an instance of `CustomTaskPane`, a type deriving from `QWidget` or\n                  an instance of a `QWidget`. If a QWidget instance is passed, it must have \n                  been created on the Qt thread.\n\n              name: \n                  The task pane name. Will be displayed above the task pane. If not provided,\n                  the 'name' attribute of the task pane is used.\n\n              window: \n                  A window title or `xloil.ExcelWindow` object to which the task pane should be\n                  attached.  If None, the active window is used.\n\n              size:\n                  If provided, a tuple (width, height) used to set the initial pane size\n\n              visible:\n                  Determines the initial pane visibility. Defaults to True.\n            )\")\n          .def(\"create_task_pane\",\n            createTaskPane,\n            R\"(\n              Deprecated: use `attach_pane`. Note that `create_task_pane` tries to `find_task_pane`\n              before creation whereas `attach_pane` does not.\n            )\", \n            py::arg(\"name\"),\n            py::arg(\"creator\"),\n            py::arg(\"window\") = py::none(),\n            py::arg(\"size\") = py::none(),\n            py::arg(\"visible\") = true)\n          .def_property_readonly(\"name\",\n            &ComAddin::name,\n            \"The name displayed in Excel's COM Addins window\")\n          .def_property_readonly(\"connected\",\n            &ComAddin::connected,\n            \"True if the a connection to Excel has been made\");\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyRtd.cpp",
    "content": "#include \"PyRtd.h\"\n#include \"PyCore.h\"\n#include \"TypeConversion/BasicTypes.h\"\n#include \"PyEvents.h\"\n#include \"EventLoop.h\"\n#include \"PyAddin.h\"\n#include <xloil/RtdServer.h>\n#include <xloil/ExcelThread.h>\n#include <pybind11/pybind11.h>\n#include <future>\n\nnamespace py = pybind11;\nusing std::future_status;\nusing std::shared_ptr;\nusing std::make_shared;\n\nnamespace\n{\n  // See https://github.com/pybind/pybind11/issues/1389\n\n  template <typename T> class py_shared_ptr {\n  private:\n    shared_ptr<T> _impl;\n\n  public:\n    using element_type = T;\n\n    py_shared_ptr() {}\n\n    py_shared_ptr(T *ptr) \n    {\n      auto pyobj = py::cast(ptr);\n      auto* pyptr = pyobj.ptr();\n      Py_INCREF(pyptr);\n      shared_ptr<PyObject> pyObjPtr(\n        pyptr, \n        [](PyObject* x) { py::gil_scoped_acquire getGil; Py_XDECREF(x); }\n      );\n      _impl = shared_ptr<T>(pyObjPtr, ptr);\n    }\n\n    py_shared_ptr(std::shared_ptr<T> r) : _impl(r) {}\n\n    operator std::shared_ptr<T>() const { return _impl; }\n\n    T* get() const { return _impl.get(); }\n  };\n}\n\nPYBIND11_DECLARE_HOLDER_TYPE(T, py_shared_ptr<T>);\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      auto& asyncEventLoop()\n      {\n        return *theCoreAddin()->thread;\n      }\n    }\n\n    RtdReturn::RtdReturn(\n      IRtdPublish& notify,\n      const shared_ptr<const IPyToExcel>& returnConverter,\n      const CallerInfo& caller)\n      : _notify(notify)\n      , _returnConverter(returnConverter)\n      , _caller(caller)\n      , _running(true)\n    {\n    }\n\n    RtdReturn::~RtdReturn()\n    {\n      if (!_task.ptr())\n        return;\n\n      py::gil_scoped_acquire gilAcquired;\n      _task = py::object();\n    }\n\n    void RtdReturn::set_task(const py::object& task)\n    {\n      _task = task;\n      _running = true;\n    }\n\n    void RtdReturn::set_result(const py::object& value) const\n    {\n      if (!_running)\n        return;\n      \n      XLO_TRACE(L\"Received result for RTD task started in '{0}'\", _caller.address());\n\n      try\n      {\n        // Convert result to ExcelObj\n        ExcelObj result = _returnConverter\n          ? (*_returnConverter)(value.ptr())\n          : FromPyObjOrError()(value.ptr());\n\n        // If nil, conversion wasn't possible, so use the cache\n        if (result.isType(ExcelType::Nil))\n          result = pyCacheAdd(value, _caller.address().c_str());\n\n        _notify.publish(std::move(result));\n      }\n      catch (const std::exception& e)\n      {\n        _notify.publish(ExcelObj(e.what()));\n      }\n    }\n    void RtdReturn::set_done()\n    {\n      if (!_running)\n        return;\n      _running = false;\n\n      _task = py::object();\n    }\n    void RtdReturn::cancel()\n    {\n      if (!_running)\n        return;\n      \n      _running = false;\n\n      XLO_TRACE(L\"Sending cancellation to RTD task started in '{0}'\", _caller.address());\n      if (_task)\n        asyncEventLoop().callback(_task.attr(\"cancel\"));\n    }\n    bool RtdReturn::done() noexcept\n    {\n      return !_running;\n    }\n    void RtdReturn::wait() noexcept\n    {\n      // asyncio.Future has no 'wait'\n    }\n    const CallerInfo& RtdReturn::caller() const noexcept\n    {\n      return _caller;\n    }\n\n    /// <summary>\n    /// Uses the RtdReturn object to launch a publishing task.\n    /// </summary>\n    struct PyRtdTaskLauncher : public IRtdTask\n    {\n      shared_ptr<RtdReturn> _returnObj;\n      CallerInfo _caller;\n      PyObjectHolder _func;\n      shared_ptr<const IPyToExcel> _returnConverter;\n\n      PyRtdTaskLauncher(const py::object& func, const shared_ptr<IPyToExcel>& converter) \n        : _func(func)\n        , _returnConverter(converter)\n      {}\n\n      virtual ~PyRtdTaskLauncher()\n      {}\n\n      void start(IRtdPublish& publisher) override\n      {\n        _returnObj.reset(new RtdReturn(publisher, _returnConverter, _caller));\n        py::gil_scoped_acquire gilAcquired;\n        try\n        {\n          _func(py::cast(_returnObj));\n        }\n        catch (const std::exception& e)\n        {\n          publisher.publish(ExcelObj(e.what()));\n        }\n      }\n      bool done() noexcept override\n      {\n        return _returnObj ? _returnObj->done() : false;\n      }\n      void wait() noexcept override\n      {\n        if (_returnObj)\n          _returnObj->wait();\n      }\n      void cancel() override\n      {\n        if (_returnObj && !_returnObj->done())\n        {\n          py::gil_scoped_acquire gilAcquired;\n          _returnObj->cancel();\n        }\n      }\n    };\n\n    class PyRtdServer\n    {\n      shared_ptr<IRtdServer> _impl;\n      shared_ptr<const void> _cleanup;\n      std::future<shared_ptr<IRtdServer>> _initialiser;\n      using rtdCacheType = std::unordered_map<std::wstring, py::object>;\n      rtdCacheType _rtdCache;\n\n      IRtdServer& impl()\n      {\n        if (!_impl)\n        {\n          if (!_initialiser.valid())\n            XLO_THROW(\"RtdServer terminated\");\n          _impl = _initialiser.get();\n        }\n        return *_impl;\n      }\n\n      /// <summary>\n      /// This curious bit of code is designed to execute _debugpy_activate_thread\n      /// in the RTD worker thread.  That thread is inaccesible unless you are an\n      /// IRtdPublisher\n      /// </summary>\n      struct InitDebugPy : public IRtdPublisher\n      {\n        InitDebugPy(IRtdServer* server) : _server(server) {}\n        IRtdServer* _server;\n\n        virtual void connect(size_t /*numSubscribers*/)\n        {\n          if (!_server)\n            return;\n          py::gil_scoped_acquire getGil;\n          pybind11::module::import(\"xloil.debug\").attr(\"_debugpy_activate_thread\")();\n          _server->testDisconnect(topicId);\n          _server = nullptr;\n        }\n        virtual bool disconnect(size_t) { return true; }\n        virtual void stop() {}\n        virtual bool done() const { return true; }\n        virtual const wchar_t* topic() const noexcept { return topicName; }\n\n        static constexpr wchar_t* topicName = L\"_xlOil_Rtd_Init_\";\n        static constexpr long topicId = -6666666;\n      };\n    public:\n      PyRtdServer()\n      {\n        // We don't need the COM or XLL APIs so flags = 0\n        _initialiser = runExcelThread([]() \n        { \n          auto server = newRtdServer();\n          // InitDebugPy is disabled because as of Aug 2022, VS Code refuses to hit\n          // breakpoints in async / rtd functions. VS Pro manages fine, so it's not\n          // clear the problem is with xlOil.\n          // server->start(make_shared<InitDebugPy>(server.get()));\n          // server->testConnect(InitDebugPy::topicId, InitDebugPy::topicName);\n          return server;\n        }, 0);\n        \n        // Destroy the Rtd server if we are still around on python exit. The \n        // Rtd server may maintain links to python objects and Excel may not\n        // call the server terminate function until after python has unloaded.\n        // PyBye will only be called synchronously from the thread destroying the \n        // interpreter, so capturing 'this' is safe.\n        _cleanup = Event_PyBye().bind([this]\n        { \n          _impl.reset(); \n        });\n      }\n      ~PyRtdServer()\n      {\n        _rtdCache.clear();\n        py::gil_scoped_release releaseGil;\n      \n        _impl.reset();\n      }\n      void start(const py_shared_ptr<IRtdPublisher>& topic)\n      {\n        py::gil_scoped_release releaseGil;\n        impl().start(topic);\n      }\n      bool publish(\n        const wchar_t* topic, \n        const py::object& value)\n      {\n        if (PyExceptionInstance_Check(value.ptr()))\n        {\n          Event_PyUserException().fire(PyBorrow(value.get_type().ptr()), value, PySteal(PyException_GetTraceback(value.ptr())));\n        }\n        _rtdCache[topic] = value; // Note we are implicitly using the GIL to synchronize access thread to this cache.\n        py::gil_scoped_release releaseGil;\n        return impl().publish(topic);\n      }\n      py::object subscribe(const wchar_t* topic)\n      {\n        impl().subscribeOnly(topic);\n        return peek(topic);\n      }\n\n      py::object peek(const wchar_t* topic)\n      {\n        if (_rtdCache.find(std::wstring(topic)) == _rtdCache.end())\n          return py::none();\n        auto value = _rtdCache[topic];\n        if (PyExceptionInstance_Check(value.ptr()))\n        {\n          #if PY_VERSION_HEX < 0x030c0000\n            auto tb = PyException_GetTraceback(value.ptr());\n            Py_INCREF(value.get_type().ptr());\n            Py_INCREF(value.ptr());\n            PyErr_Restore(value.get_type().ptr(), value.ptr(), tb ); // deprecated\n          #else\n           PyErr_SetRaisedException(value.release().ptr()); //part of stable ABI as of 3.12*/\n          #endif\n          throw py::error_already_set();\n        }\n        return value;\n      }\n\n      void drop(const wchar_t* topic)\n      {\n        // Don't throw if _impl has been destroyed, just ignore\n        if (_impl)\n        {\n          py::gil_scoped_release releaseGil;\n          _impl->drop(topic);\n        }\n      }\n\n      void startTask(\n        const wchar_t* topic, \n        const py::object& func, \n        const shared_ptr<IPyToExcel>& converter = nullptr)\n      {\n        auto task = make_shared<PyRtdTaskLauncher>(func, converter);\n        py::gil_scoped_release releaseGil;\n        impl().start(\n          make_shared<RtdPublisher>(\n            topic, impl(), task));\n      }\n      \n      auto progId() { return impl().progId(); }\n    };\n\n    class PyRtdTopic : public IRtdPublisher\n    {\n    public:\n      using IRtdPublisher::IRtdPublisher;\n\n      virtual void connect(size_t numSubscribers) override\n      {\n        PYBIND11_OVERLOAD_PURE(void, IRtdPublisher, connect, numSubscribers)\n      }\n      virtual bool disconnect(size_t numSubscribers) override\n      {\n        PYBIND11_OVERLOAD_PURE(bool, IRtdPublisher, disconnect, numSubscribers)\n      }\n      virtual void stop() override\n      {\n        PYBIND11_OVERLOAD_PURE(void, IRtdPublisher, stop, )\n      }\n      virtual bool done() const override\n      {\n        PYBIND11_OVERLOAD_PURE(bool, IRtdPublisher, done, )\n      }\n      virtual const wchar_t* topic() const noexcept override\n      {\n        try\n        {\n        PYBIND11_OVERLOAD_PURE(const wchar_t *, IRtdPublisher, topic, )\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Rtd publisher failed to get topic name: {}\", e.what());\n          return L\"\";\n        }\n      }\n    };\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        py::class_<IRtdPublisher, PyRtdTopic, py_shared_ptr<IRtdPublisher>>(mod, \"RtdPublisher\",\n          R\"(\n            RTD servers use a publisher/subscriber model with the 'topic' as the key\n            The publisher class is linked to a single topic string.\n\n            Typically the publisher will do nothing on construction, but when it detects\n            a subscriber using the connect() method, it creates a background publishing task\n            When disconnect() indicates there are no subscribers, it cancels this task with\n            a call to stop()\n\n            If the task is slow to return or spin up, it could be started the constructor  \n            and kept it running permanently, regardless of subscribers.\n\n            The publisher should call RtdServer.publish() to push values to subscribers.\n          )\")\n          .def(py::init<>(), R\"(\n            This __init__ method must be called explicitly by subclasses or pybind\n            will fatally crash Excel.\n          )\")\n          .def(\"connect\", \n            &IRtdPublisher::connect,\n            R\"(\n              Called by the RtdServer when a sheet function subscribes to this \n              topic. Typically a topic will start up its publisher on the first\n              subscriber, i.e. when num_subscribers == 1\n            )\",\n            py::arg(\"num_subscribers\"))\n          .def(\"disconnect\", \n            &IRtdPublisher::disconnect,\n            R\"(\n              Called by the RtdServer when a sheet function disconnects from this \n              topic. This happens when the function arguments are changed the\n              function deleted. Typically a topic will shutdown its publisher \n              when num_subscribers == 0.\n\n              Whilst the topic remains live, it may still receive new connection\n              requests, so generally avoid finalising in this method.\n            )\",\n            py::arg(\"num_subscribers\"))\n          .def(\"stop\", \n            &IRtdPublisher::stop, \n            R\"(\n              Called by the RtdServer to indicate that a topic should shutdown\n              and dependent threads or tasks and finalise resource usage\n            )\")\n          .def(\"done\", \n            &IRtdPublisher::done,\n            R\"(\n              Returns True if the topic can safely be deleted without leaking resources.\n            )\")\n          .def_property_readonly(\"topic\", \n            &IRtdPublisher::topic, \n            \"Returns the name of the topic\");\n\n        py::class_<PyRtdServer>(mod, \"RtdServer\",\n          R\"(\n            An RtdServer allows asynchronous interaction with Excel by posting update\n            notifications which cause Excel to recalcate certain cells.  The python \n            RtdServer object manages an RTD COM server with each new RtdServer creating\n            an underlying COM server. The RtdServer works on a publisher/subscriber\n            model with topics identified by a string. \n\n            A topic publisher is registered using start(). Subsequent calls to subscribe()\n            will connect this topic and tell Excel that the current calling cell should be\n            recalculated when a new value is published.\n\n            RTD sits outside of Excel's normal calc cycle: publishers can publish new values \n            at any time, triggering a re-calc of any cells containing subscribers. Note the\n            re-calc will only happen 'live' if Excel's caclulation mode is set to automatic\n          )\")\n          .def(py::init<>())\n          .def(\"start\", \n            &PyRtdServer::start,\n            R\"(\n              Registers an RtdPublisher with this manager. The RtdPublisher receives\n              notification when the number of subscribers changes\n            )\",\n            py::arg(\"topic\"))\n          .def(\"publish\", \n            &PyRtdServer::publish,\n            R\"(\n              Publishes a new value for the specified topic and updates all subscribers.\n              This function can be called even if no RtdPublisher has been started.\n\n              This function does not use any Excel API and is safe to call at any time\n              on any thread.\n\n              An Exception object can be passed at the value, this will trigger the debugging\n              hook if it is set. The exception object will be published.\n            )\",\n            py::arg(\"topic\"), \n            py::arg(\"value\"))\n          .def(\"subscribe\", \n            &PyRtdServer::subscribe,\n            R\"(\n              Subscribes to the specified topic. If no publisher for the topic currently \n              exists, it returns None, but the subscription is held open and will connect\n              to a publisher created later. If there is no published value, it will return \n              CellError.NA.  \n              \n              Re-raises exceptions which have been published to the topic.\n\n              This calls Excel's RTD function, which means the calling cell will be\n              recalculated every time a new value is published.\n\n              Calling this function outside of a worksheet function called by Excel may\n              produce undesired results and possibly crash Excel.\n            )\",\n            py::arg(\"topic\"))\n          .def(\"peek\", \n            &PyRtdServer::peek,\n            R\"(\n              Looks up a value for a specified topic, but does not subscribe.\n              If there is no active publisher for the topic, it returns None.\n              If there is no published value, it will return CellError.NA.\n              \n              Re-raises exceptions which have been published to the topic.\n\n              This function does not use any Excel API and is safe to call at\n              any time on any thread.\n            )\",\n            py::arg(\"topic\"))\n          .def(\"drop\", \n            &PyRtdServer::drop,\n            R\"(\n              Drops the producer for a topic by calling `RtdPublisher.stop()`, then waits\n              for it to complete and publishes #N/A to all subscribers.\n            )\")\n          .def(\"start_task\", \n            &PyRtdServer::startTask,\n            R\"(\n              Launch a publishing task for a `topic` given a func and a return converter.\n              The function should take a single `xloil.RtdReturn` argument.\n            )\",\n            py::arg(\"topic\"), \n            py::arg(\"func\"), \n            py::arg(\"converter\") = nullptr)\n          .def_property_readonly(\"progid\", &PyRtdServer::progId);\n\n        py::class_<RtdReturn, shared_ptr<RtdReturn>>(mod, \"RtdReturn\")\n          .def(\"set_result\", \n            &RtdReturn::set_result)\n          .def(\"set_done\", \n            &RtdReturn::set_done,\n            R\"(\n              Indicates that the task has completed and the RtdReturn can drop its reference\n              to the task. Further calls to `set_result()` will be ignored.\n            )\")\n          .def(\"set_task\", \n            &RtdReturn::set_task,\n            R\"(\n              Set the task object to keep it alive until the task indicates it is done. The\n              task object should respond to the `cancel()` method.\n            )\",\n            py::arg(\"task\"))\n          .def_property_readonly(\"caller\", &RtdReturn::caller)\n          .def_property_readonly(\"loop\", [](py::object x) { return asyncEventLoop().loop(); });\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyRtd.h",
    "content": "#pragma once\n#include \"PyCore.h\"\n#include <xlOil/RtdServer.h>\n#include <pybind11/pybind11.h>\n\nnamespace xloil\n{\n  class CallerInfo;\n\n  namespace Python\n  {\n    class RtdReturn\n    {\n    public:\n      RtdReturn(\n        IRtdPublish& notify,\n        const std::shared_ptr<const IPyToExcel>& returnConverter,\n        const CallerInfo& caller);\n      ~RtdReturn();\n      /// <summary>\n      /// Must hold GIL to call this\n      /// </summary>\n      void set_task(const pybind11::object& task);\n      /// <summary>\n      /// Must hold GIL to call this\n      /// </summary>\n      void set_result(const pybind11::object& value) const;\n      /// <summary>\n      /// Must hold GIL to call this\n      /// </summary>\n      void set_done();\n      /// <summary>\n      /// Must hold GIL to call this\n      /// </summary>\n      void cancel();\n      bool done() noexcept;\n      void wait() noexcept;\n      const CallerInfo& caller() const noexcept;\n\n    private:\n      IRtdPublish& _notify;\n      std::shared_ptr<const IPyToExcel> _returnConverter;\n      pybind11::object _task;\n      std::atomic<bool> _running;\n      const CallerInfo& _caller;\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyRunLater.cpp",
    "content": "#include \"PyHelpers.h\"\n#include \"PyFuture.h\"\n#include \"PyCore.h\"\n#include <xlOil/ExcelThread.h>\n#include <xlOil/StringUtils.h>\n\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::wstring;\nusing std::string;\nnamespace py = pybind11;\nusing std::make_pair;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    PyObject* comBusyException;\n\n    namespace\n    {\n      // TODO: define in another cpp\n      auto runLater(\n        const py::object& callable,\n        const unsigned delay,\n        const unsigned retryPause,\n        wstring& api)\n      {\n        int flags = 0;\n        toLower(api);\n        if (api.empty() || api.find(L\"com\") != wstring::npos)\n          flags |= ExcelRunQueue::COM_API;\n        if (api.find(L\"xll\") != wstring::npos)\n          flags |= ExcelRunQueue::XLL_API;\n        if (retryPause == 0)\n          flags |= ExcelRunQueue::NO_RETRY;\n        return PyFuture<PyObject*>(runExcelThread([callable = PyObjectHolder(callable)]()\n          {\n            py::gil_scoped_acquire getGil;\n            try\n            {\n              return callable().release().ptr();\n            }\n            catch (py::error_already_set& err)\n            {\n              if (err.matches(comBusyException))\n                throw ComBusyException();\n              throw;\n            }\n          },\n          flags,\n          delay,\n          retryPause));\n      }\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        comBusyException = py::register_exception<ComBusyException>(mod, \"ComBusyError\").ptr();\n\n        mod.def(\"excel_callback\",\n          &runLater,\n          R\"(\n            Schedules a callback to be run in the main thread. Much of the COM API in unavailable\n            during the calc cycle, in particular anything which involves writing to the sheet.\n            COM is also unavailable whilst xlOil is loading.\n \n            Returns a future which can be awaited.\n\n            Parameters\n            ----------\n\n            func: callable\n            A callable which takes no arguments and returns nothing\n\n            retry : int\n            Millisecond delay between retries if Excel's COM API is busy, e.g. a dialog box\n            is open or it is running a calc cycle.If zero, does no retry\n\n            wait : int\n            Number of milliseconds to wait before first attempting to run this function\n\n            api : str\n            Specify 'xll' or 'com' or both to indicate which APIs the call requires.\n            The default is 'com': 'xll' would only be required in rare cases.\n            )\",\n          py::arg(\"func\"),\n          py::arg(\"wait\") = 0,\n          py::arg(\"retry\") = 500,\n          py::arg(\"api\") = \"\");\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PySettings.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup>\n    <IncludePath>$(xlOilRoot)external\\python\\$(PyMajorVer).$(PyMinorVer)\\include;$(xlOilRoot)external\\python\\numpy\\include;$(xlOilRoot)external\\pybind11\\include;$(xlOilRoot)src;$(IncludePath);$(ProjectDir)</IncludePath>\n    <LibraryPath>$(xlOilRoot)external\\python\\$(PyMajorVer).$(PyMinorVer)\\$(Platform);$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>PYTHON_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>xloilHelpers.lib;python$(PyMajorVer)$(PyMinorVer).lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PostBuildEvent Condition=\"'$(Platform)|$(Configuration)'=='x64|Debug'\">\n      <Command>set XLOIL_BIN_DIR=$(OutDir)\npy -$(PyMajorVer).$(PyMinorVer) $(ProjectDir)package\\generate_stubs.py</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup>\n    <TargetExt>.pyd</TargetExt>\n  </PropertyGroup>  \n  <ItemGroup>\n    <ClCompile Include=\"AsyncFunctions.cpp\" />\n    <ClCompile Include=\"PyAddin.cpp\" />\n\t  <ClCompile Include=\"PyAddress.cpp\" />\n    <ClCompile Include=\"PyAppObjects.cpp\" />\n    <ClCompile Include=\"PyAppCallRun.cpp\" />\n    <ClCompile Include=\"PyLogWriter.cpp\" />\n    <ClCompile Include=\"PyRunLater.cpp\" />\n    <ClCompile Include=\"PyStatusBar.cpp\" />\n    <ClCompile Include=\"TypeConversion\\BasicTypes.cpp\" />\n    <ClCompile Include=\"PyCache.cpp\" />\n    <ClCompile Include=\"TypeConversion\\PyCustomType.cpp\" />\n    <ClCompile Include=\"TypeConversion\\PyDateType.cpp\" />\n    <ClCompile Include=\"TypeConversion\\PyDictType.cpp\" />\n    <ClCompile Include=\"PyCOM.cpp\">\n      <MultiProcessorCompilation>false</MultiProcessorCompilation>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyRangeType.cpp\" />\n    <ClCompile Include=\"PyImage.cpp\" />\n    <ClCompile Include=\"PyRibbon.cpp\" />\n    <ClCompile Include=\"PySource.cpp\" />\n    <ClCompile Include=\"PyFunctionRegister.cpp\" />\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"PyCore.cpp\" />\n    <ClCompile Include=\"TypeConversion\\NumpyFromExcel.cpp\" />\n\t<ClCompile Include=\"TypeConversion\\NumpyToExcel.cpp\" />\n\t<ClCompile Include=\"TypeConversion\\NumpyPandas.cpp\" />\n\t<ClCompile Include=\"TypeConversion\\NumpyHelpers.cpp\" />\n\t<ClCompile Include=\"TypeConversion\\NumpyDatetime.cpp\" />\n    <ClCompile Include=\"PyEvents.cpp\" />\n    <ClCompile Include=\"TypeConversion\\PyExcelArrayType.cpp\" />\n    <ClCompile Include=\"PyHelpers.cpp\" />\n    <ClCompile Include=\"PyRtd.cpp\" />\n\t<ClCompile Include=\"EventLoop.cpp\" />\n    <ClCompile Include=\"TypeConversion\\PyTupleType.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"ArrayHelpers.h\" />\n    <ClInclude Include=\"EventLoop.h\" />\n    <ClInclude Include=\"PyAddin.h\" />\n\t<ClInclude Include=\"PyAddress.h\" />\n    <ClInclude Include=\"PyCOM.h\" />\n    <ClInclude Include=\"PyFuture.h\" />\n    <ClInclude Include=\"AsyncFunctions.h\" />\n    <ClInclude Include=\"CPython.h\" />\n    <ClInclude Include=\"PyCache.h\" />\n    <ClInclude Include=\"PyImage.h\" />\n    <ClInclude Include=\"PyRtd.h\" />\n    <ClInclude Include=\"PySource.h\" />\n    <ClInclude Include=\"TypeConversion\\ConverterInterface.h\" />\n    <ClInclude Include=\"TypeConversion\\PyDateType.h\" />\n    <ClInclude Include=\"TypeConversion\\PyDictType.h\" />\n    <ClInclude Include=\"PyFunctionRegister.h\" />\n    <ClInclude Include=\"TypeConversion\\BasicTypes.h\" />\n\t<ClInclude Include=\"TypeConversion\\NumpyHelpers.h\" />\n\t<ClInclude Include=\"TypeConversion\\NumpyDatetime.h\" />\n    <ClInclude Include=\"PyCore.h\" />\n    <ClInclude Include=\"TypeConversion\\Numpy.h\" />\n    <ClInclude Include=\"PyEvents.h\" />\n    <ClInclude Include=\"TypeConversion\\PyExcelArrayType.h\" />\n    <ClInclude Include=\"PyHelpers.h\" />\n    <ClInclude Include=\"TypeConversion\\PyTupleType.h\" />\n\t<ClInclude Include=\"PyAppCallRun.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>  \n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings310.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>10</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings311.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>11</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings312.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>12</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings313.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>13</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings314.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>14</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings36.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>6</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings37.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>7</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings38.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>8</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySettings39.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <PyMajorVer>3</PyMajorVer>\n    <PyMinorVer>9</PyMinorVer>\n  </PropertyGroup>\n  <PropertyGroup />\n  <ItemDefinitionGroup />\n  <ItemGroup>\n    <BuildMacro Include=\"PyMajorVer\">\n      <Value>$(PyMajorVer)</Value>\n    </BuildMacro>\n    <BuildMacro Include=\"PyMinorVer\">\n      <Value>$(PyMinorVer)</Value>\n    </BuildMacro>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/PySource.cpp",
    "content": "#include \"PySource.h\"\n\n#include \"PyHelpers.h\"\n#include \"PyFunctionRegister.h\"\n#include \"PyAddin.h\"\n#include \"PyCOM.h\"\n\n#include <xlOil/WindowsSlim.h>\n#include <winreg/WinReg/WinReg.hpp>\n#include <xlOil/AppObjects.h>\n#include <xloil/Log.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/Events.h>\n#include <xlOil/ExcelUI.h>\n#include <filesystem>\n\nnamespace fs = std::filesystem;\n\nusing std::vector;\nusing std::string;\nusing std::wstring;\nusing std::weak_ptr;\nusing std::wstring_view;\nusing winreg::RegKey;\n\nnamespace py = pybind11;\n\nnamespace\n{\n  /// <summary>\n  /// Tries to find a local copy of a file given its OneDrive/Sharepoint URL.\n  /// Uses the approach discussed here: https://stackoverflow.com/questions/33734706/\n  /// </summary>\n  bool oneDriveUrlToLocal(const wstring_view& url, wstring& path)\n  {\n    RegKey key;\n    key.Open(HKEY_CURRENT_USER, L\"Software\\\\SyncEngines\\\\Providers\\\\OneDrive\");\n    for (const auto& location : key.EnumSubKeys())\n    {\n      RegKey locationKey;\n      locationKey.Open(key.Get(), location);\n\n      auto urlNamespace = locationKey.GetStringValue(L\"UrlNamespace\");\n      if (url.find(urlNamespace) != wstring_view::npos)\n      {\n        auto mountPoint = fs::path(locationKey.GetStringValue(L\"MountPoint\"));\n        auto pathPart = url.substr(urlNamespace.size() + 2);\n        path = mountPoint / pathPart;\n        std::replace(path.begin(), path.end(), L'/', L'\\\\');\n        while (!fs::exists(path))\n        {\n          auto nextSlash = pathPart.find_first_of(L'/');\n          if (nextSlash == wstring_view::npos)\n            return false;\n          pathPart = pathPart.substr(nextSlash + 1);\n          path = mountPoint / pathPart;\n        }\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /// <summary>\n  /// Loads a text file directly from a URL. It does this via the Application.Open\n  /// method so that if the URL is on OneDrive/Sharepoint Excel's own access tokens\n  /// are leveraged.  Otherwise the user would need to get a Graph API token for xlOil,\n  /// unless there is another way?  Returns an empty string if the load fails\n  /// \n  /// Note this needs to be run on the main thread as it uses COM.\n  /// </summary>\n  wstring loadOneDriveUrl(const wstring& url)\n  {\n    XLO_DEBUG(L\"Loading module from OneDrive URL '{}'\", url);\n    auto& app = xloil::thisApp();\n    {\n      // Turning off alerts means that a failed open happens quickly,\n      // otherwise there can be 30s timeout\n      const xloil::PauseExcel paused(app);\n      xloil::ExcelWorkbook wb;\n      try\n      {\n        wb = app.open(url, false, true);\n      }\n      catch (std::exception) {}\n\n      if (!wb.valid())\n        return wstring();\n\n      if (wb.path() != url)\n      {\n        XLO_WARN(L\"Unexpected error when loading module from sharepoint: \"\n          \"requested file '{}' but loaded ;{}'\", url, wb.path());\n        return wstring();\n      }\n\n      const auto firstSheet = wb.worksheets().list()[0];\n      auto textRange = firstSheet.usedRange();\n      wstring text;\n      for (auto i = 0u; i < textRange.nRows(); ++i)\n      {\n        auto value = textRange.value(i, 0);\n        (text += value.toString()) += L\"\\n\";\n      }\n      wb.close();\n      return std::move(text);\n    }\n  }\n}\n\nnamespace xloil\n{\n  namespace Python\n  {\n    bool unloadModule(const py::handle& module)\n    {\n      py::gil_scoped_acquire get_gil;\n\n      // Because xloil.scan_module adds workbook modules with the prefix\n      // 'xloil.wb.', we can't simply lookup the module name in sys.modules.\n      // We could rely on our knowledge of the prefix but iterating is not \n      // slow and is less fragile.\n      auto sysModules = PyBorrow<py::dict>(PyImport_GetModuleDict());\n      py::handle modName;\n      for (auto [k, v] : sysModules)\n        if (v.is(module))\n          modName = k;\n\n      if (!modName.ptr())\n        return false;\n\n      // Need to explictly clear the module's dict so that all globals get\n      // dec-ref'd - they are not removed even when the module's ref-count \n      // hits zero.\n      module.attr(\"__dict__\").cast<py::dict>().clear();\n\n      const auto ret = PyDict_DelItem(sysModules.ptr(), modName.ptr());\n\n      // Remove last remaining reference to module\n      module.dec_ref();\n\n      return ret == 0;\n    }\n\n    namespace\n    {\n      std::map<wstring, wstring> theOneDriveSources;\n\n      struct WorkbookOpenHandler\n      {\n        weak_ptr<PyAddin> _loadContext;\n\n        WorkbookOpenHandler(const weak_ptr<PyAddin>& loadContext)\n          : _loadContext(loadContext)\n        {}\n\n        void operator()(const wchar_t* wbPath, const wchar_t* wbName) const\n        {\n          auto addin = _loadContext.lock();\n          const auto isUrl = wcsncmp(wbPath, L\"http\", 4) == 0;\n          const auto separator = isUrl ? L'/' : L'\\\\';\n\n          auto modulePath = formatStr(L\"%s%c%s\",\n              wbPath,\n              separator,\n              addin->getLocalModulePath(wbName).c_str());\n\n          XLO_DEBUG(L\"Looking for workbook module at '{}'\", modulePath);\n\n          if (isUrl)\n          {\n            // TODO: better onedrive URL detection?\n            bool isOneDrive = modulePath.find(L\"sharepoint.com\") != wstring::npos ||\n              modulePath.find(L\"docs.live.net\") != wstring::npos;\n\n            if (isOneDrive)\n            {\n              wstring localPath;\n              if (oneDriveUrlToLocal(modulePath, localPath))\n              {\n                XLO_DEBUG(L\"Found local copy of OneDrive file '{}' at '{}'\", modulePath, localPath);\n                modulePath = localPath;\n              }\n              else\n              {\n                auto sourceText = loadOneDriveUrl(modulePath);\n                // If no source was found, then we're done \n                if (sourceText.empty())\n                  return;\n                theOneDriveSources[modulePath] = move(sourceText);\n              }\n            }\n          }\n          else if (!fs::exists(modulePath))\n            return;\n\n          // First add the module, if the scan fails it will still be on the\n          // file change watchlist. Note we always add workbook modules to the \n          // core context to avoid confusion.\n          FunctionRegistry::addModule(_loadContext, modulePath, wbName);\n          auto wbPathName = wstring(wbPath) + separator + wbName;\n\n          addin->importFile(modulePath.c_str(), wbPathName.c_str(), addin->useLoaderThread());\n        }\n      };\n    }\n\n    std::shared_ptr<const void>\n      createWorkbookOpenHandler(const weak_ptr<PyAddin>& loadContext)\n    {\n      if (!loadContext.lock()->loadLocalModules())\n        return std::shared_ptr<const void>();\n\n      WorkbookOpenHandler handler(loadContext);\n      return Event::WorkbookOpen().bind(handler);\n    }\n\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n          mod.def(\"_get_onedrive_source\", [](const wstring& url) { return theOneDriveSources[url]; });\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PySource.h",
    "content": "#pragma once\n#include <memory>\nnamespace pybind11 { class handle; }\nnamespace xloil {\n  class Application;\n  namespace Python\n  {\n    class PyAddin;\n  }\n}\n\nnamespace xloil\n{\n  namespace Python\n  {\n    /// <summary>\n    /// 'Hard' unloads a python module: clears its __dict__ and removes it\n    /// from sys.modules. Release the module handle into the argument so\n    /// there are no hanging references to the module object \n    /// </summary>\n    bool unloadModule(const pybind11::handle& module);\n\n    std::shared_ptr<const void>\n      createWorkbookOpenHandler(const std::weak_ptr<PyAddin>& loadContext);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/PyStatusBar.cpp",
    "content": "#include \"PyCore.h\"\n#include <xlOil/ExcelUI.h>\n\nusing std::shared_ptr;\nusing std::wstring_view;\nusing std::vector;\nusing std::wstring;\nnamespace py = pybind11;\n\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      struct PyStatusBar\n      {\n        std::unique_ptr<StatusBar> _bar;\n\n        PyStatusBar(size_t timeout)\n          : _bar(new StatusBar(timeout))\n        {}\n        void msg(const std::wstring& msg, size_t timeout)\n        {\n          py::gil_scoped_release releaseGil;\n          _bar->msg(msg, timeout);\n        }\n        void exit(py::args)\n        {\n          py::gil_scoped_release releaseGil;\n          _bar.reset();\n        }\n      };\n\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        py::class_<PyStatusBar>(mod, \"StatusBar\", R\"(             \n            Displays status bar messages and clears the status bar (after an optional delay) \n            on context exit.\n\n            Examples\n            --------\n\n            ::\n\n              with StatusBar(1000) as status:\n                status.msg('Doing slow thing')\n                ...\n                status.msg('Done slow thing')\n          )\")\n          .def(py::init<size_t>(), \n              R\"(\n                Constructs a StatusBar with a timeout specified in milliseconds.  After the \n                StatusBar context exits, any messages will be cleared after the timeout\n              )\",\n              py::arg(\"timeout\") = 0)\n          .def(\"__enter__\", [](py::object self) { return self; })\n          .def(\"__exit__\", &PyStatusBar::exit)\n          .def(\"msg\", &PyStatusBar::msg,\n            R\"(\n              Posts a status bar message, and if `timeout` is non-zero, clears if after\n              the specified number of milliseconds\n            )\",\n            py::arg(\"msg\"), py::arg(\"timeout\") = 0);\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/BasicTypes.cpp",
    "content": "#include \"BasicTypes.h\"\n#include \"PyCore.h\"\n#include \"PyEvents.h\"\n#include <pybind11/pybind11.h>\n#include <pybind11/stl.h>\n\nnamespace py = pybind11;\nusing std::shared_ptr;\n\nnamespace xloil \n{\n  namespace Python\n  {\n    namespace\n    {\n      struct CustomReturnConverter\n      {\n        std::shared_ptr<const IPyToExcel> value;\n      };\n      CustomReturnConverter* theConverter = nullptr;\n    }\n\n    const IPyToExcel* detail::getCustomReturnConverter()\n    {\n      return theConverter->value.get();\n    }\n\n    namespace\n    {\n      /// <summary>\n      /// Type converter which expects a cache reference string and rejects\n      /// all other types.\n      /// </summary>\n      class PyCacheObject : public ExcelValVisitor<PyObject*>\n      {\n      public:\n        using ExcelValVisitor::operator();\n        static constexpr char* const ourName = \"Cache\";\n\n        PyObject* operator()(const PStringRef& pstr) const\n        {\n          PyObject* _typeCheck = nullptr;\n\n          pybind11::object cached;\n          if (pyCacheGet(pstr.view(), cached))\n          {\n            // Type checking seems nice, but it's unpythonic to raise an error here\n            if (_typeCheck && PyObject_IsInstance(cached.ptr(), _typeCheck) == 0)\n              XLO_WARN(L\"Found `{0}` in cache but type was expected\", pstr.string());\n            return cached.release().ptr();\n          }\n          return nullptr;\n        }\n\n        constexpr wchar_t* failMessage() const { return L\"Expected cache string\"; }\n      };\n\n      struct FromPyLong\n      {\n        auto operator()(const PyObject* obj) const\n        {\n          if (!PyLong_Check(obj))\n            XLO_THROW(\"Expected python int, got '{0}'\", to_string(obj));\n          int overflowIndicator;\n          long output = PyLong_AsLongAndOverflow((PyObject*)obj, &overflowIndicator);\n          if (overflowIndicator)\n            return ExcelObj(PyFloat_AsDouble((PyObject*)obj)); // since obj is not a float, this will call obj.__float__() which exists since PyLong_Check passed above\n          else\n            return ExcelObj(output);\n        }\n        static constexpr char* ourName = \"int\";\n      };\n      struct FromPyFloat\n      {\n        auto operator()(const PyObject* obj) const\n        {\n          if (!PyFloat_Check(obj))\n            XLO_THROW(\"Expected python float, got '{0}'\", to_string(obj));\n          return ExcelObj(PyFloat_AS_DOUBLE(obj));\n        }\n        static constexpr char* ourName = \"float\";\n      };\n      struct FromPyBool\n      {\n        auto operator()(const PyObject* obj) const\n        {\n          if (!PyBool_Check(obj))\n            XLO_THROW(\"Expected python bool, got '{0}'\", to_string(obj));\n          return ExcelObj(PyObject_IsTrue((PyObject*)obj) > 0);\n        }\n        static constexpr char* ourName = \"bool\";\n      };\n\n      struct FromPyToCache\n      {\n        auto operator()(const PyObject* obj) const\n        {\n          return pyCacheAdd(PyBorrow<>(const_cast<PyObject*>(obj)));\n        }\n        static constexpr char* ourName = \"Cache\";\n      };\n\n      /// <summary>\n      /// Always returns a single cell value. Uses the Excel object cache for \n      /// returned arrays and the Python object cache for unconvertable objects\n      /// </summary>\n      struct FromPyToSingleValue\n      {\n        auto operator()(const PyObject* obj) const\n        {\n          ExcelObj excelObj(FromPyObj()(obj));\n          if (excelObj.isType(ExcelType::ArrayValue))\n            return std::move(excelObj);\n          return makeCached<ExcelObj>(std::move(excelObj));\n        }\n        static constexpr char* ourName = \"Single\";\n      };\n\n    }\n    \n#pragma region PYBIND_BINDINGS\n    namespace\n    {\n      template <class T>\n      void convertPy(pybind11::module& mod, const char* type)\n      {\n        bindPyConverter<PyFromExcelConverter<T>>(mod, type).def(py::init<>());\n      }\n\n      template <class T>\n      void convertXl(pybind11::module& mod, const char* type)\n      {\n        bindXlConverter<PyFuncToExcel<T>>(mod, type).def(py::init<>());\n      }\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        // Bind converters for standard types\n        convertPy<PyFromInt>    (mod, PyFromInt::ourName);\n        convertPy<PyFromDouble> (mod, PyFromDouble::ourName);\n        convertPy<PyFromBool>   (mod, PyFromBool::ourName);\n        convertPy<PyFromString> (mod, PyFromString::ourName);\n        convertPy<PyFromAny>    (mod, PyFromAny::ourName);\n        convertPy<PyCacheObject>(mod, PyCacheObject::ourName);\n\n        convertPy<PyFromIntUncached>(mod, XLOPY_UNCACHED_PREFIX \"int\");\n        convertPy<PyFromDoubleUncached>(mod, XLOPY_UNCACHED_PREFIX \"float\");\n        convertPy<PyFromBoolUncached>(mod, XLOPY_UNCACHED_PREFIX \"bool\");\n        convertPy<PyFromStringUncached>(mod, XLOPY_UNCACHED_PREFIX \"str\");\n        convertPy<PyFromAnyUncached>(mod, XLOPY_UNCACHED_PREFIX \"object\");\n\n        convertXl<FromPyLong>         (mod, FromPyLong::ourName);\n        convertXl<FromPyFloat>        (mod, FromPyFloat::ourName);\n        convertXl<FromPyBool>         (mod, FromPyBool::ourName);\n        convertXl<FromPyString>       (mod, FromPyString::ourName);\n        convertXl<FromPyToCache>      (mod, FromPyToCache::ourName);\n        convertXl<FromPyToSingleValue>(mod, FromPyToSingleValue::ourName);\n\n        py::class_<CustomReturnConverter>(mod, \"_CustomReturnConverter\")\n          .def_readwrite(\"value\", &CustomReturnConverter::value);\n          \n        theConverter = new CustomReturnConverter();\n        mod.add_object(\"_return_converter_hook\",\n          py::cast(theConverter, py::return_value_policy::take_ownership));\n      });\n    }\n#pragma endregion\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/BasicTypes.h",
    "content": "#pragma once\n\n#include \"ConverterInterface.h\"\n#include \"Numpy.h\"\n#include \"PyCache.h\"\n#include \"PyDateType.h\"\n#include \"PyTupleType.h\"\n#include \"PyHelpers.h\"\n#include <xlOil/ExcelObj.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/ExcelRef.h>\n\n#include <xlOil/ExcelObjCache.h>\n#include <xlOil/Log.h>\n#include <xloil/StringUtils.h>\n#include <xlOil/Range.h>\n#include <string>\n\nusing namespace std::literals::string_literals;\n\nnamespace xloil \n{\n  namespace Python\n  {\n    template<class TImpl, bool TUseCache = true> struct PyFromExcel;\n\n    namespace detail\n    {\n      template<class TSuper>\n      struct PyFromExcelImpl : public ExcelValVisitor<PyObject*>\n      {\n        using ExcelValVisitor::operator();\n\n        // Default behaviour is to run `visit` on ourselves, which calls the \n        // type-appropriate overload of operator()\n        PyObject* operator()(const ExcelObj& obj) const\n        {\n          return obj.visit(static_cast<const TSuper&>(*this));\n        }\n\n        constexpr bool emptyStringGivesDefault() const { return true; }\n      };\n\n      /// <summary>\n      /// Wraps a type conversion functor, interpreting the string conversion to\n      /// look for a python cache reference.  If found, returns the cache object,\n      /// otherwise passes the string through.\n      /// </summary>\n      template<class TBase>\n      struct PyFromCache : public TBase\n      {\n        template <class...Args>\n        PyFromCache(Args&&...args) \n          : TBase(std::forward<Args>(args)...)\n        {}\n\n        using TBase::operator();\n        PyObject* operator()(const ExcelObj& obj) const\n        {\n          if (obj.isType(ExcelType::Str))\n          {\n            auto pStr = obj.cast<PStringRef>();\n            pybind11::object cached;\n            if (pyCacheGet(pStr, cached))\n              return cached.release().ptr();\n\n            auto* cacheVal = getCached<ExcelObj>(pStr);\n            if (cacheVal)\n              return TBase::operator()(*cacheVal);\n          }\n          return TBase::operator()(obj);\n        }\n\n        constexpr bool emptyStringGivesDefault() const { return true; }\n      };\n\n      struct PyFromDouble : public PyFromExcelImpl<PyFromDouble>\n      {\n        using PyFromExcelImpl::operator();\n        static constexpr char* const ourName = \"float\";\n\n        PyObject* operator()(double x) const   { return PyFloat_FromDouble(x); }\n        PyObject* operator()(int x)    const   { return operator()(double(x)); }\n        PyObject* operator()(bool x)   const   { return operator()(double(x)); }\n\n        constexpr wchar_t* failMessage() const { return L\"Expected float\"; }\n      };\n\n      struct PyFromBool : public PyFromExcelImpl<PyFromBool>\n      {\n        using PyFromExcelImpl::operator();\n        static constexpr char* const ourName = \"bool\";\n\n        PyObject* operator()(bool x) const\n        {\n          if (x) Py_RETURN_TRUE; else Py_RETURN_FALSE;\n        }\n        PyObject* operator()(int x)      const { return operator()(bool(x)); }\n        PyObject* operator()(double x)   const { return operator()(x != 0); }\n\n        constexpr wchar_t* failMessage() const { return L\"Expected bool\"; }\n      };\n\n      struct PyFromString : public PyFromExcelImpl<PyFromString>\n      {\n        using PyFromExcelImpl::operator();\n        static constexpr char* const ourName = \"str\";\n\n        PyObject* operator()(const PStringRef& pstr) const\n        {\n          return PyUnicode_FromWideChar(const_cast<wchar_t*>(pstr.pstr()), pstr.length());\n        }\n        // Return empty string for Excel Nil value\n        PyObject* operator()(nullptr_t) const { return PyUnicode_New(0, 127); }\n        PyObject* operator()(int x)     const { return PyUnicode_FromFormat(\"%i\", x); }\n        PyObject* operator()(bool x)    const { return PyUnicode_FromString(std::to_string(x).c_str()); }\n        PyObject* operator()(double x)  const { return PyUnicode_FromString(std::to_string(x).c_str()); }\n\n        constexpr wchar_t* failMessage() const { return L\"Expected string\"; }\n\n        constexpr bool emptyStringGivesDefault() const { return false; }\n      };\n\n      struct PyFromInt : public PyFromExcelImpl<PyFromInt>\n      {\n        using PyFromExcelImpl::operator();\n        static constexpr char* const ourName = \"int\";\n\n        PyObject* operator()(int x)    const { return PyLong_FromLong(long(x)); }\n        PyObject* operator()(bool x)   const { return operator()(int(x)); }\n        PyObject* operator()(double x) const\n        {\n          long long i;\n          if (floatingToInt(x, i))\n            return PyLong_FromLongLong(i);\n          return nullptr;\n        }\n        \n        constexpr wchar_t* failMessage() const { return L\"Expected int\"; }\n      };\n\n      template<class TSuper = nullptr_t, bool TTrimArray = true>\n      struct PyFromAny : public PyFromExcelImpl<std::conditional_t<std::is_null_pointer_v<TSuper>, PyFromAny<TSuper, TTrimArray>, TSuper>>\n      {\n        // One suspects that C++ template syntax, while much improved, remains suboptimal\n        using PyFromExcelImpl<std::conditional_t<std::is_null_pointer_v<TSuper>, PyFromAny<TSuper, TTrimArray>, TSuper>>::operator();\n        static constexpr char* const ourName = \"object\";\n\n        PyObject* operator()(int x)    const { return PyFromInt()(x); }\n        PyObject* operator()(bool x)   const { return PyFromBool()(x); }\n        PyObject* operator()(double x) const { return PyFromDouble()(x); }\n        PyObject* operator()(const ArrayVal& arr) const\n        {\n          return excelArrayToNumpyArray(ExcelArray(arr, TTrimArray));\n        }\n\n        // Return python None for Excel nil value\n        PyObject* operator()(nullptr_t) const { Py_RETURN_NONE; }\n\n        PyObject* operator()(const PStringRef& pstr) const\n        {\n          return PyFromString()(pstr);\n        }\n\n        PyObject* operator()(CellError err) const\n        {\n          if (err == CellError::NA)\n            Py_RETURN_NONE;\n          auto pyObj = pybind11::cast(err);\n          return pyObj.release().ptr();\n        }\n\n        PyObject* operator()(const RefVal& ref) const\n        {\n          return pybind11::cast(new XllRange(ref)).release().ptr();\n        }\n\n        constexpr wchar_t* failMessage() const { return L\"Unknown type\"; }\n\n        constexpr bool emptyStringGivesDefault() const { return false; }\n      };\n\n      /// <summary>\n      /// Used by PyExcelConverter\n      /// </summary>\n      template <class T>\n      struct MakePyFromExcel { using type = PyFromExcel<T>; };\n\n      template <class T, bool TUseCache>\n      struct MakePyFromExcel<PyFromExcel<T, TUseCache>>\n      {\n        using type = PyFromExcel<T, TUseCache>;\n      };\n    }\n    \n    /// <summary>\n    /// Checks if the python object is instance of Range type\n    /// (i.e. is XllRange or ExcelRange)\n    /// </summary>\n    bool isRangeType(const PyObject* obj);\n    /// <summary>\n    /// Checks if the python object is a CellError (#N/A! etc) type\n    /// </summary>\n    bool isErrorType(const PyObject* obj);\n    /// <summary>\n    /// Checks if the python object is a wrapper for an *ExcelObj*,\n    /// which can be returned by some type converters\n    /// </summary>\n    bool isExcelObjType(const PyObject* obj);\n\n    /// <summary>\n    /// Wraps a type conversion implementation, similarly to <see cref=\"xloil::FromExcel\"/>\n    /// Checks all ExcelObj strings for both python and ExcelObj cache references.\n    /// Throws an error if conversion fails. \n    /// </summary>\n    template<class TImpl, bool TUseCache>\n    struct PyFromExcel\n    {\n      typename std::conditional_t<TUseCache,\n                                  detail::PyFromCache<TImpl>,\n                                  TImpl> _impl;\n\n      static constexpr auto ourName = TImpl::ourName;\n\n      template <class...Args>\n      PyFromExcel(Args&&...args)\n        : _impl(std::forward<Args>(args)...)\n      {}\n\n      auto operator()(\n        const ExcelObj& xl,\n        const PyObject* defaultVal) const\n      {\n        return operator()(xl, const_cast<PyObject*>(defaultVal));\n      }\n\n      /// <summary>\n      /// <returns>New/borrowed reference</returns>\n      /// </summary>\n      auto operator()(\n        const ExcelObj& obj,\n        PyObject* defaultVal = nullptr) const\n      {\n        if (defaultVal && (obj.isMissing() || (_impl.emptyStringGivesDefault() && obj.isEmptyStr())))\n        {\n          // If we return the default value, we need to increment its refcount\n          Py_INCREF(defaultVal);\n          return defaultVal;\n        }\n\n        // Why return null and not throw here?\n        auto* retVal = _impl(obj);\n\n        if (!retVal)\n        {\n          XLO_THROW(L\"Cannot convert '{0}': {1}\", obj.toString(),\n            PyErr_Occurred() ? pyErrIfOccurred() : _impl.failMessage());\n        }\n        return retVal;\n      }\n      const char* name() const\n      {\n        return TImpl::ourName;\n      }\n    };\n\n    using PyFromInt            = PyFromExcel<detail::PyFromInt>;\n    using PyFromBool           = PyFromExcel<detail::PyFromBool>;\n    using PyFromDouble         = PyFromExcel<detail::PyFromDouble>;\n    using PyFromString         = PyFromExcel<detail::PyFromString>;\n    using PyFromAny            = PyFromExcel<detail::PyFromAny<nullptr_t, true>>;\n    using PyFromAnyNoTrim      = PyFromExcel<detail::PyFromAny<nullptr_t, false>>;\n\n    using PyFromIntUncached    = PyFromExcel<detail::PyFromInt, false>;\n    using PyFromBoolUncached   = PyFromExcel<detail::PyFromBool, false>;\n    using PyFromDoubleUncached = PyFromExcel<detail::PyFromDouble, false>;\n    using PyFromStringUncached = PyFromExcel<detail::PyFromString, false>;\n    using PyFromAnyUncached    = PyFromExcel<detail::PyFromAny<>, false>;\n\n    /// <summary>\n    /// Wraps a <see cref=\"PyFromExcel\"/> to inherit from <see cref=\"IPyFromExcel\"/>\n    /// and create a type converter object with a virtual call.\n    /// </summary>\n    template <class TImpl>\n    class PyFromExcelConverter : public IPyFromExcel\n    {\n      typename detail::MakePyFromExcel<TImpl>::type _impl;\n\n    public:\n      template <class...Args>\n      PyFromExcelConverter(Args&&...args) \n        : _impl(std::forward<Args>(args)...)\n      {}\n\n      virtual PyObject* operator()(\n        const ExcelObj& xl, const PyObject* defaultVal = nullptr) override\n      {\n        // Because ref-counting there's no notion of a const PyObject*\n        // for a default value\n        return _impl(xl, const_cast<PyObject*>(defaultVal));\n      }\n      const char* name() const override\n      {\n        return _impl.name();\n      }\n    };\n\n    struct FromPyString\n    {\n      template <class TAlloc = PStringAllocator<wchar_t>>\n      auto operator()(\n        const PyObject* obj, \n        const TAlloc& allocator = PStringAllocator<wchar_t>()) const\n      {\n        if (!PyUnicode_Check(obj))\n          XLO_THROW(\"Expected python str, got '{0}'\", to_string(obj));\n\n        PyUnicode_READY(obj);\n        const auto len = (char16_t)std::min<size_t>(\n          USHRT_MAX, PyUnicode_GET_LENGTH((PyObject*)obj));\n        BasicPString<wchar_t, TAlloc> pstr(len, allocator);\n        PyUnicode_AsWideChar((PyObject*)obj, pstr.pstr(), pstr.length());\n        return ExcelObj(std::move(pstr));\n      }\n      static constexpr char* ourName = \"str\";\n    };\n\n    namespace detail\n    {\n      const IPyToExcel* getCustomReturnConverter();\n\n      /// <summary>\n      /// Used with FromPyObj to return unknown objects as #VALUE\n      /// </summary>\n      struct ReturnValueError\n      {\n        template <class TAlloc>\n        auto operator()(PyObject*, const TAlloc&)\n        {\n          return ExcelObj(CellError::Value);\n        }\n      };\n\n      /// <summary>\n      /// Used with FromPyObj to return unknown objects as a cache ref\n      /// </summary>\n      struct ReturnToCache \n      {\n        template <class TAlloc>\n        auto operator()(PyObject* obj, const TAlloc& stringAllocator)\n        {\n          // TODO: pass allocator through to cache \n          return ExcelObj(BasicPString<wchar_t, TAlloc>(pyCacheAdd(PyBorrow(obj)).asStringView(), stringAllocator));\n        }\n      };\n\n      /// <summary>\n      /// Used with FromPyObj to return unknown objects as `str(obj)`\n      /// </summary>\n      struct ReturnToString\n      {\n        template <class TAlloc>\n        ExcelObj operator()(PyObject* obj, const TAlloc& stringAllocator)\n        {\n          return FromPyString()(PySteal(PyObject_Str(obj)).ptr(), stringAllocator);\n        }\n      };\n    }\n   \n    /// <summary>\n    /// Tries to convert a python object to Excel using all known converters\n    /// </summary>\n    /// <typeparam name=\"TDefault\">\n    /// Functor which determines the fate of an otherwise unconvertable object\n    /// </typeparam>\n    /// <typeparam name=\"TIsScalar\">\n    /// If true, does not check for array / iterable conversions. Useful when\n    /// populating an array\n    /// </typeparam>\n    template<class TDefault=detail::ReturnToCache, bool TIsScalar=false>\n    struct FromPyObj\n    {\n      TDefault _defaultHandler;\n\n      template <class TAlloc = PStringAllocator<wchar_t>>\n      auto operator()(\n        const PyObject* obj, \n        const TAlloc& stringAllocator = PStringAllocator<wchar_t>())\n      {\n        auto p = (PyObject*)obj; // Python API isn't const-aware\n        if (p == Py_None)\n        {\n          // Return #N/A here as xltypeNil is turned to zero by Excel\n          return ExcelObj(CellError::NA);\n        }\n        else if (isExcelObjType(p))\n        {\n          return py::unsafe_move<ExcelObj>(p);\n        }\n        else if (PyBool_Check(p)) // Must check this before `long`\n        {\n          return ExcelObj(PyObject_IsTrue(p) > 0);\n        }\n        else if (PyLong_Check(p))\n        {\n          int overflowIndicator;\n          auto out = PyLong_AsLongAndOverflow(p, &overflowIndicator);\n          if (overflowIndicator)\n            return ExcelObj(PyFloat_AsDouble(p));\n          else\n            return ExcelObj(out);\n\n        }\n        else if (PyFloat_Check(p))\n        {\n          return ExcelObj(PyFloat_AS_DOUBLE(p));\n        }\n#pragma warning(suppress: 4127)\n        else if (!TIsScalar && isNumpyArray(p))\n        {\n          return numpyArrayToExcel(p);\n        }\n        else if (isPyDate(p))\n        {\n          return pyDateToExcel(p);\n        }\n        else if (isErrorType(p))\n        {\n          auto err = pybind11::reinterpret_borrow<pybind11::object>(p).cast<CellError>();\n          return ExcelObj(err);\n        }\n        else if (PyUnicode_Check(p))\n        {\n          return FromPyString()(p, stringAllocator);\n        }\n        else if (detail::getCustomReturnConverter())\n        {\n          auto val = (*detail::getCustomReturnConverter())(obj);\n          if (!val.isType(ExcelType::Nil))\n            return ExcelObj(std::move(val));\n        }\n        \n        if constexpr (!TIsScalar)\n        {\n          if (PyIterable_Check(p))\n          {\n            return nestedIterableToExcel(p);\n          }\n        }\n        return _defaultHandler(p, stringAllocator);\n      }\n    };\n\n    using FromPyObjOrError = FromPyObj<detail::ReturnValueError>;\n    using FromPyObjOrCache = FromPyObj<detail::ReturnToCache>;\n\n    template<class TFunc>\n    class PyFuncToExcel : public IPyToExcel\n    {\n    public:\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        return TFunc()(obj);\n      }\n      const char* name() const override\n      {\n        return TFunc::ourName;\n      }\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/ConverterInterface.h",
    "content": "#pragma once\n\n#include <xlOil/ExcelObj.h>\n#include \"CPython.h\"\n\nnamespace xloil\n{\n  namespace Python\n  {\n    class IPyFromExcel : public IConvertFromExcel<PyObject*>\n    {\n    public:\n      /// <summary>\n      /// A useful name for the converter, typically the type supported.\n      /// Currently used only for log diagnostics.\n      /// </summary>\n      virtual const char* name() const = 0;\n    };\n    class IPyToExcel : public IConvertToExcel<PyObject*>\n    {\n    public:\n      /// <summary>\n      /// A useful name for the converter, typically the type supported.\n      /// Currently used only for log diagnostics.\n      /// </summary>\n      virtual const char* name() const = 0;\n    };\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/Numpy.h",
    "content": "#pragma once\n\n/*\n * Functions to hide the horror of the numpy API, in particular the need to initialise\n * an array of function points in every cpp file. \n */\n\n#include \"CPython.h\"\n#include <xlOil/ExcelObj.h>\n#include <memory>\n\nnamespace xloil { \n  class FPArray;\n  namespace Python {\n    class IPyFromExcel;\n} }\n\nnamespace xloil\n{\n  namespace Python\n  {\n    bool importNumpy();\n    bool isArrayDataType(PyTypeObject* p);\n    bool isNumpyArray(PyObject* p);\n\n    IPyFromExcel* createFPArrayConverter();\n\n    std::shared_ptr<FPArray> numpyToFPArray(const PyObject* obj);\n\n    PyObject* excelArrayToNumpyArray(const ExcelArray& arr, int dims = 2, int dtype = -1);\n\n    ExcelObj numpyArrayToExcel(const PyObject* p);\n\n    PyObject* toNumpyDatetimeFromExcelDateArray(const PyObject* p);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyDatetime.cpp",
    "content": "#include \"NumpyDatetime.h\"\n#include <stdexcept>\n/*\n * This file implements core functionality for NumPy datetime.\n *\n * Written by Mark Wiebe (mwwiebe@gmail.com)\n * Copyright (c) 2011 by Enthought, Inc.\n *\n * See LICENSE.txt for the license.\n */\n\n/*\n * This function returns a pointer to the DateTimeMetaData\n * contained within the provided datetime dtype.\n */\nPyArray_DatetimeMetaData *\nget_datetime_metadata_from_dtype(PyArray_Descr *dtype)\n{\n    if (!PyDataType_ISDATETIME(dtype))\n      throw std::runtime_error(\"cannot get datetime metadata from non-datetime type\");\n\n    return &(((PyArray_DatetimeDTypeMetaData*)PyDataType_C_METADATA(dtype))->meta);\n}\n\nPyArray_Descr *\ncreate_datetime_dtype(int type_num, PyArray_DatetimeMetaData *meta)\n{\n    PyArray_Descr *dtype = NULL;\n    PyArray_DatetimeMetaData *dt_data;\n\n    /* Create a default datetime or timedelta */\n    if (type_num == NPY_DATETIME || type_num == NPY_TIMEDELTA) {\n        dtype = PyArray_DescrNewFromType(type_num);\n    }\n    else {\n        throw std::runtime_error(\"Asked to create a datetime type with a non-datetime type number\");\n    }\n\n    if (dtype == NULL) {\n        return NULL;\n    }\n\n    dt_data = &(((PyArray_DatetimeDTypeMetaData *)PyDataType_C_METADATA(dtype))->meta);\n\n    /* Copy the metadata */\n    *dt_data = *meta;\n\n    return dtype;\n}\n\n/*\n * Computes the python `ret, d = divmod(d, unit)`.\n *\n * Note that GCC is smart enough at -O2 to eliminate the `if(*d < 0)` branch\n * for subsequent calls to this command - it is able to deduce that `*d >= 0`.\n */\ninline\nnpy_int64 extract_unit_64(npy_int64 *d, npy_int64 unit) {\n    assert(unit > 0);\n    npy_int64 div = *d / unit;\n    npy_int64 mod = *d % unit;\n    if (mod < 0) {\n        mod += unit;\n        div -= 1;\n    }\n    assert(mod >= 0);\n    *d = mod;\n    return div;\n}\n\ninline\nnpy_int32 extract_unit_32(npy_int32 *d, npy_int32 unit) {\n    assert(unit > 0);\n    npy_int32 div = *d / unit;\n    npy_int32 mod = *d % unit;\n    if (mod < 0) {\n        mod += unit;\n        div -= 1;\n    }\n    assert(mod >= 0);\n    *d = mod;\n    return div;\n}\n\n/* Days per month, regular year and leap year */\nint _days_per_month_table[2][12] = {\n    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },\n    { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }\n};\n\n/*\n * Returns 1 if the given year is a leap year, 0 otherwise.\n */\nint\nis_leapyear(npy_int64 year)\n{\n    return (year & 0x3) == 0 && /* year % 4 == 0 */\n           ((year % 100) != 0 ||\n            (year % 400) == 0);\n}\n\n/*\n * Calculates the days offset from the 1970 epoch.\n */\nnpy_int64\nget_datetimestruct_days(const npy_datetimestruct *dts)\n{\n    int i, month;\n    npy_int64 year, days = 0;\n    int *month_lengths;\n\n    year = dts->year - 1970;\n    days = year * 365;\n\n    /* Adjust for leap years */\n    if (days >= 0) {\n        /*\n         * 1968 is the closest leap year before 1970.\n         * Exclude the current year, so add 1.\n         */\n        year += 1;\n        /* Add one day for each 4 years */\n        days += year / 4;\n        /* 1900 is the closest previous year divisible by 100 */\n        year += 68;\n        /* Subtract one day for each 100 years */\n        days -= year / 100;\n        /* 1600 is the closest previous year divisible by 400 */\n        year += 300;\n        /* Add one day for each 400 years */\n        days += year / 400;\n    }\n    else {\n        /*\n         * 1972 is the closest later year after 1970.\n         * Include the current year, so subtract 2.\n         */\n        year -= 2;\n        /* Subtract one day for each 4 years */\n        days += year / 4;\n        /* 2000 is the closest later year divisible by 100 */\n        year -= 28;\n        /* Add one day for each 100 years */\n        days -= year / 100;\n        /* 2000 is also the closest later year divisible by 400 */\n        /* Subtract one day for each 400 years */\n        days += year / 400;\n    }\n\n    month_lengths = _days_per_month_table[is_leapyear(dts->year)];\n    month = dts->month - 1;\n\n    /* Add the months */\n    for (i = 0; i < month; ++i) {\n        days += month_lengths[i];\n    }\n\n    /* Add the days */\n    days += dts->day - 1;\n\n    return days;\n}\n\n/*\n * Calculates the minutes offset from the 1970 epoch.\n */\nnpy_int64\nget_datetimestruct_minutes(const npy_datetimestruct *dts)\n{\n    npy_int64 days = get_datetimestruct_days(dts) * 24 * 60;\n    days += dts->hour * 60;\n    days += dts->min;\n\n    return days;\n}\n\n/*\n * Modifies '*days_' to be the day offset within the year,\n * and returns the year.\n */\nnpy_int64\ndays_to_yearsdays(npy_int64 *days_)\n{\n    const npy_int64 days_per_400years = (400*365 + 100 - 4 + 1);\n    /* Adjust so it's relative to the year 2000 (divisible by 400) */\n    npy_int64 days = (*days_) - (365*30 + 7);\n    npy_int64 year;\n\n    /* Break down the 400 year cycle to get the year and day within the year */\n    year = 400 * extract_unit_64(&days, days_per_400years);\n\n    /* Work out the year/day within the 400 year cycle */\n    if (days >= 366) {\n        year += 100 * ((days-1) / (100*365 + 25 - 1));\n        days = (days-1) % (100*365 + 25 - 1);\n        if (days >= 365) {\n            year += 4 * ((days+1) / (4*365 + 1));\n            days = (days+1) % (4*365 + 1);\n            if (days >= 366) {\n                year += (days-1) / 365;\n                days = (days-1) % 365;\n            }\n        }\n    }\n\n    *days_ = days;\n    return year + 2000;\n}\n\n/* Extracts the month number from a 'datetime64[D]' value */\nint\ndays_to_month_number(npy_datetime days)\n{\n    npy_int64 year;\n    int *month_lengths, i;\n\n    year = days_to_yearsdays(&days);\n    month_lengths = _days_per_month_table[is_leapyear(year)];\n\n    for (i = 0; i < 12; ++i) {\n        if (days < month_lengths[i]) {\n            return i + 1;\n        }\n        else {\n            days -= month_lengths[i];\n        }\n    }\n\n    /* Should never get here */\n    return 1;\n}\n\n/*\n * Fills in the year, month, day in 'dts' based on the days\n * offset from 1970.\n */\nvoid\nset_datetimestruct_days(npy_int64 days, npy_datetimestruct *dts)\n{\n    int *month_lengths, i;\n\n    dts->year = days_to_yearsdays(&days);\n    month_lengths = _days_per_month_table[is_leapyear(dts->year)];\n\n    for (i = 0; i < 12; ++i) {\n        if (days < month_lengths[i]) {\n            dts->month = i + 1;\n            dts->day = (int)days + 1;\n            return;\n        }\n        else {\n            days -= month_lengths[i];\n        }\n    }\n}\n\n/*NUMPY_API\n *\n * Converts a datetime from a datetimestruct to a datetime based\n * on some metadata. The date is assumed to be valid.\n *\n * TODO: If meta->num is really big, there could be overflow\n *\n * Returns 0 on success, -1 on failure.\n */\nint\nNpyDatetime_ConvertDatetimeStructToDatetime64(PyArray_DatetimeMetaData *meta,\n                                    const npy_datetimestruct *dts,\n                                    npy_datetime *out)\n{\n    npy_datetime ret;\n    NPY_DATETIMEUNIT base = meta->base;\n\n    /* If the datetimestruct is NaT, return NaT */\n    if (dts->year == NPY_DATETIME_NAT) {\n        *out = NPY_DATETIME_NAT;\n        return 0;\n    }\n\n    /* Cannot instantiate a datetime with generic units */\n    if (meta->base == NPY_FR_GENERIC) {\n        throw std::runtime_error(\n                    \"Cannot create a NumPy datetime other than NaT with generic units\");\n    }\n\n    if (base == NPY_FR_Y) {\n        /* Truncate to the year */\n        ret = dts->year - 1970;\n    }\n    else if (base == NPY_FR_M) {\n        /* Truncate to the month */\n        ret = 12 * (dts->year - 1970) + (dts->month - 1);\n    }\n    else {\n        /* Otherwise calculate the number of days to start */\n        npy_int64 days = get_datetimestruct_days(dts);\n\n        switch (base) {\n            case NPY_FR_W:\n                /* Truncate to weeks */\n                if (days >= 0) {\n                    ret = days / 7;\n                }\n                else {\n                    ret = (days - 6) / 7;\n                }\n                break;\n            case NPY_FR_D:\n                ret = days;\n                break;\n            case NPY_FR_h:\n                ret = days * 24 +\n                      dts->hour;\n                break;\n            case NPY_FR_m:\n                ret = (days * 24 +\n                      dts->hour) * 60 +\n                      dts->min;\n                break;\n            case NPY_FR_s:\n                ret = ((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec;\n                break;\n            case NPY_FR_ms:\n                ret = (((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec) * 1000 +\n                      dts->us / 1000;\n                break;\n            case NPY_FR_us:\n                ret = (((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec) * 1000000 +\n                      dts->us;\n                break;\n            case NPY_FR_ns:\n                ret = ((((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec) * 1000000 +\n                      dts->us) * 1000 +\n                      dts->ps / 1000;\n                break;\n            case NPY_FR_ps:\n                ret = ((((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec) * 1000000 +\n                      dts->us) * 1000000 +\n                      dts->ps;\n                break;\n            case NPY_FR_fs:\n                /* only 2.6 hours */\n                ret = (((((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec) * 1000000 +\n                      dts->us) * 1000000 +\n                      dts->ps) * 1000 +\n                      dts->as / 1000;\n                break;\n            case NPY_FR_as:\n                /* only 9.2 secs */\n                ret = (((((days * 24 +\n                      dts->hour) * 60 +\n                      dts->min) * 60 +\n                      dts->sec) * 1000000 +\n                      dts->us) * 1000000 +\n                      dts->ps) * 1000000 +\n                      dts->as;\n                break;\n            default:\n                /* Something got corrupted */\n                throw std::runtime_error(\"NumPy datetime metadata with corrupt unit value\");\n        }\n    }\n\n    /* Divide by the multiplier */\n    if (meta->num > 1) {\n        if (ret >= 0) {\n            ret /= meta->num;\n        }\n        else {\n            ret = (ret - meta->num + 1) / meta->num;\n        }\n    }\n\n    *out = ret;\n\n    return 0;\n}\n\n/*NUMPY_API\n *\n * Converts a datetime based on the given metadata into a datetimestruct\n */\nint\nNpyDatetime_ConvertDatetime64ToDatetimeStruct(\n        PyArray_DatetimeMetaData *meta, npy_datetime dt,\n        npy_datetimestruct *out)\n{\n    npy_int64 days;\n\n    /* Initialize the output to all zeros */\n    memset(out, 0, sizeof(npy_datetimestruct));\n    out->year = 1970;\n    out->month = 1;\n    out->day = 1;\n\n    /* NaT is signaled in the year */\n    if (dt == NPY_DATETIME_NAT) {\n        out->year = NPY_DATETIME_NAT;\n        return 0;\n    }\n\n    /* Datetimes can't be in generic units */\n    if (meta->base == NPY_FR_GENERIC) {\n        throw std::runtime_error(\n                    \"Cannot convert a NumPy datetime value other than NaT \"\n                    \"with generic units\");\n    }\n\n    /* TODO: Change to a mechanism that avoids the potential overflow */\n    dt *= meta->num;\n\n    /*\n     * Note that care must be taken with the / and % operators\n     * for negative values.\n     */\n    switch (meta->base) {\n        case NPY_FR_Y:\n            out->year = 1970 + dt;\n            break;\n\n        case NPY_FR_M:\n            out->year  = 1970 + extract_unit_64(&dt, 12);\n            out->month = (npy_int32)dt + 1;\n            break;\n\n        case NPY_FR_W:\n            /* A week is 7 days */\n            set_datetimestruct_days(dt * 7, out);\n            break;\n\n        case NPY_FR_D:\n            set_datetimestruct_days(dt, out);\n            break;\n\n        case NPY_FR_h:\n            days      = extract_unit_64(&dt, 24LL);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)dt;\n            break;\n\n        case NPY_FR_m:\n            days      =      extract_unit_64(&dt, 60LL*24);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)extract_unit_64(&dt, 60LL);\n            out->min  = (int)dt;\n            break;\n\n        case NPY_FR_s:\n            days      =      extract_unit_64(&dt, 60LL*60*24);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)extract_unit_64(&dt, 60LL*60);\n            out->min  = (int)extract_unit_64(&dt, 60LL);\n            out->sec  = (int)dt;\n            break;\n\n        case NPY_FR_ms:\n            days      =      extract_unit_64(&dt, 1000LL*60*60*24);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)extract_unit_64(&dt, 1000LL*60*60);\n            out->min  = (int)extract_unit_64(&dt, 1000LL*60);\n            out->sec  = (int)extract_unit_64(&dt, 1000LL);\n            out->us   = (int)(dt * 1000);\n            break;\n\n        case NPY_FR_us:\n            days      =      extract_unit_64(&dt, 1000LL*1000*60*60*24);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)extract_unit_64(&dt, 1000LL*1000*60*60);\n            out->min  = (int)extract_unit_64(&dt, 1000LL*1000*60);\n            out->sec  = (int)extract_unit_64(&dt, 1000LL*1000);\n            out->us   = (int)dt;\n            break;\n\n        case NPY_FR_ns:\n            days      =      extract_unit_64(&dt, 1000LL*1000*1000*60*60*24);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)extract_unit_64(&dt, 1000LL*1000*1000*60*60);\n            out->min  = (int)extract_unit_64(&dt, 1000LL*1000*1000*60);\n            out->sec  = (int)extract_unit_64(&dt, 1000LL*1000*1000);\n            out->us   = (int)extract_unit_64(&dt, 1000LL);\n            out->ps   = (int)(dt * 1000);\n            break;\n\n        case NPY_FR_ps:\n            days      =      extract_unit_64(&dt, 1000LL*1000*1000*1000*60*60*24);\n            set_datetimestruct_days(days, out);\n            out->hour = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000*60*60);\n            out->min  = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000*60);\n            out->sec  = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000);\n            out->us   = (int)extract_unit_64(&dt, 1000LL*1000);\n            out->ps   = (int)(dt);\n            break;\n\n        case NPY_FR_fs:\n            /* entire range is only +- 2.6 hours */\n            out->hour = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000*1000*60*60);\n            if (out->hour < 0) {\n                out->year  = 1969;\n                out->month = 12;\n                out->day   = 31;\n                out->hour  += 24;\n                assert(out->hour >= 0);\n            }\n            out->min  = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000*1000*60);\n            out->sec  = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000*1000);\n            out->us   = (int)extract_unit_64(&dt, 1000LL*1000*1000);\n            out->ps   = (int)extract_unit_64(&dt, 1000LL);\n            out->as   = (int)(dt * 1000);\n            break;\n\n        case NPY_FR_as:\n            /* entire range is only +- 9.2 seconds */\n            out->sec = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000*1000*1000);\n            if (out->sec < 0) {\n                out->year  = 1969;\n                out->month = 12;\n                out->day   = 31;\n                out->hour  = 23;\n                out->min   = 59;\n                out->sec   += 60;\n                assert(out->sec >= 0);\n            }\n            out->us   = (int)extract_unit_64(&dt, 1000LL*1000*1000*1000);\n            out->ps   = (int)extract_unit_64(&dt, 1000LL*1000);\n            out->as   = (int)dt;\n            break;\n\n        default:\n            throw std::runtime_error(\n                        \"NumPy datetime metadata is corrupted with invalid base unit\");\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyDatetime.h",
    "content": "#pragma once\n\n#include \"NumpyHelpers.h\"\n\n// Prior to the as-yet-unreleased Numpy 2, there are no working API functions\n// to convert to and from numpy's datetime representation. There are\n// promising looking API functions, but they give a ten-year-old deprecation\n// error. The only approach is to copy/paste the relevant conversion code\n// which is what we have done here\n\nint\nNpyDatetime_ConvertDatetime64ToDatetimeStruct(\n  PyArray_DatetimeMetaData* meta, npy_datetime dt,\n  npy_datetimestruct* out);\n\nPyArray_Descr*\ncreate_datetime_dtype(int type_num, PyArray_DatetimeMetaData* meta);\n\nint\nNpyDatetime_ConvertDatetimeStructToDatetime64(PyArray_DatetimeMetaData* meta,\n  const npy_datetimestruct* dts,\n  npy_datetime* out);\n\nPyArray_DatetimeMetaData*\nget_datetime_metadata_from_dtype(PyArray_Descr* dtype);\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyFromExcel.cpp",
    "content": "#include \"NumpyHelpers.h\"\n#include \"PyCore.h\"\n#include \"BasicTypes.h\"\n#include <xloil/Date.h>\n\nusing std::vector;\nnamespace py = pybind11;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing std::string;\nusing std::to_string;\nusing row_t = xloil::ExcelArray::row_t;\nusing col_t = xloil::ExcelArray::col_t;\n\ntypedef npy_int64 npy_datetime;\n\n\n// Useful references:\n//\n// https://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html\n//\nnamespace xloil \n{\n  namespace Python\n  {\n    bool isArrayDataType(PyTypeObject* t)\n    {\n      return (t == &PyGenericArrType_Type || PyType_IsSubtype(t, &PyGenericArrType_Type));\n    }\n\n    bool isNumpyArray(PyObject * p)\n    {\n      return PyArray_Check(p);\n    }\n\n    /**********************\n     * Numpy helper types *\n     **********************/\n\n    // We need to override the nan returned here as numpy's nan is not\n    // the same as the one defined in numeric_limits for some reason.\n    struct ToDoubleNPYNan : conv::ExcelValToType<double, double>\n    {\n      using base = conv::ExcelValToType<double, double>;\n      using base::operator();\n      double operator()(CellError err) const\n      {\n        switch (err)\n        {\n        case CellError::Div0:\n          return NPY_INFINITY;\n        case CellError::Num:\n        case CellError::Null:\n        case CellError::NA:\n          return NPY_NAN;\n        }\n        return base::operator()(err);\n      }\n    };\n\n    struct ToFloatNPYNan : public ExcelValVisitor<float>\n    {\n      template<class T>\n      float operator()(T x) const\n      {\n        return static_cast<float>(ToDoubleNPYNan()(x));\n      }\n      //float operator()(CellError err) const\n      //{\n\n      //}\n    };\n\n    class NumpyDateFromDate : public ExcelValVisitor<npy_datetime>\n    {\n    public:\n      using ExcelValVisitor::operator();\n\n      npy_datetime operator()(int x) const noexcept\n      {\n        int day, month, year;\n        excelSerialDateToYMD(x, year, month, day);\n        npy_datetimestruct dt{ year, month, day, 0, 0, 0, 0, 0 };\n        return convertDateTime<NPY_FR_us>(dt);\n      }\n      npy_datetime operator()(double x) const noexcept\n      {\n        int day, month, year, hours, mins, secs, usecs;\n        excelSerialDatetoYMDHMS(x, year, month, day, hours, mins, secs, usecs);\n        npy_datetimestruct dt{ year, month, day, hours, mins, secs, usecs };\n        return convertDateTime<NPY_FR_us>(dt);\n      }\n      npy_datetime operator()(const PStringRef& str) const\n      {\n        std::tm tm;\n        if (stringToDateTime(str.view(), tm))\n        {\n          npy_datetimestruct dt{ tm.tm_year + 1900, tm.tm_mon + 1,\n            tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 0 };\n          return convertDateTime<NPY_FR_us>(dt);\n        }\n        XLO_THROW(\"Cannot read '{0}' as a date\");\n      }\n    };\n   \n\n    struct TruncateUTF16ToChar\n    {\n      using to_char = char;\n      size_t operator()(to_char* target, size_t size, const wchar_t* begin, const wchar_t* end) const\n      {\n        auto* p = target;\n        auto* pEnd = target + size;\n        for (; begin < end && p != pEnd; ++begin, ++p)\n          *p = (char)*begin;\n        return p - target;\n      }\n    };\n\n    template <class TConv>\n    struct ToFixedWidthString\n    {\n      using TChar = typename TConv::to_char;\n      TConv _conv;\n      void operator() (TChar* dest, size_t destSize, const ExcelObj& obj) const\n      {\n        size_t nWritten = 0;\n        auto destLength = destSize / sizeof(TChar);\n        if (obj.type() == ExcelType::Str)\n        {\n          auto pstr = obj.cast<PStringRef>();\n          nWritten = _conv(dest, destLength, pstr.begin(), pstr.end());\n        }\n        else\n        {\n          auto str = obj.toStringRecursive();\n          nWritten = _conv(dest, destLength, (wchar_t*)str.data(), (wchar_t*)str.data() + str.length());\n        }\n        memset((char*)(dest + nWritten), 0, (destLength - nWritten) * sizeof(TChar));\n      }\n    };\n\n    /// <summary>\n    /// Helper class which assigns the value of an ExcelObj conversion \n    /// to an numpy array element.  The size_t param is only used for\n    /// strings\n    /// </summary>\n    template<class TExcelObjConverter, class TResultValue>\n    struct NPToT\n    {\n      void operator()(TResultValue* d, size_t, const ExcelObj& x) const\n      {\n        *d = (TResultValue)x.visit(TExcelObjConverter());\n      }\n    };\n\n    template<class TExcelObjConverter>\n    struct NPToT<TExcelObjConverter, PyObject*>\n    {\n      void operator()(PyObject** d, size_t, const ExcelObj& x) const\n      {\n        *d = TExcelObjConverter()(x);\n      }\n    };\n\n    template <int, typename=void> struct FromExcel {};\n    template <int Type> struct FromExcel<Type, std::enable_if_t<std::is_integral_v<typename TypeTraits<Type>::storage>>>\n    {\n      using value = NPToT<conv::ToType<int>, typename TypeTraits<Type>::storage>;\n    };\n    template<> struct FromExcel<NPY_BOOL>      { using value = NPToT<conv::ToType<bool>, TypeTraits<NPY_BOOL>::storage>; };\n    template<> struct FromExcel<NPY_FLOAT>     { using value = NPToT<ToFloatNPYNan, TypeTraits<NPY_FLOAT>::storage>; };\n    template<> struct FromExcel<NPY_DOUBLE>    { using value = NPToT<ToDoubleNPYNan, TypeTraits<NPY_DOUBLE>::storage>; };\n    template<> struct FromExcel<NPY_DATETIME>\n    {\n      using value= NPToT<NumpyDateFromDate, TypeTraits<NPY_DATETIME>::storage>;\n    };\n    template<> struct FromExcel<NPY_STRING>\n    {\n      using value= ToFixedWidthString<TruncateUTF16ToChar>;\n    };\n    template<> struct FromExcel<NPY_UNICODE>\n    {\n      using value= ToFixedWidthString<ConvertUTF16ToUTF32>;\n    };\n    template<> struct FromExcel<NPY_OBJECT>\n    {\n      using value= NPToT<PyFromAny, PyObject*>;\n    };\n\n    /// <summary>\n    /// Returns the storage size required to write the given array as\n    /// a numpy array\n    /// </summary>\n    template<int TNpType>\n    size_t getItemSize(const ExcelArray&)\n    {\n      return sizeof(TypeTraits<TNpType>::storage);\n    }\n\n    template<>\n    size_t getItemSize<NPY_STRING>(const ExcelArray& arr)\n    {\n      // Start with a length of 1 since this is the minimum itemsize,\n      // even for an array of empty strings\n      size_t strLength = 1;\n      for (ExcelArray::size_type i = 0; i < arr.size(); ++i)\n        strLength = std::max<size_t>(strLength, arr.at(i).maxStringLength());\n      return strLength * sizeof(TypeTraits<NPY_STRING>::storage);\n    }\n\n    template<>\n    size_t getItemSize<NPY_UNICODE>(const ExcelArray& arr)\n    {\n      return getItemSize<NPY_STRING>(arr) \n        * sizeof(TypeTraits<NPY_UNICODE>::storage);\n    }\n\n\n    /// <summary>\n    /// Helper to call PyArray_New.  Allocate data using PyDataMem_NEW\n    /// </summary>\n    template<int NDim>\n    py::object newNumpyArray(int numpyType, Py_intptr_t (&dims)[NDim], size_t itemsize, char*& data)\n    {\n      PyArray_Descr* descr;\n\n      if (numpyType == NPY_DATETIME)\n        descr = createDatetimeDtype();\n      else if (numpyType == NPY_STRING || numpyType == NPY_UNICODE)\n      {\n        descr = PyArray_DescrNewFromType(numpyType);\n        PyDataType_SET_ELSIZE(descr, (int)itemsize);\n      }\n      else\n        descr = PyArray_DescrFromType(numpyType);\n\n      assert(PyDataType_ELSIZE(descr) > 0);\n\n      // The flags argument is confusing: if data is null, flags=1 means a \n      // fortran-style array, but if data is not null, flags=1 (i.e. set to\n      // NPY_ARRAY_C_CONTIGUOUS) means a C-style array!\n      auto array = PyArray_NewFromDescr(\n        &PyArray_Type,\n        descr,\n        NDim,\n        dims,\n        nullptr,  // strides\n        nullptr,  // data\n        0,        // flags\n        nullptr); // array finaliser\n\n      assert(PyArray_CHKFLAGS((PyArrayObject*)array, NPY_ARRAY_C_CONTIGUOUS));\n      data = PyArray_BYTES((PyArrayObject*)array);\n      return PySteal(array);\n    }\n\n    template <int TNpType>\n    class PyFromArray1d : public detail::PyFromExcelImpl<PyFromArray1d<TNpType>>\n    {\n      bool _trim;\n      typename FromExcel<TNpType>::value _conv;\n      using data_type = typename TypeTraits<TNpType>::storage;\n\n    public:\n      PyFromArray1d(bool trim = true) : _trim(trim), _conv()\n      {}\n\n      using detail::PyFromExcelImpl<PyFromArray1d<TNpType>>::operator();\n      static constexpr char* const ourName = \"array(1d)\";\n\n      PyObject* operator()(const ExcelObj& obj) const\n      {\n        ExcelArray arr(cacheCheck(obj), _trim);\n        return (*this)(arr);\n      }\n\n      PyObject* operator()(const ExcelArray& arr) const\n      {\n        Py_intptr_t dims[] = { (intptr_t)arr.size() };\n\n        if (arr.size() == 0)\n          return PyArray_EMPTY(1, dims, TNpType, 0);\n\n        if (arr.dims() != 1)\n          XLO_THROW(\"Expecting a 1-dim array\");\n\n        const auto itemsize = getItemSize<TNpType>(arr);\n        const auto arraySize = arr.size();\n\n        // If array memory size is over 65k and the string length is\n        // 64 chars, just switch to using an array of object strings\n        if (itemsize > 256 && arraySize * itemsize > 1 << 16)\n        {\n          return PyFromArray1d<NPY_OBJECT>(_trim)(arr);\n        }\n        else\n        {\n          char* data;\n          auto pyArray = newNumpyArray(TNpType, dims, itemsize, data);\n\n          NumpyBeginThreadsDescr releaseGil(TNpType);\n          for (auto p = arr.begin(); p != arr.end(); ++p, data += itemsize)\n            _conv((data_type*)data, itemsize, *p);\n          return pyArray.release().ptr();\n        }\n      }\n\n      constexpr wchar_t* failMessage() const { return L\"Expected array\"; }\n    };\n\n    template <int TNpType>\n    class PyFromArray2d : public detail::PyFromExcelImpl<PyFromArray2d<TNpType>>\n    {\n      bool _trim;\n      typename FromExcel<TNpType>::value _conv;\n      using TDataType = typename TypeTraits<TNpType>::storage;\n\n    public:\n      PyFromArray2d(bool trim = true) : _trim(trim), _conv()\n      {}\n\n      using detail::PyFromExcelImpl<PyFromArray2d<TNpType>>::operator();\n      static constexpr char* const ourName = \"array(2d)\";\n\n      PyObject* operator()(const ExcelObj& obj) const\n      {\n        ExcelArray arr(cacheCheck(obj), _trim);\n        return (*this)(arr);\n      }\n\n      PyObject* operator()(const ExcelArray& arr) const\n      {\n        // Arrays passed to/from Excel can never be empty but a trimmed \n        // or sliced ExcelArray might be\n        if (arr.size() == 0)\n        {\n          Py_intptr_t dims[] = { 0, 0 };\n          return PyArray_EMPTY(2, dims, TNpType, 0);\n        }\n\n        Py_intptr_t dims[] = { (intptr_t)arr.nRows(), (intptr_t)arr.nCols() };\n        \n        const auto itemsize = getItemSize<TNpType>(arr);\n        const auto arraySize = arr.size();\n\n        // If array memory size is over 65k and the string length is\n        // 64 chars, just switch to using an array of object strings\n        if (itemsize > 256 && arraySize * itemsize > 1 << 16)\n        {\n          return PyFromArray1d<NPY_OBJECT>(_trim)(arr);\n        }\n        else\n        {\n          char* data;\n          auto pyArray = newNumpyArray(TNpType, dims, itemsize, data);\n\n          NumpyBeginThreadsDescr releaseGil(TNpType);\n          auto d = data;\n          for (auto i = 0; i < dims[0]; ++i)\n          {\n            auto* pObj = arr.row_begin(i);\n            const auto* rowEnd = pObj + dims[1];\n            for (; pObj != rowEnd; d += itemsize, ++pObj)\n              _conv((TDataType*)d, itemsize, *pObj);\n          }\n\n          return pyArray.release().ptr();\n        }\n      }\n\n      constexpr wchar_t* failMessage() const { return L\"Expected array\"; }\n    };\n\n    PyObject* numpyArrayFromCArray(size_t rows, size_t columns, const double* array)\n    {\n      Py_intptr_t dims[] = { (intptr_t)rows, (intptr_t)columns };\n\n      constexpr auto itemsize = sizeof(double);\n      const auto dataSize = rows * columns * itemsize;\n      char* data;\n      auto pyArray = newNumpyArray(NPY_DOUBLE, dims, itemsize, data);\n      memcpy(data, array, dataSize);\n      return pyArray.release().ptr();\n    }\n\n    class FPArrayConverter : public IPyFromExcel\n    {\n    public:\n      virtual PyObject* operator()(\n        const ExcelObj& xl, const PyObject* /*defaultVal*/) override\n      {\n        auto& fp = reinterpret_cast<const msxll::FP12&>(xl);\n        return numpyArrayFromCArray(fp.rows, fp.columns, fp.array);\n      }\n      const char* name() const override\n      {\n        return \"FloatArray\";\n      }\n    };\n\n    IPyFromExcel* createFPArrayConverter()\n    {\n      return new FPArrayConverter();\n    }\n\n    int excelTypeToNumpyDtype(ExcelType t)\n    {\n      switch (t)\n      {\n      case ExcelType::Bool: return NPY_BOOL;\n      case ExcelType::Num: return NPY_DOUBLE;\n      case ExcelType::Int: return NPY_INT;\n      case ExcelType::Str: return NPY_UNICODE;\n      default: return NPY_OBJECT;\n      }\n    }\n\n    PyObject* excelArrayToNumpyArray(const ExcelArray& arr, int dims, int dtype)\n    {\n      if (dtype < 0)\n        dtype = excelTypeToNumpyDtype(arr.dataType());\n\n      switch (dims)\n      {\n      case 1:\n        return switchDataType<PyFromArray1d>(dtype, arr);\n      case 2:\n        return switchDataType<PyFromArray2d>(dtype, arr);\n      default:\n        XLO_THROW(\"Dimensions must be 1 or 2\");\n      };\n    }\n\n    PyObject* toNumpyDatetimeFromExcelDateArray(const PyObject* obj)\n    {\n      auto [pyArr, dims, nDims] = getArrayInfo(obj);\n\n      npy_uint32 op_flags[2];\n      /*\n       * No inner iteration - inner loop is handled by CopyArray code\n       */\n      auto flags = NPY_ITER_EXTERNAL_LOOP; // use NPY_ITER_C_INDEX rather?\n      /*\n       * Tell the constructor to automatically allocate the output.\n       * The data type of the output will match that of the input.\n       */\n      PyArrayObject* op[] = { pyArr, nullptr };\n      op_flags[0] = NPY_ITER_READONLY;\n      op_flags[1] = NPY_ITER_WRITEONLY | NPY_ITER_ALLOCATE;\n\n\n      auto outputDescr = PySteal((PyObject*)createDatetimeDtype());\n      PyArray_Descr* op_descr[] = { PyArray_DescrFromType(NPY_DOUBLE), (PyArray_Descr*)outputDescr.ptr()};\n\n      /* Construct the iterator */\n      auto iter = NpyIter_MultiNew(2, op, flags, NPY_KEEPORDER, NPY_SAFE_CASTING,\n        op_flags, op_descr);\n      if (!iter)\n        XLO_THROW(\"Failed to create iterator: expected numeric array\");\n\n      {\n        NumpyBeginThreadsDescr dropGil(NPY_DOUBLE);\n\n        /*\n         * Make a copy of the iternext function pointer and\n         * a few other variables the inner loop needs.\n         */\n        auto iternext = NpyIter_GetIterNext(iter, NULL);\n        auto innerstride = NpyIter_GetInnerStrideArray(iter)[0];\n        auto itemsize = PyDataType_ELSIZE(NpyIter_GetDescrArray(iter)[0]);\n        /*\n         * The inner loop size and data pointers may change during the\n         * loop, so just cache the addresses.\n         */\n        auto innersizeptr = NpyIter_GetInnerLoopSizePtr(iter);\n        auto dataptrarray = NpyIter_GetDataPtrArray(iter);\n\n        /*\n         * Note that because the iterator allocated the output,\n         * it matches the iteration order and is packed tightly,\n         * so we don't need to check it like the input.\n         */\n\n         /* For efficiency, should specialize this based on item size... */\n        do {\n          npy_intp N = *innersizeptr;\n          const char* in = dataptrarray[0];\n          char* out = dataptrarray[1];\n\n          for (npy_intp i = 0; i < N; i++)\n          {\n            *((npy_datetime*)out) = NumpyDateFromDate()(*(double*)in);\n            in += innerstride;\n            out += itemsize;\n          }\n\n        } while (iternext(iter));\n      }\n\n      /* Get the result from the iterator object array */\n      auto ret = NpyIter_GetOperandArray(iter)[1];\n      Py_INCREF(ret);\n\n      if (NpyIter_Deallocate(iter) != NPY_SUCCEED) \n      {\n        Py_DECREF(ret);\n        XLO_THROW(\"Failed to deallocate iterator\");\n      }\n\n      return (PyObject*)ret;\n    }\n\n    namespace\n    {\n      template <int TNpType>\n      using Array1dFromXL = PyFromExcelConverter<PyFromArray1d<TNpType>>;\n\n      template <int TNpType>\n      using Array2dFromXL = PyFromExcelConverter<PyFromArray2d<TNpType>>;\n  \n      template<template<int N> class T, int TNpType, int TNDims>\n      struct Reader\n      {\n        auto operator()(pybind11::module& mod) const\n        {\n          return py::class_<T<TNpType>, IPyFromExcel, shared_ptr<T<TNpType>>>\n            (mod, (prefix + nameToStr(TNpType) + dimsToStr(TNDims)).c_str())\n            .def(py::init<bool>(), py::arg(\"trim\")=true);\n        }\n        static inline auto prefix = string(theReadConverterPrefix);\n      };\n\n      template<\n        template<template<int> class, int, int> class Declarer, \n        template<int N> class Converter, \n        int TNDims>\n      void declare(pybind11::module& mod)\n      {\n        Declarer<Converter, NPY_INT,    TNDims>()(mod);\n        Declarer<Converter, NPY_DOUBLE, TNDims>()(mod);\n        Declarer<Converter, NPY_BOOL,   TNDims>()(mod);\n        Declarer<Converter, NPY_STRING, TNDims>()(mod);\n        Declarer<Converter, NPY_OBJECT, TNDims>()(mod);\n\n        auto datetime = Declarer<Converter, NPY_DATETIME, TNDims>()(mod);\n        // Alias so that either date or datetime arrays can be requested.\n        // TODO: strictly should drop time information if it exists\n        mod.add_object(\n          (Declarer<Converter, 1, 1>::prefix + string(\"Array_date_\") + dimsToStr(TNDims)).c_str(),\n          datetime);\n      }\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        declare<Reader, Array1dFromXL, 1>(mod);\n        declare<Reader, Array2dFromXL, 2>(mod);\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyHelpers.cpp",
    "content": "#include \"CPython.h\"\n\n// Disable C4127: conditional expression is constant caused by numpy headers\n#pragma warning(disable: 4127)\n#define PY_ARRAY_UNIQUE_SYMBOL xloil_PyArray_API\n#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\n#include <numpy/arrayobject.h>\n#pragma warning(default: 4127)\n\n#include \"NumpyHelpers.h\"\n#include \"NumpyDatetime.h\"\n#include \"Numpy.h\"\n#include <xloil/Date.h>\n\n\ntypedef npy_int64 npy_datetime;\n\n\nnamespace xloil\n{\n  namespace Python\n  {\n    bool importNumpy()\n    {\n      auto ret = _import_array();\n      return ret == 0;\n    }\n\n    namespace\n    {\n      double excelDateFromNumpyDate(const npy_datetime x, const PyArray_DatetimeMetaData& meta)\n      {\n        npy_datetimestruct dt;\n        NpyDatetime_ConvertDatetime64ToDatetimeStruct(\n          const_cast<PyArray_DatetimeMetaData*>(&meta), x, &dt);\n\n        if (dt.year == NPY_DATETIME_NAT)\n          return NPY_NAN;\n\n        if (meta.base <= NPY_FR_D)\n          return excelSerialDateFromYMD((int)dt.year, dt.month, dt.day);\n        else\n          return excelSerialDateFromYMDHMS(\n            (int)dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec, dt.us);\n      }\n    }\n    PyArray_Descr*\n      createDatetimeDtype(int type_num, NPY_DATETIMEUNIT unit)\n    {\n      PyArray_DatetimeMetaData meta{ unit, 1 };\n      return create_datetime_dtype(type_num, &meta);\n    }\n\n    template<>\n    npy_datetime convertDateTime<NPY_FR_us>(const npy_datetimestruct& dt) noexcept\n    {\n      PyArray_DatetimeMetaData meta{ NPY_FR_us, 1 };\n      npy_datetime result;\n      NpyDatetime_ConvertDatetimeStructToDatetime64(&meta, &dt, &result);\n      return result;\n    }\n\n    FromArrayImpl<NPY_DATETIME>::FromArrayImpl(PyArrayObject* pArr)\n      : _meta(get_datetime_metadata_from_dtype(PyArray_DESCR(pArr)))\n    {}\n\n    ExcelObj FromArrayImpl<NPY_DATETIME>::toExcelObj(\n      ExcelArrayBuilder& /*builder*/,\n      void* arrayPtr) const\n    {\n      auto x = (npy_datetime*)arrayPtr;\n      const auto serial = excelDateFromNumpyDate(*x, *_meta);\n      return ExcelObj(serial);\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyHelpers.h",
    "content": "#pragma once\n\n\n#include \"CPython.h\"\n// Disable C4127: conditional expression is constant caused by numpy headers\n#pragma warning(disable: 4127)\n#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\n#define PY_ARRAY_UNIQUE_SYMBOL xloil_PyArray_API\n#define NO_IMPORT_ARRAY\n#include <numpy/arrayobject.h>\n#include <numpy/arrayscalars.h>\n#include <numpy/npy_math.h>\n#undef NO_IMPORT_ARRAY\n#pragma warning(default: 4127)\n\n#include \"xlOil/ExcelArray.h\"\n#include \"xlOil/ArrayBuilder.h\"\n#include \"xloil/StringUtils.h\"\n#include <pybind11/pybind11.h>\n\n\nnamespace xloil\n{\n  namespace Python\n  {\n    template <int> struct TypeTraits {};\n    template<> struct TypeTraits<NPY_BOOL> { using storage = bool; };\n    template<> struct TypeTraits<NPY_SHORT> { using storage = short; };\n    template<> struct TypeTraits<NPY_USHORT> { using storage = unsigned short; };\n    template<> struct TypeTraits<NPY_INT> { using storage = int; };\n    template<> struct TypeTraits<NPY_UINT> { using storage = unsigned; };\n    template<> struct TypeTraits<NPY_LONG> { using storage = long; };\n    template<> struct TypeTraits<NPY_ULONG> { using storage = unsigned long; };\n    template<> struct TypeTraits<NPY_LONGLONG> { using storage = long long; };\n    template<> struct TypeTraits<NPY_ULONGLONG> { using storage = unsigned long; };\n    template<> struct TypeTraits<NPY_FLOAT> { using storage = float; };\n    template<> struct TypeTraits<NPY_DOUBLE> { using storage = double; };\n    template<> struct TypeTraits<NPY_DATETIME> { using storage = npy_datetime; };\n    template<> struct TypeTraits<NPY_STRING> { using storage = char; };\n    template<> struct TypeTraits<NPY_UNICODE> { using storage = char32_t; };\n    template<> struct TypeTraits<NPY_OBJECT> { using storage = PyObject*; };\n\n    inline std::tuple<PyArrayObject*, npy_intp*, int>\n      getArrayInfo(const PyObject* obj)\n    {\n      if (!PyArray_Check(obj))\n        XLO_THROW(\"Expected an array, got a {}\", (std::string)pybind11::str(pybind11::type::of((PyObject*)obj)));\n\n      auto pyArr = (PyArrayObject*)obj;\n      auto dims = PyArray_DIMS(pyArr);\n      auto nDims = PyArray_NDIM(pyArr);\n\n      return { pyArr, dims, nDims };\n    }\n\n    /// C++ safe version of NPY_BEGIN_THREADS_DESCR\n    class NumpyBeginThreadsDescr {\n    public:\n      explicit NumpyBeginThreadsDescr(int dtype)\n        : tstate(nullptr)\n      {\n        if (dtype != NPY_OBJECT)\n          tstate = PyEval_SaveThread();\n      }\n\n      ~NumpyBeginThreadsDescr()\n      {\n        if (tstate)\n          PyEval_RestoreThread(tstate);\n      }\n\n    private:\n      PyThreadState* tstate;\n    };\n\n    template <template <int> class TThing, class... Args>\n    auto switchDataType(int dtype, Args&&... args)\n    {\n      switch (dtype)\n      {\n      case NPY_BOOL:      return TThing<NPY_BOOL>()(std::forward<Args>(args)...);\n      case NPY_SHORT:     return TThing<NPY_SHORT>()(std::forward<Args>(args)...);\n      case NPY_USHORT:    return TThing<NPY_USHORT>()(std::forward<Args>(args)...);\n      case NPY_UINT:      return TThing<NPY_UINT>()(std::forward<Args>(args)...);\n      case NPY_INT:       return TThing<NPY_INT>()(std::forward<Args>(args)...);\n      case NPY_LONG:      return TThing<NPY_LONG>()(std::forward<Args>(args)...);\n      case NPY_LONGLONG:  return TThing<NPY_LONGLONG>()(std::forward<Args>(args)...);\n      case NPY_ULONG:     return TThing<NPY_ULONG>()(std::forward<Args>(args)...);\n      case NPY_ULONGLONG: return TThing<NPY_ULONGLONG>()(std::forward<Args>(args)...);\n      case NPY_FLOAT:     return TThing<NPY_FLOAT>()(std::forward<Args>(args)...);\n      case NPY_DOUBLE:    return TThing<NPY_DOUBLE>()(std::forward<Args>(args)...);\n      case NPY_DATETIME:  return TThing<NPY_DATETIME>()(std::forward<Args>(args)...);\n      case NPY_OBJECT:    return TThing<NPY_OBJECT>()(std::forward<Args>(args)...);\n      case NPY_STRING:    return TThing<NPY_STRING>()(std::forward<Args>(args)...);\n      case NPY_UNICODE:   return TThing<NPY_UNICODE>()(std::forward<Args>(args)...);\n      default:\n        XLO_THROW(\"Unsupported numpy date type\");\n      }\n    }\n\n    template<NPY_DATETIMEUNIT TGranularity>\n    npy_datetime convertDateTime(const npy_datetimestruct& dt) noexcept;\n\n    template<\n      template<template<int> class, int, int> class Declarer,\n      template<int N> class Converter,\n      int TNDims>\n    void declare(pybind11::module& mod)\n    {\n      Declarer<Converter, NPY_INT, TNDims>()(mod);\n      Declarer<Converter, NPY_DOUBLE, TNDims>()(mod);\n      Declarer<Converter, NPY_BOOL, TNDims>()(mod);\n      Declarer<Converter, NPY_STRING, TNDims>()(mod);\n      Declarer<Converter, NPY_OBJECT, TNDims>()(mod);\n\n      auto datetime = Declarer<Converter, NPY_DATETIME, TNDims>()(mod);\n      // Alias so that either date or datetime arrays can be requested.\n      // TODO: strictly should drop time information if it exists\n      mod.add_object(\n        (Declarer<Converter, 1, 1>::prefix + string(\"Array_date_\") + dimsToStr(TNDims)).c_str(),\n        datetime);\n    }\n\n    PyArray_Descr* \n      createDatetimeDtype(int type_num = NPY_DATETIME, NPY_DATETIMEUNIT unit = NPY_FR_us);\n\n    constexpr const char* nameToStr(int numpyDataType)\n    {\n      switch (numpyDataType)\n      {\n      case NPY_INT: return \"Array_int\";\n      case NPY_DOUBLE: return \"Array_float\";\n      case NPY_BOOL: return \"Array_bool\";\n      case NPY_DATETIME: return \"Array_datetime\";\n      case NPY_STRING: return \"Array_str\";\n      case NPY_OBJECT: return \"Array_object\";\n      default: return \"?\";\n      }\n    }\n\n    constexpr const char* dimsToStr(int n)\n    {\n      switch (n)\n      {\n      case 1: return \"_1d\";\n      case 2: return \"_2d\";\n      default: return \"_bad_dims_\";\n      }\n    }\n\n    template<int TNpType, typename = void>\n    struct FromArrayImpl\n    {\n      using TDataType = typename TypeTraits<TNpType>::storage;\n\n      FromArrayImpl(PyArrayObject* /*pArr*/)\n      {}\n\n      static constexpr size_t stringLength() { return 0; }\n\n      auto toExcelObj(\n        ExcelArrayBuilder&,\n        void* arrayPtr) const\n      {\n        auto x = (TDataType*)arrayPtr;\n        return ExcelObj(*x);\n      }\n    };\n\n    template <int TNpType>\n    struct FromArrayImpl<TNpType, std::enable_if_t<\n        (TNpType == NPY_FLOAT) || \n        (TNpType == NPY_DOUBLE) || \n        (TNpType == NPY_LONGDOUBLE)>>\n    {\n      using TDataType = typename TypeTraits<TNpType>::storage;\n\n      FromArrayImpl(PyArrayObject* /*pArr*/)\n      {}\n\n      static constexpr size_t stringLength() { return 0; }\n\n      auto toExcelObj(\n        ExcelArrayBuilder&,\n        void* arrayPtr) const\n      {\n        auto x = *(TDataType*)arrayPtr;\n        if (npy_isnan(x)) return ExcelObj(CellError::NA);\n        if (npy_isinf(x)) return ExcelObj(CellError::Num);\n        return ExcelObj(x);\n      }\n    };\n\n    template <int TNpType>\n    class FromArrayImpl<TNpType, std::enable_if_t<\n        (TNpType == NPY_UNICODE) || \n        (TNpType == NPY_STRING)>>\n    {\n    private:\n      using data_type = typename TypeTraits<TNpType>::storage;\n\n      // The number of char16 we require to hold any character in the array\n      static constexpr uint16_t _charMultiple =\n        std::max<uint16_t>(1, sizeof(data_type) / sizeof(char16_t));\n\n      // The string length of each array element\n      const uint16_t _elementLength;\n\n      size_t _stringLength;\n\n    public:\n      // Contains the number of characters per numpy array element multiplied \n      // by the number of char16 we will need\n     \n      FromArrayImpl(PyArrayObject* pArr)\n        : _elementLength(std::min<uint16_t>(\n            USHRT_MAX,\n            (uint16_t)PyArray_ITEMSIZE(pArr) / sizeof(data_type)))\n      {\n        _stringLength = _charMultiple * _elementLength * PyArray_SIZE(pArr);\n        const auto type = PyArray_TYPE(pArr);\n        if (type != NPY_UNICODE && type != NPY_STRING)\n          XLO_THROW(\"Incorrect array type: expected string or unicode\");\n      }\n\n      auto stringLength() const { return _stringLength; }\n\n      auto toExcelObj(\n        ExcelArrayBuilder& builder,\n        void* arrayPtr) const\n      {\n        auto x = (const char32_t*)arrayPtr;\n        const auto len = strlen32(x, _elementLength);\n        auto pstr = builder.string((uint16_t)len);\n        const auto nChars = ConvertUTF32ToUTF16()(\n          (char16_t*)pstr.pstr(), pstr.length(), x, x + len);\n\n        // Because not every UTF-32 char takes two UTF-16 chars and not\n        // every string takes up the full fixed with, we resize here\n        pstr.resize((char16_t)nChars);\n        return ExcelObj(std::move(pstr));\n      }\n    };\n\n    template<>\n    struct FromArrayImpl<NPY_DATETIME>\n    {\n      static constexpr size_t stringLength() { return 0; }\n\n      const PyArray_DatetimeMetaData* _meta;\n\n      FromArrayImpl(PyArrayObject* pArr);\n\n      ExcelObj toExcelObj(\n        ExcelArrayBuilder& /*builder*/,\n        void* arrayPtr) const;\n    };\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyPandas.cpp",
    "content": "#include \"NumpyHelpers.h\"\n#include \"PyCore.h\"\n#include \"BasicTypes.h\"\n\nusing row_t = xloil::ExcelArray::row_t;\nusing col_t = xloil::ExcelArray::col_t;\nnamespace py = pybind11;\nusing std::vector;\nusing std::unique_ptr;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace TableHelpers\n    {\n      struct ApplyConverter\n      {\n        virtual ~ApplyConverter() {}\n        virtual void operator()(ExcelArrayBuilder& builder,\n          xloil::detail::ArrayBuilderIterator& start,\n          xloil::detail::ArrayBuilderIterator& end) = 0;\n      };\n\n      template<int NPDtype>\n      struct ConverterHolder : public ApplyConverter\n      {\n        FromArrayImpl<NPDtype> _impl;\n        PyArrayObject* _array;\n\n        ConverterHolder(PyArrayObject* array, bool)\n          : _impl(array)\n          , _array(array)\n        {}\n\n        virtual ~ConverterHolder() {}\n\n        auto stringLength() const { return _impl.stringLength(); }\n\n        virtual void operator()(ExcelArrayBuilder& builder,\n          xloil::detail::ArrayBuilderIterator& start,\n          xloil::detail::ArrayBuilderIterator& end)\n        {\n          char* arrayPtr = PyArray_BYTES(_array);\n          const auto step = PyArray_STRIDE(_array, 0);\n          for (; start != end; arrayPtr += step, ++start)\n          {\n            start->take(_impl.toExcelObj(builder, arrayPtr));\n          }\n        }\n      };\n\n      template<>\n      struct ConverterHolder<NPY_OBJECT> : public ApplyConverter\n      {\n        SequentialArrayBuilder _builder;\n\n        ConverterHolder(PyArrayObject* array, bool objectToString)\n          : _builder((row_t)PyArray_DIMS(array)[0], 1)\n        {\n          auto arrayPtr = PyArray_BYTES(array);\n          const auto N = _builder.nRows();\n          const auto step = PyArray_STRIDE(array, 0);\n          auto charAllocator = _builder.charAllocator();\n          if (objectToString)\n          {\n            for (auto i = 0u; i < N; ++i, arrayPtr += step)\n              _builder.emplace(\n                FromPyObj<detail::ReturnToString, true>()(\n                  *(PyObject**)arrayPtr, charAllocator));\n          }\n          else\n          {\n            for (auto i = 0u; i < N; ++i, arrayPtr += step)\n              _builder.emplace(\n                FromPyObj<detail::ReturnToCache, true>()(\n                  *(PyObject**)arrayPtr, charAllocator));\n          }\n        }\n\n        virtual ~ConverterHolder() {}\n\n        size_t stringLength() const { return _builder.stringLength(); }\n\n        virtual void operator()(ExcelArrayBuilder& /*builder*/,\n          xloil::detail::ArrayBuilderIterator& start,\n          xloil::detail::ArrayBuilderIterator& end)\n        {\n          _builder.copyToBuilder(start, end);\n        }\n      };\n\n      /// <summary>\n      /// Helper class used with `switchDataType`\n      /// </summary>\n      template<int NPDtype>\n      struct CreateConverter\n      {\n        ApplyConverter* operator()(PyArrayObject* array, size_t& stringLength, bool objectToString)\n        {\n          auto converter = new ConverterHolder<NPDtype>(array, objectToString);\n          stringLength += converter->stringLength();\n          return converter;\n        }\n      };\n\n      size_t arrayShape(const py::handle& p)\n      {\n        if (p.is_none())\n          return 0;\n\n        auto[pyArr, dims, nDims] = getArrayInfo(p.ptr());\n        \n        if (nDims != 1)\n          XLO_THROW(\"Expected 1 dim array, got a {} dim one\", nDims);\n\n        return dims[0];\n      }\n\n      /// <summary>\n      /// This class holds an array of virtual FromArrayImpl holders.  Each column in a \n      /// dataframe can have a different data type and so require a different converter.\n      /// The indices can also have their own data types. The class uses `collect` to \n      /// examine 1-d numpy arrays and creates an appropriate converters. Then `write` is\n      /// called when and ExcelArrayBuilder object is ready to receive the converted data\n      /// </summary>\n      struct Converters\n      {\n        vector<unique_ptr<ApplyConverter>> _converters;\n        size_t stringLength = 0;\n        bool _hasObjectDtype;\n        bool _objectToString;\n\n        Converters(size_t n, bool objectToString)\n          : _objectToString(objectToString)\n          , _hasObjectDtype(false)\n        {\n          _converters.reserve(n);\n        }\n\n        auto collect(const py::handle& p, size_t expectedLength)\n        {\n          auto shape = arrayShape(p);\n\n          if (shape != expectedLength)\n            XLO_THROW(\"Expected a 1-dim array of size {}\", expectedLength);\n\n          auto pyArr = (PyArrayObject*)p.ptr();\n          const auto dtype = PyArray_TYPE(pyArr);\n          if (dtype == NPY_OBJECT)\n            _hasObjectDtype = true;\n\n          _converters.emplace_back(unique_ptr<ApplyConverter>(\n            switchDataType<CreateConverter>(dtype, pyArr, std::ref(stringLength), _objectToString)));\n        }\n\n        auto write(size_t iArray, ExcelArrayBuilder& builder, int startX, int startY, bool byRow)\n        {\n          auto start = byRow\n            ? builder.row_begin(startX) + startY\n            : builder.col_begin(startX) + startY;\n\n          auto end = byRow\n            ? builder.row_end(startX)\n            : builder.col_end(startX);\n\n          (*_converters[iArray])(builder, start, end);\n        }\n\n        /// <summary>\n        /// Used to determine if we can release the GIL for the duration of the conversion\n        /// </summary>\n        auto hasObjectDtype() const { return _hasObjectDtype; }\n      };\n    }\n\n    ExcelObj numpyTableHelper(\n      uint32_t nOuter,\n      uint32_t nInner,\n      const py::object& columns,\n      const py::object& rows,\n      const py::object& headings,\n      const py::object& index,\n      const py::object& indexName,\n      bool useObjectCache)\n    {\n      // This method can handle writing data vertically or horizontally.  When used to \n      // write a pandas DataFrame, the data is vertical/by-column.\n      const auto byRow = columns.is_none();\n\n      const auto hasHeadings = !headings.is_none();\n      const auto hasIndex = !index.is_none();\n\n      auto tableData = const_cast<PyObject*>(byRow ? rows.ptr() : columns.ptr());\n\n      // The row or column headings can be multi-level indices. We determine the number\n      // of levels from iterators later.\n      auto nHeadingLevels = 0u;\n      auto nIndexLevels = 0u;\n\n\n      // Converters may end up larger if we have multi-level indices\n      TableHelpers::Converters converters(\n        nOuter + (hasHeadings ? 1 : 0) + (hasIndex ? 1 : 0), !useObjectCache);\n\n      \n      auto iInput = 0u; // Only used for error messages\n\n      // Examine data frame index\n      if (hasIndex)\n      {\n        iInput = 0;\n        try\n        {\n          for (auto iter = py::iter(index); iter != py::iterator::sentinel(); ++iter, ++iInput)\n          {\n            converters.collect(*iter, nInner);\n            ++nIndexLevels;\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_THROW(\"Whilst reading index level {}: {}\", iInput, e.what());\n        }\n      }\n\n      \n      iInput = 0;\n      // First loop to establish array size and length of strings\n      for (auto iter = py::iter(tableData); iter != py::iterator::sentinel(); ++iter, ++iInput)\n      {\n        try\n        {\n          converters.collect(*iter, nInner);\n        }\n        catch (const std::exception& e)\n        {\n          XLO_THROW(\"Whilst reading column {}: {}\", iInput, e.what());\n        }\n      }\n\n      if (hasHeadings)\n      {\n        iInput = 0;\n        try\n        {\n          for (auto iter = py::iter(headings); iter != py::iterator::sentinel(); ++iter, ++iInput)\n          {\n            converters.collect(*iter, nOuter);\n            ++nHeadingLevels;\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_THROW(\"Whilst reading heading level {}: {}\", iInput, e.what());\n        }\n      }\n\n      vector<ExcelObj> indexNames(nIndexLevels * nHeadingLevels, CellError::NA);\n      auto indexNameStringLength = 0;\n      if (nIndexLevels > 0 && !indexName.is_none())\n      {\n        auto i = 0u;\n        for (auto iter = py::iter(indexName); i < nIndexLevels * nHeadingLevels && iter != py::iterator::sentinel(); ++i, ++iter)\n        {\n          indexNames[i] = FromPyObj()(iter->ptr());\n          indexNameStringLength += indexNames[i].stringLength();\n        }\n      }\n\n      // If possible, release the GIL before beginning the conversion\n      NumpyBeginThreadsDescr releaseGil(\n        converters.hasObjectDtype() ? NPY_OBJECT : NPY_FLOAT);\n\n      auto nRows = nOuter + nIndexLevels;\n      auto nCols = nInner + nHeadingLevels;\n      if (!byRow)\n        std::swap(nRows, nCols);\n\n\n      ExcelArrayBuilder builder(\n        nRows,\n        nCols,\n        converters.stringLength + indexNameStringLength);\n\n      // Write the index names in the top left\n      if (!byRow)\n      {\n        auto k = 0u;\n        for (auto i = 0u; i < nHeadingLevels; ++i)\n          for (auto j = 0u; j < nIndexLevels; ++j)\n            builder(i, j) = indexNames[k++];\n      }\n      else\n      {\n        auto k = 0u;\n        for (auto j = 0u; j < nIndexLevels; ++j)\n          for (auto i = 0u; i < nHeadingLevels; ++i)\n            builder(i, j) = indexNames[k++];\n      }\n\n      auto iConv = 0;\n\n      for (auto i = 0u; i < nOuter + nIndexLevels; ++i, ++iConv)\n        converters.write(iConv, builder, i, nHeadingLevels, byRow);\n\n      for (auto i = 0u; i < nHeadingLevels; ++i, ++iConv)\n        converters.write(iConv, builder, i, nIndexLevels, !byRow);\n\n      return builder.toExcelObj();\n    }\n    namespace\n    {\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        mod.def(\"_table_converter\",\n          &numpyTableHelper,\n          R\"(\n          For internal use. Converts a table like object (such as a pandas DataFrame) to \n          RawExcelValue suitable for returning to xlOil.\n            \n          n, m:\n            the number of data fields and the length of the fields\n          columns / rows: \n            a iterable of numpy array containing data, specified as columns \n            or rows (not both)\n          headings:\n            optional array of data field headings\n          index:\n            optional data field labels - one per data point\n          index_name:\n            optional headings for the index, should be a 1 dim iteratable of size\n            num_index_levels * num_column_levels\n          cache_objects:\n            if True, place unconvertible objects in the cache and return a ref string\n            if False, call str(x) on unconvertible objects\n          )\",\n          py::arg(\"n\"),\n          py::arg(\"m\"),\n          py::arg(\"columns\") = py::none(),\n          py::arg(\"rows\") = py::none(),\n          py::arg(\"headings\") = py::none(),\n          py::arg(\"index\") = py::none(),\n          py::arg(\"index_name\") = py::none(),\n          py::arg(\"cache_objects\") = false);\n      });\n    }\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/NumpyToExcel.cpp",
    "content": "#include \"NumpyHelpers.h\"\n#include \"PyCore.h\"\n#include \"BasicTypes.h\"\n#include <xloil/FPArray.h>\n\nusing std::vector;\nusing std::string;\nusing std::shared_ptr;\nnamespace py = pybind11;\nusing row_t = xloil::ExcelArray::row_t;\nusing col_t = xloil::ExcelArray::col_t;\n\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      /// <summary>\n      /// Empty arrays are not allowed in Excel, the closest is #N/A.\n      /// Regardless of nDims, if any is zero the array is empty.\n      /// </summary>\n      bool isEmptyArray(npy_intp* dims, int nDims)\n      {\n        for (auto i = 0; i < nDims; ++i)\n          if (dims[i] == 0)\n            return true;\n        return false;\n      }\n    }\n\n    template <int TNpType>\n    class XlFromArray1d : public IPyToExcel\n    {\n      bool _cache;\n      using TImpl = FromArrayImpl<TNpType>;\n      using TDataType = typename TypeTraits<NPY_OBJECT>::storage;\n\n    public:\n      XlFromArray1d(bool cache = false)\n        : _cache(cache)\n      {}\n\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        auto [pyArr, dims, nDims] = getArrayInfo(obj);\n\n        // Empty arrays are not allowed in Excel, the closest is #N/A.\n        if (isEmptyArray(dims, nDims))\n          return CellError::NA;\n\n        if (nDims != 1)\n          XLO_THROW(\"Expected 1-d array\");\n\n        TImpl converter(pyArr);\n\n        ExcelArrayBuilder builder((row_t)dims[0], 1, converter.stringLength());\n        auto elementPtr = PyArray_BYTES(pyArr);\n        const auto stride = PyArray_STRIDE(pyArr, 0);\n        for (auto j = 0; j < dims[0]; ++j, elementPtr += stride)\n          builder(j, 0).take(converter.toExcelObj(builder, elementPtr));\n\n        return _cache\n          ? makeCached<ExcelObj>(builder.toExcelObj())\n          : builder.toExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"array(1d)\";\n      }\n    };\n\n    template <int TNpType>\n    class XlFromArray2d : public IPyToExcel\n    {\n      bool _cache;\n      using TImpl = FromArrayImpl<TNpType>;\n\n    public:\n      XlFromArray2d(bool cache = false) : _cache(cache) {}\n\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        auto [pyArr, dims, nDims] = getArrayInfo(obj);\n        // Empty arrays are not allowed in Excel, the closest is #N/A.\n        if (isEmptyArray(dims, nDims))\n          return CellError::NA;\n\n        if (nDims != 2)\n          XLO_THROW(\"Expected 2-d array\");\n\n        TImpl converter(pyArr);\n\n        ExcelArrayBuilder builder((uint32_t)dims[0], (uint32_t)dims[1],\n          converter.stringLength());\n\n        const auto stride1 = PyArray_STRIDE(pyArr, 0);\n        const auto stride2 = PyArray_STRIDE(pyArr, 1);\n        for (auto i = 0; i < dims[0]; ++i)\n        {\n          auto elementPtr = PyArray_BYTES(pyArr) + i * stride1;\n          for (auto j = 0; j < dims[1]; ++j, elementPtr += stride2)\n            builder(i, j).take(converter.toExcelObj(builder, elementPtr));\n        }\n        return _cache\n          ? xloil::makeCached<ExcelObj>(builder.toExcelObj())\n          : builder.toExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"array(2d)\";\n      }\n    };\n\n    // TODO: support converting unknown objects to string. It's easy but\n    // how best to pass the parameter?\n    template <>\n    class XlFromArray1d<NPY_OBJECT> : public IPyToExcel\n    {\n      bool _cacheResult;\n      using TDataType = typename TypeTraits<NPY_OBJECT>::storage;\n\n    public:\n      XlFromArray1d(bool cache = false) : _cacheResult(cache) {}\n\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        auto [pyArr, dims, nDims] = getArrayInfo(obj);\n        // Empty arrays are not allowed in Excel, the closest is #N/A.\n        if (isEmptyArray(dims, nDims))\n          return CellError::NA;\n\n        if (nDims != 1)\n          XLO_THROW(\"Expected 1-d array\");\n\n        size_t stringLength = dims[0] * 4; // err why?\n\n        SequentialArrayBuilder builder((row_t)dims[0], 1, stringLength);\n        auto elementPtr = PyArray_BYTES(pyArr);\n        const auto stride = PyArray_STRIDE(pyArr, 0);\n        for (auto i = 0; i < dims[0]; ++i, elementPtr += stride)\n          builder.emplace(\n            FromPyObj<detail::ReturnToCache, true>()(\n              *(TDataType*)elementPtr, builder.charAllocator()));\n\n        py::gil_scoped_release noGil;\n\n        return _cacheResult\n          ? xloil::makeCached<ExcelObj>(builder.toExcelObj())\n          : builder.toExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"array(1d)\";\n      }\n    };\n\n    template <>\n    class XlFromArray2d<NPY_OBJECT> : public IPyToExcel\n    {\n      bool _cacheResult;\n      using TDataType = typename TypeTraits<NPY_OBJECT>::storage;\n\n    public:\n      XlFromArray2d(bool cache = false) : _cacheResult(cache) {}\n\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        auto [pyArr, dims, nDims] = getArrayInfo(obj);\n        // Empty arrays are not allowed in Excel, the closest is #N/A.\n        if (isEmptyArray(dims, nDims))\n          return CellError::NA;\n\n        if (nDims != 2)\n          XLO_THROW(\"Expected 2-d array\");\n\n        size_t stringLength = dims[0] * dims[1] * 4; // 4 seems like a respectable length?\n\n        SequentialArrayBuilder builder((row_t)dims[0], (col_t)dims[1], stringLength);\n        auto charAllocator = builder.charAllocator();\n\n        for (auto i = 0; i < dims[0]; ++i)\n          for (auto j = 0; j < dims[1]; ++j)\n          {\n            auto p = *(TDataType*)PyArray_GETPTR2(pyArr, i, j);\n            builder.emplace(FromPyObj<detail::ReturnToCache, true>()(p, charAllocator));\n          }\n\n        py::gil_scoped_release noGil;\n\n        return _cacheResult\n          ? xloil::makeCached<ExcelObj>(builder.toExcelObj())\n          : builder.toExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"array(2d)\";\n      }\n    };\n\n    ExcelObj numpyArrayToExcel(const PyObject* p)\n    {\n      auto [pyArr, dims, nDims] = getArrayInfo(p);\n      auto dType = PyArray_TYPE(pyArr);\n\n      NumpyBeginThreadsDescr releaseGil(dType);\n\n      switch (nDims)\n      {\n      case 1:\n        return switchDataType<XlFromArray1d>(dType, p);\n      case 2:\n        return switchDataType<XlFromArray2d>(dType, p);\n      default:\n        XLO_THROW(\"Expected 1 or 2 dim array\");\n      }\n    }\n  \n    std::shared_ptr<FPArray> numpyToFPArray(const PyObject* obj)\n    {\n      auto [pyArr, dims, nDims] = getArrayInfo(obj);\n\n      if (isEmptyArray(dims, nDims) || nDims != 2)\n        XLO_THROW(\"Expected non-empty 2-d array\");\n\n      if (PyArray_TYPE(pyArr) != NPY_DOUBLE)\n        XLO_THROW(\"Expected float array (type float64)\");\n\n      const auto itemsize = PyArray_ITEMSIZE(pyArr);\n      const auto strides = PyArray_STRIDES(pyArr);\n\n      auto result = FPArray::create(dims[0], dims[1]);\n\n      // Check if the array is in row-major order like the FPArray so we can\n      // use memcpy (note the strides are in bytes).\n      if (strides[0] == itemsize * dims[0] && strides[1] == itemsize)\n      {\n        const auto* raw = PyArray_BYTES(pyArr);\n        const auto databytes = itemsize * dims[0] * dims[1];\n        memcpy(result->begin(), raw, databytes);\n      }\n      else\n      {\n        // Do it the old-fashioned way: elementwise copy\n        auto pArr = result->begin();\n        for (auto i = 0; i < dims[0]; ++i)\n          for (auto j = 0; j < dims[1]; ++j)\n            *pArr++ = *(double*)PyArray_GETPTR2(pyArr, i, j);\n      }\n\n      return result;\n    }\n    namespace\n    {\n      template<template<int N> class T, int TNpType, int TNDims>\n      struct Writer\n      {\n        auto operator()(pybind11::module& mod) const\n        {\n          return py::class_<T<TNpType>, IPyToExcel, shared_ptr<T<TNpType>>>\n            (mod, (prefix + nameToStr(TNpType) + dimsToStr(TNDims)).c_str())\n            .def(py::init<bool>(), py::arg(\"cache\") = false);\n        }\n        static inline auto prefix = string(theReturnConverterPrefix);\n      };\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        declare<Writer, XlFromArray1d, 1>(mod);\n        declare<Writer, XlFromArray2d, 2>(mod);\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyCustomType.cpp",
    "content": "#include \"PyHelpers.h\"\n#include <xlOil/ExcelArray.h>\n#include \"BasicTypes.h\"\n#include \"PyCore.h\"\n#include \"PyExcelArrayType.h\"\n#include \"PyEvents.h\"\n#include <pybind11/pybind11.h>\n\nnamespace py = pybind11;\nusing std::string;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      /// <summary>\n      /// Wraps the usual PyFromAny but intercepts the array handling to return \n      /// a PyExcelArray object, then checks that the object passed to python was\n      /// properly disposed of and no reference to the temporary array object remains.\n      /// </summary>\n      class CustomConverterArrayHandler : \n        public detail::PyFromAny<CustomConverterArrayHandler>\n      {\n        py::object _ArrayWrapper;\n        PyExcelArray* _excelArray;\n\n      public:\n        CustomConverterArrayHandler() : _excelArray(nullptr)\n        {}\n\n        using detail::PyFromAny<CustomConverterArrayHandler>::operator();\n\n        PyObject* operator()(const ArrayVal& arr) const\n        {\n          const_cast<CustomConverterArrayHandler*>(this)->setWrapper(\n            new PyExcelArray(arr));\n          // Inc ref count as this function should return a stealable reference\n          _ArrayWrapper.inc_ref();\n          return _ArrayWrapper.ptr();\n        }\n\n        // Normally #N/A inputs are converted to None in PyFromAny. To give the custom converter\n        // maximum flexibility we override that behaviour\n\n        PyObject* operator()(CellError err) const\n        {\n          auto pyObj = pybind11::cast(err);\n          return pyObj.release().ptr();\n        }\n\n        ~CustomConverterArrayHandler()\n        {\n          if (_excelArray && (_ArrayWrapper.ref_count() != 1 || _excelArray->refCount() != 1))\n            XLO_ERROR(\"Held reference to ExcelArray detected. Accessing this object \"\n              \"in python may crash Excel\");\n        }\n\n        void setWrapper(PyExcelArray* ptr)\n        {\n          // This class should only be used for a single ExcelObj, then disposed of.\n          assert(!_excelArray);\n          _excelArray = ptr;\n          _ArrayWrapper = py::cast(\n            ptr,\n            py::return_value_policy::take_ownership);\n        }\n\n        constexpr wchar_t* failMessage() const { return L\"Custom converter failed\"; }\n      };\n    }\n\n    class CustomConverter : public IPyFromExcel\n    {\n    private:\n      py::object _callable;\n      bool _checkCache;\n      string _name;\n\n    public:\n      CustomConverter(py::object&& callable, bool checkCache, const char* name)\n        : _callable(callable)\n        , _checkCache(checkCache)\n        , _name(name)\n      {}\n\n      virtual ~CustomConverter()\n      {\n        py::gil_scoped_acquire getGil;\n        _callable = py::object();\n      }\n\n      virtual result_type operator()(\n        const ExcelObj& xl, \n        const_result_ptr defaultVal) override\n      {\n        // Called from type conversion code where GIL has already been acquired\n        return checkUserException([&]()\n        {\n          if (_checkCache)\n            return callConverter<true>(xl, defaultVal);\n          else\n            return callConverter<false>(xl, defaultVal);\n        });\n      }\n\n      template<bool TUseCache>\n      auto callConverter(const ExcelObj& xl, const_result_ptr defaultVal)\n      {\n        PyFromExcel<CustomConverterArrayHandler, TUseCache> typeConverter;\n        auto arg = PySteal(typeConverter(xl, defaultVal));\n        auto retVal = _callable(arg);\n        return retVal.release().ptr();\n      }\n\n      const char* name() const override\n      {\n        return _name.c_str();\n      }\n    };\n \n    class CustomReturn : public IPyToExcel\n    {\n    private:\n      py::object _callable;\n      string _name;\n    public:\n      CustomReturn(py::object&& callable, const char* name)\n        : _callable(callable)\n        , _name(name)\n      {\n      }\n      virtual ~CustomReturn()\n      {\n        py::gil_scoped_acquire getGil;\n        _callable = py::object();\n      }\n      virtual ExcelObj operator()(const PyObject* target) const override\n      {\n        auto* result = invokeImpl(target);\n        if (!result)\n        {\n          auto error = PyErr_Occurred();\n          if (!PyErr_GivenExceptionMatches(error, cannotConvertException))\n            throw py::error_already_set();\n          PyErr_Clear();\n          return ExcelObj();\n        }\n        auto converted = PySteal(result);\n        // TODO: the custom converter should be able to specify the return type rather than generic FromPyObj\n        // TODO: the user could create an infinite loop which cycles between two type converters - best way to avoid?\n        return FromPyObj()(converted.ptr());\n      }\n      auto invoke(const py::object& target) const\n      {\n        return PySteal(invokeImpl(target.ptr()));\n      }\n\n      PyObject* invokeImpl(const PyObject* target) const\n      {\n      // Use raw C API for extra speed as this code is on a critical path\n#if PY_VERSION_HEX < 0x03080000\n        auto result = PyObject_CallFunctionObjArgs(_callable.ptr(), const_cast<PyObject*>(target), nullptr);\n#elif PY_VERSION_HEX < 0x03090000\n        PyObject* args[] = { nullptr, const_cast<PyObject*>(target) };\n        auto result = _PyObject_Vectorcall(_callable.ptr(), args + 1, 1 | PY_VECTORCALL_ARGUMENTS_OFFSET, nullptr);\n#else\n        auto result = PyObject_CallOneArg(_callable.ptr(), const_cast<PyObject*>(target));\n#endif\n        return result;\n      }\n\n      const char* name() const override\n      {\n        return _name.c_str();\n      }\n    };\n\n    static int theBinder = addBinder([](py::module& mod)\n    {\n      py::class_<CustomConverter, IPyFromExcel, std::shared_ptr<CustomConverter>>(mod, \n        \"_CustomConverter\", R\"(\n          This is the interface class for custom type converters to allow them\n          to be called from the Core.\n        )\")\n        .def(py::init<py::object, bool, const char*>(),\n          py::arg(\"callable\"), \n          py::arg(\"check_cache\")=true,\n          py::arg(\"name\")=\"custom\");\n\n      py::class_<CustomReturn, IPyToExcel, std::shared_ptr<CustomReturn>>(mod, \n        \"_CustomReturn\")\n        .def(py::init<py::object, const char*>(), py::arg(\"callable\"), py::arg(\"name\")=\"custom\")\n        .def(\"invoke\", &CustomReturn::invoke);\n    });\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyDateType.cpp",
    "content": "#include \"BasicTypes.h\"\n#include \"PyDateType.h\"\n#include \"PyCore.h\"\n#include \"PyHelpers.h\"\n#include <xloil/Date.h>\n#include <Python.h>\n#include <datetime.h>\n#include <pybind11/stl_bind.h>\n\nnamespace py = pybind11;\nusing std::vector;\nusing std::wstring;\n\n// Defined in Py 3.10+, seems to work in earlier verions\n#ifndef PyDateTime_TIME_GET_TZINFO\n#define _PyDateTime_HAS_TZINFO(o) (((_PyDateTime_BaseTZInfo *)(o))->hastzinfo)\n#define PyDateTime_TIME_GET_TZINFO(o) (_PyDateTime_HAS_TZINFO(o) ? \\\n    ((PyDateTime_Time *)(o))->tzinfo : Py_None)\n#endif\n\nnamespace xloil\n{\n  namespace Python\n  {\n    void importDatetime()\n    {\n      PyDateTime_IMPORT;\n    }\n\n    bool isPyDate(PyObject* p)\n    {\n      return (PyDate_CheckExact(p) || PyDateTime_CheckExact(p));\n    }\n\n    ExcelObj pyLocalDateTimeToSerial(const PyObject* p)\n    {\n      auto serial = excelSerialDateFromYMDHMS(\n        PyDateTime_GET_YEAR(p), PyDateTime_GET_MONTH(p), PyDateTime_GET_DAY(p),\n        PyDateTime_DATE_GET_HOUR(p), PyDateTime_DATE_GET_MINUTE(p), PyDateTime_DATE_GET_SECOND(p),\n        PyDateTime_DATE_GET_MICROSECOND(p)\n      );\n      return ExcelObj(serial);\n    }\n\n    ExcelObj pyDateTimeToSerial(PyObject* p)\n    {\n      if (PyDateTime_TIME_GET_TZINFO(p) == Py_None)\n        return pyLocalDateTimeToSerial(p);\n      else\n      {\n        auto localised = PyBorrow(p).attr(\"astimezone\")();\n        return pyLocalDateTimeToSerial(localised.ptr());\n      }\n    }\n\n    ExcelObj pyDateToSerial(const PyObject* p)\n    {\n      auto serial = excelSerialDateFromYMD(\n        PyDateTime_GET_YEAR(p), PyDateTime_GET_MONTH(p), PyDateTime_GET_DAY(p));\n      return ExcelObj(serial);\n    }\n\n    ExcelObj pyDateToExcel(PyObject* p)\n    {\n      if (PyDateTime_CheckExact(p))\n        return ExcelObj(pyDateTimeToSerial(p));\n      else if (PyDate_CheckExact(p))\n        return ExcelObj(pyDateToSerial(p));\n      else\n      {\n        // Nil return used to indicate no conversion possible\n        return ExcelObj();\n      }\n    }\n\n    class PyFromDate : public detail::PyFromExcelImpl<PyFromDate>\n    {\n    public:\n      using detail::PyFromExcelImpl<PyFromDate>::operator();\n      static constexpr char* const ourName = \"date\";\n\n      PyObject* operator()(int x) const\n      {\n        int day, month, year;\n        if (!excelSerialDateToYMD(x, year, month, day))\n          throw py::value_error(\"Number not a valid Excel serial date\");\n        return PyDate_FromDate(year, month, day);\n      }\n      PyObject* operator()(double x) const\n      {\n        return operator()(int(x));\n      }\n      PyObject* operator()(const PStringRef& pstr) const\n      {\n        std::tm tm;\n        if (stringToDateTime(pstr.view(), tm))\n          return PyDate_FromDate(tm.tm_year, tm.tm_mon, tm.tm_yday);\n        return nullptr;\n      }\n      constexpr wchar_t* failMessage() const { return L\"Expected date\"; }\n    };\n\n    class PyFromDateTime : public detail::PyFromExcelImpl<PyFromDateTime>\n    {\n    public:\n      using detail::PyFromExcelImpl<PyFromDateTime>::operator();\n      static constexpr char* const ourName = \"datetime\";\n\n      PyObject* operator()(int x) const\n      {\n        return PyFromDate()(x);\n      }\n\n      PyObject* operator()(double x) const\n      {\n        int day, month, year, hours, mins, secs, usecs;\n        if (!excelSerialDatetoYMDHMS(x, year, month, day, hours, mins, secs, usecs))\n          throw py::value_error(\"Number not a valid Excel serial date\");\n        return PyDateTime_FromDateAndTime(year, month, day, hours, mins, secs, usecs);\n      }\n\n      PyObject* operator()(const PStringRef& pstr) const\n      {\n        std::tm tm;\n        if (stringToDateTime(pstr.view(), tm))\n          return PyDateTime_FromDateAndTime(\n            tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,\n            tm.tm_hour, tm.tm_min, tm.tm_sec, 0);\n        return nullptr;\n      }\n\n      constexpr wchar_t* failMessage() const { return L\"Expected date\"; }\n    };\n\n    class PyDateToExcel : public IPyToExcel\n    {\n    public:\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        return PyDate_CheckExact(obj)\n          ? ExcelObj(pyDateToSerial(obj))\n          : ExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"date\";\n      }\n    };\n    class PyDateTimeToExcel : public IPyToExcel\n    {\n    public:\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        return PyDateTime_CheckExact(obj)\n          ? ExcelObj(pyDateTimeToSerial(const_cast<PyObject*>(obj)))\n          : ExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"datetime\";\n      }\n    };\n  }\n}\n\n// Make vector<wstring> opaque so we can bind a reference to a vector using\n// py::bind_vector. Note the opacity only affects this compliation unit.\nPYBIND11_MAKE_OPAQUE(std::vector<std::wstring>);\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      py::object fromExcelDate(const py::object& obj)\n      {\n        auto p = obj.ptr();\n        if (p == Py_None)\n          return py::none();\n        else if (PyLong_Check(p))\n          return PySteal(PyFromDate()(PyLong_AsLong(p)));\n        else if (PyFloat_Check(p))\n          return PySteal(PyFromDateTime()(PyFloat_AS_DOUBLE(p)));\n        else if (isNumpyArray(p))\n          return PySteal(toNumpyDatetimeFromExcelDateArray(p));\n        else if (PyUnicode_Check(p))\n          return PySteal(PyFromDateTime()(FromPyString()(p).cast<PStringRef>()));\n        else if (PyDateTime_Check(p))\n          return obj;\n        else\n          throw std::invalid_argument(\"No conversion to date\");\n      }\n\n      static int theBinder = addBinder([](py::module& mod)\n      {\n        bindPyConverter<PyFromExcelConverter<PyFromDateTime>>(mod, \"datetime\").def(py::init<>());\n        bindPyConverter<PyFromExcelConverter<PyFromDate>>(mod, \"date\").def(py::init<>());\n        bindXlConverter<PyDateTimeToExcel>(mod, \"datetime\").def(py::init<>());\n        bindXlConverter<PyDateToExcel>(mod, \"date\").def(py::init<>());\n\n        \n        mod.def(\"to_datetime\",\n          fromExcelDate,\n          R\"(\n            Tries to the convert the given object to a `dt.date` or `dt.datetime`:\n\n              * Numbers are assumed to be Excel date serial numbers. \n              * Strings are parsed using the current date conversion settings.\n              * A numpy array of floats is treated as Excel date serial numbers and converted\n                to n array of datetime64[ns].\n              * `dt.datetime` is provided is simply returned.\n\n            Raises `ValueError` if conversion is not possible.\n          )\");\n\n        mod.def(\"from_excel_date\",\n          fromExcelDate,\n          R\"(\n            Identical to `xloil.to_datetime`.\n          )\");\n\n        py::bind_vector<vector<wstring>, py::ReferenceHolder<vector<wstring>>>(mod, \"_DateFormatList\",\n          R\"(\n            Registers date time formats to try when parsing strings to dates.\n            See `std::get_time` for format syntax.\n          )\");\n\n        mod.add_object(\"date_formats\", \n          py::cast(py::ReferenceHolder(&theDateTimeFormats())));\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyDateType.h",
    "content": "#pragma once\n#include <Python.h>\n#include <xlOil/ExcelObj.h>\n\nnamespace xloil\n{\n  namespace Python\n  {\n    void importDatetime();\n\n    bool isPyDate(PyObject* p);\n\n    ExcelObj pyDateToExcel(PyObject* p);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyDictType.cpp",
    "content": "#include \"PyCore.h\"\n#include <xlOil/ExcelArray.h>\n#include \"BasicTypes.h\"\n#include \"ArrayHelpers.h\"\n#include <pybind11/pybind11.h>\n\nnamespace py = pybind11;\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace detail\n    {\n      template <class TKeyConv, class TValConv>\n      class PyDictFromArray : public PyFromExcelImpl<PyDictFromArray<TKeyConv, TValConv>>\n      {\n        TKeyConv _keyConv;\n        TValConv _valConv;\n      public:\n        using PyFromExcelImpl::operator();\n        static constexpr char* const ourName = \"dict\";\n\n        // Return empty dictionary for missing value\n        PyObject* operator()(MissingVal) const\n        {\n          return PyDict_New();\n        }\n        // Return empty dictionary for nil value\n        PyObject* operator()(nullptr_t) const\n        {\n          return PyDict_New();\n        }\n\n        PyObject* operator()(const ArrayVal& obj) const\n        {\n          ExcelArray arr(obj);\n\n          // Return empty dict is array is empty\n          if (arr.nRows() == 0)\n            return PyDict_New();\n\n          if (arr.nCols() != 2)\n            XLO_THROW(\"Need a 2 column array to convert to dictionary\");\n\n          auto dict = py::dict();\n          ExcelArray::row_t i = 0;\n\n          for (; i < arr.nRows(); ++i)\n          {\n            auto key = PySteal(_keyConv(arr.at(i, 0)));\n            auto val = PySteal(_valConv(arr.at(i, 1)));\n            if (!key || !val || PyDict_SetItem(dict.ptr(), key.ptr(), val.ptr()) != 0)\n              XLO_THROW(\"Failed to add row \" + std::to_string(i) + \" to dict\");\n          }\n\n          return dict.release().ptr();\n        }\n        constexpr wchar_t* failMessage() const { return L\"Expected array\"; }\n      };\n    }\n    using PyDictFromExcel = PyFromExcelConverter<\n      detail::PyDictFromArray<PyFromAny, PyFromAny>>;\n\n    PyObject* readKeywordArgs(const ExcelObj& obj)\n    {\n      return PyFromExcel<\n        detail::PyDictFromArray<PyFromString, PyFromAny>>()(obj);\n    }\n   \n    class XlFromDict: public IPyToExcel\n    {\n    public:\n      ExcelObj operator()(const PyObject* obj) const override\n      {\n        auto p = const_cast<PyObject*>(obj);\n        if (!PyDict_Check(p))\n          return ExcelObj();\n        const auto size = PyDict_Size(p);\n\n        size_t stringLength = 0;\n        PyObject *key, *value;\n        Py_ssize_t pos = 0;\n\n        while (PyDict_Next(p, &pos, &key, &value)) \n        {\n          accumulateObjectStringLength(key, stringLength);\n          accumulateObjectStringLength(value, stringLength);\n        }\n\n        ExcelArrayBuilder builder((ExcelObj::row_t)size, 2, stringLength);\n\n        pos = 0;\n        ExcelObj::row_t row = 0; // Cannot use pos - it is an internal pointer only\n        while (PyDict_Next(p, &pos, &key, &value))\n        {\n          builder(row, 0).take(FromPyObj()(key, builder.charAllocator()));\n          builder(row, 1).take(FromPyObj()(value, builder.charAllocator()));\n          ++row;\n        }\n\n        return builder.toExcelObj();\n      }\n      const char* name() const override\n      {\n        return \"dict\";\n      }\n    };\n\n    namespace\n    {\n      static int theBinder = addBinder([](pybind11::module& mod)\n      {\n          bindPyConverter<PyDictFromExcel>(mod, \"dict\").def(py::init<>());\n          bindXlConverter<XlFromDict>(mod, \"dict\").def(py::init<>());\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyDictType.h",
    "content": "#pragma once\n#include \"CPython.h\"\n\nnamespace xloil\n{\n  class ExcelObj;\n  namespace Python\n  {\n    PyObject* readKeywordArgs(const ExcelObj& obj);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyExcelArrayType.cpp",
    "content": "#pragma once\n#include \"PyHelpers.h\"\n#include \"PyExcelArrayType.h\"\n#include \"PyCore.h\"\n#include \"BasicTypes.h\"\n\nusing std::vector;\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    extern PyTypeObject* ExcelArrayType = nullptr;\n\n    /// <summary>\n    /// This pretty weird looking ctor is supports adding to the refcount\n    /// when taking subarrays via the [] operator\n    /// </summary>\n    PyExcelArray::PyExcelArray(\n      const PyExcelArray& from,\n      ExcelArray&& rebase)\n      : _base(std::move(rebase))\n      , _refCount(from._refCount)\n    {\n      *_refCount += 1;\n    }\n\n    PyExcelArray::PyExcelArray(const PyExcelArray& from)\n      : _base(from._base)\n      , _refCount(from._refCount)\n    {\n      *_refCount += 1;\n    }\n\n    PyExcelArray::PyExcelArray(const ExcelArray& arr)\n      : _base(arr)\n      , _refCount(new size_t(1))\n    {}\n\n    PyExcelArray::PyExcelArray(const ExcelObj & arr)\n      : _base(arr)\n      , _refCount(new size_t(1))\n    {}\n\n    PyExcelArray::~PyExcelArray()\n    {\n      *_refCount -= 1;\n      if (*_refCount == 0)\n      {\n        delete _refCount;\n        _refCount = nullptr;\n      }\n    }\n\n    size_t PyExcelArray::refCount() const \n    { \n      return _refCount ? *_refCount : 0;\n    }\n\n    const ExcelArray& PyExcelArray::base() const \n    { \n      return _base; \n    }\n\n    py::object PyExcelArray::operator()(size_t row, size_t col) const\n    {\n      return PySteal<>(\n        PyFromAny()(\n          _base((ExcelArray::row_t)row, (ExcelArray::col_t)col)));\n    }\n\n    py::object PyExcelArray::operator()(size_t row) const\n    {\n      return PySteal<>(\n        PyFromAny()(\n          _base((ExcelArray::row_t)row)));\n    }\n\n    PyExcelArray PyExcelArray::slice(\n      int fromRow, int fromCol, int toRow, int toCol) const\n    {\n      return PyExcelArray(*this, _base.slice(fromRow, fromCol, toRow, toCol));\n    }\n\n    pybind11::object PyExcelArray::getItem(pybind11::tuple loc) const\n    {\n      if (dims() == 1)\n      {\n        size_t from, to;\n        bool singleElem = getItemIndexReader1d(loc[0], size(), from, to);\n        return singleElem\n          ? operator()(from)\n          : py::cast<PyExcelArray>(slice((int)from, 0, (int)to, 1));\n      }\n      else\n      {\n        size_t fromRow, fromCol, toRow, toCol;\n        bool singleElem = getItemIndexReader2d(loc, nRows(), nCols(),\n          fromRow, fromCol, toRow, toCol);\n        if (singleElem)\n          return operator()(fromRow, fromCol);\n\n        auto subarray = ExcelArray(_base,\n          (ExcelObj::row_t)fromRow, (ExcelObj::col_t)fromCol,\n          (ExcelObj::row_t)toRow, (ExcelObj::col_t)toCol);\n\n        return py::cast(PyExcelArray(*this, std::move(subarray)));\n      }\n    }\n\n    size_t PyExcelArray::nRows() const { return _base.nRows(); }\n    size_t PyExcelArray::nCols() const { return _base.nCols(); }\n    size_t PyExcelArray::size() const { return _base.size(); }\n    size_t PyExcelArray::dims() const { return _base.dims(); }\n\n    pybind11::tuple PyExcelArray::shape() const\n    {\n      if (dims() == 2)\n      {\n        py::tuple result(2);\n        result[0] = nRows();\n        result[1] = nCols();\n        return result;\n      }\n      else\n      {\n        py::tuple result(1);\n        result[0] = size();\n        return result;\n      }\n    }\n\n    ExcelType PyExcelArray::dataType() const { return _base.dataType(); }\n\n    auto toArray(const PyExcelArray& arr, std::optional<int> dtype, std::optional<int> dims)\n    {\n      return PySteal<>(excelArrayToNumpyArray(arr.base(), dims ? *dims : 2, dtype ? *dtype : -1));\n    }\n\n    namespace\n    {\n      static int theBinder = addBinder([](pybind11::module& mod)\n      {\n        // Bind the PyExcelArray type to ExcelArray. PyExcelArray is a wrapper\n        // around the core ExcelArray type.\n        auto aType = py::class_<PyExcelArray>(mod, \"ExcelArray\",\n          R\"(\n            A view of a internal Excel array which can be manipulated without\n            copying the underlying data. It's not a general purpose array class \n            but rather used to create efficiencies in type converters.\n    \n            It can be accessed and sliced using the usual syntax (the slice step must be 1):\n\n            ::\n\n                x[1, 1] # The value at 1,1 as int, str, float, etc.\n\n                x[1, :] # The second row as another ExcelArray\n\n                x[:-1, :-1] # A sub-array omitting the last row and column\n\n          )\")\n          .def(\"slice\", \n            &PyExcelArray::slice, \n            R\"(\n              Slices the array \n            )\",\n            py::arg(\"from_row\"), \n            py::arg(\"from_col\"),\n            py::arg(\"to_row\"), \n            py::arg(\"to_col\"))\n          .def(\"to_numpy\",\n            &toArray,\n            R\"(\n              Converts the array to a numpy array. If *dtype* is None, xlOil attempts \n              to determine the correct numpy dtype. It raises an exception if values\n              cannot be converted to a specified *dtype*. The array dimension *dims* \n              can be 1 or 2 (default is 2).\n            )\",\n            py::arg(\"dtype\") = py::none(), \n            py::arg(\"dims\") = 2)\n          .def(\"__getitem__\", \n            &PyExcelArray::getItem,\n            R\"(\n              Given a 2-tuple, slices the array to return a sub ExcelArray or a single element.\n            )\")\n          .def_property_readonly(\"nrows\", \n            &PyExcelArray::nRows,\n            \"Returns the number of rows in the array\")\n          .def_property_readonly(\"ncols\", \n            &PyExcelArray::nCols,\n            \"Returns the number of columns in the array\")\n          .def_property_readonly(\"dims\", \n            &PyExcelArray::dims,\n            \"Property which gives the dimension of the array: 1 or 2\")\n          .def_property_readonly(\"shape\", \n            &PyExcelArray::shape,\n            \"Returns a tuple (nrows, ncols) like numpy's array.shape\");\n\n        ExcelArrayType = (PyTypeObject*)aType.get_type().ptr();\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyExcelArrayType.h",
    "content": "#pragma once\n#include <xlOil/ExcelArray.h>\n#include <pybind11/pybind11.h>\n\nnamespace xloil\n{\n  namespace Python\n  {\n    class PyExcelArray\n    {\n      ExcelArray _base;\n      size_t* _refCount;\n\n      PyExcelArray(\n        const PyExcelArray& from,\n        ExcelArray&& rebase);\n\n    public:\n      PyExcelArray(const PyExcelArray& from);\n      PyExcelArray(const ExcelArray& arr);\n      PyExcelArray(const ExcelObj& arr);\n      ~PyExcelArray();\n\n      /// <summary>\n      /// This ref count is a safety feature to stop python code from\n      /// keeping references to PyExcelArrays after the function which\n      /// created them has exited and hence the underlying array data\n      /// is destroyed\n      /// </summary>\n      /// <returns></returns>\n      size_t refCount() const;\n      const ExcelArray& base() const;\n\n      pybind11::object operator()(size_t row, size_t col) const;\n      pybind11::object operator()(size_t row) const;\n\n      PyExcelArray slice(int fromRow, int fromCol, int toRow, int toCol) const;\n      pybind11::object getItem(pybind11::tuple) const;\n      size_t nRows() const;\n      size_t nCols() const;\n      size_t size() const;\n      size_t dims() const;\n\n      /// <summary>\n      /// Consistent with numpy's shape property, but read-only\n      /// </summary>\n      pybind11::tuple shape() const;\n\n      ExcelType dataType() const;\n    };\n\n    extern PyTypeObject* ExcelArrayType;\n\n    auto toArray(const PyExcelArray& arr, std::optional<int> dtype, std::optional<int> dims);\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyRangeType.cpp",
    "content": "#include \"PyCore.h\"\n#include \"PyHelpers.h\"\n#include \"BasicTypes.h\"\n#include <xlOil/ExcelRef.h>\n\nusing std::shared_ptr;\nusing std::vector;\nnamespace py = pybind11;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    namespace\n    {\n      class PyRangeFromRange : public detail::PyFromExcelImpl<PyRangeFromRange>\n      {\n      public:\n        using detail::PyFromExcelImpl<PyRangeFromRange>::operator();\n        static constexpr char* const ourName = \"Range\";\n\n        PyObject* operator()(const RefVal& obj) const \n        {\n          return pybind11::cast(new XllRange(obj)).release().ptr();\n        }\n        constexpr wchar_t* failMessage() const { return L\"Expected range\"; }\n      };\n      static int theBinder = addBinder([](pybind11::module& mod)\n      {\n        bindPyConverter<PyFromExcelConverter<PyRangeFromRange>>(mod, \"Range\").def(py::init<>());\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyTupleType.cpp",
    "content": "#include \"PyTupleType.h\"\n#include \"PyCore.h\"\n#include <xlOil/ExcelArray.h>\n#include \"BasicTypes.h\"\n#include \"ArrayHelpers.h\"\n#include <xlOil/ArrayBuilder.h>\n#include <pybind11/pybind11.h>\n\n\nnamespace py = pybind11;\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  namespace Python\n  {\n    ExcelObj nestedIterableToExcel(const PyObject* obj)\n    {\n      auto p = const_cast<PyObject*>(obj);\n\n      assert(PyIterable_Check(p));\n\n      auto iter = py::iter(py::handle(p));\n\n      size_t stringLength = 0;\n      uint32_t nRows = 0;\n      uint16_t nCols = 1;\n\n      // First loop to establish array size and length of strings\n      while (iter != py::iterator::sentinel())\n      {\n        if (PyIterable_Check(iter->ptr()) && !PyUnicode_Check(iter->ptr()))\n        {\n          decltype(nCols) j = 0;\n          auto innerIter = py::iter(*iter);\n          while (innerIter != py::iterator::sentinel())\n          {\n            ++j;\n            accumulateObjectStringLength(innerIter->ptr(), stringLength);\n            ++innerIter;\n          }\n          \n          nCols = std::max(nCols, j);\n        }\n        else\n          accumulateObjectStringLength(iter->ptr(), stringLength);\n\n        ++nRows;\n        ++iter;\n      }\n\n      if (nRows > XL_MAX_ROWS)\n        XLO_THROW(\"Max rows exceeded when returning iterator\");\n      if (nCols > XL_MAX_COLS)\n        XLO_THROW(\"Max columns exceeded when returning iterator\");\n\n      if (PyErr_Occurred())\n        throw py::error_already_set();\n\n      // Python supports an empty tuple, but Excel doesn't support an\n      // empty array, so return a Missing type\n      if (nRows == 0)\n        return ExcelObj(ExcelType::Missing);\n\n      ExcelArrayBuilder builder(nRows, nCols, stringLength);\n\n      // Second loop to fill in array values\n      iter = py::iter(py::handle(p));\n      size_t i = 0, j = 0;\n      while (iter != py::iterator::sentinel())\n      {\n        j = 0;\n        if (PyIterable_Check(iter->ptr()) && !PyUnicode_Check(iter->ptr()))\n        {\n          auto innerIter = py::iter(*iter);\n          while (innerIter != py::iterator::sentinel())\n          {\n            builder(i, j++).take(FromPyObj<detail::ReturnToCache, true>()(innerIter->ptr(), builder.charAllocator()));\n            ++innerIter;\n          }\n        }\n        else\n          builder(i, j++).take(FromPyObj<detail::ReturnToCache, true>()(iter->ptr(), builder.charAllocator()));\n\n        if (PyErr_Occurred())\n          throw py::error_already_set();\n\n        // Fill with N/A\n        for (; j < nCols; ++j)\n          builder(i, j) = CellError::NA;\n\n        ++i;\n        ++iter;\n      }\n\n      return builder.toExcelObj();\n    }\n\n    template <class TValConv>\n    class PyTupleFromArray : public detail::PyFromExcelImpl<PyTupleFromArray<TValConv>>\n    {\n      TValConv _valConv;\n    public:\n      using detail::PyFromExcelImpl<PyTupleFromArray<TValConv>>::operator();\n      static constexpr char* const ourName = \"tuple\";\n\n      PyObject* operator()(const ExcelObj& obj) const\n      {\n        ExcelArray arr(cacheCheck(obj));\n        if (arr.dims() < 2)\n        {\n          auto result = py::tuple(arr.size());\n          for (auto i = 0u; i < arr.size(); ++i)\n          {\n            auto val = _valConv(arr.at(i));\n            PyTuple_SET_ITEM(result.ptr(), i, val);\n          }\n          return result.release().ptr();\n        }\n        else\n        {\n          auto nRows = arr.nRows();\n          auto nCols = arr.nCols();\n\n          auto outer = py::tuple(nRows);\n          for (decltype(nRows) i = 0; i < nRows; ++i)\n          {\n            auto inner = py::tuple(nCols);\n            for (decltype(nCols) j = 0; j < nCols; ++j)\n            {\n              auto val = _valConv(arr.at(i, j));\n              PyTuple_SET_ITEM(inner.ptr(), j, val);\n            }\n            PyTuple_SET_ITEM(outer.ptr(), i, inner.release().ptr());\n          }\n          return outer.release().ptr();\n        }\n      }\n      constexpr wchar_t* failMessage() const { return L\"Expected array\"; }\n    };\n\n    template <class TValConv>\n    class PyListFromArray : public detail::PyFromExcelImpl<PyListFromArray<TValConv>>\n    {\n      TValConv _valConv;\n    public:\n      using detail::PyFromExcelImpl<PyListFromArray<TValConv>>::operator();\n      static constexpr char* const ourName = \"list\";\n\n      PyObject* operator()(const ExcelObj& obj) const\n      {\n        ExcelArray arr(cacheCheck(obj));\n\n        if (arr.dims() < 2)\n        {\n          auto result = py::list(arr.size());\n          for (auto i = 0u; i < arr.size(); ++i)\n          {\n            auto val = _valConv(arr.at(i));\n            PyList_SET_ITEM(result.ptr(), i, val);\n          }\n          return result.release().ptr();\n        }\n        else\n        {\n          auto nRows = arr.nRows();\n          auto nCols = arr.nCols();\n\n          auto outer = py::list(nRows);\n          for (decltype(nRows) i = 0; i < nRows; ++i)\n          {\n            auto inner = py::list(nCols);\n            for (decltype(nCols) j = 0; j < nCols; ++j)\n            {\n              auto val = _valConv(arr.at(i, j));\n              PyList_SET_ITEM(inner.ptr(), j, val);\n            }\n            PyList_SET_ITEM(outer.ptr(), i, inner.release().ptr());\n          }\n          return outer.release().ptr();\n        }\n      }\n      constexpr wchar_t* failMessage() const { return L\"Expected array\"; }\n    };\n\n    PyObject* excelArrayToNestedTuple(const ExcelObj & obj)\n    {\n      return PyTupleFromArray<PyFromAny>()(obj);\n    }\n\n    namespace\n    {\n      struct Adapter\n      {\n        template<class... Args> auto operator()(Args&&... args)\n        {\n          return nestedIterableToExcel(std::forward<Args>(args)...);\n        }\n        static constexpr char* ourName = \"iterable\";\n      };\n      static int theBinder = addBinder([](pybind11::module& mod)\n      {\n        bindPyConverter<PyFromExcelConverter<PyTupleFromArray<PyFromAny>>>(mod, \"tuple\").def(py::init<>());\n        bindPyConverter<PyFromExcelConverter<PyListFromArray<PyFromAny>>>(mod, \"list\").def(py::init<>());\n        auto tupleToExcel = bindXlConverter<PyFuncToExcel<Adapter>>(mod, \"tuple\").def(py::init<>());\n        mod.add_object((std::string(theReturnConverterPrefix) + \"list\").c_str(), tupleToExcel);\n        mod.add_object((std::string(theReturnConverterPrefix) + \"iterable\").c_str(), tupleToExcel);\n      });\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/TypeConversion/PyTupleType.h",
    "content": "#pragma once\n#include <xlOil/ExcelObj.h>\n#include \"CPython.h\"\n\nnamespace xloil\n{\n  class ExcelObj;\n  namespace Python\n  {\n    PyObject* excelArrayToNestedTuple(const ExcelObj& obj);\n    ExcelObj nestedIterableToExcel(const PyObject* p);\n  }\n}"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python310.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python310</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings310.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python310.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python311.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python311</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings311.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python311.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python312.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python312</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings312.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python312.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python313.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python313</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings313.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python313.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python314.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python314</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings314.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python314.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python36.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{C28B8E78-3CE7-4381-AA3B-846A85AB1F30}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python36</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings36.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python36.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python37.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python37</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <TargetExt>.pyd</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings37.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python37.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python38.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python38</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <TargetExt>.pyd</TargetExt>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings38.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>python38.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python39.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Python</RootNamespace>\n    <ProjectName>xlOil_Python39</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n    <Import Project=\"PySettings39.props\" />\n    <Import Project=\"PySettings.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Python/xlOil_Python39.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"AsyncFunctions.cpp\" />\n    <ClCompile Include=\"PyCache.cpp\" />\n    <ClCompile Include=\"PyCOM.cpp\" />\n    <ClCompile Include=\"PyImage.cpp\" />\n    <ClCompile Include=\"PyRibbon.cpp\" />\n    <ClCompile Include=\"PySource.cpp\" />\n    <ClCompile Include=\"PyFunctionRegister.cpp\" />\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"PyCore.cpp\" />\n    <ClCompile Include=\"PyEvents.cpp\" />\n    <ClCompile Include=\"PyHelpers.cpp\" />\n    <ClCompile Include=\"PyRtd.cpp\" />\n    <ClCompile Include=\"TypeConversion\\BasicTypes.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyCustomType.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyDateType.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyDictType.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyExcelArrayType.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyRangeType.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"TypeConversion\\PyTupleType.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n    <ClCompile Include=\"PyCallExcelBuiltin.cpp\" />\n    <ClCompile Include=\"PyAppObjects.cpp\" />\n    <ClCompile Include=\"PyAddin.cpp\" />\n    <ClCompile Include=\"PyStatusBar.cpp\" />\n    <ClCompile Include=\"PyLogWriter.cpp\" />\n    <ClCompile Include=\"PyRunLater.cpp\" />\n    <ClCompile Include=\"TypeConversion\\Numpy.cpp\">\n      <Filter>TypeConversion</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"AsyncFunctions.h\" />\n    <ClInclude Include=\"CPython.h\" />\n    <ClInclude Include=\"PyCache.h\" />\n    <ClInclude Include=\"PyImage.h\" />\n    <ClInclude Include=\"PySource.h\" />\n    <ClInclude Include=\"PyFunctionRegister.h\" />\n    <ClInclude Include=\"PyCore.h\" />\n    <ClInclude Include=\"PyEvents.h\" />\n    <ClInclude Include=\"PyHelpers.h\" />\n    <ClInclude Include=\"TypeConversion\\BasicTypes.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n    <ClInclude Include=\"TypeConversion\\PyDateType.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n    <ClInclude Include=\"TypeConversion\\PyDictType.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n    <ClInclude Include=\"TypeConversion\\PyExcelArrayType.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n    <ClInclude Include=\"TypeConversion\\PyTupleType.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n    <ClInclude Include=\"EventLoop.h\" />\n    <ClInclude Include=\"PyFuture.h\" />\n    <ClInclude Include=\"PyCOM.h\" />\n    <ClInclude Include=\"ArrayHelpers.h\" />\n    <ClInclude Include=\"PyRtd.h\" />\n    <ClInclude Include=\"PyAddin.h\" />\n    <ClInclude Include=\"TypeConversion\\ConverterInterface.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n    <ClInclude Include=\"TypeConversion\\Numpy.h\">\n      <Filter>TypeConversion</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <Filter Include=\"TypeConversion\">\n      <UniqueIdentifier>{92ecbc1c-26d1-4843-bafe-bcb200fa7050}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_SQL/Cache.cpp",
    "content": "#include <xloil/ExcelObjCache.h>\n#include \"Cache.h\"\n\nusing std::unique_ptr;\nnamespace xloil \n{\n  template<>\n  struct CacheUniquifier<std::unique_ptr<const SQL::CacheObj>>\n  {\n    static constexpr wchar_t value = L'\\x8449';\n  };\n\n  namespace SQL \n  {\n    ExcelObj cacheAdd(unique_ptr<const CacheObj>&& obj)\n    {\n      if (!obj)\n        return Const::Error(CellError::Value);\n      return addCached<CacheObj>(obj.release(), L\"SQLDB\");\n    }\n    const CacheObj* cacheFetch(const std::wstring_view& key)\n    {\n      return getCached<CacheObj>(key);\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/Cache.h",
    "content": "#include <memory>\n#include <string>\n\nstruct sqlite3;\n\nnamespace xloil \n{\n  namespace SQL \n  {\n    class CacheObj\n    {\n    public:\n      virtual std::shared_ptr<sqlite3> getDB() const\n      {\n        return std::shared_ptr<sqlite3>();\n      }\n    };\n\n    ExcelObj \n      cacheAdd(std::unique_ptr<const CacheObj>&& obj);\n\n    const CacheObj*\n      cacheFetch(const std::wstring_view& key);\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_SQL/Common.cpp",
    "content": "#include \"Common.h\"\n#include <xloil/Interface.h>\n#include \"XlArrayTable.h\"\n#include <xlOil/ExcelArray.h>\n\nusing std::shared_ptr;\nusing std::string;\nusing std::wstring;\nusing std::vector;\nusing std::unique_ptr;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    void sqlThrow(sqlite3* db, int errCode)\n    {\n      if (errCode != SQLITE_OK)\n        XLO_THROW(sqlite3_errmsg(db));\n    }\n\n    shared_ptr<sqlite3> newDatabase()\n    {\n      sqlite3 *db;\n      if (sqlite3_open(\":memory:\", &db) == SQLITE_OK\n        && sqlite3_create_module(db, \"xlarray\", &XlArrayModule, 0) == SQLITE_OK)\n        return shared_ptr<sqlite3>(db, sqlite3_close);\n\n      string msg(sqlite3_errmsg(db));\n      sqlite3_close(db);\n      XLO_THROW(msg);\n    }\n\n    wstring tableSchema(\n      const ExcelArray& arr,\n      const vector<wstring>* headings)\n    {\n      auto nCols = arr.nCols();\n      wstring sql;\n      sql.reserve(20 + nCols * 14);\n      sql += L\"CREATE TABLE x(\";\n      if (headings && headings->size() != arr.nCols())\n        XLO_THROW(\"Provided {0} headings, but data has {1} columns\", headings->size(), arr.nCols());\n\n      for (auto j = 0u; j < nCols; ++j)\n      {\n        sql += headings\n          ? headings->at(j)\n          : arr(0, j).toString();\n        auto col = arr.slice(headings ? 0 : 1, j, -1, j + 1);\n        auto colType = col.dataType();\n        switch (colType)\n        {\n        case ExcelType::Int:\n        case ExcelType::Bool:\n          sql += L\" INTEGER\";\n          break;\n        case ExcelType::Num:\n          sql += L\" REAL\";\n          break;\n        case ExcelType::Str:\n          sql += L\" TEXT\";\n          break;\n        default:\n          break;\n        }\n        sql += L',';\n      }\n      if (nCols > 0)\n        sql.pop_back();\n      sql += L')';\n\n      return sql;\n    }\n\n    void createVTable(\n      sqlite3* db,\n      const ExcelArray& arr,\n      const wchar_t* name,\n      const vector<wstring>* headings)\n    {\n      auto schema = tableSchema(arr, headings);\n      auto arrayData = arr.slice(headings ? 0 : 1, 0);\n      auto sql = fmt::format(\n        L\"CREATE VIRTUAL TABLE {0} USING xlarray({1},{2},0)\", name, (long long)&arrayData, schema);\n\n      sqlite3_stmt *stmt;\n      if (sqlite3_prepare16_v2(db, sql.c_str(),\n        (int)sql.length() * sizeof(wchar_t), &stmt, 0) == SQLITE_OK)\n      {\n        sqlite3_step(stmt);\n        sqlite3_finalize(stmt);\n      }\n      else\n        XLO_THROW(L\"Failed to create virtual table {0}\", name);\n    }\n\n    shared_ptr<sqlite3_stmt> sqlPrepare(sqlite3* db, const wstring& sql)\n    {\n      sqlite3_stmt *stmt;\n      sqlThrow(db,\n        sqlite3_prepare16_v2(db, sql.c_str(), (int)sql.length() * sizeof(wchar_t), &stmt, 0));\n      shared_ptr<sqlite3_stmt> stmtPtr(stmt, sqlite3_finalize);\n      return stmtPtr;\n    }\n\n    int sqlExec(sqlite3* db, const wstring& sql)\n    {\n      const wchar_t* pSql = sql.c_str();\n      const wchar_t* pSqlEnd = pSql + sql.length();\n\n      int rc = SQLITE_OK;\n      while (rc == SQLITE_OK && pSql != pSqlEnd)\n      {\n        const wchar_t* pLeftover;\n        sqlite3_stmt *stmt;\n        \n        rc = sqlite3_prepare16_v2(db, pSql,\n          (int)(pSqlEnd - pSql) * sizeof(wchar_t), &stmt, (const void **)&pLeftover);\n\n        if (!stmt)\n        {\n          /* this happens for a comment or white-space */\n          pSql = pLeftover;\n          continue;\n        }\n        while (sqlite3_step(stmt) == SQLITE_ROW);\n        rc = sqlite3_finalize(stmt);\n        pSql = pLeftover;\n        while (isspace(pSql[0])) pSql++;\n      }\n\n      return rc;\n    }\n\n    ExcelObj sqlQueryToArray(const std::shared_ptr<sqlite3_stmt>& prepared)\n    {\n      // Since we don't know the number of results in advance, our strategy is\n      // to collect ExcelObj values in a vector and (pascal) strings in separate \n      // store. When we see a string, we put an empty string ExcelObj in results \n      // (this allocates no internal storage) and the string value in strings.\n      // Later we allocate a contiguous block for both of these this data, copy \n      // them and fix-up the string objects to point to the right place.\n      vector<ExcelObj> results;\n      vector<wchar_t> strings;\n\n      auto rc = sqlite3_step(prepared.get());\n      auto nCols = sqlite3_column_count(prepared.get());\n      int nRows = 0;\n      while (rc == SQLITE_ROW)\n      {\n        for (auto j = 0; j < nCols; ++j)\n        {\n          switch (sqlite3_column_type(prepared.get(), j))\n          {\n          case SQLITE_INTEGER:\n            results.emplace_back(sqlite3_column_int(prepared.get(), j));\n            break;\n          case SQLITE_FLOAT:\n            results.emplace_back(sqlite3_column_double(prepared.get(), j));\n            break;\n          case SQLITE_TEXT:\n          {\n            auto text = (const wchar_t*)sqlite3_column_text16(prepared.get(), j);\n            auto len = std::min<wchar_t>(USHRT_MAX, (unsigned short)wcslen(text));\n            strings.push_back(len);\n            strings.insert(strings.end(), text, text + len);\n            // Empty string into results - we will fix it later\n            results.emplace_back(ExcelType::Str);\n            break;\n          }\n          case SQLITE_BLOB:\n          case SQLITE_NULL:\n          default:\n            results.emplace_back(CellError::NA);\n            break;\n          }\n        }\n        rc = sqlite3_step(prepared.get());\n        ++nRows;\n      }\n\n      if (results.empty())\n        return Const::Error(CellError::NA);\n\n      // Memcpy the ExcelObj and string values into a single block\n      // Since Excel expects arrays by-row, we don't need to re-order\n      auto resultsNBytes = sizeof(ExcelObj) * results.size();\n      auto stringsNBytes = sizeof(wchar_t) * strings.size();\n      auto* arrayData = new char[resultsNBytes + stringsNBytes];\n      auto* stringData = arrayData + resultsNBytes;\n      memcpy_s(arrayData, resultsNBytes, results.data(), resultsNBytes);\n      memcpy_s(stringData, stringsNBytes, strings.data(), stringsNBytes);\n\n      // Fix up strings\n      auto pObj = (ExcelObj*)arrayData;\n      auto pEnd = pObj + results.size();\n      auto pStr = (wchar_t*)stringData;\n      for (; pObj != pEnd; ++pObj)\n      {\n        if (pObj->xltype == msxll::xltypeStr)\n        {\n          assert((char*)pStr < stringData + stringsNBytes);\n          pObj->val.str.data = pStr;\n          pObj->val.str.xloil_view = true;\n          // Skip to the next string by adding the string length\n          pStr += pStr[0] + 1;\n        }\n      }\n\n      return ExcelObj((const ExcelObj*)arrayData, nRows, nCols);\n    }\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/Common.h",
    "content": "#pragma once\n#define SQLITE_OMIT_PROGRESS_CALLBACK\n#define SQLITE_OMIT_AUTHORIZATION\n#define SQLITE_OMIT_WAL\n\n#include <xlOil/ExcelObj.h>\n#include <sqlite/sqlite3.h>\n#include <sqlite/sqlite3ext.h>\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace xloil { class ExcelArray; }\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    void \n      sqlThrow(sqlite3* db, int errCode);\n\n    std::shared_ptr<sqlite3> \n      newDatabase();\n\n    void \n      createVTable(\n        sqlite3* db, \n        const ExcelArray& arr, \n        const wchar_t* name, \n        const std::vector<std::wstring>* headings = nullptr);\n\n    std::shared_ptr<sqlite3_stmt> \n      sqlPrepare(sqlite3* db, const std::wstring& sql);\n\n    int \n      sqlExec(sqlite3* db, const std::wstring& sql);\n\n    ExcelObj\n      sqlQueryToArray(const std::shared_ptr<sqlite3_stmt>& prepared);\n\n    class ScopedLock\n    {\n    public:\n      ScopedLock(sqlite3* db) : _db(db)\n      {\n        sqlite3_mutex_enter(sqlite3_db_mutex(db));\n      }\n      ~ScopedLock()\n      {\n        sqlite3_mutex_leave(sqlite3_db_mutex(_db));\n      }\n    private:\n      sqlite3* _db;\n    };\n  }\n}\n"
  },
  {
    "path": "libs/xlOil_SQL/Main.cpp",
    "content": "#include <xlOil/StaticRegister.h>\n#include <xloil/Plugin.h>\n#include \"Cache.h\"\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    XLO_PLUGIN_INIT(AddinContext* context, const PluginContext& plugin)\n    {\n      try\n      {\n        linkPluginToCoreLogger(context, plugin);\n        throwIfNotExactVersion(plugin);\n        return 0;\n      }\n      catch (const std::exception& e)\n      {\n        XLO_ERROR(e.what());\n        return -1;\n      }\n    }\n  }\n}\n\nXLO_DEFINE_FREE_CALLBACK()\n"
  },
  {
    "path": "libs/xlOil_SQL/XlArrayTable.cpp",
    "content": "#include \"XlArrayTable.h\"\n#include <sqlite/sqlite3.h>\n#include <sqlite/sqlite3ext.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/ExcelRef.h>\n\nusing std::shared_ptr;\nusing std::pair;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    /* An instance of the XlArray virtual table */\n   \n    struct XlArrayTable\n    {\n      using InputType = XlArrayInput;\n      XlArrayTable(const InputType& input) : data(input) {};\n      sqlite3_vtab base;              /* Base class.  Must be first */\n      ExcelArray data;\n    };\n\n    struct XlRangeTable\n    {\n      using InputType = XlRangeInput;\n      XlRangeTable(const InputType& input) : data(input) {};\n      sqlite3_vtab base;              /* Base class.  Must be first */\n      ExcelRef data;\n    };\n\n    // Not sure what this could be used for...\n    //\n    //using XlArrayOwnerInput = std::pair<ExcelArray, std::shared_ptr<const ExcelObj>>;\n    //struct XlArrayOwnerTable\n    //{\n    //  using InputType = XlArrayOwnerInput;\n    //  XlArrayOwnerTable(const InputType& input)\n    //   : data(input.first)\n    //   , storage(input.second)\n    //  {}\n    //  sqlite3_vtab base;              /* Base class.  Must be first */\n    //  ExcelArray data;\n    //  shared_ptr<const ExcelObj> storage;\n    //};\n\n\n    struct XlTableCursor \n    {\n      sqlite3_vtab_cursor base;  /* Base class.  Must be first */\n      int iRowid;                /* The current rowid.  Negative for EOF */\n    };\n\n    template<class T>\n    static int xConnect(\n      sqlite3 *db,\n      void* /*pAux*/,\n      int /*argc*/, const char *const* argv,\n      sqlite3_vtab **ppVtab,\n      char** /*pzErr*/)\n    {\n      auto input = (const typename T::InputType*)atoll(argv[3]);\n      auto schema = argv[4];\n\n      auto rc = sqlite3_declare_vtab(db, schema);\n\n      if (rc == SQLITE_OK)\n      {\n        auto* pNew = new T(*input);\n        *ppVtab = (sqlite3_vtab*)pNew;\n      }\n\n      return rc;\n    }\n\n    /*\n    ** The xConnect and xCreate methods do the same thing, but they must be\n    ** different so that the virtual table is not an eponymous virtual table.\n    */\n    template<class T>\n    static int xCreate(\n      sqlite3 *db,\n      void *pAux,\n      int argc, const char *const*argv,\n      sqlite3_vtab **ppVtab,\n      char **pzErr)\n    {\n      return xConnect<T>(db, pAux, argc, argv, ppVtab, pzErr);\n    }\n\n    static int xBestIndex(\n      sqlite3_vtab*,\n      sqlite3_index_info *pIdxInfo)\n    {\n      pIdxInfo->estimatedCost = 1000000;\n      return SQLITE_OK;\n    }\n\n    /*\n    ** This is the destructor for the vtable.\n    */\n    template<class T>\n    static int xDisconnect(sqlite3_vtab *pVtab) {\n      auto* p = (T*)pVtab;\n      delete p;\n      return SQLITE_OK;\n    }\n\n    static int xOpen(sqlite3_vtab*, sqlite3_vtab_cursor **ppCursor) {\n      auto *pCur = new XlTableCursor();\n      *ppCursor = &pCur->base;\n      return SQLITE_OK;\n    }\n\n    /*\n    ** Destructor for a Cursor.\n    */\n    static int xClose(sqlite3_vtab_cursor *cur) {\n      auto *pCur = (XlTableCursor*)cur;\n      delete pCur;\n      return SQLITE_OK;\n    }\n\n    /*\n    ** Only a full table scan is supported.  So xFilter simply rewinds to\n    ** the beginning.\n    */\n    static int xFilter(\n      sqlite3_vtab_cursor *pVtabCursor,\n      int /*idxNum*/, const char* /*idxStr*/,\n      int /*argc*/, sqlite3_value** /*argv*/)\n    {\n      auto *pCur = (XlTableCursor*)pVtabCursor;\n      pCur->iRowid = 0;\n      return SQLITE_OK;\n    }\n\n    /*\n    ** Advance a Cursor to its next row of input.\n    ** Set the EOF marker if we reach the end of input.\n    */\n    template<class T>\n    static int xNext(sqlite3_vtab_cursor *cur)\n    {\n      auto *pCur = (XlTableCursor*)cur;\n      auto *pTab = (const T*)cur->pVtab;\n      if (++pCur->iRowid >= (int)pTab->data.nRows())\n        pCur->iRowid = -1;\n      return SQLITE_OK;\n    }\n\n    /*\n    ** Return TRUE if the cursor has been moved off of the last\n    ** row of output.\n    */\n    static int xEof(sqlite3_vtab_cursor *cur) {\n      auto *pCur = (const XlTableCursor*)cur;\n      return pCur->iRowid < 0;\n    }\n\n    \n    template<class T> struct TableReturn {};\n    template<> struct TableReturn<XlRangeTable> { using type = ExcelObj; };\n    template<> struct TableReturn<XlArrayTable> { using type = const ExcelObj&; };\n\n\n    struct ExcelValToSqlType\n    {\n      sqlite3_context* ctx;\n\n      void operator()(int x) const     { sqlite3_result_int64(ctx, x); }\n      void operator()(bool x) const    { sqlite3_result_int64(ctx, x); }\n      void operator()(double x) const  { sqlite3_result_double(ctx, x); }\n      void operator()(CellError) const { sqlite3_result_null(ctx); }\n      void operator()(nullptr_t) const { sqlite3_result_null(ctx); }\n      void operator()(const PStringRef& pstr) const \n      {\n        sqlite3_result_text16(ctx, pstr.pstr(),\n          pstr.length() * sizeof(wchar_t), SQLITE_STATIC);\n      }\n\n      template <class T> void operator()(T) const\n      {\n        sqlite3_result_error(ctx, \"Unexpected excel type\", -1);\n      }\n    };\n\n    /*\n    ** Return values of columns for the row at which the cursor\n    ** is currently pointing.\n    */\n    template<class T>\n    static int xColumn(\n      sqlite3_vtab_cursor *cur,   /* The cursor */\n      sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */\n      int i)                      /* Which column to return */\n    {\n      auto *pCur = (XlTableCursor*)cur;\n      auto *pTab = (const T*)cur->pVtab;\n      TableReturn<T>::type val = pTab->data(pCur->iRowid, i);\n      val.visit(ExcelValToSqlType{ ctx });\n      return SQLITE_OK;\n    }\n\n    /*\n    ** Return the rowid for the current row.\n    */\n    static int xRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid)\n    {\n      auto *pCur = (XlTableCursor*)cur;\n      *pRowid = pCur->iRowid;\n      return SQLITE_OK;\n    }\n\n    template<class T>\n    sqlite3_module XlModule = {\n      0,                  /* iVersion */\n      xCreate<T>,         /* xCreate */\n      xConnect<T>,        /* xConnect */\n      xBestIndex,         /* xBestIndex */\n      xDisconnect<T>,     /* xDisconnect */\n      xDisconnect<T>,     /* xDestroy */\n      xOpen,              /* xOpen - open a cursor */\n      xClose,             /* xClose - close a cursor */\n      xFilter,            /* xFilter - configure scan constraints */\n      xNext<T>,           /* xNext - advance a cursor */\n      xEof,               /* xEof - check for end of scan */\n      xColumn<T>,         /* xColumn - read data */\n      xRowid,             /* xRowid - read data */\n      0,                  /* xUpdate */\n      0,                  /* xBegin */\n      0,                  /* xSync */\n      0,                  /* xCommit */\n      0,                  /* xRollback */\n      0,                  /* xFindMethod */\n      0,                  /* xRename */\n    };\n\n\n    extern sqlite3_module XlArrayModule = XlModule<XlArrayTable>;\n    extern sqlite3_module XlRangeModule = XlModule<XlRangeTable>; \n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/XlArrayTable.h",
    "content": "#include <memory>\n\nstruct sqlite3_module;\nnamespace xloil { class ExcelArray; class ExcelRef; class ExcelObj;  }\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    using XlArrayInput = ExcelArray;\n    using XlRangeInput = ExcelRef;\n\n    extern sqlite3_module XlArrayModule;\n    extern sqlite3_module XlRangeModule;\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/xlOil_SQL.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\external\\sqlite\\sqlite3.c\" />\n    <ClCompile Include=\"Cache.cpp\" />\n    <ClCompile Include=\"Common.cpp\" />\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"XlArrayTable.cpp\" />\n    <ClCompile Include=\"xloSql.cpp\" />\n    <ClCompile Include=\"xloSqlDB.cpp\" />\n    <ClCompile Include=\"xloSqlQuery.cpp\" />\n    <ClCompile Include=\"xloSqlTable.cpp\" />\n    <ClCompile Include=\"xloSqlTables.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"Cache.h\" />\n    <ClInclude Include=\"Common.h\" />\n    <ClInclude Include=\"XlArrayTable.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>SQL</RootNamespace>\n    <ProjectName>xlOil_SQL</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>SQLITE_CORE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_SQL/xlOil_SQL.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\sqlite\\sqlite3.c\" />\n    <ClCompile Include=\"XlArrayTable.cpp\" />\n    <ClCompile Include=\"Cache.cpp\" />\n    <ClCompile Include=\"xloSql.cpp\" />\n    <ClCompile Include=\"xloSqlDB.cpp\" />\n    <ClCompile Include=\"xloSqlTable.cpp\" />\n    <ClCompile Include=\"xloSqlQuery.cpp\" />\n    <ClCompile Include=\"Common.cpp\" />\n    <ClCompile Include=\"xloSqlTables.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"XlArrayTable.h\" />\n    <ClInclude Include=\"Cache.h\" />\n    <ClInclude Include=\"Common.h\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "libs/xlOil_SQL/xloSql.cpp",
    "content": "#include <sqlite/sqlite3ext.h>\n#include <xlOil/StaticRegister.h>\n#include <xloil/Interface.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/ExcelObj.h>\n#include <xloil/ExcelObjCache.h>\n#include \"Common.h\"\n\n#include <xlOil/Preprocessor.h>\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::wstring;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    void processMeta(\n      const ExcelArray& metaData, \n      sqlite3* db,\n      ExcelObj::row_t i, \n      const ExcelObj& arg, \n      const wchar_t* defaultName)\n    {\n      if (!arg.isNonEmpty())\n        return;\n\n      if (i >= metaData.nRows() || metaData.nCols() < 1 || metaData(i, 0).isMissing())\n        createVTable(db, ExcelArray(arg), defaultName);\n      else\n      { \n        vector<wstring> headings;\n        std::transform(\n          metaData.row_begin(i) + 1, metaData.row_end(i),\n          std::back_inserter(headings),\n          [](const ExcelObj& x) { return x.toString(); });\n        createVTable(\n          db,\n          ExcelArray(arg),\n          metaData(i, 0).toString().c_str(),\n          headings.empty() ? nullptr : &headings);\n      }\n    }\n  \n#define XLOSQL_ARG_NAME Table\n#define XLOSQL_NARGS 10\n\n    constexpr wchar_t* TABLE_ARG_HELP = L\"An array of data with rows as records\";\n\n    XLO_FUNC_START(\n      xloSql(\n        const ExcelObj& query,\n        const ExcelObj& meta,\n        XLO_DECLARE_ARGS(XLOSQL_NARGS, XLOSQL_ARG_NAME)\n      )\n    )\n    {\n      auto db = newDatabase();\n\n      if (meta.isNonEmpty())\n      {\n        if (meta.isType(ExcelType::Str))\n        {\n         /* vector<PStringRef> names;\n          auto pstr = meta.cast<PStringRef>();\n          const auto length = pstr.length();\n\n          while (!(pstr = pstr.strtok(L\",\")).empty())\n            names.push_back(pstr);\n          ExcelArrayBuilder builder(names.size(), 1, length);\n          for (auto i = 0; i < names.size(); ++i)\n            builder(i, 0) = names[i];*/\n        }\n        ExcelArray metaData(cacheCheck(meta));\n        ProcessArgs([db, metaData](auto iArg, auto& argVal, auto& argName)\n        {\n          processMeta(metaData, db.get(), iArg, argVal, argName);\n        }, XLO_ARGS_LIST(XLOSQL_NARGS, XLOSQL_ARG_NAME));\n      }\n      else\n      {\n        ProcessArgs([db](auto& argVal, auto& argName)\n        {\n          if (argVal.isNonEmpty())\n            createVTable(db.get(), ExcelArray(cacheCheck(argVal)), argName);\n        }, XLO_ARGS_LIST(XLOSQL_NARGS, XLOSQL_ARG_NAME));\n      }\n\n      auto sql = query.toStringRecursive();\n\n      auto stmt = sqlPrepare(db.get(), sql);\n\n      return returnValue(sqlQueryToArray(stmt));\n    }\n    XLO_FUNC_END(xloSql).threadsafe()\n      .help(L\"Excecutes the SQL query on the provided tables. \"\n        \"The tables will be named Table1, Table2, unless overrided \"\n        \"by the Meta.  In the Meta, the first column should contain \"\n        \"the names of the tables. Subsequent columns are interpreted \"\n        \"as column headings for the table.\")\n      .arg(L\"Query\", L\"The SQL query to perform\")\n      .arg(L\"Meta\", L\"[opt] an array giving table names and column names\")\n      XLO_WRITE_ARG_HELP(XLOSQL_NARGS, XLOSQL_ARG_NAME, TABLE_ARG_HELP);\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/xloSqlDB.cpp",
    "content": "\n#include <xlOil/StaticRegister.h>\n#include <xloil/Interface.h>\n#include <xloil/Caller.h>\n#include <xlOil/ExcelArray.h>\n#include \"Common.h\"\n#include \"Cache.h\"\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::make_unique;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    class DataBaseRef : public CacheObj\n    {\n    public:\n      DataBaseRef(const std::shared_ptr<sqlite3>& db)\n        : _db(db)\n      {}\n      virtual std::shared_ptr<sqlite3> getDB() const\n      {\n        return _db;\n      }\n      std::shared_ptr<sqlite3> _db;\n    };\n\n    XLO_FUNC_START(xloSqlDB())\n    {\n      throwInFunctionWizard();\n\n      return returnValue(\n        cacheAdd(\n          make_unique<DataBaseRef>(\n            newDatabase())));\n    }\n    XLO_FUNC_END(xloSqlDB).threadsafe();\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/xloSqlQuery.cpp",
    "content": "\n#include <xlOil/StaticRegister.h>\n#include <xloil/Caller.h>\n#include <xlOil/ExcelArray.h>\n#include \"Common.h\"\n#include \"Cache.h\"\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::make_shared;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    XLO_FUNC_START( xloSqlQuery(\n      const ExcelObj& database,\n      const ExcelObj& query\n      )\n    )\n    {\n      throwInFunctionWizard();\n\n      const CacheObj* dbObj = cacheFetch(database.cast<PStringRef>());\n      if (!dbObj)\n        XLO_THROW(\"No database provided\");\n\n      auto sql = query.toStringRecursive();\n      auto stmt = sqlPrepare(dbObj->getDB().get(), sql);\n\n      return returnValue(sqlQueryToArray(stmt));\n    }\n    XLO_FUNC_END(xloSqlQuery).threadsafe()\n      .help(L\"Runs the specified query on a database, returning the results as an array\")\n      .arg(L\"Database\", L\"A cache reference to a database object created wth xloSqlDB\")\n      .arg(L\"Query\");\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/xloSqlTable.cpp",
    "content": "#include <xlOil/StaticRegister.h>\n#include <xloil/Caller.h>\n#include <xlOil/ExcelArray.h>\n#include <xloil/ExcelObjCache.h>\n#include \"Common.h\"\n#include \"Cache.h\"\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::make_shared;\nusing std::wstring;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    XLO_FUNC_START( xloSqlTable(\n      const ExcelObj& database,\n      const ExcelObj& data,\n      const ExcelObj& name,\n      const ExcelObj& headings,\n      const ExcelObj& query)\n    )\n    {\n      throwInFunctionWizard();\n\n      vector<wstring> headingsVec;\n      if (headings.isNonEmpty())\n      {\n        ExcelArray headingArray(cacheCheck(headings));\n        std::transform(\n          headingArray.begin(), headingArray.end(),\n          std::back_inserter(headingsVec),\n          [](const ExcelObj& x) { return x.toString(); });\n      }\n\n      const CacheObj* dbObj = cacheFetch(database.toString());\n      if (!dbObj)\n        XLO_THROW(\"No database provided\");\n        \n      auto tableName = name.toString();\n\n      auto db = dbObj->getDB();\n      ScopedLock lock(db.get());\n\n      // Attempt to drop table if it already exists, e.g. function called \n      // again, but ignore return code\n      sqlExec(db.get(), fmt::format(L\"DROP TABLE {0}\", tableName));\n\n      createVTable(\n        db.get(),\n        ExcelArray(cacheCheck(data)),\n        tableName.c_str(),\n        headingsVec.empty() ? nullptr : &headingsVec);\n\n      wstring select = query.isNonEmpty()\n        ? query.toString()\n        : fmt::format(L\"SELECT * FROM {0}\", tableName);\n\n      // We do this little rename so the table can have the \n      // expected name in the query even though it is just\n      // the temporary vtable.\n      auto tempName = wstring(L\"xloil_temp\");\n      auto sql = fmt::format(\n        L\"CREATE TABLE {0} AS {1};\"\n        \"DROP TABLE {2};\"\n        \"ALTER TABLE {0} RENAME TO {2};\",\n        tempName, select, tableName);\n      sqlThrow(db.get(), sqlExec(db.get(), sql));\n        \n      return const_cast<ExcelObj*>(&database);\n    }\n    XLO_FUNC_END(xloSqlTable).threadsafe()\n      .help(L\"Creates a table in a database, optionally via a query. \"\n            \"Returns a reference to the database: it is recommended to chain xloSqlTable calls \"\n            \"to force execution order before calling xloSqlQuery\")\n      .arg(L\"Database\", L\"A reference to a database created by xloSqlDB or another call to xloSqlTable\")\n      .arg(L\"Data\", L\"An array of data to read into the table. First row must be headings, unless \"\n                     \"headings parameter is specified\")\n      .arg(L\"Name\", L\"The table name in the database, this must be unique\")\n      .arg(L\"Headings\", L\"[opt] headings (field names) for the data\")\n      .arg(L\"Query\", L\"[opt] A select statement used to extract a subset of the data, otherwise SELECT * is used\");\n  }\n}"
  },
  {
    "path": "libs/xlOil_SQL/xloSqlTables.cpp",
    "content": "\n#include <xlOil/StaticRegister.h>\n#include <xloil/Caller.h>\n#include <xlOil/ExcelArray.h>\n#include \"Common.h\"\n#include \"Cache.h\"\n\nusing std::shared_ptr;\nusing std::vector;\nusing std::make_shared;\n\nnamespace xloil\n{\n  namespace SQL\n  {\n    XLO_FUNC_START( xloSqlTables(\n      const ExcelObj& database)\n    )\n    {\n      throwInFunctionWizard();\n\n      const CacheObj* dbObj = cacheFetch(database.cast<PStringRef>());\n      if (!dbObj)\n        XLO_THROW(\"No database provided\");\n        \n      auto stmt = sqlPrepare(dbObj->getDB().get(), \n        L\"SELECT name FROM sqlite_master\"\n        \"WHERE type = 'table' AND name NOT LIKE 'sqlite_%'\");\n\n      return returnValue(sqlQueryToArray(stmt));\n    }\n    XLO_FUNC_END(xloSqlTables).threadsafe();\n  }\n}"
  },
  {
    "path": "libs/xlOil_Utils/Main.cpp",
    "content": "#include <xlOil/Plugin.h>\n#include <xloil/ExcelObj.h>\n\nnamespace xloil\n{\n  namespace Utils\n  {\n    XLO_PLUGIN_INIT(AddinContext* ctx, const PluginContext& plugin)\n    {\n      try\n      {\n        linkPluginToCoreLogger(ctx, plugin);\n        throwIfNotExactVersion(plugin);\n        return 0;\n      }\n      catch (const std::exception& e)\n      {\n        XLO_ERROR(e.what());\n        return -1;\n      }\n    }\n  }\n}\n\nXLO_DEFINE_FREE_CALLBACK()\n"
  },
  {
    "path": "libs/xlOil_Utils/RegexHelpers.h",
    "content": "#pragma once\n#include <xloil/Throw.h>\n#include <regex>\n\nnamespace xloil\n{\n  inline auto parseRegexGrammar(const std::wstring_view& name)\n  {\n    using namespace std::regex_constants;\n    if (name.empty() || name == L\"ecma\") return ECMAScript;\n    if (name == L\"basic\") return basic;\n    if (name == L\"extended\") return extended;\n    if (name == L\"awk\") return awk;\n    if (name == L\"grep\") return grep;\n    if (name == L\"egrep\") return egrep;\n    XLO_THROW(L\"Unknown regex grammar '{}'\", name);\n  }\n\n  inline auto strView(const std::wcsub_match& matchResults)\n  {\n    return std::wstring_view(matchResults.first, matchResults.length());\n  }\n  constexpr auto _GrammerHelp =\n    L\"(ecma) Choice of regex syntax: ecma, basic, extended, awk, grep, egrep. See https://en.cppreference.com/w/cpp/regex/syntax_option_type\";\n}"
  },
  {
    "path": "libs/xlOil_Utils/xlOil_Utils.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"xloBlock.cpp\" />\n    <ClCompile Include=\"xloConcat.cpp\" />\n    <ClCompile Include=\"xloFill.cpp\" />\n    <ClCompile Include=\"xloFillNA.cpp\" />\n    <ClCompile Include=\"xloIndex.cpp\" />\n    <ClCompile Include=\"xloPad.cpp\" />\n    <ClCompile Include=\"xloRegex.cpp\" />\n    <ClCompile Include=\"xloSearch.cpp\" />\n    <ClCompile Include=\"xloSort.cpp\" />\n    <ClCompile Include=\"xloSplit.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"RegexHelpers.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>xlOil</RootNamespace>\n    <ProjectName>xlOil_Utils</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilPlugin.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "libs/xlOil_Utils/xloBlock.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelObjCache.h>\n#include <boost/preprocessor/repeat_from_to.hpp>\n#include <xlOil/Preprocessor.h>\n\nusing std::vector;\nusing std::tuple;\n\n/*\nLayout should be\n\"1, 2, 3 ; 4, 5 ; 6\"\n\"1, 2, 3 ; 4, , 5\"\nTODO: support transpose with a t\n*/\nnamespace xloil\n{\n#define XLOBLOCK_NARGS 30\n#define XLOBLOCK_ARG_NAME arg\n#define COPY_ARG(z,N,d) args[N - 1] = &arg##N;\n\n  XLO_FUNC_START( xloBlock(\n    const ExcelObj* layout,\n    XLO_DECLARE_ARGS(XLOBLOCK_NARGS, XLOBLOCK_ARG_NAME)\n  ))\n  {\n    constexpr size_t nArgs = XLOBLOCK_NARGS - 1;\n    std::array<const ExcelObj*, XLOBLOCK_NARGS> args = { { XLO_ARG_PTRS(XLOBLOCK_NARGS, XLOBLOCK_ARG_NAME) } };\n    std::apply(CacheCheck(), args);\n\n    constexpr short NEW_ROW = -1;\n    constexpr short PADDING = 0;\n\n    const auto parse = layout->toString();\n\n    if (parse.empty())\n      XLO_THROW(\"No layout\");\n\n    using row_t = ExcelArray::row_t;\n    using col_t = ExcelArray::col_t;\n\n    auto* p = parse.data();\n\n    row_t totalRows = 0, rowsForCurrent = 0;\n    col_t totalCols = 0, colsForCurrent = 0;\n    size_t totalStrLength = 0;\n\n    vector<tuple<row_t, col_t, short>> spec;\n\n    while (true)\n    {\n      wchar_t* nextP;\n      auto argNum = (short)wcstol(p, &nextP, 10); \n      if (argNum > nArgs)\n        XLO_THROW(\"Arg {i} out of range\", argNum);\n      p = nextP;\n\n      if (argNum == 0)\n        spec.emplace_back(0, 0, PADDING);\n      else\n      {\n        row_t nRows = 1;\n        col_t nCols = 1;\n        auto* obj = args[argNum - 1];\n        switch (obj->type())\n        {\n        case ExcelType::Multi:\n        {\n          ExcelArray arr(*obj);\n          nRows = arr.nRows();\n          nCols = arr.nCols();\n          for (auto& x: arr)\n            totalStrLength += x.stringLength();\n          break;\n        }\n        case ExcelType::Str:\n          totalStrLength += obj->stringLength();\n          break;\n        default:\n          break;\n        }\n        spec.emplace_back(nRows, nCols, argNum);\n        rowsForCurrent = std::max(rowsForCurrent, nRows);\n        colsForCurrent += nCols;\n      }\n      auto separator = wcspbrk(p, L\",;\");\n\n      if (!separator || *separator == L';')\n      {\n        spec.emplace_back(rowsForCurrent, 0, NEW_ROW);\n        totalCols = std::max(totalCols, colsForCurrent);\n        totalRows += rowsForCurrent;\n        colsForCurrent = 0;\n        rowsForCurrent = 0;\n      }\n\n      if (!separator)\n        break;\n\n      p = separator + 1;\n    }\n\n    if (totalCols == 0 || totalRows == 0)\n      return returnValue(CellError::NA);\n\n    // TODO: avoid looping the spec twice!\n    row_t row = 0;\n    col_t col = 0;\n    for (size_t i = 0; i < spec.size(); ++i)\n    {\n      auto[nRows, nCols, iArg] = spec[i];\n      switch (iArg)\n      {\n      case NEW_ROW:\n        col = 0;\n        break;\n      case PADDING:\n      {\n        auto j = i;\n        // Walk through the specs until we find the next new row, adding\n        // the required columns as we go\n        while (std::get<2>(spec[++j]) != NEW_ROW)\n          col += std::get<1>(spec[j]);\n\n        // The padding shoud be the number of columns required for this row\n        // less the number we found in the above loop\n        spec[i] = std::make_tuple(0, totalCols - col, PADDING);\n        i = j;\n        col = 0;\n        break;\n      }\n      default:\n        col += nCols;\n      }\n    }\n\n    ExcelArrayBuilder builder(totalRows, totalCols, totalStrLength);\n    builder.fillNA();\n\n    row = 0; col = 0;\n    for (auto[nRows, nCols, iArg] : spec)\n    {\n      switch (iArg)\n      {\n      case NEW_ROW:\n        col = 0;\n        row += nRows;\n        break;\n      case PADDING:\n        col += nCols;\n        break;\n      default:\n      {\n        auto* obj = args[iArg - 1];\n        switch (obj->type())\n        {\n        case ExcelType::Multi:\n        {\n          auto arr = ExcelArray(*obj, false).slice(0, 0, nRows, nCols);\n\n          for (row_t i = 0; i < nRows; ++i)\n            for (col_t j = 0; j < nCols; ++j)\n              builder(row + i, col + j).take(const_cast<ExcelObj&&>(arr(i, j)));\n\n          col += nCols;\n          break;\n        }\n        default:\n          builder(row, col) = *obj;\n          ++col;\n        }\n      }\n      }\n    }\n\n    return returnValue(builder.toExcelObj());\n  }\n  XLO_FUNC_END(xloBlock).threadsafe()\n    .help(L\"Creates a block matrix given a layout specification. \"\n      \"Layout has the form '1, 2, 3; 4, ,5' where numbers refer \"\n      \"to the n-th argument (1-based). Semi-colon indicates a new row. \"\n      \"Two consecutive commas mean a resized padded space. Whitespace is ignored.\")\n    .arg(L\"Layout\", L\"String specifying how to layout the blocks\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloConcat.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xlOil/Range.h>\n#include <xloil/StaticRegister.h>\n#include <xlOil/Preprocessor.h>\n\nusing std::wstring;\n\nnamespace xloil\n{\n#define XLOCONCAT_NARGS 10\n#define XLOCONCAT_ARG_NAME strings\n\n  XLO_FUNC_START( xloConcat(\n    const ExcelObj& separator, \n    XLO_DECLARE_ARGS(XLOCONCAT_NARGS, XLOCONCAT_ARG_NAME)\n    )\n  )\n  {\n    wstring result;\n     \n    if (separator.isMissing())\n    {\n      ProcessArgs([&result](auto& argVal)\n      {\n        if (argVal.isNonEmpty())\n          result += argVal.get<std::wstring>();\n      }, XLO_ARGS_LIST(XLOCONCAT_NARGS, XLOCONCAT_ARG_NAME));\n    }\n    else\n    {\n      auto sep = separator.get<std::wstring>();\n      ProcessArgs([&result, &sep](auto& argVal)\n      {\n        if (argVal.isNonEmpty())\n          result += argVal.toStringRecursive(sep.c_str()) + sep;\n      }, XLO_ARGS_LIST(XLOCONCAT_NARGS, XLOCONCAT_ARG_NAME));\n      if (!result.empty())\n        result.erase(result.size() - sep.size());\n    }\n    return returnValue(result);\n  }\n  XLO_FUNC_END(xloConcat).threadsafe()\n    .help(L\"Concatenates strings. Non strings are converted to string, arrays are concatenated by row\")\n    .arg(L\"Separator\", L\"[opt] separator between strings\")\n    XLO_WRITE_ARG_HELP(XLOCONCAT_NARGS, XLOCONCAT_ARG_NAME, L\"Value or array of values to concatenate\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloFill.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StaticRegister.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START( \n    xloFill(\n      const ExcelObj* value, \n      const ExcelObj* nRows, \n      const ExcelObj* nCols)\n  )\n  {\n    auto strLen = value->stringLength();\n    auto nRowsVal = nRows->get<int>();\n    auto nColsVal = nCols->get<int>();\n\n    ExcelArrayBuilder builder(nRowsVal, nColsVal, strLen);\n\n    if (value->type() == ExcelType::Str)\n    {\n      auto pstr = builder.string(strLen);\n      pstr = value->cast<PStringRef>();\n      // Rather than copy the string for each array entry, we just pass\n      // the same pointer each time.\n      for (auto i = 0; i < nRowsVal; ++i)\n        for (auto j = 0; j < nColsVal; ++j)\n          builder(i, j).emplace_pstr(pstr.release());\n    }\n    else\n    {\n      for (auto i = 0; i < nRowsVal; ++i)\n        for (auto j = 0; j < nColsVal; ++j)\n          builder(i, j).assign(*value);\n    }\n\n    return returnValue(builder.toExcelObj());\n  }\n  XLO_FUNC_END(xloFill).threadsafe()\n    .help(L\"Creates an array of the specified size filled with the given value\")\n    .arg(L\"Value\", L\"The value to fill with, must be a single type e.g. int, string, etc.\")\n    .arg(L\"NumRows\")\n    .arg(L\"NumColumns\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloFillNA.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelObjCache.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START(\n    xloFillNA(\n      const ExcelObj* arrayOrRef,\n      const ExcelObj* value,\n      const ExcelObj* trim\n    )\n  )\n  {\n    if (!value->isType(ExcelType::ArrayValue))\n      XLO_THROW(\"Value must be a suitable type for an array element\");\n\n    const auto& array = cacheCheck(*arrayOrRef);\n    ExcelArray arr(array, trim->isMissing() ? true : trim->get<bool>());\n\n    const auto inplace = &array == arrayOrRef;\n\n    const auto nRows = arr.nRows();\n    const auto nCols = arr.nCols();\n\n    // If the value type is string we need to copy the array, otherwise\n    // we cheekily edit the input and pass it back to Excel. It seems \n    // that Excel copies the result before it frees in the input arguments.\n    // Need to check that this behaviour is guaranteed....\n    if (value->type() == ExcelType::Str)\n    {\n      auto valueStr = value->cast<PStringRef>();\n\n      // Rather than copy the string for each array entry, we just pass\n      // the same pointer each time, so the total string length is \n      // just the length of the fill value.\n      ExcelArrayBuilder builder(nRows, nCols, valueStr.length());\n\n      // Set up the string data in the array memory space.\n      auto arrayStr = builder.string(valueStr.length());\n      arrayStr = valueStr;\n\n      const auto arrayNumBytes = nRows * nCols * sizeof(ExcelObj);\n\n      // Do a byte-wise copy of the entire array data - this should\n      // be very fast. It means that string values will be pointing\n      // to memory Excel allocated for the input argument, but when\n      // we delete an array in xlOil, we don't recursively free over\n      // each element so we won't double delete.\n      memcpy_s(builder.data(), arrayNumBytes,\n        array.val.array.lparray, arrayNumBytes);\n\n      // Now replace all N/As with the specified value.\n      for (auto i = 0u; i < nRows; ++i)\n        for (auto j = 0u; j < nCols; ++j)\n          if (arr.at(i, j).isNA())\n            builder(i, j).emplace_pstr(arrayStr.release());\n\n      return returnValue(builder.toExcelObj());\n    }   \n    else if (inplace)\n    {\n      // For non strings, we simply replace N/As with the specified value.\n      // ExcelArray is a view, so we const_cast to change the underlying data\n      for (auto i = 0u; i < nRows; ++i)\n        for (auto j = 0u; j < nCols; ++j)\n          if (arr.at(i, j).isNA() || arr.at(i, j).isMissing())\n            const_cast<ExcelObj&>(arr(i, j)) = *value;\n\n      return const_cast<ExcelObj*>(arrayOrRef);\n    }\n    else\n    {\n      // If not \"inplace\" we're filling a cache object. We know the strings in this\n      // object will outlive the return value, so it's safe to call 'memcpy' to\n      // do a fast bitwise copy, leaving the strings pointed at the cache object.\n      ExcelArrayBuilder builder(nRows, nCols);\n\n      const auto arrayNumBytes = nRows * nCols * sizeof(ExcelObj);\n\n      memcpy_s(builder.data(), arrayNumBytes,\n        array.val.array.lparray, arrayNumBytes);\n\n      // Now replace all N/As with the specified value. Note the builder\n      // and our newArray both point to the same underlying data\n      for (auto i = 0u; i < nRows; ++i)\n        for (auto j = 0u; j < nCols; ++j)\n          if (arr.at(i, j).isNA())\n            builder(i, j) = *value;\n\n      return returnValue(builder.toExcelObj());\n    }\n  }\n  XLO_FUNC_END(xloFillNA).threadsafe()\n    .help(L\"Replaces #N/As in the given array with a specifed value\")\n    .arg(L\"Value\", L\"The value to fill with, must be a single type e.g. int, string, etc.\")\n    .arg(L\"Array\", L\"The array containing #N/As\")\n    .optArg(L\"Trim\", L\"(true) Specifies whether the array should be trimmed to the last row \"\n      \"and column containing a non-#N/A and non-empty string value.\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloIndex.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelObjCache.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START(\n    xloIndex(\n      const ExcelObj& inArrayOrRef,\n      const ExcelObj& inFromRow,\n      const ExcelObj& inFromCol,\n      const ExcelObj& inToRow,\n      const ExcelObj& inToCol)\n  )\n  {\n    // TODO: handle range\n\n    ExcelArray array(cacheCheck(inArrayOrRef));\n    auto fromRow = inFromRow.get<int>(1);         \n    auto fromCol = inFromCol.get<int>(1);\n\n    if (fromRow > 0)\n      --fromRow;\n    else \n      fromRow += array.nRows();\n\n    if (fromCol > 0)\n      --fromCol;\n    else \n      fromCol += array.nCols();\n\n    // If only the first three arguments are supplied, behave like the INDEX function\n    if (inToRow.isMissing() && inToCol.isMissing())\n    {\n      if (inFromCol.isMissing())\n        return returnValue(array.slice(fromRow, 0, fromRow + 1, array.nCols()).toExcelObjUnsafe());\n      else if (inFromRow.isMissing())\n        return returnValue(array.slice(0, fromCol, array.nRows(), fromCol + 1).toExcelObjUnsafe());\n      else\n        return returnValue(array(fromRow, fromCol));\n    }\n\n    int toRow, toCol;\n\n    if (inToRow.isMissing())\n      toRow = fromRow + 1;\n    else\n    {\n      toRow = inToRow.get<int>();\n      if (toRow > 0) --toRow;\n    }\n\n    if (inToCol.isMissing())\n      toCol = fromCol + 1;\n    else\n    {\n      toCol = inToCol.get<int>();\n      if (toCol > 0) --toCol;\n    }\n\n    const auto slice = array.slice(\n      fromRow, fromCol, \n      toRow == 0 ? array.nRows() : toRow,\n      toCol == 0 ? array.nCols() : toCol);\n\n    return returnValue(slice.toExcelObjUnsafe());\n  }\n  XLO_FUNC_END(xloIndex).threadsafe()\n    .help(L\"Extends the INDEX function to xlOil refs and sub-arrays. Indices are 1-based. \"\n          L\"Returns a single value if exactly FromRow and ToRow are given. Returns a\"\n          L\"column or row array if one is given. Returns a subarray if ToRow or ToCol\"\n          L\"are also given.\")\n    .arg(L\"ArrayOrRef\", L\"A range/array or an xlOil ref\")\n    .optArg(L\"FromRow\", L\"Starting row. If negative, counts back from last row. If ommitted, the entire column is returned\")\n    .optArg(L\"FromCol\", L\"Starting column. If negative, counts back from last column. If ommitted, the entire row is returned\")\n    .optArg(L\"ToRow\", L\"End row, not inclusive. If omitted uses FromRow+1 if FromRow was gven. \"\n                      L\"Zero is the last row.If negative, counts back from last row\")\n    .optArg(L\"ToCol\", L\"End column, not inclusive. If omitted uses FromCol+1 if FromCol was given. \"\n                      L\"Zero is the last column. If negative, counts back from last column\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloPad.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelObjCache.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START(\n    xloPad(const ExcelObj* arrayOrRef)\n  )\n  {\n    const auto& array = cacheCheck(*arrayOrRef);\n    ExcelArray arr(array);\n    const auto nCols = arr.nCols();\n    const auto nRows = arr.nRows();\n\n    if (nCols > 1 && nRows > 1)\n      return const_cast<ExcelObj*>(&array);\n\n    size_t strLen = 0u;\n    for (auto& x : arr)\n      strLen += x.stringLength();\n\n    ExcelArrayBuilder builder(nRows, nCols, strLen, true);\n\n    for (auto i = 0u; i < nRows; ++i)\n      for (auto j = 0u; j < nCols; ++j)\n        builder(i, j) = arr(i, j);\n\n    return returnValue(builder.toExcelObj());\n  }\n  XLO_FUNC_END(xloPad).threadsafe()\n    .help(L\"Returns at array with at least two rows and two columns, padded with #N/A\")\n    .arg(L\"Array\", L\"The array or single value\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloRegex.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xlOil/Range.h>\n#include <xloil/StaticRegister.h>\n#include <xlOil/Preprocessor.h>\n#include <xloil/ExcelObjCache.h>\n#include \"RegexHelpers.h\"\n\nusing std::wstring;\nusing std::vector;\nusing std::wstring_view;\n\nnamespace xloil\n{\n  namespace\n  {\n    template<class TStr>\n    auto doMatch(const TStr& str, const std::wregex& regex, \n      std::wcmatch& results, bool isMatch)\n    {\n      return isMatch\n        ? std::regex_match(\n          str.begin(), str.end(),\n          results, regex)\n        : std::regex_search(\n          str.begin(), str.end(),\n          results, regex);\n    }\n  }\n\n  XLO_FUNC_START(xloRegex(\n    const ExcelObj& stringOrArray,\n    const ExcelObj& searchRegex,\n    const ExcelObj& replaceExpr,\n    const ExcelObj& wholeString,\n    const ExcelObj& ignoreCase,\n    const ExcelObj& grammar\n  ))\n  {\n    const auto isMatch = wholeString.get<bool>(false);\n\n    auto regexOptions = parseRegexGrammar(grammar.cast<PStringRef>());\n    if (ignoreCase.get<bool>(false))\n      regexOptions |= std::regex_constants::icase;\n\n    const std::wregex expression(searchRegex.toString(), regexOptions);\n\n    const auto replaceExpression = replaceExpr.toString();\n    const auto doReplace = !replaceExpression.empty();\n\n    const auto nGroups = expression.mark_count();\n    const auto& input = cacheCheck(stringOrArray);\n\n    const auto notStringValue = nGroups == 0\n      ? ExcelObj(false)\n      : ExcelObj(CellError::NA);\n\n    if (input.isType(ExcelType::Multi))\n    {\n      ExcelArray inputArray(input);\n      if (inputArray.dims() != 1)\n        XLO_THROW(\"Input array must be 1-dim\");\n\n      // Orient output array consistent with input\n      const bool byRow = inputArray.nCols() == 1;\n\n      // Do first parse to determine string length\n      auto totalStrLength = 0u;\n      for (auto& val : inputArray)\n        if (val.isType(ExcelType::Str))\n          totalStrLength += val.cast<PStringRef>().length();\n\n      // Output array has 1 field if a replace string or no capture groups\n      // have be specified, else one field per capture group\n      const auto outputWidth = (doReplace || nGroups == 0) ? 1 : nGroups;\n\n      ExcelArrayBuilder builder(\n        byRow ? inputArray.size() : outputWidth,\n        byRow ? outputWidth : inputArray.size(),\n        totalStrLength);\n\n      // We may not write to every cell, so need to initialise\n      builder.fillNA();\n\n      auto k = 0u;\n      for (const auto& val : inputArray)\n      {\n        // First row/column entry\n        auto writePosition = byRow ? builder(k, 0) : builder(0, k);\n\n        if (val.isType(ExcelType::Str))\n        {\n          const auto pStr = val.cast<PStringRef>();\n\n          std::wcmatch matchResults;\n          const auto success = doMatch(pStr, expression, matchResults, isMatch);\n          const auto N = matchResults.size();\n\n          if (nGroups == 0)\n            writePosition = success;\n          else if (success)\n          {\n            assert(N > 1);\n\n            if (doReplace)\n              writePosition = matchResults.format(replaceExpression);\n            else if (byRow)\n              for (size_t j = 1; j < N; ++j)\n                builder(k, j - 1) = strView(matchResults[j]);\n            else\n              for (size_t i = 1; i < N; ++i)\n                builder(i - 1, k) = strView(matchResults[i]);\n          }\n        }\n        else\n        {\n          writePosition = notStringValue;\n        }\n        ++k;\n      }\n\n      return returnValue(builder.toExcelObj());\n    }\n    else if (input.isType(ExcelType::Str))\n    {\n      const auto pStr = input.cast<PStringRef>();\n      std::wcmatch matchResults;\n\n      const auto success = doMatch(pStr, expression, matchResults, isMatch);\n\n      const auto N = (ExcelObj::row_t)matchResults.size();\n\n      if (nGroups == 0)\n        return returnValue(success);\n      else if (!success)\n        return returnValue(CellError::NA);\n      else if (doReplace)\n        return returnValue(matchResults.format(replaceExpression));\n\n      assert(N > 1);\n\n      ExcelArrayBuilder builder(N - 1, 1, pStr.length());\n      for (ExcelObj::row_t i = 1; i < N; ++i)\n        builder(i - 1) = strView(matchResults[i]);\n\n      return returnValue(builder.toExcelObj());\n    }\n    else\n      return returnValue(notStringValue);\n  }\n  XLO_FUNC_END(xloRegex).threadsafe()\n    .help(L\"Matches the given regex against provided string(s). Default syntax is ECMA\")\n    .arg(L\"String\", L\"String or 1-d array of strings. The output orientation will match the input.\")\n    .arg(L\"Search\", L\"Search regex. If no capture groups are defined, the function ouputs match success: TRUE/FALSE\")\n    .optArg(L\"Replace\", L\"If provided, defines the output string using capture groups, e.g '$1-$2'. If empty, one capture group is output per row/column\")\n    .optArg(L\"WholeString\", L\"(false) If true, regex much match entire string, else string is searched for pattern\")\n    .optArg(L\"IgnoreCase\", L\"(false) Determines if letters match either case\")\n    .optArg(L\"Grammar\", _GrammerHelp);\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloSearch.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xlOil/Range.h>\n#include <xloil/StaticRegister.h>\n#include <xlOil/Preprocessor.h>\n#include <xloil/ExcelObjCache.h>\n#include \"RegexHelpers.h\"\n\nusing std::wstring;\nusing std::vector;\nusing std::wstring_view;\n\nnamespace xloil\n{\n  XLO_FUNC_START(xloSearch(\n    const ExcelObj& string,\n    const ExcelObj& searchRegex,\n    const ExcelObj& replaceExpr,\n    const ExcelObj& ignoreCase,\n    const ExcelObj& grammar\n  ))\n  {\n    const auto& input = cacheCheck(string);\n    if (!input.isType(ExcelType::Str))\n      return returnValue(CellError::NA);\n\n    auto regexOptions = parseRegexGrammar(grammar.cast<PStringRef>());\n    if (ignoreCase.get<bool>(false))\n      regexOptions |= std::regex_constants::icase;\n\n    const std::wregex expression(searchRegex.toString(), regexOptions);\n\n    const auto giveIndices = replaceExpr.getIf<double>() == -1;\n    const auto replaceExpression = giveIndices ? wstring() : replaceExpr.toString();\n    const auto doReplace = !replaceExpression.empty();\n\n    const auto nGroups = expression.mark_count();\n    \n    const auto pStr = input.cast<PStringRef>();\n\n    vector<std::wcmatch> matchResults;\n    size_t totalStrLength = 0;\n    auto beginIterator = std::wcregex_iterator(pStr.begin(), pStr.end(), expression);\n    auto endIterator = std::wcregex_iterator();\n    for (auto i = beginIterator; i != endIterator; ++i)\n    {\n      matchResults.push_back(*i);\n      totalStrLength += (size_t)i->length();\n    }\n\n    const auto N = (ExcelObj::row_t)matchResults.size();\n    if (N == 0)\n      return returnValue(CellError::NA);\n\n    const auto width = doReplace ? 1 : (nGroups == 0 ? 1 : nGroups);\n    ExcelArrayBuilder builder(N, width, giveIndices ? 0 : totalStrLength);\n\n    if (doReplace)\n    {\n      for (ExcelObj::row_t i = 0; i < N; ++i)\n        builder(i, 0) = matchResults[i].format(replaceExpression);\n    }\n    else if (nGroups > 0)\n    {\n      if (giveIndices)\n      {\n        for (ExcelObj::row_t i = 0; i < N; ++i)\n          for (size_t j = 0; j < nGroups; ++j)\n            builder(i, j) = matchResults[i][j + 1].first - pStr.begin();\n      }\n      else\n      {\n        for (ExcelObj::row_t i = 0; i < N; ++i)\n          for (size_t j = 0; j < nGroups; ++j)\n            builder(i, j) = strView(matchResults[i][j + 1]);\n      }\n    }\n    else \n    {\n      if (giveIndices)\n      {\n        for (ExcelObj::row_t i = 0; i < N; ++i)\n          builder(i, 0) = strView(matchResults[i][0]);\n      }\n      else\n      {\n        for (ExcelObj::row_t i = 0; i < N; ++i)\n          builder(i, 0) = matchResults[i][0].first - pStr.begin();\n      }\n    }\n\n    return returnValue(builder.toExcelObj());\n      \n  }\n  XLO_FUNC_END(xloSearch).threadsafe()\n    .help(L\"Matches the given regex to provided strings. Default syntax is ECMA\")\n    .arg(L\"String\", L\"String or 1-d array of strings. The output orientation will match the input.\")\n    .arg(L\"Search\", L\"Search regex. If no capture groups are defined, the function ouputs match success TRUE/FALSE\")\n    .optArg(L\"Replace\", L\"Defines the output string using capture groups. If empty, one capture group is shown per column. If -1, indices are output\")\n    .optArg(L\"IgnoreCase\", L\"(false) Determines if letters match either case\")\n    .optArg(L\"Grammar\", _GrammerHelp);\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloSort.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StaticRegister.h>\n#include <xlOil/Preprocessor.h>\n#include <xloil/ExcelObjCache.h>\n#include <algorithm>\n#include <numeric>\n#include <array>\n\nusing std::array;\nusing std::vector;\n\nnamespace xloil\n{\n#define XLOSORT_NARGS 8\n#define XLOSORT_ARG_NAME colOrHeading\n  namespace\n  {\n    enum SortDirection\n    {\n      Descending    = 1 << 0,\n      CaseSensitive = 1 << 1,\n      StopSearch    = 1 << 2\n    };\n\n    using MyArray = array<ExcelArray::col_t, XLOSORT_NARGS + 1>;\n\n    // TOOD: template<int N>\n    struct LessThan\n    {\n      LessThan(const ExcelArray& data, const MyArray& directions, const MyArray& columns)\n        : _data(data)\n        , _directions(directions)\n        , _columns(columns)\n      {}\n      bool operator()(const ExcelObj::row_t left, const ExcelObj::row_t right)\n      {\n        ExcelObj::row_t i = 0;\n        while (_directions[i] != StopSearch)\n        {\n          bool cased = _directions[i] & CaseSensitive;\n          auto cmp = ExcelObj::compare(\n            _data.at(left, _columns[i]), \n            _data.at(right, _columns[i]), \n            cased);\n          if (cmp != 0)\n            return (_directions[i] & Descending) == 0 ? cmp < 0 : cmp > 0;\n          ++i;\n        }\n        return false;\n      }\n      const MyArray& _directions;\n      const MyArray& _columns;\n      const ExcelArray& _data;\n    };\n\n    void swapmem(size_t* a, size_t* b, size_t nBytes)\n    {\n      const auto end = (size_t*)((char*)a + nBytes);\n\n      for (; a < end; ++a, ++b)\n      {\n        const auto t = *a;\n        *a = *b;\n        *b = t;\n      }\n    }\n  }\n\n  XLO_FUNC_START(\n    xloSort(\n      const ExcelObj* arrayOrRef,\n      const ExcelObj* order,\n      XLO_DECLARE_ARGS(XLOSORT_NARGS, XLOSORT_ARG_NAME)\n    )\n  )\n  {\n    // TODO: want to optionally take an array ref, but we sort in-place so need to make a copy!\n    const ExcelObj& array = cacheCheck(*arrayOrRef);\n    ExcelArray arr(array);\n    const auto nRows = arr.nRows();\n    const auto nCols = arr.nCols();\n\n    // Anything to do?\n    if (nRows < 2 || nCols == 0)\n      return const_cast<ExcelObj*>(&array);\n\n    // If we are not using a cache object, we can sort inplace on the input: \n    // Excel doesn't seem to mind.\n    const bool inplace = &array == arrayOrRef;\n\n    const ExcelObj* args[] = { XLO_ARG_PTRS(XLOSORT_NARGS, XLOSORT_ARG_NAME) };\n\n    // could use raw pascal str, but that's an unnecessary optimisation\n    auto orderStr = order->get<std::wstring>(); \n\n    MyArray directions, columns;\n\n    // Default sort order is left to right on columns\n    std::iota(columns.begin(), columns.end(), 0);\n\n    auto c = orderStr.begin();\n    bool hasHeadings = false;\n    size_t nOrders = 0;\n\n    // If no orders provided, sort ascending (the default)\n    if (c == orderStr.end())\n      nOrders = 1;\n\n    for (; nOrders < directions.size() - 1; ++nOrders, ++c)\n    {\n      while (c != orderStr.end() && iswspace(*c)) ++c;\n      if (c == orderStr.end())\n        break;\n\n      auto& direction = directions[nOrders];\n      direction = 0;\n      switch (*c)\n      {\n      case L'A':\n        direction |= CaseSensitive;\n      case L'a':\n        break;\n      case L'D':\n        direction |= CaseSensitive;\n      case L'd':\n        direction |= Descending;\n        break;\n      default:\n        XLO_THROW(\"Direction must be one of {A, a, D, d}\");\n      }\n\n      const auto* arg = args[nOrders];\n      auto& column = columns[nOrders];\n\n      switch (arg->type())\n      {\n      case ExcelType::Int:\n      case ExcelType::Num:\n        column = arg->get<int>() - 1; // 1-based column indexing to match Excel's INDEX function etc.\n        if (column >= nCols)\n          XLO_THROW(\"Column number in descriptor {0} is beyond number of array columns: {1} > {2}\", \n            nOrders, column + 1, nCols);\n        break;\n      case ExcelType::Str:\n        hasHeadings = true;\n        column = nCols;\n        for (auto j = 0u; j < nCols; ++j)\n          if (*arg == arr(0, j))\n          {\n            column = j;\n            break;\n          }\n        if (column == nCols)\n          XLO_THROW(L\"Could not find heading {0} in first row of array\", arg->get<std::wstring>());\n        break;\n      case ExcelType::Missing:\n        // No need to specify descriptor: can rely on default ordering\n        break;\n      default:\n        XLO_THROW(\"Column descriptor {0} must be a column number or heading\", nOrders);\n      }\n    }\n    directions[nOrders] = StopSearch;\n\n    using row_t = ExcelArray::row_t;\n    using col_t = ExcelArray::col_t;\n\n    vector<row_t> indices(nRows);\n    std::iota(indices.begin(), indices.end(), 0);\n\n    std::sort(indices.begin() + (hasHeadings ? 1 : 0), indices.end(),\n      LessThan(arr, directions, columns));\n\n\n    if (inplace)\n    {\n      // For an inplace sort, we note the indices array contains\n      // the inverse of the permutation we need to apply to the rows\n      // so we just step through each cycle, applying transpositions.\n      // We mark moved rows with npos\n      const auto npos = row_t(-1);\n      row_t start = 0;\n      while (true)\n      {\n        while (start < indices.size() && indices[start] == npos) ++start;\n        if (start == indices.size())\n          break;\n\n        row_t k = start;\n        while (true)\n        {\n          const auto r = indices[k];\n          indices[k] = npos;\n          if (r == start)\n            break;\n          swapmem(\n            (size_t*)arr.row_begin(k),\n            (size_t*)arr.row_begin(r),\n            nCols * sizeof(ExcelObj));\n          k = r;\n        }\n      }\n\n      return const_cast<ExcelObj*>(&array);\n    }\n    else\n    {\n      // If not \"inplace\" we're sorting a cache object. We know the strings in this\n      // object will outlive the return value, so it's safe to call 'take'\n      ExcelArrayBuilder builder(nRows, nCols);\n      for (row_t i = 0; i < nRows; ++i)\n      {\n        auto iRow = indices[i];\n        for (col_t j = 0; j < nCols; ++j)\n          builder(i, j).take(const_cast<ExcelObj&&>(arr(iRow, j)));\n      }\n      return returnValue(builder.toExcelObj());\n    }\n  }\n  XLO_FUNC_END(xloSort).threadsafe()\n    .help(L\"Sorts an array by one or more columns. If column headings are specified the first row is \"\n      \"not moved. The `Order` should contain one character for each column specified for sorting\")\n    .arg(L\"Array\", L\"\")\n    .arg(L\"Order\", L\"a = ascending, A = ascending case-sensitive, d = descending, D = descending \"\n      \"case-sensitive, whitespace ignored\")\n    XLO_WRITE_ARG_HELP(XLOSORT_NARGS, XLOSORT_ARG_NAME, L\"Column number (1-based) or column heading\");\n}"
  },
  {
    "path": "libs/xlOil_Utils/xloSplit.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xlOil/Range.h>\n#include <xloil/StaticRegister.h>\n#include <xlOil/Preprocessor.h>\n#include <xloil/ExcelObjCache.h>\n\nusing std::wstring;\nusing std::vector;\n\nnamespace xloil\n{\n  namespace\n  {\n    void findSplitPoints(\n      vector<wchar_t>& found, \n      BasicPStringRef<wchar_t>& input,  // This string will be modified!\n      const wstring& sep,\n      const bool consecutiveAsOne)\n    {\n      const auto view = input.view();\n      auto pstr = input.data();\n      const auto length = pstr[0];\n\n      size_t prev = 0, next;\n      while ((next = view.find(sep.c_str(), prev)) != wstring::npos)\n      {\n        *pstr = (wchar_t)(next - prev);\n        found.push_back((wchar_t)prev);\n\n        if (consecutiveAsOne)\n        {\n          while (sep.find(view[next]) != wstring::npos)\n            if (++next == view.size())\n              break;\n        }\n        else\n          ++next;\n        pstr += (next - prev);\n        prev = next;\n      }\n\n      // Add suffix\n      *pstr = length - (wchar_t)prev;\n      found.push_back((wchar_t)prev);\n    }\n  }\n\n  XLO_FUNC_START(xloSplit(\n    const ExcelObj& stringOrArray,\n    const ExcelObj& separators,\n    const ExcelObj& consecutiveAsOne\n  ))\n  {\n    // Note this functon relies on the currently observed fact that \n    // Excel doesn't mind if we modify the input data a little bit,\n    // then pass it back as the return value to avoid copies. That \n    // is, Excel appears to copy the function result before freeing the\n    // memory associated with the inputs.\n    const auto consecutive = consecutiveAsOne.get<bool>(true);\n    const auto sep = separators.toString();\n\n    const auto& input = cacheCheck(stringOrArray);\n\n    if (input.isType(ExcelType::Multi))\n    {\n      ExcelArray inputArray(input);\n      if (inputArray.dims() != 1)\n        XLO_THROW(\"Input array must be 1-dim\");\n\n      // Location of the sub-string start points\n      vector<vector<wchar_t>> found(inputArray.size());\n      size_t totalStrLength = 0, maxTokens = 1;\n      size_t iVal = 0;\n      for (auto& val : inputArray)\n      {\n        if (val.isType(ExcelType::Str))\n        {\n          auto pStr = val.cast<PStringRef>().remove_const();\n          totalStrLength += pStr.length();\n          findSplitPoints(found[iVal], pStr, sep, consecutive);\n          maxTokens = std::max(maxTokens, found[iVal].size());\n        }\n        ++iVal;\n      }\n\n      // Orient output array consistent with input\n      bool byRow = inputArray.nCols() == 1;\n\n      ExcelArrayBuilder builder(\n        byRow ? inputArray.size() : (int)maxTokens, \n        byRow ? (int)maxTokens : inputArray.size(),\n        totalStrLength);\n\n      // We don't intend to write to every cell, so need to initialise\n      builder.fillNA();\n\n      if (byRow)\n      {\n        for (size_t i = 0; i < found.size(); ++i)\n        {\n          if (found[i].empty()) // No tokens or was not a string\n            builder(i, 0) = inputArray(i);\n          else\n          {\n            // We are actually taking a pointer to part of the input string,\n            // pretending we 'own' it, then emplacing the resulting ExcelObj\n            // in the builder to avoid a copy. The emplacement uses move ctors\n            // so the PString dtor will not be called on the 'owned' sub-string\n            auto pStr = inputArray(i).cast<PStringRef>().remove_const();\n            for (size_t j = 0; j < found[i].size(); ++j)\n              builder(i, j).emplace_pstr(pStr.data() + found[i][j]);\n          }\n        }\n      }\n      else\n      {\n        for (size_t i = 0; i < found.size(); ++i)\n        {\n          if (found[i].empty()) // No tokens or was not a string\n            builder(0, i) = inputArray(i);\n          else\n          {\n            auto pStr = inputArray(i).cast<PStringRef>().remove_const();\n            for (size_t j = 0; j < found[i].size(); ++j)\n              builder(j, i).emplace_pstr(pStr.data() + found[i][j]);\n          }\n        }\n      }\n\n      return returnValue(builder.toExcelObj());\n    }\n    else if (input.isType(ExcelType::Str))\n    {\n      vector<wchar_t> found;\n\n      auto pStr = input.cast<PStringRef>().remove_const();\n      findSplitPoints(found, pStr, sep, consecutive);\n\n      ExcelArrayBuilder builder((uint32_t)found.size(), 1, pStr.length());\n      for (size_t i = 0; i < found.size(); ++i)\n        builder(i).emplace_pstr(pStr.data() + found[i]);\n\n      return returnValue(builder.toExcelObj());\n    }\n    else // Not a string or array, so do not modify\n      return returnValue(input);\n  }\n  XLO_FUNC_END(xloSplit).threadsafe()\n    .help(L\"Splits a string or array of strings on a given separator. The array must be\"\n           \"1-dim.\")\n    .arg(L\"String\", L\"String or array of strings. Any non-strings will be unmodified\")\n    .arg(L\"Separators\", L\"Separators between strings: each character is interpreted \"\n                         \"as a distinct separator\")\n    .optArg(L\"ConsecutiveAsOne\", L\"(true) Treat consecutive delimiters as one\");\n}"
  },
  {
    "path": "src/BuildPaths.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"UserMacros\">\n    <xlOilRoot>$(SolutionDir)</xlOilRoot>\n  </PropertyGroup>\n  <PropertyGroup>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n\t<IntDir>$(xlOilRoot)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "src/Common.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"Globals\">\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <LibraryPath>$(xlOilRoot)\\external\\Excel2013SDK\\LIB\\$(Platform);$(SolutionDir)build\\$(Platform)\\$(Configuration);$(LibraryPath)</LibraryPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <IncludePath>$(xlOilRoot)external\\boost-1.67;$(xlOilRoot)external\\Excel2013SDK\\INCLUDE;$(xlOilRoot)external\\tomlplusplus\\include;$(xlOilRoot)external\\spdlog\\include;$(xlOilRoot)external;$(xlOilRoot)include;$(xlOilRoot)src;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;SPDLOG_COMPILED_LIB;_DISABLE_CONSTEXPR_MUTEX_CONSTRUCTOR;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <LanguageStandard>stdcpp17</LanguageStandard>\n      <DisableSpecificWarnings>4251</DisableSpecificWarnings>\n      <ConformanceMode>false</ConformanceMode>\n      <UseStandardPreprocessor>false</UseStandardPreprocessor>\n      <WarningLevel>Level4</WarningLevel>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup />\n</Project>"
  },
  {
    "path": "src/Debug.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <WarningLevel>Level4</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup />\n</Project>"
  },
  {
    "path": "src/Release.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ImportGroup Label=\"PropertySheets\" />\n  <PropertyGroup Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <MultiProcessorCompilation>true</MultiProcessorCompilation>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>\n\t  <SetChecksum>true</SetChecksum>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup />\n</Project>"
  },
  {
    "path": "src/external/asmjit.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\asmjit.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\arch.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\assembler.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\build.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\builder.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\callconv.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\codebufferwriter_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\codeholder.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\compiler.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\constpool.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\cpuinfo.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\datatypes.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\emitter.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\features.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\func.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\globals.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\inst.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\jitallocator.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\jitruntime.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\logging.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\misc_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\operand.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\osutils.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\raassignment_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\rabuilders_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\radefs_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\ralocal_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\rapass_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\rastack_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\string.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\support.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\target.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\type.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\virtmem.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zone.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonehash.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonelist.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonestack.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonestring.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonetree.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonevector.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86assembler.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86builder.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86callconv_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86compiler.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86emitter.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86features.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86globals.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86instapi_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86instdb.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86instdb_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86internal_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86logging_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86opcode_p.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86operand.h\" />\n    <ClInclude Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86rapass_p.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\arch.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\assembler.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\builder.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\callconv.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\codeholder.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\compiler.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\constpool.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\cpuinfo.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\emitter.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\func.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\globals.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\inst.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\jitallocator.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\jitruntime.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\logging.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\operand.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\osutils.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\ralocal.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\rapass.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\rastack.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\string.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\support.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\target.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\type.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\virtmem.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zone.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonehash.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonelist.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonestack.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonetree.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\core\\zonevector.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86assembler.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86builder.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86callconv.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86compiler.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86features.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86instapi.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86instdb.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86internal.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86logging.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86operand.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\asmjit\\src\\asmjit\\x86\\x86rapass.cpp\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{164AF267-092E-441D-8BF0-2ACF18E9ADFD}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>asmjit</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>ASMJIT_STATIC;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PrecompiledHeaderFile />\n      <PrecompiledHeaderOutputFile />\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>ASMJIT_STATIC;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PrecompiledHeaderFile />\n      <PrecompiledHeaderOutputFile />\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>ASMJIT_STATIC;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PrecompiledHeaderFile />\n      <PrecompiledHeaderOutputFile />\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>ASMJIT_STATIC;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <PrecompiledHeaderFile />\n      <PrecompiledHeaderOutputFile />\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "src/external/rdcfswatcher.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\external\\rdcfswatcher\\rdc_fs_watcher.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\external\\rdcfswatcher\\rdc_fs_watcher.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>16.0</VCProjectVersion>\n    <Keyword>Win32Proj</Keyword>\n    <ProjectGuid>{94cb9502-b5a4-473d-8a2e-4a67950049b6}</ProjectGuid>\n    <RootNamespace>rdcfswatcher</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>\n      </SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>\n      </SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>\n      </SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <ConformanceMode>true</ConformanceMode>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <PrecompiledHeaderFile>\n      </PrecompiledHeaderFile>\n    </ClCompile>\n    <Link>\n      <SubSystem>\n      </SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/external/spdlog.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}</ProjectGuid>\n    <RootNamespace>spdlog</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <IncludePath>$(SolutionDir)\\external\\spdlog\\include;$(IncludePath)</IncludePath>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <IncludePath>$(SolutionDir)\\external\\spdlog\\include;$(IncludePath)</IncludePath>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <IncludePath>$(SolutionDir)\\external\\spdlog\\include;$(IncludePath)</IncludePath>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <IncludePath>$(SolutionDir)\\external\\spdlog\\include;$(IncludePath)</IncludePath>\n    <OutDir>$(SolutionDir)build\\$(Platform)\\$(Configuration)\\</OutDir>\n    <IntDir>$(SolutionDir)build\\obj\\$(ProjectName)_$(Platform)_$(Configuration)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <PreprocessorDefinitions>SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_WCHAR_FILENAMES;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <PreprocessorDefinitions>SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_WCHAR_FILENAMES;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <PreprocessorDefinitions>SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_WCHAR_FILENAMES;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <SDLCheck>true</SDLCheck>\n      <ConformanceMode>true</ConformanceMode>\n      <PreprocessorDefinitions>SPDLOG_COMPILED_LIB;SPDLOG_WCHAR_TO_UTF8_SUPPORT;SPDLOG_WCHAR_FILENAMES;_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\external\\spdlog\\src\\async.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\spdlog\\src\\color_sinks.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\spdlog\\src\\file_sinks.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\spdlog\\src\\fmt.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\spdlog\\src\\spdlog.cpp\" />\n    <ClCompile Include=\"..\\..\\external\\spdlog\\src\\stdout_sinks.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/xlOil/Interface.cpp",
    "content": "#include <xlOil/Interface.h>\n#include <xlOil-XLL/FuncRegistry.h>\n#include <xlOil-Dynamic/LocalFunctions.h>\n#include <xlOil/ObjectCache.h>\n#include <xlOilHelpers/Settings.h>\n#include <xlOil/Log.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/Loaders/AddinLoader.h>\n#include <xlOil/Loaders/PluginLoader.h>\n#include <xloil/State.h>\n#include <xlOilHelpers/GuidUtils.h>\n#include <xlOil-COM/Connect.h>\n#include <xlOil-COM/WorkbookScopeFunctions.h>\n#include <filesystem>\n#include <set>\n#define TOML_ABI_NAMESPACES 0\n#include <toml++/toml.h>\n\nusing std::make_pair;\nusing std::wstring;\nusing std::make_shared;\nusing std::shared_ptr;\nusing std::vector;\n\nnamespace fs = std::filesystem;\n\nnamespace\n{\n  template<class T, class U>\n  std::weak_ptr<T>\n    static_pointer_cast(std::weak_ptr<U> const& r)\n  {\n    return std::static_pointer_cast<T>(std::shared_ptr<U>(r.lock()));\n  }\n\n  // {9B8C6F9F-B0FF-46B7-8376-2A6DDECD1B5E}\n  static const GUID theXloilNamespace =\n    { 0x9b8c6f9f, 0xb0ff, 0x46b7, { 0x83, 0x76, 0x2a, 0x6d, 0xde, 0xcd, 0x1b, 0x5e } };\n}\n\nnamespace xloil\n{\n  AddinContext::AddinContext(\n    const std::wstring_view& pathName, \n    const std::shared_ptr<const toml::table>& settings,\n    const std::wstring_view& logFilePath)\n    : _settings(settings)\n    , _pathName(pathName)\n    , _logFilePath(logFilePath)\n  {\n  }\n\n  AddinContext::~AddinContext()\n  {}\n\n  void AddinContext::loadPlugins()\n  {\n    if (!settings())\n      return;\n\n    auto addinSettings = (*settings())[\"Addin\"];\n\n    auto pluginNames = Settings::plugins(addinSettings);\n\n    auto plugins = std::set<wstring>(pluginNames.cbegin(), pluginNames.cend());\n\n    const auto xllDir = fs::path(pathName()).remove_filename();\n    const auto coreDir = fs::path(Environment::coreDllPath()).remove_filename();\n\n    // If the settings specify a search pattern for plugins, \n    // find the DLLs and add them to our plugins collection\n    \n    auto searchPattern = Settings::pluginSearchPattern(addinSettings);\n    if (!searchPattern.empty())\n    {\n      WIN32_FIND_DATA fileData;\n\n      auto searchPath = xllDir / searchPattern;\n      auto fileHandle = FindFirstFile(searchPath.c_str(), &fileData);\n      if (fileHandle != INVALID_HANDLE_VALUE &&\n        fileHandle != (void*)ERROR_FILE_NOT_FOUND)\n      {\n        do\n        {\n          if (_wcsicmp(fileData.cFileName, Environment::coreDllName()) == 0)\n            continue;\n\n          plugins.emplace(fs::path(fileData.cFileName).stem());\n        } while (FindNextFile(fileHandle, &fileData));\n      }\n    }\n\n    for (auto& plugin : plugins)\n    {\n      if (loadPluginForAddin(*this, plugin))\n        _plugins.emplace_back(plugin);\n    }\n  }\n\n  void AddinContext::detachPlugins()\n  {\n    for (auto& plugin : _plugins)\n      detachPluginForAddin(*this, plugin);\n  }\n\n  void FuncSource::init()\n  {\n    if (!Environment::excelProcess().isEmbedded())\n      XLO_THROW(\"Function registration is only possible when xlOil is running inside Excel\");\n  }\n\n  FuncSource::~FuncSource()\n  {\n    if (_functions.empty())\n      return;\n\n    decltype(_functions) functions;\n    std::swap(_functions, functions);\n\n    runExcelThread([functions = std::move(functions)]()\n    {\n      for (auto& f : functions)\n        f.second->deregister();\n    }, ExcelRunQueue::XLL_API);\n  }\n\n  namespace\n  {\n    auto registerFunc(\n      std::map<std::wstring, std::shared_ptr<RegisteredWorksheetFunc>>& existingFuncs,\n      const shared_ptr<const WorksheetFuncSpec>& spec)\n    {\n      auto& name = spec->name();\n      auto iFunc = existingFuncs.find(name);\n      if (iFunc != existingFuncs.end())\n      {\n        auto& ptr = iFunc->second;\n\n        // Attempt to patch the function context to refer to the new function\n        if (ptr->reregister(spec))\n          return make_pair(ptr, true);\n\n        if (!ptr->deregister())\n          return make_pair(ptr, false);\n\n        existingFuncs.erase(iFunc);\n      }\n\n      auto ptr = xloil::registerFunc(spec);\n      return make_pair(ptr, !!ptr);\n    }\n  }\n\n  void FuncSource::registerFuncs(\n    const std::vector<std::shared_ptr<const WorksheetFuncSpec> >& funcSpecs,\n    const bool append)\n  {\n    runExcelThread([append, specs = funcSpecs, self = shared_from_this()]() mutable\n    {\n      auto& existingFuncs = self->_functions;\n      decltype(self->_functions) newFuncs;\n\n      for (auto& f : specs)\n      {\n        // If registration succeeds, just add the function to the new map\n        auto [ptr, success] = registerFunc(existingFuncs, f);\n\n        // If deregistration fails we have to keep the ptr or it will be orphaned\n        if (ptr)\n          newFuncs.emplace(f->name(), ptr);\n\n        if (success)\n          f.reset(); // Clear pointer in specs to indicate success\n      }\n\n      for (auto& f : specs)\n        if (f)\n          XLO_ERROR(L\"Registration failed for: {0}\", f->name());\n\n      if (append)\n        newFuncs.merge(existingFuncs);\n      self->_functions = newFuncs;\n    }, ExcelRunQueue::XLL_API);\n  }\n\n  bool FuncSource::deregister(const std::wstring& name)\n  {\n    auto iFunc = _functions.find(name);\n    if (iFunc != _functions.end())\n    {\n      runExcelThread([iFunc, self = this]()\n      {\n        if (iFunc->second->deregister())\n          self->_functions.erase(iFunc);\n      }, ExcelRunQueue::XLL_API);\n      return true;\n    }\n    return false;\n  }\n\n  std::vector<std::shared_ptr<const WorksheetFuncSpec>> FuncSource::functions() const\n  {\n    vector<shared_ptr<const WorksheetFuncSpec>> result;\n    for (auto& item : _functions)\n      result.push_back(item.second->spec());\n    return result;\n  }\n\n  std::pair<std::shared_ptr<FuncSource>, std::shared_ptr<AddinContext>>\n    AddinContext::findSource(const wchar_t* source)\n  {\n    for (auto& [addinName, addin] : currentAddinContexts())\n    {\n      auto found = addin->sources().find(source);\n      if (found != addin->sources().end())\n        return make_pair(found->second, addin);\n    }\n    return make_pair(shared_ptr<FuncSource>(), shared_ptr<AddinContext>());\n  }\n\n  FileSource::FileSource(\n    const wchar_t* sourcePath, bool watchFile)\n    : _sourcePath(sourcePath)\n    , _watchFile(watchFile)\n  {\n    const auto isUrl = wcsncmp(sourcePath, L\"http\", 4) == 0;\n    const auto separator = isUrl ? L'/' : L'\\\\';\n    auto lastSlash = wcsrchr(_sourcePath.c_str(), separator);\n    _sourceName = lastSlash ? lastSlash + 1 : _sourcePath.c_str();\n    // TODO: implement std::string _functionPrefix;\n    //_functionPrefix = toml::find_or<std::string>(*_settings, \"FunctionPrefix\", \"\");\n  }\n\n  FileSource::~FileSource()\n  {\n    XLO_DEBUG(L\"Deregistering functions in source '{0}'\", _sourcePath);\n  }\n\n  void FileSource::reload()\n  {}\n\n  void FileSource::init()\n  {\n    if (_watchFile)\n    {\n      auto path = fs::path(name());\n      auto dir = path.remove_filename();\n      if (!dir.empty())\n        _fileWatcher = Event::DirectoryChange(dir, false)->weakBind(\n          static_pointer_cast<FileSource>(weak_from_this()),\n          &FileSource::handleDirChange);\n    }\n\n    FuncSource::init();\n  }\n\n  LinkedSource::~LinkedSource()\n  {\n    if (!_localFunctions.empty())\n      clearLocalFunctions(_localFunctions);\n  }\n\n  void LinkedSource::registerLocal(\n    const std::vector<std::shared_ptr<const WorksheetFuncSpec>>& funcSpecs,\n    const bool append)\n  {\n    if (_workbookName.empty())\n      XLO_THROW(\"Need a linked workbook to declare local functions\");\n\n    // Local functions can be registered from any source (e.g. jupyter) but \n    // the linked source (the py file with the same name as the workbook) is\n    // special. If this is detected, the VBA module name is set to a special\n    // string and all other xlOil local function stubs are removed - we assume\n    // that the linked source is loaded before any other.\n    auto action = append ? LocalFuncs::APPEND_MODULE : LocalFuncs::REPLACE_MODULE;\n\n    if (_vbaModuleName.empty())\n    {\n      if (fs::path(filename()).stem() == fs::path(_workbookName).stem())\n      {\n        _vbaModuleName = wstring(theAutoGenModulePrefix) + L\"_linked__\";\n        action = LocalFuncs::CLEAR_MODULES;\n      }\n      else\n      {\n        // Limits: alphanumeric and underscore, 31 chars\n        _vbaModuleName = wstring(theAutoGenModulePrefix) + filename();\n\n        auto invalidChars = std::any_of(_vbaModuleName.begin(), _vbaModuleName.end(),\n          [](auto c) { return isalnum((int)c) == 0 && c != '.' && c != '_'; });\n\n        if (_vbaModuleName.size() > 31 || invalidChars)\n        {\n          GUID guid;\n          stableGuidFromString(guid, theXloilNamespace, filename());\n          _vbaModuleName = wstring(theAutoGenModulePrefix) + guidToWString(guid, GuidToString::BASE62);\n        }\n        else\n          std::replace(_vbaModuleName.begin(), _vbaModuleName.end(), L'.', L'_');\n      }\n    }\n\n    registerLocalFuncs(\n      _localFunctions, \n      _workbookName.c_str(), \n      funcSpecs, \n      _vbaModuleName.c_str(), \n      action);\n  }\n\n  void LinkedSource::init()\n  {\n    if (!linkedWorkbook().empty())\n    {\n      _workbookCloseHandler = Event::WorkbookAfterClose().weakBind(\n        static_pointer_cast<LinkedSource>(weak_from_this()),\n        &LinkedSource::handleClose);\n      _workbookRenameHandler = Event::WorkbookRename().weakBind(\n        static_pointer_cast<LinkedSource>(weak_from_this()),\n        &LinkedSource::handleRename);\n    }\n    FileSource::init();\n  }\n  namespace\n  {\n    // TODO: is this really necessary or is further refactoring needed?\n    void deleteSource(const std::shared_ptr<FuncSource>& context)\n    {\n      for (auto& [name, addinCtx] : currentAddinContexts())\n      {\n        auto found = addinCtx->sources().find(context->name());\n        if (found != addinCtx->sources().end())\n          addinCtx->erase(found->second);\n      }\n    }\n  }\n  void LinkedSource::handleClose(const wchar_t* wbName)\n  {\n    if (_wcsicmp(wbName, linkedWorkbook().c_str()) == 0)\n      deleteSource(shared_from_this());\n  }\n\n  void LinkedSource::handleRename(const wchar_t* wbName, const wchar_t* prevName)\n  {\n    if (_wcsicmp(prevName, linkedWorkbook().c_str()) == 0)\n      renameWorkbook(wbName);\n  }\n\n  void LinkedSource::renameWorkbook(const wchar_t* /*newName*/)\n  {\n  }\n\n  void FileSource::handleDirChange(\n    const wchar_t* /*dirName*/,\n    const wchar_t* fileName,\n    const Event::FileAction action)\n  {\n    // Nothing to do if filename does not mach\n    if (_wcsicmp(fileName, _sourceName) != 0)\n      return;\n    \n    // TODO: assert check that directory name matches (it should!)\n    runExcelThread([\n        self = std::static_pointer_cast<FileSource>(shared_from_this()),\n        action]()\n      {\n        switch (action)\n        {\n          case Event::FileAction::Modify:\n          {\n            XLO_INFO(L\"Module '{0}' modified, reloading.\", self->name().c_str());\n            self->reload();\n            break;\n          }\n          case Event::FileAction::Delete:\n          {\n            XLO_INFO(L\"Module '{0}' deleted/renamed, removing functions.\", self->name().c_str());\n            deleteSource(self);\n            break;\n          }\n        }\n      }, ExcelRunQueue::ENQUEUE);\n  }\n}"
  },
  {
    "path": "src/xlOil/Loaders/AddinLoader.cpp",
    "content": "#include \"AddinLoader.h\"\n#include <xlOil/Interface.h>\n#include <xlOil-XLL/FuncRegistry.h>\n#include <xlOilHelpers/Settings.h>\n#include <xlOil/Date.h>\n#include <xlOil/Loaders/PluginLoader.h>\n#include <xlOil/Log.h>\n#include <xlOil/Events.h>\n#include <xloil/State.h>\n#include <xloil/RtdServer.h>\n#include <xloil-XLL/LogWindowSink.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelThread.h>\n#include <xlOil-COM/Connect.h>\n#define TOML_ABI_NAMESPACES 0\n#include <toml++/toml.h>\n#include <filesystem>\n\nnamespace fs = std::filesystem;\nusing std::make_pair;\nusing std::wstring;\nusing std::make_shared;\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  namespace\n  {\n    std::map<std::wstring, std::shared_ptr<AddinContext>> theAddinContexts;\n    std::shared_ptr<AddinContext> theCoreContextPtr;\n\n    /// <summary>\n    /// Finds the settings file <XllName>.ini either in %APPDATA%\\xlOil\n    /// or in the same directory as the XLL.  Adds any log sink specified\n    /// and any date formats.\n    /// </summary>\n    auto createContext(const wchar_t* xllPath)\n    {\n      auto settings = findSettingsFile(xllPath);\n      wstring logFile;\n      if (!settings)\n      {\n        XLO_DEBUG(L\"No settings file found for '{}'\", xllPath);\n      }\n      else\n      {\n        // Log file settings\n        logFile = Settings::logFilePath(*settings);\n        auto logLevel = Settings::logLevel(*settings);\n        auto [logMaxSize, logNumFiles] = Settings::logRotation(*settings);\n\n        logFile = loggerAddRotatingFileSink(spdlog::default_logger(),\n                                            logFile.c_str(), logLevel.c_str(),\n                                            logMaxSize, logNumFiles);\n        // If these are specified in multiple addins and/or the core, \n        // the last value will override\n        setLogWindowPopupLevel(\n          Settings::logPopupLevel(*settings).c_str());\n\n        loggerSetFlush(spdlog::default_logger(),\n                       Settings::logFlushLevel(*settings));\n\n        // Write the log message *after* we set up the log file!\n        XLO_INFO(L\"Found settings file '{}' for '{}'\",\n          utf8ToUtf16(*settings->source().path), xllPath);\n\n        // Add any requested date formats\n        auto dateFormats = Settings::dateFormats(*settings);\n        \n        for (auto& form : dateFormats)\n        {\n          XLO_DEBUG(L\"Registering date format '{}'\", form);\n          theDateTimeFormats().push_back(form);\n        }\n      }\n\n      auto [ctx, isNew] = theAddinContexts.insert_or_assign(\n        wstring(xllPath), make_shared<AddinContext>(xllPath, settings, logFile));\n\n      return ctx->second;\n    }\n  }\n\n  AddinContext& theCoreContext()\n  {\n    assert(theCoreContextPtr);\n    return *theCoreContextPtr;\n  }\n\n  const std::map<std::wstring, std::shared_ptr<AddinContext>>& currentAddinContexts()\n  {\n    return theAddinContexts;\n  }\n\n  std::shared_ptr<AddinContext> createCoreAddinContext()\n  {\n    if (!theCoreContextPtr)\n      theCoreContextPtr = createContext(Environment::coreDllPath());\n    return theCoreContextPtr;\n  }\n\n  std::shared_ptr<AddinContext>createAddinContext(const wchar_t* pathName)\n  {\n    // Compare the filename stem to our core dll name (which should end in 'dll')\n    const auto lastSlash = wcsrchr(pathName, L'\\\\');\n    const auto coreDll = Environment::coreDllName();\n    const bool isCore = 0 == _wcsnicmp(\n      coreDll,\n      lastSlash ? lastSlash + 1 : pathName,\n      wcslen(coreDll) - 3);\n\n    XLO_DEBUG(L\"Creating addin context for '{}'\", pathName);\n    if (isCore)\n    {\n      auto context = createCoreAddinContext();\n      // Point xloil.xll at the context (as well as xloil.dll). In the case\n      // of multiple xlOil xlls, they can be unloaded in any order, the \n      // check in addinCloseXll that only 1 remains assumes there is \n      // one context entry per XLL.\n      theAddinContexts[pathName] = theCoreContextPtr;\n      return context;\n    }\n    else\n      return createContext(pathName);\n  }\n\n  void addinCloseXll(const wchar_t* xllPath)\n  {\n    theAddinContexts.erase(xllPath);\n    // Check if only the core is left\n    if (theAddinContexts.size() == 1)\n    {\n      // Somewhat cheap trick to ensure any async tasks which may reference plugin\n      // code are destroyed in a timely manner prior to teardown.  Better would be\n      // to keep track of which tasks were registered by which addin\n      rtdAsyncServerClear();\n\n      if (theAddinContexts.begin()->second.get() != theCoreContextPtr.get())\n        XLO_ERROR(\"addinCloseXll: unexpected addins present\");\n\n      theAddinContexts.clear();\n      theCoreContextPtr->detachPlugins();\n      theCoreContextPtr.reset();\n\n      Event::AutoClose().fire();\n\n      unloadAllPlugins();\n\n      // We don't want any messages hanging around after autoClose finishes\n      teardownMessageQueue();\n\n      COM::disconnectCom();\n    }\n\n    spdlog::default_logger()->flush();\n  }\n\n  void teardownAddinContext()\n  {\n    teardownFunctionRegistry();\n\n    theAddinContexts.clear();\n    theCoreContextPtr.reset();\n\n    teardownMessageQueue();\n\n    COM::disconnectCom();\n\n    spdlog::default_logger()->flush();\n  }\n}"
  },
  {
    "path": "src/xlOil/Loaders/AddinLoader.h",
    "content": "#pragma once\n#include <memory>\n#include <string>\n#include <map>\n\nnamespace xloil\n{\n  class AddinContext; class FileSource; class FuncSource;\n\n  AddinContext& theCoreContext();\n\n  /// <summary>\n  /// Called by the core entry point to initialise all the xloil.dll\n  /// paths and register functions\n  /// </summary>\n  std::shared_ptr<AddinContext> createCoreAddinContext();\n\n  const std::map<std::wstring, std::shared_ptr<AddinContext>>& currentAddinContexts();\n\n  /// <summary>\n  /// Called by the core entry point to initialise each XLL except xloil.xll\n  /// The core DLL is initialised by createCoreContext, not this function\n  /// </summary>\n  std::shared_ptr<AddinContext> createAddinContext(const wchar_t* xllPath);\n\n  /// <summary>\n  /// Triggered by xlAutoClose for each addin. When the last XLL is closed\n  /// a teardown is initiated.\n  /// </summary>\n  void addinCloseXll(const wchar_t* xllPath);\n\n  /// <summary>\n  /// When Excel closes it may not call autoClose for Excel XLL. This function\n  /// ensures tidy-up happens at DLL detach in a safe way which does not try\n  /// to use the Excel APIs.\n  /// </summary>\n  void teardownAddinContext();\n}"
  },
  {
    "path": "src/xlOil/Loaders/CoreEntryPoint.cpp",
    "content": "#include <xlOilHelpers/Settings.h>\n#include <xlOil/Loaders/CoreEntryPoint.h>\n#include <xlOil/Loaders/PluginLoader.h>\n#include <xlOil/Loaders/AddinLoader.h>\n#include <xlOil/State.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/Events.h>\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Interface.h>\n#include <xlOil/ExcelCall.h>\n#include <xlOil/ExportMacro.h>\n#include <xlOil/Log.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil-XLL/Intellisense.h>\n#include <xlOil-COM/Connect.h>\n#include <filesystem>\n\nnamespace fs = std::filesystem;\n\nusing std::wstring;\nusing std::string;\nusing std::vector;\nusing std::shared_ptr;\nusing std::tuple;\n\nnamespace\n{\n  static HMODULE theCoreModuleHandle = nullptr;\n  static bool theCoreIsLoaded = false;\n}\n\nnamespace xloil\n{\n  XLOIL_EXPORT int coreAutoOpenHandler(const wchar_t* xllPath) noexcept\n  {\n    try\n    {\n      InXllContext xllContext;\n      // A return val of 1 tells the XLL to hook XLL-API events. There may be\n      // multiple XLLs calling this function, but we only want to hook the events \n      // the first time.\n      int retVal = 0;\n\n      shared_ptr<FuncSource> coreRegisteredFunctions;\n      std::shared_ptr<spdlog::logger> logger;\n\n      if (!theCoreIsLoaded)\n      {\n        Environment::initAppContext();\n        Environment::setCoreHandle(theCoreModuleHandle);\n\n        // There's no log file until createAddinContext figures out our \n        // settings, so any logging goes to the debug output.  We also flush\n        // on trace level so we don't miss any crashes during startup. This\n        // has a minimal performance impact vs flushing during sheet calc.\n        logger = loggerInitialise(\"trace\");\n        XLO_INFO(L\"xlOil {} starting\", XLOIL_VERSION_STR);\n        loggerSetFlush(logger, \"trace\");\n\n        initMessageQueue(Environment::excelProcess().hInstance);\n\n        loggerAddPopupWindowSink(logger);\n      }\n\n      // After the context has been created, we will have a log file\n      auto coreContext = createCoreAddinContext();\n      auto addinContext = createAddinContext(xllPath);\n\n      if (!theCoreIsLoaded)\n      {\n        XLO_DEBUG(L\"Loaded xlOil core from: {}\", Environment::coreDllPath());\n\n        // Flush logger after sheet calculates\n        Event::AfterCalculate() += [logger]() { logger->flush(); };\n\n        // Run before staticSource so the function registration gets picked up\n        registerIntellisenseHook(xllPath);\n\n        // Collect all static UDFs for registration\n        coreRegisteredFunctions = std::make_shared<StaticFunctionSource>(\n          Environment::coreDllName());\n\n        // Do the registration\n        coreRegisteredFunctions->init();\n\n        // Associate registed functions with the core \n        coreContext->addSource(coreRegisteredFunctions);\n        // Signal that the XLL events should be hooked\n        retVal = 1;\n      }\n\n      if (addinContext == coreContext || theCoreIsLoaded)\n      {\n        addinContext->loadPlugins();\n      }\n      else\n      {\n        // Check if we should process the settings for a non-core addin first\n        // and/or we need to load the core addin. We also check we don't call\n        // loadPluginsForAddin twice (although it would be harmless)\n        const bool loadBeforeCore = Settings::loadBeforeCore(*addinContext->settings());\n\n        const auto [firstLoad, secondLoad] = loadBeforeCore\n          ? tuple(addinContext, coreContext)\n          : tuple(coreContext, addinContext);\n\n        XLO_DEBUG(L\"User xll file present, plugin load order is: {}, {}\",\n          firstLoad ? firstLoad->pathName() : L\"\", \n          firstLoad ? secondLoad->pathName() : L\"\");\n\n        if (firstLoad)\n          firstLoad->loadPlugins();\n        if (secondLoad)\n          secondLoad->loadPlugins();\n      }\n\n      runComSetupOnXllOpen([]() {});\n\n      theCoreIsLoaded = true;\n      return retVal;\n    }\n    catch (const std::exception& e)\n    {\n      XLO_ERROR(\"Initialisation error: {0}\", e.what());\n    }\n\n    return 0;\n  }\n  XLOIL_EXPORT int coreAutoCloseHandler(const wchar_t* xllPath) noexcept\n  {\n    try\n    {\n      InXllContext xllContext;\n      \n      addinCloseXll(xllPath);\n\n      return 1;\n    }\n    catch (const std::exception& e)\n    {\n      XLO_ERROR(\"Finalisation error: {0}\", e.what());\n    }\n    return 0;\n  }\n}\n\nXLO_DEFINE_FREE_CALLBACK()\n\nXLO_ENTRY_POINT(int) DllMain(\n  _In_ HINSTANCE hinstDLL,\n  _In_ DWORD     fdwReason,\n  _In_ LPVOID    /*lpvReserved*/\n)\n{\n  if (fdwReason == DLL_PROCESS_ATTACH)\n  {\n    theCoreModuleHandle = hinstDLL;\n  }\n  else if (fdwReason == DLL_PROCESS_DETACH)\n  {\n    xloil::teardownAddinContext();\n    theCoreModuleHandle = nullptr;\n  }\n  return TRUE;\n}\n"
  },
  {
    "path": "src/xlOil/Loaders/CoreEntryPoint.h",
    "content": "#pragma once\n#include <xloil/ExportMacro.h>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Called by the XLL loader's xlAutoOpen\n  /// </summary>\n  XLOIL_EXPORT int \n    coreAutoOpenHandler(const wchar_t* xllPath) noexcept;\n\n  /// <summary>\n  /// Called by the XLL loader's xlAutoClose\n  /// </summary>\n  XLOIL_EXPORT int \n    coreAutoCloseHandler(const wchar_t* xllPath) noexcept;\n\n  XLOIL_EXPORT void onCalculationCancelled() noexcept;\n}"
  },
  {
    "path": "src/xlOil/Loaders/PluginLoader.cpp",
    "content": "#include \"PluginLoader.h\"\n#include <xlOil/WindowsSlim.h>\n#include <xlOilHelpers/Environment.h>\n#include <xlOil-COM/RtdManager.h>\n#include <xlOil/Log.h>\n#include <xlOil/Throw.h>\n#include <xlOil/State.h>\n#include <xlOilHelpers/Settings.h>\n#include <xlOil/StaticRegister.h>\n#include <xlOil-XLL/FuncRegistry.h>\n#include <xlOil/Loaders/AddinLoader.h>\n#include <xlOil/Version.h>\n#define TOML_ABI_NAMESPACES 0\n#include <toml++/toml.h>\n#include <vector>\n#include <string>\n#include <filesystem>\n#include <regex>\n#include <unordered_map>\n#include <boost/preprocessor/stringize.hpp>\n\nnamespace fs = std::filesystem;\n\nusing std::vector;\nusing std::wstring;\nusing std::make_shared;\nusing std::shared_ptr;\nusing std::pair;\nusing std::make_pair;\nusing std::string;\nusing std::unordered_map;\nusing std::map;\n\nnamespace xloil\n{\n  constexpr const wchar_t* XLOIL_PLUGIN_EXT = L\".dll\";\n  namespace\n  {\n    static auto emptyTomlTable = toml::table();\n  }\n\n  struct LoadedPlugin\n  {\n    AddinContext* Context;\n    HMODULE Handle;\n    PluginInitFunc Init;\n  };\n\n  static auto& getLoadedPlugins()\n  {\n    static auto instance = map<\n      wstring, LoadedPlugin, CaselessCompare<wchar_t>>();\n    return instance;\n  }\n\n  bool loadPluginForAddin(AddinContext& context, const std::wstring& pluginName) noexcept\n  {\n    const auto xllDir = fs::path(context.pathName()).remove_filename();\n    const auto coreDir = fs::path(Environment::coreDllPath()).remove_filename();\n\n    auto& loadedPlugins = getLoadedPlugins();\n    XLO_INFO(\"Loading plugins from settings file {}\", *context.settings()->source().path);\n\n    // Look for the plugin in the same directory as xloil.dll, \n    // otherwise check the directory of the XLL\n    std::error_code fsErr;\n    const auto pluginDir = fs::exists(coreDir / (pluginName + XLOIL_PLUGIN_EXT), fsErr)\n      ? coreDir\n      : xllDir;\n\n    PushDllDirectory setDllDir(pluginDir.c_str());\n\n    const auto pluginPath = pluginDir / (pluginName + XLOIL_PLUGIN_EXT);\n\n    const auto pluginNameUtf8 = utf16ToUtf8(pluginName);\n\n    try\n    {\n      XLO_INFO(L\"Loading plugin {}\", pluginName);\n        \n      const auto pluginSettings = Settings::findPluginSettings(\n        context.settings(), pluginNameUtf8.c_str());\n\n      // If the plugin has already be loaded, we just notify it of \n      // a new XLL by calling attach and passing any XLL specific settings\n      auto pluginData = loadedPlugins.find(pluginName);\n      if (pluginData == loadedPlugins.end())\n      {\n        auto environment = Settings::environmentVariables(pluginSettings);\n\n        for (auto&[key, val] : environment)\n        {\n          auto value = expandWindowsRegistryStrings(\n            expandEnvironmentStrings(val));\n          XLO_DEBUG(L\"Setting environment variable: {}='{}'\", key, value);\n\n          if (!setEnvironmentVar(key.c_str(), value.c_str()))\n            XLO_WARN(L\"Failed to set environment variable '{}'\");\n        }\n        // Load the plugin\n        const auto lib = LoadLibrary(pluginPath.c_str());\n        if (!lib)\n          XLO_THROW(writeWindowsError());\n\n        // Find the main entry point required by xlOil\n        const auto initFunc = (PluginInitFunc)GetProcAddress(lib,\n          BOOST_PP_STRINGIZE(XLO_PLUGIN_INIT_FUNC));\n        if (!initFunc)\n          XLO_THROW(\"Couldn't find plugin entry point\");\n\n\n        PluginContext pluginLoadContext =\n        {\n          PluginContext::Load,\n          pluginName.data(),\n          pluginSettings ? *pluginSettings.as_table() : emptyTomlTable,\n          XLOIL_MAJOR_VERSION,\n          XLOIL_MINOR_VERSION,\n          XLOIL_PATCH_VERSION\n        };\n        if (initFunc(&theCoreContext(), pluginLoadContext) < 0)\n        {\n          //TODO:  Can we roll back any bad registrations?\n          FreeLibrary(lib);\n          XLO_THROW(\"Initialisation failed\");\n        }\n\n        // Add the plugin to the list of loaded plugins\n        LoadedPlugin description = { &context, lib, initFunc };\n        pluginData = loadedPlugins\n          .insert(make_pair(pluginName, description)).first;\n\n        // Register any static functions in the plugin by adding it as a source.\n        auto source = make_shared<StaticFunctionSource>(pluginName.c_str());\n        context.addSource(source);\n\n        XLO_DEBUG(L\"Finished loading plugin {0}\", pluginName);\n      }\n\n      // Now \"attach\" the current XLL, passing in its associated settings\n      PluginContext pluginAttach =\n      {\n        PluginContext::Attach,\n        pluginName.c_str(),\n        pluginSettings ? *pluginSettings.as_table() : emptyTomlTable,\n        XLOIL_MAJOR_VERSION,\n        XLOIL_MINOR_VERSION,\n        XLOIL_PATCH_VERSION\n      };\n      if (pluginData->second.Init(&context, pluginAttach) < 0)\n      {\n        XLO_ERROR(L\"Failed to attach addin {0} to plugin {1}\",\n          context.pathName(), pluginName);\n        return false;\n      }\n    }\n    catch (const std::exception& e)\n    {\n      XLO_ERROR(L\"Plugin load failed for {0}: {1}\\nPath={2}\", \n        pluginPath.wstring(), utf8ToUtf16(e.what()), getEnvironmentVar(L\"PATH\"));\n      return false;\n    }\n\n    // Undo addition to DLL search path \n    SetDllDirectory(NULL);\n\n    return true;\n  }\n  \n  bool detachPluginForAddin(AddinContext& context, const std::wstring& pluginName) noexcept\n  {\n    const auto& pluginData = getLoadedPlugins()[pluginName];\n    PluginContext pluginDetach =\n    {\n      PluginContext::Detach,\n      pluginName.c_str(),\n      emptyTomlTable,\n      XLOIL_MAJOR_VERSION,\n      XLOIL_MINOR_VERSION,\n      XLOIL_PATCH_VERSION\n    };\n    if (pluginData.Init(&context, pluginDetach) < 0)\n    {\n      XLO_ERROR(L\"Failed to detach addin {0} from plugin {1}\",\n        context.pathName(), pluginName);\n      return false;\n    }\n    return true;\n  }\n\n  bool unloadPluginImpl(const wchar_t* name, LoadedPlugin& plugin) noexcept\n  {\n    XLO_DEBUG(L\"Unloading plugin {0}\", name);\n    PluginContext context = { \n      PluginContext::Unload, \n      name, \n      emptyTomlTable,          \n      XLOIL_MAJOR_VERSION,\n      XLOIL_MINOR_VERSION,\n      XLOIL_PATCH_VERSION \n    };\n    plugin.Init(0, context);\n    if (!FreeLibrary(plugin.Handle))\n      XLO_WARN(L\"FreeLibrary failed for {0}: {1}\", name, writeWindowsError());\n    return true;\n  }\n  \n  void unloadAllPlugins() noexcept\n  {\n    for (auto&[name, descr] : getLoadedPlugins())\n      unloadPluginImpl(name.c_str(), descr);\n    getLoadedPlugins().clear();\n  }\n\n  std::vector<std::wstring> listPluginNames()\n  {\n    std::vector<std::wstring> result;\n    std::transform(\n      getLoadedPlugins().begin(),\n      getLoadedPlugins().end(),\n      std::back_inserter(result),\n      [](auto it) { return it.first; });\n    return std::move(result);\n  }\n\n  StaticFunctionSource::StaticFunctionSource(const wchar_t* pluginPath)\n    : _sourcePath(pluginPath)\n  {}\n\n  void StaticFunctionSource::init()\n  {\n    auto specs = detail::processRegistryQueue(_sourcePath.c_str());\n    registerFuncs(specs);\n  }\n}\n"
  },
  {
    "path": "src/xlOil/Loaders/PluginLoader.h",
    "content": "#pragma once\n#include <xloil/Interface.h>\n#include <vector>\n#include <string>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Load and attach the specified plugin to the given addin context.\n  /// Called during autoOpen.\n  /// </summary>\n  /// <returns>True on sucess. A log entry will be written on failure</returns>\n  bool loadPluginForAddin(AddinContext& context, const std::wstring& pluginName) noexcept;\n  \n  /// <summary>\n  /// Detach the specified plugin from the addin context. In pratice this\n  /// may not be called as Excel does not invoke autoClose on all XLLs\n  /// during application exit.\n  /// </summary>\n  /// <returns>True on sucess. A log entry will be written on failure</returns>\n  bool detachPluginForAddin(AddinContext& context, const std::wstring& pluginName) noexcept;\n\n  /// Unloads any plugins prior to takedown of the Core XLL. \n  /// Called by xlAutoClose\n  void unloadAllPlugins() noexcept;\n\n  // Currently unused\n  std::vector<std::wstring> listPluginNames();\n\n  /// <summary>\n  /// File source which collects and registers any declared\n  /// static functions\n  /// </summary>\n  class StaticFunctionSource : public FuncSource\n  {\n  public:\n    /// <summary>\n    /// This collects all statically declared Excel functions, i.e. raw C functions\n    /// It assumes that this function and hence processRegistryQueue is run after each\n    /// plugin has been loaded, so that all functions on the queue belong to the \n    /// current plugin\n    /// </summary>\n    /// \n    StaticFunctionSource(const wchar_t* pluginPath);\n\n    const std::wstring& name() const override { return _sourcePath; }\n    void init() override;\n  private:\n    std::wstring _sourcePath;\n  };\n}\n"
  },
  {
    "path": "src/xlOil/Log.cpp",
    "content": "#include <xlOil/Log.h>\n\nnamespace xloil\n{\n  XLOIL_EXPORT spdlog::details::registry& loggerRegistry()\n  {\n    return spdlog::details::registry::instance();\n  }\n}"
  },
  {
    "path": "src/xlOil/xlOil.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{DF88A189-295A-4AC8-BEFC-D199155EC8CB}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>xlOil</RootNamespace>\n    <ProjectName>xlOil</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\" Condition=\"'$(Configuration)'=='Release'\">\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n  </ImportGroup>\n  <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup>\n    <IncludePath>$(SolutionDir)external\\Excel2013SDK\\INCLUDE;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>xlcall32.lib;Oleacc.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalOptions>/wholearchive:xloil-Funcs.lib /wholearchive:xloil-COM.lib /wholearchive:xloil-XLL.lib /wholearchive:xloil-Dynamic.lib %(AdditionalOptions)</AdditionalOptions>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"..\\..\\include\\xloil\\AppObjects.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\AutoBind.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\EnumHelper.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelThread.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ArrayBuilder.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Async.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Date.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\DynamicRegister.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Events.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelArray.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelCall.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelObj.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelObjCache.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Limits.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Range.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelRef.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Caller.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelTypeLib.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExportMacro.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\FPArray.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\FuncSpec.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Interface.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Log.h\" />\n    <ClInclude Include=\"..\\..\\include\\xlOil\\LogWindow.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\NumericTypeConverters.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ObjectCache.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Plugin.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Preprocessor.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\PString.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Register.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelUI.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\RtdServer.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\State.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\StaticRegister.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\StringUtils.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Throw.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\TypeConverters.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\Version.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\WindowsSlim.h\" />\n    <ClInclude Include=\"..\\..\\include\\xloil\\XlCallSlim.h\" />\n    <ClInclude Include=\"..\\..\\include\\xlOil\\XllEntryPoint.h\" />\n    <ClInclude Include=\"Loaders\\CoreEntryPoint.h\" />\n    <ClInclude Include=\"Loaders\\PluginLoader.h\" />\n    <ClInclude Include=\"Loaders\\AddinLoader.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"Interface.cpp\" />\n    <ClCompile Include=\"Loaders\\CoreEntryPoint.cpp\" />\n    <ClCompile Include=\"Loaders\\PluginLoader.cpp\" />\n    <ClCompile Include=\"Loaders\\AddinLoader.cpp\" />\n    <ClCompile Include=\"Log.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\external\\asmjit.vcxproj\">\n      <Project>{164af267-092e-441d-8bf0-2acf18e9adfd}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\external\\rdcfswatcher.vcxproj\">\n      <Project>{94cb9502-b5a4-473d-8a2e-4a67950049b6}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\xlOil-COM\\xlOil-COM.vcxproj\">\n      <Project>{2c85c326-07ea-4d9c-91c2-f79baec64f70}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\xlOil-Dynamic\\xlOil-Dynamic.vcxproj\">\n      <Project>{1102f4da-8b5a-4b01-a8ba-432a4c14a1ab}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\xlOil-Funcs\\xlOil-Funcs.vcxproj\">\n      <Project>{a310c8c5-ce14-4dd3-8a0d-61491741558a}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\xlOil-XLL\\xlOil-XLL.vcxproj\">\n      <Project>{fd89f79e-fad6-4bdf-b8b3-2028e8482abf}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\xlOilHelpers\\xlOilHelpers.vcxproj\">\n      <Project>{f7aa4c6f-c223-4ed1-bbb3-836e7ec044f2}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\" />\n</Project>"
  },
  {
    "path": "src/xlOil/xlOil.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"Interface.cpp\" />\n    <ClCompile Include=\"Log.cpp\" />\n    <ClCompile Include=\"Loaders\\AddinLoader.cpp\">\n      <Filter>Loaders</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Loaders\\PluginLoader.cpp\">\n      <Filter>Loaders</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Loaders\\CoreEntryPoint.cpp\">\n      <Filter>Loaders</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"Loaders\\AddinLoader.h\">\n      <Filter>Loaders</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Loaders\\PluginLoader.h\">\n      <Filter>Loaders</Filter>\n    </ClInclude>\n    <ClInclude Include=\"Loaders\\CoreEntryPoint.h\">\n      <Filter>Loaders</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ArrayBuilder.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Date.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Events.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelArray.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelCall.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelObj.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelObjCache.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Range.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelRef.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExportMacro.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\FuncSpec.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Interface.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Log.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\NumericTypeConverters.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ObjectCache.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Preprocessor.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\PString.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Register.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\StaticRegister.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Throw.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\TypeConverters.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\XlCallSlim.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\RtdServer.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Caller.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Async.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Version.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\StringUtils.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\WindowsSlim.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\State.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelUI.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Plugin.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\FPArray.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\DynamicRegister.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelThread.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xlOil\\XllEntryPoint.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xlOil\\LogWindow.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\ExcelTypeLib.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\AppObjects.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\EnumHelper.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\AutoBind.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n    <ClInclude Include=\"..\\..\\include\\xloil\\Limits.h\">\n      <Filter>Include</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <Filter Include=\"Loaders\">\n      <UniqueIdentifier>{d269fbda-6fa4-4a7f-a1c5-bd84599de0da}</UniqueIdentifier>\n    </Filter>\n    <Filter Include=\"Include\">\n      <UniqueIdentifier>{28b63a3a-8cbf-47cb-adb4-a08c46149d07}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-COM/API/ComUtils.cpp",
    "content": "#include <xloil/AppObjects.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/WindowsSlim.h>\n\n#include <xlOil-COM/Connect.h>\n#include <xlOil-COM/ComAddin.h>\n#include <xlOil-COM/ComVariant.h>\n#include <xloil/AppObjects.h>\n#include <xloil/Log.h>\n#include <xloil/Throw.h>\n#include <xloil/State.h>\n#include <xloil/ExcelUI.h>\n#include <comdef.h>\nusing std::make_shared;\nusing std::shared_ptr;\nusing std::vector;\nusing std::wstring;\n\nnamespace xloil\n{\n  std::shared_ptr<IComAddin> xloil::makeComAddin(\n    const wchar_t* name, const wchar_t* description)\n  {\n    return COM::createComAddin(name, description);\n  }\n\n  ExcelObj variantToExcelObj(const VARIANT& variant, bool allowRange)\n  {\n    return COM::variantToExcelObj(variant, allowRange);\n  }\n\n  void excelObjToVariant(VARIANT* v, const ExcelObj& obj)\n  {\n    COM::excelObjToVariant(v, obj);\n  }\n  \n  void statusBarMsg(const std::wstring_view& msg, size_t timeout)\n  {\n    if (!msg.empty())\n      runExcelThread([msg = wstring(msg)]() { \n        thisApp().com().PutStatusBar(0, msg.c_str()); \n      });\n    \n    // Send a null str to PutStatusBar in 'timeout' millisecs to clear it\n    if (timeout > 0)\n      runExcelThread([]() {\n          thisApp().com().PutStatusBar(0, _bstr_t()); \n        }, ExcelRunQueue::COM_API, (unsigned)timeout);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/API/Events.cpp",
    "content": "#include <xlOil/Events.h>\n#include <xlOil/Log.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/StringUtils.h>\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil-COM/Connect.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil/State.h>\n#include <xlOil/Throw.h>\n#include <map>\n#include <vector>\n#include <unordered_map>\n#include <array>\n#include <rdcfswatcher/rdc_fs_watcher.h>\n#include <string>\n#include <boost/preprocessor/seq/for_each.hpp>\n#include <boost/preprocessor/stringize.hpp>\n\nusing std::vector;\nusing std::shared_ptr;\nusing std::weak_ptr;\nusing std::make_shared;\nusing std::unordered_map;\nusing std::wstring;\nusing std::set;\nusing std::wstring;\nusing std::pair;\n\nnamespace xloil\n{\n  namespace Event\n  {\n    namespace\n    {\n      void directoryWatchChange(int64_t id, const set<pair<wstring, uint32_t>>& notifications);\n\n      void directoryWatchError(int64_t id);\n\n      auto& theFileWatcher()\n      {\n        static std::unique_ptr<RdcFSWatcher> instance([]()\n        {\n          auto instance = new RdcFSWatcher();\n          instance->changeEvent = directoryWatchChange;\n          instance->errorEvent = directoryWatchError;\n          return instance;\n        }());\n        return *instance;\n      }\n\n      using DirectoryWatchEventBase = Event<void(const wchar_t*, const wchar_t*, FileAction)>;\n\n      struct DirectoryWatchEvent : public DirectoryWatchEventBase\n      {\n        DirectoryWatchEvent(const std::wstring& path, const bool subDirs)\n          : DirectoryWatchEventBase((L\"Watch_\" + path).c_str())\n          , _lastTickCount(0)\n          , _directory(path)\n        {\n          theFileWatcher().addDirectory((intptr_t)this, path, subDirs);\n          XLO_DEBUG(L\"Started directory watch on '{}'\", path);\n        }\n\n        virtual ~DirectoryWatchEvent()\n        {\n          XLO_DEBUG(L\"Ended directory watch '{}'\", name());\n          theFileWatcher().removeDirectory((intptr_t)this);\n        }\n\n        void handleFileAction(\n          const wstring& filename,\n          FileAction action)\n        {\n          // File updates seem to generate two identical calls so we implement a time granularity\n          auto ticks = GetTickCount64();\n          auto found = _lastTickCount.find(filename);\n          if (found != _lastTickCount.end() && (ticks - found->second < 1000))\n            return;\n          _lastTickCount.insert_or_assign(found, filename, ticks);\n\n          this->fire(_directory.c_str(), filename.c_str(), action);\n        }\n\n        auto& directory() const { return _directory; }\n\n      private:\n        std::unordered_map<wstring, decltype(GetTickCount64())> _lastTickCount;\n        wstring _directory;\n      };\n\n      void directoryWatchChange(int64_t id, const set<pair<wstring, uint32_t>>& notifications)\n      {\n        auto target = (DirectoryWatchEvent*)id;\n        for (const auto& notification : notifications)\n        {\n          FileAction fwAction;\n          switch (notification.second)\n          {\n          case FILE_ACTION_RENAMED_NEW_NAME:\n          case FILE_ACTION_ADDED:\n            fwAction = FileAction::Add;\n            break;\n          case FILE_ACTION_RENAMED_OLD_NAME:\n          case FILE_ACTION_REMOVED:\n            fwAction = FileAction::Delete;\n            break;\n          case FILE_ACTION_MODIFIED:\n            fwAction = FileAction::Modify;\n            break;\n          default:\n            return;\n          };\n          target->handleFileAction(notification.first, fwAction);\n        }\n      }\n\n      void directoryWatchError(int64_t id)\n      {\n        auto target = (DirectoryWatchEvent*)id;\n        XLO_ERROR(L\"Directory watcher for '{}' failed: {}\", target->directory(), writeWindowsError());\n      };\n\n      unordered_map<wstring, weak_ptr<DirectoryWatchEvent>> theDirectoryWatchers;\n    }\n\n    XLOIL_EXPORT std::wstring to_wstring(const FileAction x)\n    {\n      switch (x)\n      {\n      case FileAction::Add: return L\"add\";\n      case FileAction::Delete: return L\"delete\";\n      case FileAction::Modify: return L\"modify\";\n      default:\n        return L\"unknown\";\n      }\n    }\n\n    XLOIL_EXPORT shared_ptr<DirectoryWatchEventBase> DirectoryChange(const std::wstring& path, const bool subDirs)\n    {\n      auto key = path + (subDirs ? L'<' : L'>');\n      auto found = theDirectoryWatchers.find(key);\n      if (found != theDirectoryWatchers.end())\n      {\n        auto ptr = found->second.lock();\n        // If our weak_ptr is dead, erase it or the emplace below will fail\n        if (ptr)\n          return ptr;\n        else \n          theDirectoryWatchers.erase(found);\n      }\n\n      auto event = make_shared<DirectoryWatchEvent>(path, subDirs);\n      auto [it, ins] = theDirectoryWatchers.emplace(key, event);\n      return event;\n    }\n\n    // This event is not exported, so defined separately\n    XLOIL_DEFINE_EVENT(AutoClose);\n\n    // Define all standard events\n#define XLO_DEF_EVENT(r, _, name) XLOIL_EXPORT XLOIL_DEFINE_EVENT(name);\n    BOOST_PP_SEQ_FOR_EACH(XLO_DEF_EVENT, _, XLOIL_STATIC_EVENTS)\n#undef XLO_DEF_EVENT\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/API/ExcelRange.cpp",
    "content": "#include <xloil/Range.h>\n#include <xloil/AppObjects.h>\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/ExcelRef.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/AppObjects.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/State.h>\n#include <xlOil-COM/ComVariant.h>\n\nnamespace xloil\n{\n  namespace\n  {\n    _variant_t stringToVariant(const std::wstring_view& str)\n    {\n      auto variant = COM::stringToVariant(str);\n      return _variant_t(variant, false);\n    }\n  }\n\n  std::unique_ptr<Range> newRange(const wchar_t* address)\n  {\n    if (InXllContext::check())\n      return std::make_unique<XllRange>(ExcelRef(address));\n    else\n      return std::make_unique<ExcelRange>(address);\n  }\n  ExcelRef refFromComRange(Excel::Range& range)\n  {\n    try\n    {\n      const auto nCols = range.Columns->Count;\n      const auto nRows = range.Rows->Count;\n\n      // Excel uses 1-based indexing for these, so we adjust\n      const auto fromRow = range.Row - 1;\n      const auto fromCol = range.Column - 1;\n\n      // Convert to an XLL SheetId\n      auto wb = (Excel::_WorkbookPtr)range.Worksheet->Parent;\n      const auto sheetId =\n        callExcel(msxll::xlSheetId, fmt::format(L\"[{0}]{1}\",\n          wb->Name, range.Worksheet->Name));\n\n      return ExcelRef(sheetId.val.mref.idSheet,\n        fromRow, fromCol, fromRow + nRows - 1, fromCol + nCols - 1);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelRange::ExcelRange(const std::wstring_view& address, const Application& app)\n    : AppObject([&]() {    \n        try\n        {\n          return app.com().GetRange(stringToVariant(address)).Detach();\n        }\n        XLO_RETHROW_COM_ERROR; \n      }(), true)\n  {\n  }\n\n  ExcelRange::ExcelRange(const Range& range)\n    : AppObject(nullptr)\n  {\n    auto* comPtr = range.asComPtr();\n    if (comPtr)\n      *this = ExcelRange(comPtr);\n    else\n      *this = ExcelRange(range.address());\n  }\n\n  std::unique_ptr<Range> ExcelRange::range(\n    int fromRow, int fromCol,\n    int toRow, int toCol) const\n  {\n    try\n    {\n      if (toRow == Range::TO_END)\n        toRow = com().Row + com().Rows->GetCount();\n      if (toCol == Range::TO_END)\n        toCol = com().Column + com().Columns->GetCount();\n\n      // Caling range->GetRange(cell1, cell2) does a very weird thing\n      // which I can't make sense of. Better to call ws.range(...)\n      auto ws = (Excel::_WorksheetPtr)com().Parent;\n      auto cells = com().Cells;\n      auto r = ws->GetRange(\n        cells->Item[fromRow + 1][fromCol + 1],\n        cells->Item[toRow + 1][toCol + 1]);\n      return std::make_unique<ExcelRange>(r);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  std::unique_ptr<Range> ExcelRange::trim() const\n  {\n    // Better than SpecialCells?\n    size_t nRows = 0, nCols = 0;\n    if (size() == 1 || !COM::trimmedVariantArrayBounds(com().Value2, nRows, nCols))\n      return std::make_unique<ExcelRange>(*this);\n    // 'range' takes the last row/col inclusive so subtract one\n    if (nRows > 0) --nRows;\n    if (nCols > 0) --nCols;\n    return range(0, 0, (int)nRows, (int)nCols);\n  }\n\n  std::tuple<Range::row_t, Range::col_t> ExcelRange::shape() const\n  {\n    try\n    {\n      return { com().Rows->GetCount(), com().Columns->GetCount() };\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  std::tuple<Range::row_t, Range::col_t, Range::row_t, Range::col_t> ExcelRange::bounds() const\n  {\n    try\n    {\n      const auto row = com().Row - 1;\n      const auto col = com().Column - 1;\n      return { row, col, row + com().Rows->GetCount() - 1, col + com().Columns->GetCount() - 1 };\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  std::wstring ExcelRange::address(AddressStyle style) const\n  {\n    try\n    {\n      const bool rowFixed = (style & AddressStyle::ROW_FIXED) != 0;\n      const bool colFixed = (style & AddressStyle::COL_FIXED) != 0;\n      const auto refStyle = (style & AddressStyle::RC) != 0\n        ? Excel::xlR1C1\n        : Excel::xlA1;\n      const bool local = (style & AddressStyle::LOCAL) != 0;\n      auto result = com().GetAddress(\n        rowFixed, colFixed, refStyle, !local);\n      return std::wstring(result);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  size_t ExcelRange::nAreas() const\n  {\n    try\n    {\n      return size_t(com().GetAreas()->Count);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelObj ExcelRange::value() const\n  {\n    return COM::variantToExcelObj(com().Value2, false, false);\n  }\n\n  ExcelObj ExcelRange::value(row_t i, col_t j) const\n  {\n    Excel::RangePtr range(com().Cells->Item[i + 1][j + 1]);\n    return COM::variantToExcelObj(range->Value2);\n  }\n\n  void ExcelRange::set(const ExcelObj& value)\n  {\n    try\n    {\n      VARIANT v;\n      COM::excelObjToVariant(&v, value);\n      com().PutValue2(_variant_t(v, false)); // Move variant\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelRange::setFormula(const std::wstring_view& formula, const SetFormulaMode mode)\n  {\n    try\n    {\n      auto value = stringToVariant(formula);\n      if (mode == ARRAY_FORMULA && size() > 1)\n        com().FormulaArray = value;\n      else if (mode == OLD_ARRAY)\n        com().PutFormula(value);\n      else\n        com().PutFormula2(value);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelRange::setFormula(const ExcelObj& formula, const SetFormulaMode mode)\n  {\n    try\n    { \n      static bool dynamicArrays = Environment::excelProcess().supportsDynamicArrays;\n      VARIANT v;\n      COM::excelObjToVariant(&v, formula);\n      auto value = _variant_t(v, false);  // Move variant\n      if (mode == ARRAY_FORMULA && v.vt == VT_BSTR && size() > 1)\n        com().FormulaArray = value;\n      else if (mode == OLD_ARRAY || !dynamicArrays)\n        com().PutFormula(value);\n      else\n        com().PutFormula2(value);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelObj ExcelRange::formula() const\n  {\n    try\n    {\n      static bool dynamicArrays = Environment::excelProcess().supportsDynamicArrays;\n      return COM::variantToExcelObj(dynamicArrays ? com().Formula2 : com().Formula);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  std::optional<bool> ExcelRange::hasFormula() const\n  {\n    try\n    {\n      auto result = com().HasFormula;\n      if (result.vt == VT_BOOL)\n        return (bool)result;\n      else\n        return std::optional<bool>();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelRange::clear()\n  {\n    try\n    {\n      com().Clear();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  std::wstring ExcelRange::name() const\n  {\n    return address();\n  }\n\n  ExcelWorksheet ExcelRange::parent() const\n  {\n    try\n    {\n      return ExcelWorksheet(com().Worksheet);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  Application ExcelRange::app() const\n  {\n    return parent().app();\n  }\n  enum class SpecialCellsValue : int\n  {\n    Errors = 16,\n    Logical = 4,\n    Numbers = 1,\n    TextValues = 2,\n  };\n\n  ExcelRange ExcelRange::specialCells(SpecialCells type, ExcelType values) const\n  {\n    // Use raw_SpecialCells to avoid catch?\n    try\n    {\n      _variant_t specialCellsValue = vtMissing;\n      auto cellType = Excel::XlCellType(int(type));\n      if (unsigned(values) != 0 && \n        (type == SpecialCells::Constants || type == SpecialCells::Formulas))\n      {\n        // Conveniently, the XlSpecialCellsValue enumeration matches XLL's\n        // xltype enumeration, so we forward the int without modification.\n        specialCellsValue = _variant_t(unsigned(values));\n      }\n\n      return ExcelRange(\n        com().SpecialCells(cellType, specialCellsValue).Detach(), true);\n    }\n    catch (_com_error& error)\n    {\n      if (error.Error() == VBA_E_IGNORE)\n        throw xloil::ComBusyException();\n      else if (error.Error() == 0x800A03EC)\n        return ExcelRange();\n      else\n        XLO_THROW(L\"COM Error {0:#x}: {1}\", (unsigned)error.Error(), error.ErrorMessage()); \\\n    }\n  }\n\n  ComIterator<ExcelRange> ExcelRange::begin() const\n  {\n    try\n    {\n      return ComIterator<ExcelRange>(com().Get_NewEnum());\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/API/ExcelThread.cpp",
    "content": "#include <xlOil/ExcelThread.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil-COM/XllContextInvoke.h>\n#include <xlOil-COM/Connect.h>\n#include <xlOil-COM/ComVariant.h>\n#include <xlOil-Dynamic/LocalFunctions.h>\n#include <xloil/Log.h>\n#include <xloil/AppObjects.h>\n#include <xloil/Throw.h>\n#include <xloil/State.h>\n#include <xloil/ExcelUI.h>\n#include <functional>\n#include <queue>\n#include <mutex>\n#include <future>\n#include <comdef.h>\n\n// Little hack needed because our WindowsSlim doesn't include this symbol\n#define WM_QUIT 0x0012\n#include <atlbase.h>\n\nusing std::scoped_lock;\nusing std::shared_ptr;\nusing std::make_shared;\nusing std::vector;\nusing std::wstring;\n\nnamespace xloil\n{\n  namespace\n  {\n    class Messenger\n    {\n    public:\n      Messenger(HINSTANCE excelInstance)\n      {\n        auto handle = OpenThread(THREAD_SET_CONTEXT, true, GetCurrentThreadId());\n        _threadHandle.Attach(handle);\n        if (!_threadHandle)\n          XLO_THROW(L\"Failed create message queue thread: {0}\", writeWindowsError());\n\n        auto windowClass = wstring(Environment::coreDllName());\n        windowClass.resize(windowClass.size() - 4);  // Drop \".exe\"\n        windowClass += L\"Hidden\";\n\n        WNDCLASS wc;\n        memset(&wc, 0, sizeof(WNDCLASS));\n        wc.lpfnWndProc = WindowProc;\n        wc.hInstance = excelInstance;\n        wc.lpszClassName = windowClass.c_str();\n        if (RegisterClass(&wc) == 0)\n          XLO_THROW(L\"Failed to register window class: {0}\", writeWindowsError());\n\n        _hiddenWindow = CreateWindow(\n          wc.lpszClassName,\n          L\"\",         // Window text\n          0,           // Window style\n          // Size and position (4 args)\n          CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\n          HWND_MESSAGE, NULL,  // Parent window, Menu \n          wc.hInstance,\n          NULL);\n\n        if (!_hiddenWindow)\n          XLO_THROW(L\"Failed to create window: {0}\", writeWindowsError());\n      }\n\n      ~Messenger()\n      {\n        KillTimer(_hiddenWindow, IDT_TIMER1);\n        DestroyWindow(_hiddenWindow);\n      }\n\n      static void createInstance(void* excelInstance)\n      {\n        _theInstance = new Messenger((HINSTANCE)excelInstance);\n      }\n\n      static void destroyInstance()\n      {\n        delete _theInstance;\n        _theInstance = nullptr;\n      }\n\n      static Messenger& instance()\n      {\n        if (!_theInstance)\n          XLO_THROW(\"Internal error: message queue destroyed\");\n        return *_theInstance;\n      }\n\n      struct QueueItem\n      {\n        std::function<bool()> _func;\n        int _flags;\n        unsigned _waitTime;\n\n        QueueItem(\n          std::function<bool()>&& func,\n          int flags,\n          unsigned waitTime)\n          : _func(std::move(func))\n          , _flags(flags)\n          , _waitTime(waitTime)\n        {}\n\n        bool useCOM() const noexcept\n        {\n          return (_flags & ExcelRunQueue::COM_API) != 0;\n        }\n        bool useXLL() const noexcept\n        {\n          return (_flags & ExcelRunQueue::XLL_API) != 0;\n        }\n        bool operator()(bool comAvailable, bool xllAvailable) noexcept\n        {\n          if (useCOM() && !comAvailable)\n            return false;\n          if (useXLL() && !(xllAvailable || comAvailable))\n            return false;\n          // The _func should be a packaged task which is noexcept, so the only errors we catch\n          // should come from runInXllContext.\n          try\n          {\n            if (useXLL())\n              return runInXllContext(_func);\n            else\n              return _func();\n          }\n          catch (const xloil::ComBusyException&)\n          {\n            return false;\n          }\n          catch (const std::exception& e)\n          {\n            XLO_ERROR(\"Internal error running main thread queue: {}\", e.what());\n          }\n          catch (...)\n          {\n            XLO_ERROR(\"Unexpected error thrown by main thread queue item\");\n          }\n          return true;\n        }\n      };\n\n      // Entirely arbitrary ID numbers\n      static constexpr unsigned IDT_TIMER1 = 101;\n      static constexpr unsigned WINDOW_MESSAGE = 666;\n      static constexpr unsigned WM_TIMER = 0x0113;\n\n      auto firstJobTime(ULONGLONG now)\n      {\n        // The queue is a sorted map so first element is due first.\n        return _timerQueue.begin()->first > now\n          ? unsigned(_timerQueue.begin()->first - now)\n          : 0;\n      }\n\n      void startTimer(unsigned millisecs)\n      {\n        if (millisecs == 0)\n          PostMessage(_hiddenWindow, WINDOW_MESSAGE, 0, 0);\n        else\n          SetTimer(_hiddenWindow, IDT_TIMER1, millisecs, TimerCallback);\n      }\n\n      void enqueue(const shared_ptr<QueueItem>& item, unsigned millisecs) noexcept\n      {\n        try\n        {\n          ULONGLONG now = GetTickCount64();\n          {\n            scoped_lock lock(_lock);\n            _timerQueue.emplace(now + millisecs, item);\n            if (millisecs > 0)\n              millisecs = firstJobTime(now);\n          }\n          startTimer(millisecs);\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Internal error adding main thread queue item: '{}'\", e.what());\n        }\n        catch (...)\n        {\n          XLO_ERROR(\"Internal error adding main thread queue item\");\n        }\n      }\n\n    private:\n      static std::atomic<Messenger*> _theInstance;\n\n      static void CALLBACK TimerCallback(\n        HWND /*hwnd*/, UINT /*uMsg*/, UINT_PTR /*idEvent*/, DWORD /*dwTime*/) noexcept\n      {\n        try\n        {\n          // The message queue has been deleted, leaving us stranded. Don't dump core \n          // and just return.\n          if (!_theInstance)\n            return;\n\n          auto& self = *_theInstance;\n          auto now = GetTickCount64();\n          vector<shared_ptr<QueueItem>> items;\n          {\n            scoped_lock lock(self._lock);\n            auto i = self._timerQueue.begin();\n            auto end = self._timerQueue.end();\n            // Find all the queue items with a due time before now and copy them\n            // to our pending vector.\n            while (i != end && i->first <= now) {\n              items.push_back(i->second);\n              ++i;\n            }\n            // Erase all the items copied to the pending vector\n            self._timerQueue.erase(self._timerQueue.begin(), i);\n          }\n\n          // Nothing to do, then exit\n          if (items.empty())\n            return;\n\n          // We have released mutex, now run pending queue items\n          const auto comAvailable = COM::isComApiAvailable();\n          const auto xllAvailable = InXllContext::check();\n\n          items.erase(std::remove_if(items.begin(), items.end(),\n            [=](auto& pJob)\n          {\n            return (*pJob)(comAvailable, xllAvailable);\n          }), items.end());\n\n          // Any remaining items failed due to COM/XLL availability\n          // so are requeued.\n          if (!items.empty())\n          {\n            now = GetTickCount64();\n            unsigned startTime;\n            {\n              scoped_lock lock(self._lock);\n              for (auto& item : items)\n                if ((item->_flags & ExcelRunQueue::NO_RETRY) == 0)\n                  self._timerQueue.emplace(now + item->_waitTime, item);\n              startTime = self.firstJobTime(now);\n            }\n            self.startTimer(startTime);\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Internal error processing main thread queue: {}\", e.what());\n        }\n        catch (...)\n        {\n          XLO_ERROR(\"Internal error running main thread queue: unknown\");\n        }\n      }\n\n      static LRESULT CALLBACK WindowProc(\n        HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) noexcept\n      {\n        switch (uMsg)\n        {\n        case WINDOW_MESSAGE:\n        case WM_TIMER:\n        {\n          TimerCallback(hwnd, uMsg, wParam, 0);\n          return S_OK;\n        }\n        default:\n          return DefWindowProc(hwnd, uMsg, wParam, lParam);\n        }\n      }\n\n      std::multimap<ULONGLONG, shared_ptr<QueueItem>> _timerQueue;\n      std::mutex _lock;\n\n      HWND _hiddenWindow;\n      CHandle _threadHandle;\n    };\n\n    std::atomic<Messenger*> Messenger::_theInstance;\n  }\n\n  void initMessageQueue(void* excelInstance)\n  {\n    Messenger::createInstance(excelInstance);\n  }\n\n  void teardownMessageQueue()\n  {\n    Messenger::destroyInstance();\n  }\n\n  bool isMainThread()\n  {\n    auto& process = Environment::excelProcess();\n    return process.mainThreadId == GetCurrentThreadId();\n  }\n\n  namespace\n  {\n    static thread_local int theXllContextCount = 0;\n  }\n\n  InXllContext::InXllContext()\n  {\n    ++theXllContextCount;\n  }\n\n  InXllContext::~InXllContext()\n  {\n    --theXllContextCount;\n  }\n\n  bool InXllContext::check()\n  {\n    return theXllContextCount > 0;\n  }\n\n  bool isCallerInfoSafe()\n  {\n    return InXllContext::check() || isExecutingLocalFunction();\n  }\n\n  namespace detail\n  {\n    void runExcelThreadImpl(\n      std::function<bool()>&& func,\n      int flags,\n      unsigned waitBeforeCall,\n      unsigned waitBetweenRetries)\n    {\n      auto queueItem = make_shared<Messenger::QueueItem>(\n        std::move(func),\n        flags,\n        waitBetweenRetries);\n\n      // If we aren't embedded just run, although this function probably shouldn't \n      // be called in this case.\n      if (!Environment::excelProcess().isEmbedded())\n      {\n        XLO_DEBUG(\"Unexpected call to runExcelThread when not embedded in an Excel process\");\n        (*queueItem)(false, false);\n        return;\n      }\n\n      // Try to run immediately if possible. \n      const bool canRunNow = (waitBeforeCall == 0\n        && (flags & ExcelRunQueue::ENQUEUE) == 0\n        && isMainThread());\n\n      if (canRunNow)\n      {\n        // Usually functions scheduled for the main thread need the COM interface\n        // so we spend cycles to make a COM call to check it is available.\n        const auto comAvailable = COM::isComApiAvailable();\n        const auto xllAvailable = InXllContext::check();\n        if ((*queueItem)(comAvailable, xllAvailable))\n          return; // Success, do not schedule call\n      }\n\n      Messenger::instance().enqueue(queueItem, waitBeforeCall);\n    }\n\n    struct RetryAtStartup\n    {\n      void operator()()\n      {\n        try\n        {\n          if (COM::connectCom())\n            func();\n          else\n          {\n            XLO_DEBUG(\"Could not connect COM: trying again in 1 second...\");\n            runExcelThread(\n              RetryAtStartup{ func },\n              ExcelRunQueue::ENQUEUE | ExcelRunQueue::NO_RETRY,\n              1000); // wait 1 second before call\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(e.what());\n        }\n      }\n      std::function<void()> func;\n    };\n  }\n  void runComSetupOnXllOpen(const std::function<void()>& func)\n  {\n    runExcelThread(detail::RetryAtStartup{ func }, ExcelRunQueue::ENQUEUE);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/API/RtdServer.cpp",
    "content": "#include <xlOil-COM/RtdManager.h>\n#include <xlOil-COM/RtdAsyncManager.h>\n#include <xlOil/RtdServer.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil/Caller.h>\n#include <xlOil/Events.h>\n#include <xlOil/ExcelCall.h>\n#include <xlOil/ExcelThread.h>\n#include <xloil/StringUtils.h>\n#include <combaseapi.h>\n\nusing std::wstring;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing std::make_shared;\nusing std::make_pair;\n\n\nnamespace xloil\n{\n  RtdPublisher::RtdPublisher(\n    const wchar_t* topic,\n    IRtdServer& mgr,\n    const shared_ptr<IRtdTask>& task)\n    : _mgr(mgr)\n    , _task(task)\n    , _topic(topic)\n  {}\n\n  RtdPublisher::~RtdPublisher()\n  {\n    try\n    {\n      XLO_TRACE(L\"RtdPublisher for topic '{}' running dtor\", _topic);\n      // Send cancellation and wait for graceful shutdown\n      stop();\n      _task->wait();\n    }\n    catch (const std::exception& e)\n    {\n      XLO_ERROR(\"Rtd Disconnect: {0}\", e.what());\n    }\n  }\n\n  void RtdPublisher::connect(size_t numSubscribers)\n  {\n    if (numSubscribers == 1)\n    {\n      _task->start(*this);\n    }\n  }\n  bool RtdPublisher::disconnect(size_t numSubscribers)\n  {\n    if (numSubscribers == 0)\n    {\n      XLO_TRACE(L\"RtdPublisher stopping '{}' because it has no subscribers\", _topic);\n      stop();\n      return true;\n    }\n    return false;\n  }\n  void RtdPublisher::stop() noexcept\n  {\n    _task->cancel();\n  }\n  bool RtdPublisher::done() const noexcept\n  {\n    return _task->done();\n  }\n  const wchar_t* RtdPublisher::topic() const noexcept\n  {\n    return _topic.c_str();\n  }\n  bool RtdPublisher::publish(ExcelObj&& value) noexcept\n  {\n    try\n    {\n      _mgr.publish(_topic.c_str(), std::forward<ExcelObj>(value));\n      return true;\n    }\n    catch (const std::exception& e)\n    {\n      XLO_ERROR(L\"RTD error publishing {}: {}\", _topic, utf8ToUtf16(e.what()));\n    }\n    return false;\n  }\n\n  std::shared_ptr<IRtdServer> newRtdServer(\n    const wchar_t* progId, const wchar_t* clsid)\n  {\n    return COM::newRtdServer(progId, clsid);\n  }\n\n  shared_ptr<ExcelObj> rtdAsync(const shared_ptr<IRtdAsyncTask>& task)\n  {\n    // TODO: the worker thread for this RTD server will be terminated by Excel once all tasks have done\n    // ... is it a good idea to keep it alive?\n    if (!task)\n    {\n      COM::RtdAsyncManager::init();\n      return shared_ptr<ExcelObj>();\n    }\n   \n    // This const cast is OK because if we are returning a non-null value \n    // we will have cancelled the producer and nothing else will need the\n    // ExcelObj\n    return std::const_pointer_cast<ExcelObj>(\n      COM::RtdAsyncManager::getValue(task));\n  }\n\n  void rtdAsyncServerClear()\n  {\n    COM::RtdAsyncManager::clear();\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/AppObjects.cpp",
    "content": "#include <xlOil/ExcelTypeLib.h>\n#include <xloil/AppObjects.h>\n#include <xlOil-COM/Connect.h>\n#include <xlOil-COM/ComVariant.h>\n#include <xlOil-COM/ComEventSink.h>\n\n#include <xlOil/Range.h>\n#include <xloil/Log.h>\n#include <xloil/Throw.h>\n#include <xloil/State.h>\n#include <functional>\n#include <comdef.h>\n#include <tuple>\n\n\nusing std::shared_ptr;\nusing std::make_shared;\nusing std::vector;\nusing std::wstring;\n\nvoid workaroundVisualStudioBug()\n{\n  /*\n  As far as COM is concerned, \"templates\" are a new-fangled trick, to be\n  treated with suspicion and comtempt.  Duly, Microsoft's compiler\n  declines to look inside templated code for references to function bodies\n  which it really ought to have been pulling from the TLI file. Therefore,\n  we need to specify which functions we want to use in this nice explicit way\n  which should be impossible for even the most simple-minded compiler to get\n  wrong.\n  */\n  ((Excel::Windows*)(nullptr))->Get_NewEnum();\n  ((Excel::Windows*)(nullptr))->GetCount();\n  ((Excel::Windows*)(nullptr))->GetApplication();\n  ((Excel::Windows*)(nullptr))->GetItem(_variant_t());\n  ((Excel::Workbooks*)(nullptr))->Get_NewEnum();\n  ((Excel::Workbooks*)(nullptr))->GetCount();\n  ((Excel::Workbooks*)(nullptr))->GetApplication();\n  ((Excel::Sheets*)(nullptr))->Get_NewEnum();\n  ((Excel::Sheets*)(nullptr))->GetCount();\n  ((Excel::Sheets*)(nullptr))->GetApplication();\n  ((Excel::Sheets*)(nullptr))->GetItem(_variant_t());\n  ((Excel::Areas*)(nullptr))->Get_NewEnum();\n  ((Excel::Areas*)(nullptr))->GetCount();\n  ((Excel::Areas*)(nullptr))->GetApplication();\n  ((Excel::Areas*)(nullptr))->GetItem(0);\n}\n\nnamespace xloil\n{\n  using detail::UnknownObject;\n  using detail::AppObject;\n\n  namespace\n  {\n    template <class T>\n    using ComPtr_t = _com_ptr_t<_com_IIID<T, &__uuidof(T)>>;\n\n    template<typename T, class V>\n    struct comPtrCast\n    {\n      auto operator()(const ComPtr_t<V>& v) const { return ComPtr_t<T>(v); }\n    };\n    template<typename T>\n    struct comPtrCast<T, T>\n    {\n      auto operator()(const ComPtr_t<T>& v) const { return v; }\n    };\n\n    template<typename T>\n    using ComType = std::remove_reference_t<decltype(T(nullptr).com())>;\n\n    template<typename TAppObj, class V>\n    auto fromComPtr(const ComPtr_t<V>& v)\n    {\n      return TAppObj(comPtrCast<ComType<TAppObj>, V>()(v).Detach(), true);\n    }\n\n    template<typename Sig>\n    struct signature;\n\n    template<typename R, typename ...Args>\n    struct signature<R(Args...)>\n    {\n      using type = std::tuple<Args...>;\n    };\n\n    template<typename C, typename R, typename ...Args>\n    struct signature<R (C::*)(Args...)>\n    {\n      using type = std::tuple<Args...>;\n    };\n\n// C5046: Symbol involving type with internal linkage not defined\n#pragma warning(disable: 5046)\n\n    template<typename F>\n    auto arguments(const F&) -> typename signature<F>::type;\n\n    void throwIfRequired(HRESULT hr)\n    {\n      if (FAILED(hr))\n      {\n        auto error = _com_error(hr);\n        XLO_THROW(L\"COM Error {0:#x}: {1}\", (unsigned)error.Error(), error.ErrorMessage());\n      }\n    }\n\n    template<class T>\n    _variant_t toVariant(const T& x)\n    {\n      return _variant_t(x);\n    }\n    \n    template<>\n    _variant_t toVariant(const std::wstring_view& str)\n    {\n      auto variant = COM::stringToVariant(str);\n      return _variant_t(variant, false);\n    }\n\n    template<class TObj, class V = TObj::get_Item>\n    IDispatch* getItemHelper(TObj& obj, const _variant_t& what, HRESULT& retCode)\n    {\n      auto resultType = std::get<1>(arguments(&TObj::get_Item));\n      std::remove_pointer_t<decltype(resultType)> result;\n      retCode = obj.get_Item(what, &result);\n      return result;\n    }\n\n    template<class TObj>\n    IDispatch* getItemHelper(TObj& obj, const _variant_t& what, HRESULT& retCode)\n    {\n      try\n      {\n        retCode = S_OK;\n        return obj.GetItem(what).Detach();\n      }\n      catch (_com_error& error)\n      {\n        retCode = error.Error();\n        return nullptr;\n      }\n    }\n\n    template<class TObj, class TRes, class TArg>\n    bool comTryGet(TObj& obj, const TArg& what, TRes& out)\n    {\n      HRESULT hr;\n      auto result = getItemHelper(obj, toVariant(what), hr);\n      if (hr == DISP_E_BADINDEX)\n        return false;\n\n      throwIfRequired(hr);\n\n      out = TRes((ComType<TRes>*)result, true);\n      return true;\n    }\n\n    template<class TRes, class TObj, class TArg>\n    TRes comGetItem(TObj& obj, const TArg& what)\n    {\n      TRes result;\n      auto found = comTryGet(obj, what, result);\n      if (!found)\n        XLO_THROW(L\"Collection: could not find '{}'\", what);\n      return std::move(result);\n    }\n\n    template<class T, class V=T::get_Application>\n    auto comGetApp(T& x)\n    {\n      struct Excel::_Application* _result = 0;\n      HRESULT hr = x.get_Application(&_result);\n      throwIfRequired(hr);\n      return Application(_result);\n    }\n\n    template<class T>\n    auto comGetApp(T& x)\n    {\n      try\n      {\n        return Application(x.Application.Detach());\n      }\n      XLO_RETHROW_COM_ERROR;\n    }\n\n    template<class T, class V = T::get_Count>\n    auto comGetCount(T& x)\n    {\n      long result = 0;\n      HRESULT hr = com().get_Count(&result);\n      throwIfRequired(hr);\n      return result\n    }\n\n    template<class T>\n    auto comGetCount(T& x)\n    {\n      try\n      {\n        return x.GetCount();\n      }\n      XLO_RETHROW_COM_ERROR;\n    }\n  }\n\n  Application& thisApp()\n  {\n    return COM::attachedApplication();\n  }\n\n  void detail::UnknownObject::release()\n  {\n    if (_ptr)\n    {\n      _ptr->Release();\n      _ptr = nullptr;\n    }\n  }\n\n  void detail::UnknownObject::init(IUnknown* ptr, bool steal)\n  {\n    _ptr = ptr;\n    if (!steal && ptr)\n      ptr->AddRef();\n  }\n\n  Application::Application(Excel::_Application* app)\n    : AppObject(app ? app : COM::newApplicationObject(), true)\n  {\n    if (!valid())\n      throw ComConnectException(\"Failed to create Application object\");\n  }\n\n  Application::Application(size_t hWnd)\n    : AppObject([hWnd]() {\n        auto p = COM::applicationObjectFromWindow((HWND)hWnd);\n        if (!p)\n          throw ComConnectException(\"Failed to create Application object from window handle\");\n        return p;\n      }(), true)\n  {\n  }\n\n  namespace\n  {\n    Application workbookFinder(const wchar_t* workbook)\n    {\n      HWND xlmain = 0;\n      while ((xlmain = COM::nextExcelMainWindow(xlmain)) != 0)\n      {\n        auto xlApp = Application(size_t(xlmain));\n        ExcelWorkbook wb(nullptr);\n        if (xlApp.workbooks().tryGet(workbook, wb))\n          return xlApp;\n      }\n      throw ComConnectException(\"Failed to create Application object from workbook\");\n    }\n  }\n\n  Application::Application(const wchar_t* workbook)\n    : Application(workbookFinder(workbook))\n  {}\n\n  std::wstring Application::name() const\n  {\n    try\n    {\n      return com().Name.GetBSTR();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void Application::calculate(const bool full, const bool rebuild)\n  {\n    try\n    {\n      if (rebuild)\n        com().CalculateFullRebuild();\n      else if (full)\n        com().CalculateFull();\n      else\n        com().Calculate();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelWorksheet Application::activeWorksheet() const\n  {\n    try\n    {\n      Excel::_Worksheet* sheet = nullptr;\n      com().ActiveSheet->QueryInterface(&sheet);\n      return ExcelWorksheet(sheet);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelRange Application::activeCell() const\n  {\n    try\n    {\n      Excel::Range* range = nullptr;\n      com().ActiveCell->QueryInterface(&range);\n      return ExcelRange(range);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void Application::quit(bool silent)\n  {\n    try\n    {\n      if (!valid())\n        return;\n\n      if (silent)\n        com().PutDisplayAlerts(0, VARIANT_FALSE);\n      com().Quit();\n\n      // Release the COM object so app really does quit\n      release();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::getVisible() const \n  {\n    try\n    {\n      return com().Visible;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void Application::setVisible(bool x)\n  {\n    try\n    { \n      com().PutVisible(0, x ? VARIANT_TRUE : VARIANT_FALSE);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::getEnableEvents() const\n  {\n    try\n    {\n      return com().EnableEvents == VARIANT_TRUE;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::setEnableEvents(bool value)\n  {\n    try\n    {\n      auto& obj = com();\n      auto previousValue = obj.EnableEvents == VARIANT_TRUE;\n      obj.EnableEvents = _variant_t(value);\n      return previousValue;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::getDisplayAlerts() const\n  {\n    try\n    {\n      return com().GetDisplayAlerts() == VARIANT_TRUE;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::setDisplayAlerts(bool value)\n  {\n    try\n    {\n      auto& obj = com();\n      auto previousValue = obj.GetDisplayAlerts() == VARIANT_TRUE;\n      obj.PutDisplayAlerts(0, value ? VARIANT_TRUE : VARIANT_FALSE);\n      return previousValue;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::getScreenUpdating() const\n  {\n    try\n    {\n      return com().GetScreenUpdating() == VARIANT_TRUE;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool Application::setScreenUpdating(bool value)\n  {\n    try\n    {\n      auto& obj = com();\n      auto previousValue = obj.GetScreenUpdating() == VARIANT_TRUE;\n      obj.PutScreenUpdating(0, value ? VARIANT_TRUE : VARIANT_FALSE);\n      return previousValue;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  Application::CalculationMode Application::getCalculationMode() const\n  {\n    try\n    {\n      return (CalculationMode)com().GetCalculation();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  Application::CalculationMode Application::setCalculationMode(CalculationMode value)\n  {\n    try\n    {\n      auto& obj = com();\n      auto previousValue = obj.GetCalculation();\n      obj.PutCalculation(0, (Excel::XlCalculation)value);\n      return (CalculationMode)previousValue;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelRange Application::selection()\n  {\n    try\n    {\n      return fromComPtr<ExcelRange>(com().Selection);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  namespace\n  {\n    template <typename F, typename T, std::size_t N, std::size_t... Idx>\n    decltype(auto) appRun_impl(F func, T(&args)[N], std::index_sequence<Idx...>) {\n      return thisApp().com().Run(func, args[Idx]...);\n    }\n\n    template <typename T, std::size_t N>\n    decltype(auto) appRun(const wchar_t* func, T(&args)[N]) {\n      return appRun_impl(func, args, std::make_index_sequence<N>{});\n    }\n  }\n\n  ExcelObj Application::run(\n    const std::wstring& func,\n    const size_t nArgs,\n    const ExcelObj* args[])\n  {\n    if (nArgs > 30)\n      XLO_THROW(\"Application::Run maximum number of args is 30\");\n\n    static _variant_t vArgs[30] = {\n      vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,\n      vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,\n      vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,\n      vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,\n      vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,\n      vtMissing, vtMissing, vtMissing, vtMissing, vtMissing\n    };\n\n    // The construction of 'cleanup' is all noexcept\n    auto finally = [begin = vArgs, end = vArgs + nArgs](void*)\n    {\n      for (auto i = begin; i != end; ++i)\n        *i = vtMissing;\n    };\n    std::unique_ptr<void, decltype(finally)> cleanup((void*)1, finally);\n\n    for (size_t i = 0; i < nArgs; ++i)\n      COM::excelObjToVariant(&vArgs[i], *args[i], true);\n\n    try\n    {\n      auto result = appRun(func.c_str(), vArgs);\n      return COM::variantToExcelObj(result);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelWorkbook Application::open(\n    const std::wstring& filepath, \n    bool updateLinks, \n    bool readOnly,\n    wchar_t delimiter)\n  {\n    try\n    {\n      return fromComPtr<ExcelWorkbook>(com().Workbooks->Open(\n        _bstr_t(filepath.c_str()),\n        updateLinks ? 3 : 0,\n        _variant_t(readOnly),\n        delimiter == 0 ? 5 : 6,\n        vtMissing,\n        vtMissing,\n        vtMissing,\n        vtMissing,\n        delimiter != 0 ? _variant_t(wstring(delimiter, 1).c_str()) : vtMissing\n      ));\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelWindow::ExcelWindow(const std::wstring_view& caption, Application app)\n    : AppObject([&]() {\n        try\n        {\n          if (caption.empty())\n            return app.com().ActiveWindow.Detach();\n          else\n            return app.com().Windows->GetItem(toVariant(caption)).Detach();\n        }\n        XLO_RETHROW_COM_ERROR;\n      }(), true)\n  {}\n\n  size_t ExcelWindow::hwnd() const\n  {\n    return (size_t)com().Hwnd;\n  }\n\n  std::wstring ExcelWindow::name() const\n  {\n    return com().Caption.bstrVal;\n  }\n\n  Application ExcelWindow::app() const\n  {\n    try\n    {\n      return Application(com().Application.Detach());\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelWorkbook ExcelWindow::workbook() const\n  {\n    try\n    {\n      return ExcelWorkbook(Excel::_WorkbookPtr(com().Parent));\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelWorkbook::ExcelWorkbook(const std::wstring_view& name, Application app)\n    : AppObject([&]() {\n        try\n        {\n          if (name.empty())\n            return app.com().ActiveWorkbook.Detach();\n          else\n          {\n            auto workbooks = app.com().Workbooks;\n            return workbooks->GetItem(toVariant(name)).Detach();\n          }\n        }\n        XLO_RETHROW_COM_ERROR;\n      }(), true)\n  {}\n\n  std::wstring ExcelWorkbook::name() const\n  {\n    return com().Name.GetBSTR();\n  }\n\n  Application ExcelWorkbook::app() const\n  {\n    return comGetApp(com());\n  }\n\n  std::wstring ExcelWorkbook::path() const\n  {\n    return com().Path.GetBSTR();\n  }\n\n  void ExcelWorkbook::activate() const\n  {\n    com().Activate();\n  }\n\n  ExcelWorksheet ExcelWorkbook::add(\n    const std::wstring_view& name, \n    const ExcelWorksheet& before, \n    const ExcelWorksheet& after) const\n  {\n    try\n    {\n      if (before.valid() && after.valid())\n        XLO_THROW(\"ExcelWorkbook::add: at most one of 'before' and 'after' should be specified\");\n\n      auto ws = fromComPtr<ExcelWorksheet>(com().Worksheets->Add(\n        before.valid() ? _variant_t(&before.com()) : vtMissing,\n        after.valid()  ? _variant_t(&after.com())  : vtMissing));\n      if (!name.empty())\n        ws.setName(name);\n      return ws;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelWorkbook::save(const std::wstring_view& filepath)\n  {\n    try\n    {\n      if (filepath.empty())\n        com().Save();\n      else\n        com().SaveAs(toVariant(filepath), \n          vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, \n          Excel::XlSaveAsAccessMode::xlNoChange);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelWorkbook::close(bool save)\n  {\n    try\n    {\n      com().Close(_variant_t(save));\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  std::wstring ExcelWorksheet::name() const\n  {\n    try\n    {\n      return com().Name.GetBSTR();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  Application ExcelWorksheet::app() const\n  {\n    return comGetApp(com());\n  }\n\n  ExcelWorkbook ExcelWorksheet::parent() const\n  {\n    try\n    {\n      return fromComPtr<ExcelWorkbook>(com().Parent);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelRange ExcelWorksheet::range(\n    int fromRow, int fromCol,\n    int toRow, int toCol) const\n  {\n    try\n    {\n      auto& obj = com();\n      if (toRow == Range::TO_END)\n        toRow = obj.Rows->GetCount() - 1;\n      if (toCol == Range::TO_END)\n        toCol = obj.Columns->GetCount() - 1;\n\n      auto r = obj.GetRange(\n        obj.Cells->Item[fromRow + 1][fromCol + 1],\n        obj.Cells->Item[toRow + 1][toCol + 1]);\n      return ExcelRange(r);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelRange ExcelWorksheet::range(const std::wstring_view& address) const\n  {\n    try\n    {\n      return ExcelRange(\n        formatStr(L\"'[%s]%s'!%s\", \n          parent().name().c_str(), \n          name().c_str(), \n          wstring(address).data()),\n        app());\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelObj ExcelWorksheet::value(Range::row_t i, Range::col_t j) const\n  {\n    Excel::RangePtr pRange(com().Cells->Item[i][j].pdispVal);\n    return COM::variantToExcelObj(pRange->Value2);\n  }\n\n  ExcelRange ExcelWorksheet::usedRange() const\n  {\n    try\n    {\n      return ExcelRange(com().GetUsedRange(0));\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelWorksheet::activate()\n  {\n    try\n    {\n      com().Activate();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelWorksheet::calculate()\n  {\n    try\n    {\n      com().Calculate();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  void ExcelWorksheet::setName(const std::wstring_view& name)\n  {\n    try\n    {\n      com().Name = toVariant(name).bstrVal;\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  ExcelWorkbook Workbooks::add()\n  {\n    try\n    {\n      return fromComPtr<ExcelWorkbook>(com().Add());\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  namespace\n  {\n    auto variantToUnknown(const VARIANT& v)\n    {\n      if (v.vt != VT_DISPATCH)\n        XLO_THROW(\"Unexpected variant type, should be IDispatch\");\n      return UnknownObject(v.pdispVal, true);\n    }\n  }\n\n  detail::ComIteratorBase::ComIteratorBase(\n    IUnknown* ptr,\n    UnknownObject next)\n    : AppObject([=]() {\n        IEnumVARIANT* iterator;\n        ptr->QueryInterface(&iterator);\n        return iterator;\n      }(), true)\n    , _next(next)\n  {\n  }\n\n  UnknownObject detail::ComIteratorBase::get()\n  {\n    return _next;\n  }\n\n  void detail::ComIteratorBase::increment()\n  {\n    try\n    {\n      VARIANT next;\n      ULONG nFetched = 0;\n      if (SUCCEEDED(com().Next(1, &next, &nFetched)) && nFetched > 0)\n        _next = variantToUnknown(next);\n      else\n        _next = UnknownObject();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  detail::ComIteratorBase detail::ComIteratorBase::excrement()\n  {\n    try\n    {\n      IEnumVARIANT* clone;\n      if (FAILED(com().Clone(&clone)))\n        XLO_THROW(\"ComIterator: internal error copy failed\");\n\n      auto prev = UnknownObject(std::move(_next));\n      increment();\n\n      return ComIteratorBase(clone, prev);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  bool detail::ComIteratorBase::operator==(const detail::ComIteratorBase& other) const\n  {\n    return _next.ptr() == other._next.ptr();\n  }\n\n  void detail::ComIteratorBase::getMany(size_t n, std::vector<UnknownObject>& result)\n  {\n    try\n    {\n      // We take the value in _next and fetch *n* more values \n      vector<VARIANT> variants(n);\n      ULONG nFetched;\n      com().Next((ULONG)n, variants.data(), &nFetched);\n    \n      result.emplace_back(std::move(_next));\n\n      for (auto i = 0u; i < std::min(n - 1, (size_t)nFetched); ++i)\n        result.emplace_back(variantToUnknown(variants[i]));\n      \n      // If iterator was exhausted, leave _next as null value, otherwise\n      // take the last value we fetched\n      if (nFetched == n)\n        _next = variantToUnknown(variants[n - 1]);\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  template<class T, class Ptr>\n  T Collection<T, Ptr>::get(const std::wstring_view& name) const\n  {\n    return comGetItem<T>(com(), name);\n  }\n\n  template<class T, class Ptr>\n  T Collection<T, Ptr>::get(const size_t index) const\n  {\n    return comGetItem<T>(com(), index);\n  }\n\n  template<class T, class Ptr>\n  bool Collection<T, Ptr>::tryGet(const std::wstring_view& name, T& out) const\n  {\n    return comTryGet(com(), name, out);\n  }\n\n  template<class T, class Ptr>\n  bool Collection<T, Ptr>::tryGet(const size_t index, T& out) const\n  {\n    return comTryGet(com(), index, out);\n  }\n\n  template<class T, class Ptr>\n  size_t Collection<T, Ptr>::count() const\n  {\n    return comGetCount(com());\n  }\n\n  template<class T, class Ptr>\n  Application Collection<T, Ptr>::app() const\n  {\n    return comGetApp(com());\n  }\n\n  template<class T, class Ptr>\n  std::vector<T> Collection<T, Ptr>::list() const\n  {\n    try\n    {\n      auto iterator = ComIterator<T>((IUnknown*)com().Get_NewEnum());\n      return iterator.getMany(count());\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n  \n  template<class T, class Ptr>\n  ComIterator<T> Collection<T, Ptr>::begin() const\n  {\n    return ComIterator<T>(com().Get_NewEnum());\n  }\n\n  Worksheets::Worksheets(const Application& app)\n    : Worksheets(app.workbooks().active())\n  {}\n\n  Worksheets::Worksheets(const ExcelWorkbook& workbook)\n    : Collection(workbook.valid()\n      ? workbook.com().Worksheets.Detach()\n      : nullptr)\n  {\n    if (!valid())\n      XLO_THROW(\"No active workbook or workbook invalid\");\n  }\n\n  ExcelWorkbook Worksheets::parent() const\n  {\n    return fromComPtr<ExcelWorkbook>(com().Parent);\n  }\n\n  Workbooks::Workbooks(const Application& app)\n    : Collection(app.com().Workbooks.Detach())\n  {}\n\n  Windows::Windows(const Application& app)\n    : Collection(app.com().Windows.Detach())\n  {}\n\n  Windows::Windows(const ExcelWorkbook& workbook)\n    : Collection(workbook.com().Windows.Detach())\n  {}\n\n  Ranges::Ranges(const ExcelRange& multiRange)\n    : Collection(multiRange.com().Areas.Detach())\n  { }\n\n  const std::set<std::wstring>& Application::workbookPaths()\n  {\n    return COM::workbookPaths();\n  }\n}\n"
  },
  {
    "path": "src/xlOil-COM/ClassFactory.cpp",
    "content": "#include \"ClassFactory.h\"\n#include <xlOilHelpers/GuidUtils.h>\n\nnamespace\n{\n  template<int TValCode>\n  HRESULT inline regWriteImpl(\n    HKEY hive,\n    const wchar_t* path,\n    const wchar_t* name,\n    BYTE* data,\n    size_t dataLength)\n  {\n    HRESULT res;\n    HKEY key;\n\n    if (0 > (res = RegCreateKeyExW(\n      hive,\n      path,\n      0, NULL,\n      REG_OPTION_VOLATILE, // key not saved on system shutdown\n      KEY_ALL_ACCESS,      // no access restrictions\n      NULL,                // no security restrictions\n      &key, NULL)))\n      return res;\n\n    res = RegSetValueEx(\n      key,\n      name,\n      0,\n      TValCode,\n      data,\n      (DWORD)dataLength);\n\n    RegCloseKey(key);\n    return res;\n  }\n\n\n  HRESULT inline regWrite(\n    HKEY hive,\n    const wchar_t* path,\n    const wchar_t* name,\n    const wchar_t* value)\n  {\n    return regWriteImpl<REG_SZ>(hive, path, name,\n      (BYTE*)value, (wcslen(value) + 1) * sizeof(wchar_t));\n  }\n\n  HRESULT inline regWrite(\n    HKEY hive,\n    const wchar_t* path,\n    const wchar_t* name,\n    DWORD value)\n  {\n    return regWriteImpl<REG_DWORD>(hive, path, name,\n      (BYTE*)&value, sizeof(DWORD));\n  }\n}\n\nnamespace xloil\n{\n  namespace COM\n  {\n    class ClassFactory : public ComObject<IClassFactory>\n    {\n    public:\n      using creator_t = std::function<IUnknown* ()>;\n      creator_t _creator;\n\n      ClassFactory(const creator_t& func)\n        : _creator(func)\n      {}\n\n      STDMETHOD(CreateInstance)(\n        IUnknown* pUnkOuter,\n        REFIID riid,\n        void** ppvObject) override\n      {\n        if (pUnkOuter)\n          return CLASS_E_NOAGGREGATION;\n        auto* instance = _creator();\n        auto ret = instance->QueryInterface(riid, ppvObject);\n        return ret;\n      }\n\n      STDMETHOD(LockServer)(BOOL /*fLock*/) override\n      {\n        return E_NOTIMPL;\n      }\n\n      STDMETHOD(QueryInterface)(REFIID riid, void** ppv)\n      {\n        *ppv = NULL;\n        if (riid == IID_IUnknown || riid == __uuidof(IClassFactory))\n        {\n          *ppv = (IUnknown*)this;\n          AddRef();\n          return S_OK;\n        }\n        return E_NOINTERFACE;\n      }\n    };\n\n    RegisterCom::RegisterCom(\n      const std::function<IUnknown* ()>& createServer,\n      const wchar_t* progId,\n      const GUID* fixedClsid)\n    {\n      GUID clsid = { 0 };\n\n      if (fixedClsid)\n      {\n        clsid = *fixedClsid;\n        StringFromGUID2(clsid, _clsidStr, _countof(_clsidStr));\n      }\n\n      if (progId)\n      {\n        // Check if ProgId is already registered by trying to find its CLSID\n        auto clsidKey = fmt::format(L\"Software\\\\Classes\\\\{0}\\\\CLSID\", progId);\n        std::wstring registeredClsId;\n        if (getWindowsRegistryValue(L\"HKCU\", clsidKey.c_str(), registeredClsId))\n        {\n          if (fixedClsid)\n          {\n            if (_wcsicmp(_clsidStr, registeredClsId.c_str()) != 0)\n              XLO_THROW(L\"COM Server progId={0} already in registry with clsid={1}, \"\n                \"but clsid={2} was requested\",\n                progId, registeredClsId, _clsidStr);\n\n          }\n          else\n          {\n            wcsncpy_s(_clsidStr, registeredClsId.c_str(), registeredClsId.length());\n            CLSIDFromString(_clsidStr, &clsid);\n          }\n        }\n        _progId = progId;\n      }\n\n      // Ensure we populate the clsid GUID and the assoicated _clsid string. If \n      // this value has not been provided or read from the registry above, we\n      // create a new GUID.\n\n      if (clsid.Data1 == 0)\n      {\n        if (CoCreateGuid(&clsid) != 0)\n          XLO_THROW(\"Failed to create CLSID for COM Server\");\n        StringFromGUID2(clsid, _clsidStr, _countof(_clsidStr));\n      }\n\n      // If no progId has been specified, use 'XlOil.<Clsid>'\n      if (!progId)\n      {\n        // COM ProgIds must have 39 or fewer chars and no punctuation other than '.'\n        _progId = std::wstring(L\"XlOil.\") + guidToWString(clsid, GuidToString::BASE62);\n      }\n\n      // Create the COM 'server' and a class factory which returns it.  Normally\n      // a class factory creates the COM object on demand, so we are subverting\n      // the pattern slightly!\n      _factory = new ClassFactory(createServer);\n\n      // Register our class factory in the Registry\n      HRESULT res;\n      res = CoRegisterClassObject(\n        clsid,                     // the CLSID to register\n        _factory.p,                // the factory that can construct the object\n        CLSCTX_INPROC_SERVER,      // can only be used inside our process\n        REGCLS_MULTIPLEUSE,        // it can be created multiple times\n        &_comRegistrationCookie);\n\n      auto keyPath = fmt::format(L\"Software\\\\Classes\\\\{0}\\\\CLSID\", _progId);\n      writeRegistry(\n        HKEY_CURRENT_USER,\n        keyPath.c_str(),\n        0,\n        _clsidStr);\n\n      // Note the outer key to ensure it is deleted\n      addedKey(HKEY_CURRENT_USER,\n        std::wstring_view(keyPath).substr(0, keyPath.find_last_of(L'\\\\')));\n\n      // This registry entry is not needed to call CLSIDFromProgID, nor\n      // to call CoCreateInstance, but for some reason the RTD call to\n      // Excel will fail without it.\n      keyPath = fmt::format(L\"Software\\\\Classes\\\\CLSID\\\\{0}\\\\InProcServer32\", _clsidStr);\n      writeRegistry(\n        HKEY_CURRENT_USER,\n        keyPath.c_str(),\n        0,\n        L\"xlOil.dll\"); // Name of dll isn't actually used.\n\n      addedKey(HKEY_CURRENT_USER,\n        std::wstring_view(keyPath).substr(0, keyPath.find_last_of(L'\\\\')));\n\n      // Check all is good by looking up the CLSID from our progId\n      CLSID foundClsid;\n      res = CLSIDFromProgID(_progId.c_str(), &foundClsid);\n      if (res != S_OK || !IsEqualCLSID(foundClsid, clsid))\n        XLO_THROW(L\"Failed to register com server '{0}'\", _progId);\n    }\n\n    HRESULT RegisterCom::writeRegistry(\n      HKEY hive,\n      const wchar_t* path,\n      const wchar_t* name,\n      const wchar_t* value)\n    {\n      addedKey(hive, path);\n      XLO_DEBUG(L\"Writing registry key {}\\\\{} = {}\", path, name ? name : L\"\", value);\n      return regWrite(hive, path, name, value);\n    }\n\n    HRESULT RegisterCom::writeRegistry(\n      HKEY hive,\n      const wchar_t* path,\n      const wchar_t* name,\n      DWORD value)\n    {\n      addedKey(hive, path);\n      XLO_DEBUG(L\"Writing registry key {}\\\\{} = {}\", path, name, value);\n      return regWrite(hive, path, name, value);\n    }\n\n    void RegisterCom::cleanRegistry()\n    {\n      // Remove the registry keys used to locate the server (they would be \n      // removed anyway on windows logoff)\n      for (auto& [hive, path] : _regKeysAdded)\n        RegDeleteKey(hive, path.c_str());\n      _regKeysAdded.clear();\n    }\n\n    RegisterCom::~RegisterCom()\n    {\n      CoRevokeClassObject(_comRegistrationCookie);\n      cleanRegistry();\n    }\n  }\n}\n"
  },
  {
    "path": "src/xlOil-COM/ClassFactory.h",
    "content": "#pragma once\n#include <xloil/WindowsSlim.h>\n#include <Objbase.h>\n#include <atlcomcli.h>\n#include <xloil/Throw.h>\n#include <xloil/Log.h>\n#include <xlOilHelpers/Environment.h>\n#include <string>\n#include <list>\n\nnamespace xloil\n{\n  namespace COM\n  {\n    /// <summary>\n    /// Simple thread-safe COM-style reference count which statisfies IUnknown.\n    /// </summary>\n    template <class Base>\n    class ComObject : public Base\n    {\n    public:\n      template<class...Args>\n      ComObject(Args&&...args)\n        : Base(std::forward<Args>(args)...)\n        , m_dwRef(0)\n      {}\n\n      virtual ~ComObject()\n      {\n#ifdef _DEBUG\n        if (m_dwRef > 0)\n          _ASSERTE(0 && \"Destructor called on object with positive ref count\");\n#endif\n        // Set refcount to -(LONG_MAX/2) to protect destruction and\n        // also catch mismatched Release in debug builds\n        this->m_dwRef = -(LONG_MAX / 2);\n      }\n      ULONG __stdcall AddRef() noexcept\n      {\n        return ::InterlockedIncrement(&m_dwRef);\n      }\n      ULONG __stdcall Release() noexcept\n      {\n        ::InterlockedDecrement(&m_dwRef);\n#ifdef _DEBUG\n        if (m_dwRef < -(LONG_MAX / 2))\n          _ASSERTE(0 && \"Release called on a pointer that has already been released\");\n#endif\n        if (m_dwRef == 0)\n          delete this;\n        return (ULONG)m_dwRef;\n      }\n\n    private:\n      long m_dwRef;\n    };\n\n    class RegisterCom\n    {\n      CComPtr<IUnknown> _factory;\n      DWORD _comRegistrationCookie;\n      wchar_t _clsidStr[39]; // includes braces and null-terminator\n      std::wstring _progId;\n      std::list<std::pair<HKEY, std::wstring>> _regKeysAdded;\n\n    public:\n      RegisterCom(\n        const std::function<IUnknown* ()>& createServer,\n        const wchar_t* progId = nullptr,\n        const GUID* fixedClsid = nullptr);\n\n      ~RegisterCom();\n\n      const wchar_t* progid() const { return _progId.c_str(); }\n      const wchar_t* clsid()  const { return _clsidStr; }\n\n      HRESULT writeRegistry(\n        HKEY hive,\n        const wchar_t* path,\n        const wchar_t* name,\n        const wchar_t* value);\n\n      HRESULT writeRegistry(\n        HKEY hive,\n        const wchar_t* path,\n        const wchar_t* name,\n        DWORD value);\n\n      void addedKey(HKEY hive, std::wstring_view path)\n      {\n        _regKeysAdded.emplace_back(std::pair(hive, std::wstring(path)));\n      }\n\n      void cleanRegistry();\n    };\n  \n    /// <summary>\n    /// Null implementation of all IDispatch functionality. Returns E_NOTIMPL\n    /// for every call.\n    /// </summary>\n    template <class TBase>\n    class NoIDispatchImpl : public TBase\n    {\n    public:\n      // IDispatch\n      STDMETHOD(GetTypeInfoCount)(UINT* /*pctinfo*/)\n      {\n        return E_NOTIMPL;\n      }\n      STDMETHOD(GetTypeInfo)(\n        UINT /*itinfo*/,\n        LCID /*lcid*/,\n        ITypeInfo** /*pptinfo*/)\n      {\n        return E_NOTIMPL;\n      }\n      STDMETHOD(GetIDsOfNames)(\n        REFIID /*riid*/,\n        LPOLESTR* /*rgszNames*/,\n        UINT /*cNames*/,\n        LCID /*lcid*/,\n        DISPID* /*rgdispid*/)\n      {\n        return E_NOTIMPL;\n      }\n      STDMETHOD(Invoke)(\n        DISPID /*dispidMember*/,\n        REFIID /*riid*/,\n        LCID /*lcid*/,\n        WORD /*wFlags*/,\n        DISPPARAMS* /*pdispparams*/,\n        VARIANT* /*pvarResult*/,\n        EXCEPINFO* /*pexcepinfo*/,\n        UINT* /*puArgErr*/)\n      {\n        return E_NOTIMPL;\n      }\n    };\n\n    /// <summary>\n    /// Base class for a COM event sink which binds to a single source and responds\n    /// to QueryInterface for the TSource interface.\n    /// </summary>\n    /// <typeparam name=\"TBase\">Base class, must inherit from TSource</typeparam>\n    /// <typeparam name=\"TSource\">Interface for target connection point</typeparam>\n    template<class TBase, class TSource>\n    class ComEventHandler : public TBase\n    {\n    public:\n      ComEventHandler() noexcept \n        : _pIConnectionPoint(nullptr)\n      {}\n\n      virtual ~ComEventHandler() noexcept\n      {\n        if (_pIConnectionPoint)\n          XLO_ERROR(\"ComEventHandler destroyed before being disconnected\");\n      }\n\n      bool connect(IUnknown* source) noexcept\n      {\n        IConnectionPointContainer* pContainer = nullptr;\n\n        // Get connection point for source\n        source->QueryInterface(IID_IConnectionPointContainer, (void**)&pContainer);\n        if (pContainer)\n        {\n          pContainer->FindConnectionPoint(__uuidof(TSource), &_pIConnectionPoint);\n          pContainer->Release();\n        }\n\n        return _pIConnectionPoint && (S_OK == _pIConnectionPoint->Advise(this, &_dwEventCookie));\n      }\n\n      /// <summary>\n      /// Must be called to destroy this object because the connection creates \n      /// a reference to this class, preventing it from being destroyed.\n      /// </summary>\n      void disconnect() noexcept\n      {\n        if (_pIConnectionPoint)\n        {\n          _pIConnectionPoint->Unadvise(_dwEventCookie);\n          _pIConnectionPoint->Release();\n          _pIConnectionPoint = nullptr;\n        }\n      }\n\n      STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) noexcept\n      {\n        if (riid == IID_IUnknown)\n          *ppvObject = (IUnknown*)this;\n        else if ((riid == IID_IDispatch) || (riid == __uuidof(TSource)))\n          *ppvObject = (IDispatch*)this;\n        else\n          return E_NOINTERFACE;\n\n        AddRef();\n        return S_OK;\n      }\n\n    private:\n      IConnectionPoint* _pIConnectionPoint;\n      DWORD\t_dwEventCookie;\n    };\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/ComAddin.cpp",
    "content": "#include \"ComAddin.h\"\n#include <xlOil/ExcelTypeLib.h>\n#include \"ClassFactory.h\"\n#include \"Connect.h\"\n#include \"RibbonExtensibility.h\"\n#include \"CustomTaskPane.h\"\n#include <xlOil/AppObjects.h>\n#include <xlOil/State.h>\n#include <xlOil/Log.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/ExcelUI.h>\n#include <xlOil/Events.h>\n#include <map>\n#include <functional>\n\n\nusing std::wstring;\nusing std::map;\nusing std::vector;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing namespace Office;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    struct ComAddinEvents\n    {\n      void OnDisconnection(bool /*excelClosing*/) {}\n      void OnAddInsUpdate() { Event::ComAddinsUpdate().fire(); }\n      void OnBeginShutdown() {}\n    };\n\n    class CustomTaskPaneConsumerImpl :\n        public NoIDispatchImpl< ComObject<ICustomTaskPaneConsumer>>\n    {\n    public:\n      HRESULT __stdcall raw_CTPFactoryAvailable(ICTPFactory* ctpfactory) override\n      {\n        factory = ctpfactory;\n        return S_OK;\n      }\n\n      STDMETHOD(QueryInterface)(REFIID riid, void** ppv) noexcept\n      {\n        *ppv = NULL;\n        if (riid == IID_IUnknown || riid == IID_IDispatch\n          || riid == __uuidof(ICustomTaskPaneConsumer))\n        {\n          *ppv = this;\n          AddRef();\n          return S_OK;\n        }\n        return E_NOINTERFACE;\n      }\n\n      STDMETHOD(Invoke)(\n        _In_ DISPID dispidMember,\n        _In_ REFIID /*riid*/,\n        _In_ LCID /*lcid*/,\n        _In_ WORD /*wFlags*/,\n        _In_ DISPPARAMS* pdispparams,\n        _Out_opt_ VARIANT* /*pvarResult*/,\n        _Out_opt_ EXCEPINFO* /*pexcepinfo*/,\n        _Out_opt_ UINT* /*puArgErr*/) override\n      {\n        // Remember the args are in reverse order\n        auto* rgvarg = pdispparams->rgvarg;\n\n        if (dispidMember == 1)\n        {\n          return raw_CTPFactoryAvailable((Office::ICTPFactory*)rgvarg[0].pdispVal);\n        }\n\n        XLO_ERROR(\"Internal Error: unknown dispid called on task pane consumer Invoke.\");\n        return E_FAIL;\n      }\n\n      ICTPFactory* factory = nullptr;\n    };\n\n    // This class does not need a disp-interface\n    class ComAddinImpl :\n        public NoIDispatchImpl<ComObject<AddInDesignerObjects::_IDTExtensibility2>>\n    {\n    public:\n      ComAddinImpl()\n        : _customTaskPane(new CustomTaskPaneConsumerImpl())\n        , ribbon(nullptr)\n      {}\n\n      STDMETHOD(QueryInterface)(REFIID riid, void** ppv) noexcept\n      {\n        *ppv = NULL;\n        if (riid == IID_IUnknown \n          || riid == __uuidof(AddInDesignerObjects::_IDTExtensibility2))\n        {\n          auto p = (AddInDesignerObjects::_IDTExtensibility2*)this;\n          *ppv = p;\n          p->AddRef();\n          return S_OK;\n        }\n        else if (riid == __uuidof(IRibbonExtensibility))\n        {\n          if (ribbon)\n            return ribbon->QueryInterface(riid, ppv);\n        }\n        else if (riid == __uuidof(ICustomTaskPaneConsumer))\n        {\n          return _customTaskPane->QueryInterface(riid, ppv);\n        }\n        return E_NOINTERFACE;\n      }\n      virtual HRESULT __stdcall raw_OnConnection(\n        /*[in]*/ IDispatch * /*Application*/,\n        /*[in]*/ enum AddInDesignerObjects::ext_ConnectMode /*ConnectMode*/,\n        /*[in]*/ IDispatch * /*AddInInst*/,\n        /*[in]*/ SAFEARRAY**) override\n      {\n        return S_OK;\n      }\n      virtual HRESULT __stdcall raw_OnDisconnection(\n        /*[in]*/ enum AddInDesignerObjects::ext_DisconnectMode RemoveMode,\n        /*[in]*/ SAFEARRAY**) override\n      {\n        events->OnDisconnection(\n          RemoveMode == AddInDesignerObjects::ext_DisconnectMode::ext_dm_HostShutdown);\n        return S_OK;\n      }\n      virtual HRESULT __stdcall raw_OnAddInsUpdate(SAFEARRAY**) override\n      {\n        events->OnAddInsUpdate();\n        return S_OK;\n      }\n      virtual HRESULT __stdcall raw_OnStartupComplete(SAFEARRAY**) override\n      {\n        return S_OK;\n      }\n      virtual HRESULT __stdcall raw_OnBeginShutdown(SAFEARRAY**) override\n      {\n        events->OnBeginShutdown();\n        return S_OK;\n      }\n\n      ICTPFactory* ctpFactory() const\n      {\n        return _customTaskPane ? _customTaskPane->factory : nullptr;\n      }\n\n      IRibbonExtensibility* ribbon;\n      CComPtr<CustomTaskPaneConsumerImpl> _customTaskPane;\n      unique_ptr<ComAddinEvents> events;\n    };\n\n    struct SetAutomationSecurity\n    {\n      SetAutomationSecurity(Office::MsoAutomationSecurity value)\n      {\n        _previous = thisApp().com().AutomationSecurity;\n        thisApp().com().AutomationSecurity = value;\n      }\n      ~SetAutomationSecurity()\n      {\n        try\n        {\n          thisApp().com().AutomationSecurity = _previous;\n        }\n        catch (...)\n        {\n        }\n      }\n      Office::MsoAutomationSecurity _previous;\n    };\n\n    class ComAddinCreator : public IComAddin\n    {\n    private:\n      auto& impl() const\n      {\n        return *_impl;\n      }\n\n      CComPtr<ComAddinImpl>     _impl;\n      RegisterCom               _registrar;\n      bool                      _connected = false;\n      shared_ptr<IRibbon>       _ribbon;\n      COMAddIn*                 _comAddin = nullptr;\n      TaskPaneMap               _panes;\n      shared_ptr<const void>    _closeHandler;\n      std::wstring              _name;\n      std::wstring              _description;\n    \n      ComAddinCreator(const wchar_t* name, const wchar_t* description)\n        : _impl(new ComAddinImpl())\n        , _name(name)\n        , _description(description ? description : L\"\")\n        , _registrar(\n          [p = _impl.p]() { return p; },\n          formatStr(L\"%s.ComAddin\", name ? name : L\"xlOil\").c_str())\n      {\n        // TODO: hook OnDisconnect to stop user from disabling COM stub.\n        impl().events.reset(new ComAddinEvents());\n\n        if (!name)\n          XLO_THROW(\"Com add-in name must be provided\");\n      }\n\n    public:\n      static auto create(const wchar_t* name, const wchar_t* description)\n      {\n        try\n        {\n          auto p = std::shared_ptr<ComAddinCreator>(new ComAddinCreator(name, description));\n          p->_closeHandler = Event::WorkbookAfterClose().weakBind(\n            std::weak_ptr<ComAddinCreator>(p),\n            &ComAddinCreator::handleWorkbookClose);\n          return p;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      void close() noexcept override\n      {\n        try\n        {\n          _closeHandler.reset();\n          for (auto& pane : _panes)\n            pane.second->destroy();\n\n          _panes.clear();\n          disconnect();\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"ComAddin failed to close: {0}\", e.what());\n        }\n        catch (_com_error& e)\n        {\n          XLO_ERROR(L\"ComAddin failed to close with COM Error {0:#x}: {1}\", \n            (unsigned)e.Error(), e.ErrorMessage());\n        }\n      }\n\n      void findAddin(Excel::_Application& app)\n      {\n        auto ourProgid = _variant_t(progid());\n        app.GetCOMAddIns()->raw_Item(&ourProgid, &_comAddin); // TODO: Does this need decref/incref?\n      }\n\n      bool isComAddinConnected() const\n      {\n        try\n        {\n          return _comAddin\n            ? (_comAddin->Connect == VARIANT_TRUE)\n            : false;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      void connect(\n        const wchar_t* xml,\n        const RibbonMap& mapper) override\n      {\n        if (_connected)\n          return;\n        try\n        {\n          if (xml)\n          {\n            _ribbon = createRibbon(xml, mapper);\n            impl().ribbon = _ribbon->getRibbon();\n          }\n\n          auto& app = thisApp().com();\n\n          SetAutomationSecurity setSecurity(\n            Office::MsoAutomationSecurity::msoAutomationSecurityLow);\n\n          // It's possible the addin has already been registered. We ensure it is \n          // reconnected, so that any new Ribbon XML is picked up by calling \n          // findAddin then disconnecting it.\n          // \n          // If the addin has already been registered, the findAddin call can cause Excel \n          // to query it for ribbon XML which is why we run this after setting the XML.\n          findAddin(app);\n\n          if (!_comAddin)\n          {\n            const auto addinPath = fmt::format(\n              L\"Software\\\\Microsoft\\\\Office\\\\Excel\\\\AddIns\\\\{0}\", _registrar.progid());\n            _registrar.writeRegistry(\n              HKEY_CURRENT_USER, addinPath.c_str(), L\"FriendlyName\", _name.c_str());\n            _registrar.writeRegistry(\n              HKEY_CURRENT_USER, addinPath.c_str(), L\"LoadBehavior\", (DWORD)0);\n            if (_description.c_str())\n              _registrar.writeRegistry(\n                HKEY_CURRENT_USER, addinPath.c_str(), L\"Description\", _description.c_str());\n          } \n          else if (isComAddinConnected())\n          {\n            disconnect();\n          }\n          \n          app.GetCOMAddIns()->Update();\n          if (!_comAddin)\n          {\n            findAddin(app);\n\n            if (!_comAddin)\n              XLO_THROW(L\"Add-in connect: could not find addin '{0}'\", progid());\n          }\n\n          _comAddin->Connect = VARIANT_TRUE;\n          _connected = true;\n        }\n        catch (_com_error& error)\n        {\n          if (error.Error() == 0x80004004) // Operation aborted\n          {\n            XLO_THROW(\"During add-in connect, received Operation Aborted ({}) this probably indicates \"\n              \"blocking by add-in security.  Check add-ins are enabled and this add-in is not a disabled \"\n              \"COM add-in.\", (unsigned)error.Error());\n          }\n          else if (error.Error() == VBA_E_IGNORE)\n            throw xloil::ComBusyException();\n          else\n            XLO_THROW(L\"COM Error {0:#x}: {1}\", (unsigned)error.Error(), error.ErrorMessage());\n        }\n      }\n\n      // TODO: use of disconnect is fatal to any attached custom task panes, they do not\n      // reappear on connect\n      void disconnect() override\n      {\n        if (!_connected)\n          return;\n        try\n        {\n          _comAddin->Connect = VARIANT_FALSE;\n          _connected = false;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      const wchar_t* progid() const override\n      {\n        return _registrar.progid();\n      }\n      void ribbonInvalidate(const wchar_t* controlId = 0) const override\n      {\n        if (_ribbon)\n          _ribbon->invalidate(controlId);\n      }\n      bool ribbonActivate(const wchar_t* controlId) const override\n      {\n        return _ribbon\n          ? _ribbon->activateTab(controlId)\n          : false;\n      }\n\n      shared_ptr<ICustomTaskPane> createTaskPane(\n        const wchar_t* name,\n        const ExcelWindow* window,\n        const wchar_t* progId) override\n      {\n        auto factory = impl().ctpFactory();\n        if (!factory)\n          XLO_THROW(\"Internal error: failed to receive CTP factory\");\n\n        shared_ptr<ICustomTaskPane> pane(\n          createCustomTaskPane(\n            *factory, \n            name, \n            window ? (IDispatch*)window->ptr() : nullptr, \n            progId));\n\n        _panes.insert(make_pair(pane->window().workbook().name(), pane));\n\n        return pane;\n      }\n\n      const TaskPaneMap& panes() const override { return _panes; }\n\n      void handleWorkbookClose(const wchar_t* wbName)\n      {\n        // destroy\n        _panes.erase(wbName);\n      }\n    };\n\n    shared_ptr<IComAddin> createComAddin(\n      const wchar_t* name, const wchar_t* description)\n    {\n      return ComAddinCreator::create(name, description);\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/ComAddin.h",
    "content": "#pragma once\n#include <memory>\nnamespace xloil\n{\n  class IComAddin;\n\n  namespace COM\n  {\n    std::shared_ptr<IComAddin> createComAddin(const wchar_t* name, const wchar_t* description);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/ComEventSink.cpp",
    "content": "#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/AppObjects.h>\n#include \"ClassFactory.h\"\n#include \"Connect.h\"\n#include <xlOil/Events.h>\n#include <xlOil/ExcelThread.h>\n#include <set>\n#include <filesystem>\n\nnamespace fs = std::filesystem;\nusing std::set;\nusing std::wstring;\nusing std::pair;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    /// <summary>\n    /// Maintains a list of open workbooks and signals the WorkbookAfterClose\n    /// and WorkbookRename events. Excel's built-in WorkbookBeforeClose fires  \n    /// before the user gets a chance to cancel the closure, so should not be\n    /// used to run clean-up actions.\n    /// </summary>\n    class WorkbookMonitor\n    {\n    public:\n      static void checkOnOpenWorkbook(struct Excel::_Workbook* Wb)\n      {\n        size_t numWorkbooks = thisApp().com().Workbooks->Count;\n\n        // If workbook collection has grown by one, nothing was closed\n        // and we just add the workbook name\n        if (numWorkbooks == _workbooks.size() + 1)\n          _workbooks.emplace(Wb->Name);\n        else\n          check();\n      }\n\n      /// <summary>\n      /// On BeforeSave, we store the path of the active workbook\n      /// </summary>\n      static void Workbook_BeforeSave()\n      {\n        auto& app = thisApp().com();\n        app.EnableEvents = false;\n        _wbPathBeforeSave = fs::path((const wchar_t*)app.ActiveWorkbook->Path) \n          / (const wchar_t*)app.ActiveWorkbook->Name;\n        app.EnableEvents = true;\n      }\n\n      /// <summary>\n      /// On AfterSave we compare the path of the active workbook\n      /// to the stored value and fire a WorkbookRename event if\n      /// they differ\n      /// </summary>\n      static void Workbook_AfterSave(bool success)\n      {\n        if (!success)\n          return;\n        auto& app = thisApp().com();\n        app.EnableEvents = false;\n        const auto wbPath = fs::path((const wchar_t*)app.ActiveWorkbook->Path)\n          / (const wchar_t*)app.ActiveWorkbook->Name;\n        if (wbPath != _wbPathBeforeSave)\n        {\n          Event::WorkbookRename().fire(wbPath.c_str(), _wbPathBeforeSave.c_str());\n        }\n        app.EnableEvents = true;\n      }\n\n      static void check()\n      {\n        decltype(_workbooks) openWorkbooks;\n        auto& app = thisApp().com();\n        auto numWorkbooks = app.Workbooks->Count;\n        for (auto i = 1; i <= numWorkbooks; ++i)\n          openWorkbooks.emplace(app.Workbooks->Item[i]->FullName);\n\n        std::vector<wstring> closedWorkbooks;\n        std::set_difference(_workbooks.begin(), _workbooks.end(),\n          openWorkbooks.begin(), openWorkbooks.end(), std::back_inserter(closedWorkbooks));\n\n        for (auto& wb : closedWorkbooks)\n        {\n          auto lastSlash = wb.find_last_of(L'\\\\');\n          Event::WorkbookAfterClose().fire(wb.c_str() + (lastSlash == wstring::npos ? 0 : lastSlash + 1));\n        }\n\n        _workbooks = openWorkbooks;\n      }\n\n      static set<wstring> _workbooks;\n\n    private:\n      static fs::path _wbPathBeforeSave;\n    };\n\n    set<wstring> WorkbookMonitor::_workbooks;\n    fs::path WorkbookMonitor::_wbPathBeforeSave;\n\n    constexpr auto DISPID_SheetSelectionChange = 0x616;\n    constexpr auto DISPID_SheetActivate = 0x619;\n    constexpr auto DISPID_SheetDeactivate = 0x61a;\n    constexpr auto DISPID_SheetCalculate = 0x61b;\n    constexpr auto DISPID_SheetChange = 0x61c;\n    constexpr auto DISPID_AfterCalculate = 0xa34;\n\n    class EventHandler :\n      public ComEventHandler<NoIDispatchImpl<ComObject<Excel::AppEvents>>, Excel::AppEvents>\n    {\n    public:\n      using Workbook = Excel::_Workbook;\n      using Worksheet = Excel::_Worksheet;\n      using Range = Excel::Range;\n\n      EventHandler(Excel::_Application* source)\n      {\n        connect(source);\n      }\n\n      void NewWorkbook(Workbook* Wb)\n      {\n        Event::NewWorkbook().fire(Wb->Name);\n        WorkbookMonitor::checkOnOpenWorkbook(Wb);\n      }\n      void SheetSelectionChange(\n        IDispatch* Sh,\n        Range* Target)\n      {\n        if (inStack(DISPID_SheetSelectionChange))\n          return;\n        if (Event::SheetSelectionChange().handlers().empty())\n          return;\n        Event::SheetSelectionChange().fire(\n          ((Worksheet*)Sh)->Name, ExcelRange(Target));\n      }\n      void SheetBeforeDoubleClick(\n        IDispatch* Sh,\n        Range* Target,\n        VARIANT_BOOL* Cancel)\n      {\n        if (Event::SheetBeforeDoubleClick().handlers().empty())\n          return;\n\n        bool cancel = *Cancel;\n        Event::SheetBeforeDoubleClick().fire(\n          ((Worksheet*)Sh)->Name, ExcelRange(Target), cancel);\n        *Cancel = cancel ? -1 : 0;\n      }\n      void SheetBeforeRightClick(\n        IDispatch* Sh,\n        Range* Target,\n        VARIANT_BOOL* Cancel)\n      {\n        if (Event::SheetBeforeRightClick().handlers().empty())\n          return;\n\n        bool cancel = *Cancel;\n        Event::SheetBeforeRightClick().fire(\n          ((Worksheet*)Sh)->Name, ExcelRange(Target), cancel);\n        *Cancel = cancel ? -1 : 0;\n      }\n      void SheetActivate(IDispatch* Sh)\n      {\n        if (inStack(DISPID_SheetActivate))\n          return;\n        Event::SheetActivate().fire(((Worksheet*)Sh)->Name);\n      }\n      void SheetDeactivate(IDispatch* Sh)\n      {\n        if (inStack(DISPID_SheetDeactivate))\n          return;\n        Event::SheetDeactivate().fire(((Worksheet*)Sh)->Name);\n      }\n      void SheetCalculate(IDispatch* Sh)\n      {\n        if (inStack(DISPID_SheetCalculate))\n          return;\n        if (Event::SheetCalculate().handlers().empty())\n          return;\n        Event::SheetCalculate().fire(((Worksheet*)Sh)->Name);\n      }\n      void SheetChange(\n        IDispatch* Sh,\n        Range* Target)\n      {\n        if (inStack(DISPID_SheetChange))\n          return;\n        if (Event::SheetChange().handlers().empty())\n          return;\n        Event::SheetChange().fire(\n          ((Worksheet*)Sh)->Name, ExcelRange(Target));\n      }\n      static void WorkbookOpen(Workbook* Wb)\n      {\n        Event::WorkbookOpen().fire(Wb->Path, Wb->Name);\n        WorkbookMonitor::checkOnOpenWorkbook(Wb);\n      }\n      static void WorkbookActivate(Workbook* Wb)\n      {\n        Event::WorkbookActivate().fire(Wb->Name);\n      }\n      static void WorkbookDeactivate(Workbook* Wb)\n      {\n        Event::WorkbookDeactivate().fire(Wb->Name);\n      }\n      static void WorkbookBeforeClose(\n        Workbook* Wb,\n        VARIANT_BOOL* Cancel)\n      {\n        if (*Cancel == VARIANT_TRUE)\n          return;\n        bool cancel = false;\n        Event::WorkbookBeforeClose().fire(Wb->Name, cancel);\n        *Cancel = cancel ? VARIANT_TRUE : VARIANT_FALSE;\n        if (!cancel)\n        {\n          // Wait 2s, then check if the workbook was actually closed. If the \n          // user still has the save/close dialog open, the COM call will fail\n          // so we retry every 1 sec after that\n          runExcelThread([]() { WorkbookMonitor::check(); }, ExcelRunQueue::COM_API, 2000, 1000);\n        }\n      }\n      static void WorkbookBeforeSave(\n        Workbook* Wb,\n        VARIANT_BOOL SaveAsUI,\n        VARIANT_BOOL* Cancel)\n      {\n        bool cancel = *Cancel;\n        Event::WorkbookBeforeSave().fire(Wb->Name, SaveAsUI < 0, cancel);\n        WorkbookMonitor::Workbook_BeforeSave();\n        *Cancel = cancel ? -1 : 0;\n      }\n      static void WorkbookAfterSave(\n        Workbook* Wb, \n        VARIANT_BOOL success)\n      {\n        Event::WorkbookAfterSave().fire(Wb->Name, success);\n        WorkbookMonitor::Workbook_AfterSave(success);\n      }\n      void WorkbookBeforePrint(\n        Workbook* Wb,\n        VARIANT_BOOL* Cancel)\n      {\n        bool cancel = *Cancel;\n        Event::WorkbookBeforePrint().fire(Wb->Name, cancel);\n        *Cancel = cancel ? -1 : 0;\n      }\n      void WorkbookNewSheet(\n        Workbook* Wb,\n        IDispatch* Sh)\n      {\n        Event::WorkbookNewSheet().fire(Wb->Name, ((Worksheet*)Sh)->Name);\n      }\n      void WorkbookAddinInstall(Workbook* Wb)\n      {\n        Event::WorkbookAddinInstall().fire(Wb->Name);\n      }\n      void WorkbookAddinUninstall(Workbook* Wb)\n      {\n        Event::WorkbookAddinUninstall().fire(Wb->Name);\n      }\n      void AfterCalculate()\n      {\n        // Although we disable events, Excel turns them back on again\n        // after calculation, so we can easily trigger a recursion by \n        // doing something in AfterCalculate which triggers a calculation.\n        // We use this bool to protect against this.\n        if (inStack(DISPID_AfterCalculate))\n          return;\n\n        Event::AfterCalculate().fire();\n      }\n\n      /// <summary>\n      /// Checks if a given event dispid is already being processed. This isn't\n      /// necessary for all events, just ones where their handlers could \n      /// re-trigger the event, e.g. if the SheetChange handler writes to the \n      /// sheet.\n      /// </summary>>\n      bool inStack(short dispid)\n      {\n        for (char i = 0; i < _stackCount - 1; ++i)\n          if (_eventStack[i] == dispid)\n            return true;\n        return false;\n      }\n\n      STDMETHOD(Invoke)(DISPID dispidMember, REFIID /*riid*/,\n        LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pdispparams, VARIANT* /*pvarResult*/,\n        EXCEPINFO* pexcepinfo, UINT* /*puArgErr*/)\n      {\n        try\n        {\n          auto* rgvarg = pdispparams->rgvarg;\n\n          // Note the event being processed. The event handling is single-threaded\n          // but can be re-entrant. See comment for inStack\n          _eventStack[_stackCount++] = (unsigned short) dispidMember;\n\n          // These dispids are copied from oleview and are in the same order as listed there\n          switch (dispidMember)\n          {\n          case 0x0000061d:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            NewWorkbook((Workbook*)rgvarg[0].pdispVal);\n            break;\n          case DISPID_SheetSelectionChange:\n            if (pdispparams->cArgs != 2) return DISP_E_BADPARAMCOUNT;\n            SheetSelectionChange(rgvarg[0].pdispVal, (Range*)rgvarg[1].pdispVal);\n            break;\n          case 0x00000617:\n            if (pdispparams->cArgs != 3) return DISP_E_BADPARAMCOUNT;\n            SheetBeforeDoubleClick(rgvarg[0].pdispVal, (Range*)rgvarg[1].pdispVal, rgvarg[2].pboolVal);\n            break;\n          case 0x00000618:\n            if (pdispparams->cArgs != 3) return DISP_E_BADPARAMCOUNT;\n            SheetBeforeRightClick(rgvarg[0].pdispVal, (Range*)rgvarg[1].pdispVal, rgvarg[2].pboolVal);\n            break;\n          case DISPID_SheetActivate:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            SheetActivate(rgvarg[0].pdispVal);\n            break;\n          case DISPID_SheetDeactivate:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            SheetDeactivate(rgvarg[0].pdispVal);\n            break;\n          case DISPID_SheetCalculate:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            SheetCalculate(rgvarg[0].pdispVal);\n            break;\n          case DISPID_SheetChange:\n            if (pdispparams->cArgs != 2) return DISP_E_BADPARAMCOUNT;\n            SheetChange(rgvarg[0].pdispVal, (Range*)rgvarg[1].pdispVal);\n            break;\n          case 0x0000061f:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            WorkbookOpen((Workbook*)rgvarg[0].pdispVal);\n            break;\n          case 0x00000620:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            WorkbookActivate((Workbook*)rgvarg[0].pdispVal);\n            break;\n          case 0x00000621:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            WorkbookDeactivate((Workbook*)rgvarg[0].pdispVal);\n            break;\n          case 0x00000622:\n            if (pdispparams->cArgs != 2) return DISP_E_BADPARAMCOUNT;\n            WorkbookBeforeClose((Workbook*)rgvarg[0].pdispVal, rgvarg[1].pboolVal);\n            break;\n          case 0x00000623:\n            if (pdispparams->cArgs != 3) return DISP_E_BADPARAMCOUNT;\n            WorkbookBeforeSave((Workbook*)rgvarg[0].pdispVal, rgvarg[1].boolVal, rgvarg[2].pboolVal);\n            break;\n          case 0x00000624:\n            if (pdispparams->cArgs != 2) return DISP_E_BADPARAMCOUNT;\n            WorkbookBeforePrint((Workbook*)rgvarg[0].pdispVal, rgvarg[1].pboolVal);\n            break;\n          case 0x00000625:\n            if (pdispparams->cArgs != 2) return DISP_E_BADPARAMCOUNT;\n            WorkbookNewSheet((Workbook*)rgvarg[0].pdispVal, rgvarg[1].pdispVal);\n            break;\n          case 0x00000626:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            WorkbookAddinInstall((Workbook*)rgvarg[0].pdispVal);\n            break;\n          case 0x00000627:\n            if (pdispparams->cArgs != 1) return DISP_E_BADPARAMCOUNT;\n            WorkbookAddinUninstall((Workbook*)rgvarg[0].pdispVal);\n            break;\n          case DISPID_AfterCalculate:\n            AfterCalculate();\n            break;\n          case 2911:\n            if (pdispparams->cArgs != 2) return DISP_E_BADPARAMCOUNT;\n            WorkbookAfterSave((Workbook*)rgvarg[0].pdispVal, rgvarg[1].boolVal);\n            break;\n          }\n        }\n        catch (_com_error& error)\n        { \n          if (error.Error() == VBA_E_IGNORE)\n          {\n            if (pexcepinfo) {\n              // ensure the invoker is ready to recieve exception info. If the pointer is null, they don't want to hear about it!\n              pexcepinfo->scode = 0;\n              pexcepinfo->wCode = error.WCode();\n              pexcepinfo->bstrDescription = nullptr;\n              pexcepinfo->bstrHelpFile = nullptr;\n              pexcepinfo->bstrSource = nullptr;\n              pexcepinfo->pfnDeferredFillIn = nullptr;\n              return DISP_E_EXCEPTION;\n            }\n          }\n          XLO_ERROR(L\"COM Error {0:#x}: {1}\", (unsigned)error.Error(), error.ErrorMessage());\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Error during COM event handler callback: {0}\", e.what());\n        }\n       \n        // Pop the stack\n        --_stackCount;\n\n        return S_OK;\n      }\n\n    private:\n      unsigned short _eventStack[16];\n      char _stackCount = 0;\n    };\n\n    std::shared_ptr<Excel::AppEvents> createEventSink(Excel::_Application* source)\n    {\n      // We manage the COM object with a shared_ptr to avoid exporting ComPtr\n      // everywhere. This means we need to AddRef/Release in the COM way.\n      auto p = std::shared_ptr<EventHandler>(new EventHandler(source),\n        [](auto* p)\n        { \n          p->disconnect();\n          p->Release(); \n        }); \n      p->AddRef();\n\n      // Trigger WorkbookOpen for any already open workbooks: the COM interface\n      // is only available when at least one workbook has been opened. This allows\n      // for code to rely on inspecting workbooks as they are opened.\n      for (auto i = 1; i <= source->Workbooks->Count; ++i)\n        EventHandler::WorkbookOpen(source->Workbooks->GetItem(i));\n\n      return p;\n    }\n    const std::set<std::wstring>& workbookPaths()\n    {\n      return WorkbookMonitor::_workbooks;\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/ComEventSink.h",
    "content": "#pragma once\n#include <memory>\n#include <set>\n#include <string>\nnamespace Excel { struct AppEvents; struct _Application; }\nnamespace xloil\n{\n  namespace COM\n  {\n    /// <summary>\n    /// Creating the event sink may trigger events which may in turn rely on the COM \n    /// connection being available - ensure that it is before calling this function.\n    /// </summary>\n    std::shared_ptr<Excel::AppEvents> createEventSink(Excel::_Application* source);\n\n    const std::set<std::wstring>& workbookPaths();\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/ComVariant.cpp",
    "content": "#include \"ComVariant.h\"\n#include <xlOil/TypeConverters.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/Range.h>\n#include <xloil/ExcelRef.h>\n#include <xloil/ArrayBuilder.h>\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/AppObjects.h>\n\nusing std::shared_ptr;\nusing std::unique_ptr;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    namespace\n    {\n      // Small helper function for array conversion\n      template<class T> \n      auto elementConvert(const T& val)       { return val; }\n      template<>\n      auto elementConvert(const VARIANT& val) { return variantToExcelObj(val, false); }\n\n      template<typename T>\n      void addStringLength(size_t&, const T&) {}\n\n      template<>\n      void addStringLength(size_t& len, const BSTR& v)\n      {\n        len += wcslen(v);\n      }\n\n      template<>\n      void addStringLength(size_t& len, const VARIANT& v)\n      {\n        if (v.vt == VT_BSTR)\n          len += wcslen(v.bstrVal);\n      }\n\n      auto variantErrorToCellError(SCODE scode)\n      {\n        return (CellError)(scode - 0x800A07D0);\n      }\n\n      bool isNonEmpty(VARIANT& obj)\n      {\n        switch (obj.vt)\n        {\n        case VT_BSTR: return wcslen(obj.bstrVal) > 0;\n        case VT_ERROR:\n          return obj.scode != DISP_E_PARAMNOTFOUND\n            && variantErrorToCellError(obj.scode) != CellError::NA;\n        case VT_EMPTY: return false;\n        }\n        return true;\n      }\n\n      void trimmedArraySize(VARIANT* data, size_t& nRows, size_t& nCols)\n      {\n        const auto start = data;\n        const auto rows = nRows;\n\n        auto p = start + nCols * nRows - 1; // Go to last element\n        for (; nCols > 0; --nCols)\n          for (int r = (int)nRows - 1; r >= 0; --r, --p)\n            if (isNonEmpty(*p))\n              goto StartRowSearch;\n       \n      StartRowSearch:\n       \n        for (; nRows > 0; --nRows)\n          for (p = start + nRows - 1; p < (start + nCols * nRows); p += rows)\n            if (isNonEmpty(*p))\n              goto SearchDone;\n\n      SearchDone:;\n      }\n\n      template<typename T>\n      size_t stringLength(const SafeArrayAccessor<T>& array)\n      {\n        size_t len = 0;\n        for (auto j = 0u; j < array.cols; j++)\n          for (auto i = 0u; i < array.rows; i++)\n            addStringLength(len, array(i, j));\n        return len;\n      }\n    }\n\n    detail::SafeArrayAccessorBase::SafeArrayAccessorBase(SAFEARRAY* pArr)\n      : _ptr(pArr)\n      , dimensions(pArr->cDims)\n      , cols(dimensions == 1 ? 1 : pArr->rgsabound[0].cElements)\n      , rows(pArr->rgsabound[dimensions == 1 ? 0 : 1].cElements)\n    {\n      if (S_OK != SafeArrayAccessData(pArr, &_data))\n        XLO_THROW(\"Failed to access SafeArray\");\n    }\n\n    detail::SafeArrayAccessorBase::~SafeArrayAccessorBase()\n    {\n      SafeArrayUnaccessData(_ptr);\n    }\n\n    std::pair<size_t, size_t> SafeArrayAccessor<VARIANT>::trimmedSize() const\n    {\n      auto nrows = this->rows;\n      auto ncols = this->cols;\n      trimmedArraySize(data(), nrows, ncols);\n      return std::pair(nrows, ncols);\n    }\n\n    template<class T>\n    auto toExcelObj(SafeArrayAccessor<T> array, bool trimArray)\n    {\n      if (array.dimensions > 2)\n        XLO_THROW(\"Can only convert 1 or 2 dim arrays\");\n\n      auto rows = array.rows;\n      auto cols = array.cols;\n      if (trimArray)\n        std::tie(rows, cols) = array.trimmedSize();\n\n      // We need up-front total string length for the ExcelArrayBuilder\n      const auto strLength = stringLength<T>(array);\n      ExcelArrayBuilder builder(\n        (ExcelObj::row_t)rows, (ExcelObj::col_t)cols, strLength);\n\n      for (auto i = 0u; i < rows; i++)\n        for (auto j = 0u; j < cols; j++)\n          builder(i, j) = elementConvert(array(i, j));\n\n      return builder.toExcelObj();\n    }\n\n    class ToVariant : public ExcelValVisitor<VARIANT>\n    {\n    public:\n      using result_t = return_type;\n\n      using ExcelValVisitor::operator();\n\n      result_t operator()(int x) const\n      {\n        return _variant_t(x).Detach();\n      }\n      result_t operator()(bool x) const\n      {\n        return _variant_t(x).Detach();\n      }\n      result_t operator()(double x) const\n      {\n        return _variant_t(x).Detach();\n      }\n      result_t operator()(const ArrayVal& obj) const\n      {\n        // No array trimming, for some good reason\n        return operator()(ExcelArray(obj, false));\n      }\n      result_t operator()(const ExcelArray& arr) const\n      {\n        const auto nRows = arr.nRows();\n        const auto nCols = arr.nCols();\n\n        SAFEARRAYBOUND bounds[2];\n        bounds[0].lLbound = 0;\n        bounds[0].cElements = nRows;\n        bounds[1].lLbound = 0;\n        bounds[1].cElements = nCols;\n\n        auto array = unique_ptr<SAFEARRAY, HRESULT(__stdcall *)(SAFEARRAY*)> (\n          SafeArrayCreate(VT_VARIANT, 2, bounds), SafeArrayDestroy);\n\n        SafeArrayAccessor<VARIANT> arrayData(array.get());\n\n        for (auto i = 0u; i < nRows; i++)\n          for (auto j = 0u; j < nCols; j++)\n            arrayData(i, j) = (*this)(arr(i, j));\n\n        VARIANT result;\n        result.vt = VT_VARIANT | VT_ARRAY;\n        result.parray = array.release();\n\n        return result;\n      }\n      result_t operator()(const PStringRef& pstr) const\n      {\n        VARIANT result;\n        VariantInit(&result);\n        V_VT(&result) = VT_BSTR;\n        V_BSTR(&result) = SysAllocStringLen(pstr.pstr(), (UINT)pstr.length());\n        return result;\n      }\n      result_t operator()(CellError x) const\n      {\n        // Magical constant from: \n        // https://docs.microsoft.com/en-us/office/client-developer/excel/how-to-access-dlls-in-excel\n        return _variant_t((long)x + (long)0x800A07D0, VT_ERROR).Detach();\n      }\n      result_t operator()(const RefVal& ref) const\n      {\n        return operator()(ExcelRef(ref).value());\n      }\n\n      // Not part of the usual FromExcel interface, just to aid cascading\n      result_t operator()(const ExcelObj& obj) const\n      {\n        return obj.visit(ToVariant());\n      }\n    };\n\n    class ToVariantWithRange : public ToVariant\n    {\n    public:\n      using ToVariant::operator();\n\n      result_t operator()(const RefVal& ref) const\n      {\n        const auto range = ExcelRange(ExcelRef(ref));\n        return _variant_t(&range.com()).Detach();\n      }\n    };\n\n    void excelObjToVariant(VARIANT* v, const ExcelObj& obj, bool allowRange)\n    {\n      VariantClear(v);\n      *v = allowRange\n        ? obj.visit(ToVariantWithRange(), vtMissing)\n        : obj.visit(ToVariant(), vtMissing);\n    }\n\n    ExcelObj variantToExcelObj(const VARIANT& variant, bool allowRange, bool trimArray)\n    {\n      switch (variant.vt)\n      {\n      case VT_I2:   return ExcelObj(variant.iVal);\n      case VT_I4:   return ExcelObj(variant.lVal);\n      case VT_I8:   return ExcelObj(variant.llVal);\n      case VT_INT:  return ExcelObj(variant.intVal);\n      case VT_UI2:  return ExcelObj(variant.uiVal);\n      case VT_UI4:  return ExcelObj(variant.ulVal);\n      case VT_UI8:  return ExcelObj(variant.ullVal);\n      case VT_UINT: return ExcelObj(variant.uintVal);\n      case VT_R8:   return ExcelObj(variant.dblVal);\n      case VT_BOOL: return ExcelObj(variant.boolVal == VARIANT_TRUE);\n      case VT_BSTR: return ExcelObj((const wchar_t*)variant.bstrVal);\n      case VT_CY:   return ExcelObj(variant.cyVal.int64); // currency\n      case VT_DATE: return ExcelObj(variant.date);\n      case VT_DISPATCH:\n      {\n        Excel::RangePtr pRange(variant.pdispVal);\n        \n        // TODO: converting to a ref via the address is a bit expensive\n        // if end users (e.g. python) can use an ExcelRange\n        auto xlRef = ExcelRef(pRange->GetAddress(\n          VARIANT_TRUE, VARIANT_TRUE, Excel::xlA1, VARIANT_TRUE));\n\n        if (allowRange)\n          return ExcelObj(std::move(xlRef));\n        else\n          // Probably faster than variantToExcelObj(pRange->Value2).\n          return xlRef.value(); \n      }\n      case VT_ERROR:\n        return variant.scode == DISP_E_PARAMNOTFOUND\n          ? ExcelObj(ExcelType::Missing)\n          : ExcelObj(variantErrorToCellError(variant.scode));\n      case VT_EMPTY: \n        return ExcelObj();\n      }\n\n      if ((variant.vt & VT_ARRAY) == 0)\n        XLO_THROW(\"Unknown variant type {0}\", variant.vt);\n      else\n      {\n        auto pArr = variant.parray;\n        VARTYPE vartype;\n        SafeArrayGetVartype(pArr, &vartype);\n        switch (vartype)\n        {\n        case VT_R8:    return toExcelObj(SafeArrayAccessor<double>(pArr), trimArray);\n        case VT_BOOL:  return toExcelObj(SafeArrayAccessor<bool>(pArr), trimArray);\n        case VT_BSTR:  return toExcelObj(SafeArrayAccessor<BSTR>(pArr), trimArray);\n        case VT_ERROR: return toExcelObj(SafeArrayAccessor<long>(pArr), trimArray);\n        case VT_VARIANT: return toExcelObj(SafeArrayAccessor<VARIANT>(pArr), trimArray);\n        default:\n          XLO_THROW(\"Unhandled array data type: {0}\", variant.vt ^ VT_ARRAY);\n        }\n      }\n    }\n    bool trimmedVariantArrayBounds(const VARIANT& variant, size_t& nRows, size_t& nCols)\n    {\n      if ((variant.vt & VT_ARRAY) == 0)\n        return false;\n\n      auto pArr = variant.parray;\n      VARTYPE vartype;\n      SafeArrayGetVartype(pArr, &vartype);\n      if (vartype != VT_VARIANT)\n        return false;\n\n      std::tie(nRows, nCols) = SafeArrayAccessor<VARIANT>(pArr).trimmedSize();\n      return true;\n    }\n\n    VARIANT stringToVariant(const char* str)\n    {\n      return _variant_t(str).Detach();\n    }\n\n    VARIANT stringToVariant(const wchar_t* str)\n    {\n      return _variant_t(str).Detach();\n    }\n\n    VARIANT stringToVariant(const std::wstring_view& str)\n    {\n      VARIANT result;\n      V_VT(&result) = VT_BSTR;\n      V_BSTR(&result) = SysAllocStringLen(str.data(), (UINT)str.length());\n      return result;\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/ComVariant.h",
    "content": "#pragma once\n#include <xloil/ExcelObj.h>\n\ntypedef struct tagVARIANT VARIANT;\ntypedef struct tagSAFEARRAY SAFEARRAY;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    namespace detail\n    {\n      class SafeArrayAccessorBase\n      {\n      public:\n        SafeArrayAccessorBase(SAFEARRAY* pArr);\n        ~SafeArrayAccessorBase();\n\n        const size_t dimensions, rows, cols;\n\n      protected:\n        SAFEARRAY* _ptr;\n        void* _data;\n      };\n    }\n    /// <summary>\n    /// Fast access to a SafeArray's internal data store. The template \n    /// parameter must match the data type of the SafeArray (this is not\n    /// checked) or core will be dumped.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    template<class T>\n    class SafeArrayAccessor : public detail::SafeArrayAccessorBase\n    {\n    public:\n      using SafeArrayAccessorBase::SafeArrayAccessorBase;\n\n      T& operator()(const size_t i, const size_t j)\n      {\n        return data()[j * rows + i];\n      }\n\n      const T& operator()(const size_t i, const size_t j) const\n      {\n        return data()[j * rows + i];\n      }\n\n      /// <summary>\n      /// Returns the size of the sub-array trimmed to the last non-empty \n      /// (not Nil, \\#N/A or \"\") row and column.\n      /// </summary>\n      std::pair<size_t, size_t> trimmedSize() const\n      {\n        return std::pair(rows, cols);\n      }\n\n    private:\n      T* data() const { return (T*)_data; }\n    };\n\n    template<> std::pair<size_t, size_t> SafeArrayAccessor<VARIANT>::trimmedSize() const;\n\n    void excelObjToVariant(VARIANT* v, const ExcelObj& obj, bool allowRange = false);\n    \n    ExcelObj variantToExcelObj(\n      const VARIANT& variant, \n      bool allowRange = false, \n      bool trimArray = true);\n\n    bool trimmedVariantArrayBounds(const VARIANT& variant, size_t& nRows, size_t& nCols);\n\n    VARIANT stringToVariant(const char* str);\n    VARIANT stringToVariant(const wchar_t* str);\n    VARIANT stringToVariant(const std::wstring_view& str);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/Connect.cpp",
    "content": "#include \"Connect.h\"\n#include \"ComEventSink.h\"\n#include <xloil/AppObjects.h>\n#include <xloil/Events.h>\n#include <xloil/ExcelCall.h>\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/State.h>\n#include <oleacc.h> // AccessibleObjectFromWindow\n#include <memory>\n\nusing std::make_shared;\nusing std::wstring;\n\nnamespace xloil\n{\n  using detail::AppObject;\n\n  namespace COM\n  {\n    HWND nextExcelMainWindow(HWND startFrom)\n    {\n      return FindWindowExA(0, startFrom, \"XLMAIN\", NULL);\n    }\n\n    Excel::_Application* newApplicationObject()\n    {\n      CoInitialize(NULL); // It's safe to call repeatedly\n      Excel::_ApplicationPtr app;\n      auto hr = app.CreateInstance(\n        __uuidof(Excel::Application),\n        NULL,\n        CLSCTX_LOCAL_SERVER);\n      return hr == S_OK ? app.Detach() : nullptr;\n    }\n\n    Excel::_Application* applicationObjectFromWindow(HWND xlmainHandle)\n    {\n      CoInitialize(NULL);\n      \n      // Based on discussion https://stackoverflow.com/questions/30363748/\n      // However we need to make a modification to the method given there:\n      // \n      // The result of `pWindow->Application` differs from \n      // `pWindow->Parent->Application` if we *do not own* the Excel process\n      // (i.e. we didn't start it and are not running within it). In this case\n      // the window's Application object is broken and will dump core when used.\n      // The only difference I can see with the VBA implementation is that VBA\n      // uses late binding, i.e. calls `invoke` which may take a different code \n      // path.  This does look awfully like a bug, but since it's in the COM \n      // interface its probably existed for years and will never be fixed.\n      //\n      auto hwnd2 = FindWindowExA(xlmainHandle, 0, \"XLDESK\", NULL);\n      auto hwnd3 = FindWindowExA(hwnd2, 0, \"EXCEL7\", NULL);\n      Excel::Window* pWindow = NULL;\n      if (AccessibleObjectFromWindow(hwnd3, (DWORD)OBJID_NATIVEOM,\n        __uuidof(Excel::Window),\n        (void**)&pWindow) == S_OK)\n      {\n        auto parent = pWindow->Parent;\n        Excel::_WorkbookPtr parentWorkbook(parent);\n        pWindow->Release();\n        \n        auto result = parentWorkbook->Application;\n        return result.Detach();\n      }\n      return nullptr;\n    }\n\n    namespace\n    {\n      class COMConnector\n      {\n      public:\n        COMConnector()\n          : _xlApp(nullptr)\n        {}\n\n        bool connect()\n        {\n          if (connected())\n            return true;\n\n          try\n          {\n            auto excelWindowHandle = (HWND)Environment::excelProcess().hWnd;\n            auto application = applicationObjectFromWindow(excelWindowHandle);\n            if (!application)\n              return false;\n\n            _xlApp = Application(application);\n            \n            XLO_DEBUG(L\"Made COM connection to Excel at '{}' with hwnd={}\",\n              (const wchar_t*)_xlApp.com().Path, (size_t)excelWindowHandle);\n\n            _handler = COM::createEventSink(&_xlApp.com());\n          }\n          catch (_com_error& error)\n          {\n            XLO_DEBUG(L\"COM connect failed: {0:#x}: {1}\",\n              (size_t)error.Error(), error.ErrorMessage());\n          }\n\n          return connected();\n        }\n\n        bool connected() const { return _xlApp.valid(); }\n\n        ~COMConnector()\n        {\n          _handler.reset();\n          _xlApp.release();\n          CoUninitialize();\n        }\n\n        Application& thisApp() { return (Application&)_xlApp; }\n       \n      private:\n        AppObject<Excel::_Application, true> _xlApp;\n        std::shared_ptr<Excel::AppEvents> _handler;\n      };\n    }\n\n    static std::unique_ptr<COMConnector> theComConnector(new COMConnector());\n\n    bool connectCom()\n    {\n      if (theComConnector->connected())\n        return true;\n      else\n        return theComConnector->connect();\n    }\n\n    void disconnectCom()\n    {\n      theComConnector.reset();\n    }\n\n    bool isComApiAvailable() noexcept\n    {\n      if (!theComConnector->connected())\n        return false;\n      \n      // Do some random COM thing - is this the fastest thing?\n      VARIANT_BOOL temp;\n      auto result = theComConnector->thisApp().com().get_EnableEvents(&temp);\n      return (SUCCEEDED(result));\n    }\n\n    Application& attachedApplication()\n    {\n      if (!theComConnector->connected())\n        throw ComConnectException(\"COM Connection not ready\");\n      return theComConnector->thisApp();\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/Connect.h",
    "content": "#pragma once\n#include <xloil/WindowsSlim.h>\n\nnamespace xloil { class Application; }\nnamespace Excel { struct _Application; }\n\nnamespace xloil\n{\n  namespace COM\n  {\n    /// <summary>\n    /// Creates a new Excel.Application object and returns a hanging /\n    /// detached reference, i.e. no need to AddRef it.\n    /// </summary>\n    /// <returns></returns>\n    Excel::_Application* newApplicationObject();\n\n    /// <summary>\n    /// Return the next XLMAIN window after the specified window handle\n    /// </summary>\n    /// <param name=\"xlmainHandle\"></param>\n    /// <returns></returns>\n    HWND nextExcelMainWindow(HWND startFrom = 0);\n\n    /// <summary>\n    /// Get the Excel.Application corresponding to an XLMAIN window handle.\n    /// Returns a hanging / detached reference, i.e. no need to AddRef it.\n    /// \n    /// A call to GetActiveObject(\"Excel.Application\") gets the first registered \n    /// instance of Excel which may not be the required one. Hence the need for\n    /// this functionality.\n    /// </summary>\n    Excel::_Application* applicationObjectFromWindow(HWND xlmainHandle);\n\n    /// <summary>\n    /// Tries to connect the COM interface if it is not already connected. Returns true \n    /// if the COM interface is available.\n    /// </summary>\n    bool connectCom();\n\n    void disconnectCom();\n\n    /// <summary>\n    /// Performs some trivial COM action to determine if it is likely that \n    /// Excel will accept COM commands (however this is never guaranteed).\n    /// </summary>\n    bool isComApiAvailable() noexcept;\n\n    Application& attachedApplication();\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/CustomTaskPane.cpp",
    "content": "#include \"ClassFactory.h\"\n#include \"TaskPaneHostControl.h\"\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/AppObjects.h>\n#include <xlOil/ExcelUI.h>\n#include <xloil/Throw.h>\n#include <xloil/Log.h>\n#include <xloil/State.h>\n\nusing std::shared_ptr;\nusing std::make_shared;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    class CustomTaskPaneEventHandler\n      : public ComEventHandler<\n          NoIDispatchImpl<ComObject<Office::_CustomTaskPaneEvents>>, Office::_CustomTaskPaneEvents>\n    {\n    public:\n      CustomTaskPaneEventHandler(\n        ICustomTaskPane& parent, \n        shared_ptr<ICustomTaskPaneEvents> handler)\n        : _parent(parent)\n        , _handler(handler)\n      {}\n\n      virtual ~CustomTaskPaneEventHandler() noexcept\n      {}\n\n      STDMETHOD(Invoke)(DISPID dispidMember, REFIID /*riid*/,\n        LCID /*lcid*/, WORD /*wFlags*/, DISPPARAMS* pdispparams, VARIANT* /*pvarResult*/,\n        EXCEPINFO* /*pexcepinfo*/, UINT* /*puArgErr*/)\n      {\n        try\n        {\n          auto* rgvarg = pdispparams->rgvarg;\n\n          // These dispids are copied from oleview and are in the same order as listed there\n          switch (dispidMember)\n          {\n          case 1:\n            VisibleStateChange((Office::_CustomTaskPane*)rgvarg[0].pdispVal);\n            break;\n          case 2:\n            DockPositionStateChange((Office::_CustomTaskPane*)rgvarg[0].pdispVal);\n            break;\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"CustomTaskPaneEventHandler: error during callback: {0}\", e.what());\n        }\n\n        return S_OK;\n      }\n\n    private:\n      HRESULT VisibleStateChange(Office::_CustomTaskPane*)\n      {\n        _handler->onVisible(_parent.getVisible());\n        return S_OK;\n      }\n      HRESULT DockPositionStateChange(Office::_CustomTaskPane*)\n      {\n        _handler->onDocked();\n        return S_OK;\n      }\n\n    private:\n      ICustomTaskPane& _parent;\n      shared_ptr<ICustomTaskPaneEvents> _handler;\n    };\n\n    class CustomTaskPaneCreator : public ICustomTaskPane\n    {\n      Office::_CustomTaskPanePtr _pane;\n      CComPtr<CustomTaskPaneEventHandler> _paneEvents;\n      CComQIPtr<ITaskPaneHostControl> _hostingControl;\n      std::wstring _name;\n\n    public:\n      CustomTaskPaneCreator(\n        Office::ICTPFactory& ctpFactory, \n        const wchar_t* name,\n        const IDispatch* window,\n        const wchar_t* progId)\n      {\n        if (!name)\n          XLO_THROW(\"CustomTaskPaneCreator: name must be non-null\");\n\n        XLO_DEBUG(L\"Creating Custom Task Pane '{}'\", name);\n        _name = name;\n        \n        // Pasing vtMissing causes the pane to be attached to ActiveWindow\n        auto targetWindow = window ? _variant_t(window) : vtMissing;\n\n        _pane = ctpFactory.CreateCTP(\n          progId ? progId : taskPaneHostControlProgId(),\n          name, \n          targetWindow);\n\n        if (!progId)\n          _hostingControl = content();\n      }\n\n      ~CustomTaskPaneCreator()\n      {\n        destroy();\n      }\n\n      IDispatch* content() const override\n      {\n        try\n        {\n          return _pane->ContentControl;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      ExcelWindow window() const override\n      {\n        try\n        {\n          return ExcelWindow(Excel::WindowPtr(_pane->Window));\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      void setVisible(bool value) override\n      { \n        try\n        {\n          _pane->Visible = value;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n      bool getVisible() override\n      {\n        try\n        {\n          return _pane->Visible;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n      std::pair<int, int> getSize() override\n      {\n        try\n        {\n          return std::make_pair(_pane->Width, _pane->Height);\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n      void setSize(int width, int height) override\n      {\n        try\n        {\n          _pane->Width = width;\n          _pane->Height = height;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n      DockPosition getPosition() const override\n      {\n        try\n        {\n          return DockPosition(_pane->DockPosition);\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n      void setPosition(DockPosition pos) override\n      {\n        try\n        {\n          _pane->DockPosition = (Office::MsoCTPDockPosition)pos;\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      std::wstring getTitle() const\n      {\n        try\n        {\n          return _pane->Title.GetBSTR();\n        }\n        XLO_RETHROW_COM_ERROR;\n      }\n\n      void destroy() override\n      {\n        XLO_DEBUG(L\"Destroying Custom Task Pane '{}'\", _name);\n\n        if (_hostingControl)\n          _hostingControl.Release();\n        if (_paneEvents)\n        {\n          _paneEvents->disconnect();\n          _paneEvents.Release();\n        }\n        // This delete will trigger onDestroy to be called on the event handler\n        // if we are using a hosting control.\n        _pane->Delete();\n      }\n\n      void listen(const std::shared_ptr<ICustomTaskPaneEvents>& events) override\n      {\n        _paneEvents = CComPtr<CustomTaskPaneEventHandler>(\n            new CustomTaskPaneEventHandler(*this, events));\n        _paneEvents->connect(_pane);\n        if (_hostingControl)\n          _hostingControl->AttachDestroyHandler(events);\n      }\n\n      void attach(size_t hwnd, bool asParent) override\n      {\n        if (_hostingControl)\n        {\n          XLO_DEBUG(L\"Attaching task pane host control for pane {}\", _name);\n          _hostingControl->AttachWindow((HWND)hwnd, asParent);\n        }\n        else\n          XLO_INFO(\"ICustomTaskPane::attach only works for the built-in host control\");\n      }\n    };\n\n    ICustomTaskPane* createCustomTaskPane(\n      Office::ICTPFactory& ctpFactory, \n      const wchar_t* name,\n      const IDispatch* window,\n      const wchar_t* progId)\n    {\n      try\n      {\n        return new CustomTaskPaneCreator(ctpFactory, name, window, progId);\n      }\n      XLO_RETHROW_COM_ERROR;\n    }\n  }\n}\n"
  },
  {
    "path": "src/xlOil-COM/CustomTaskPane.h",
    "content": "#pragma once\n\nnamespace Office { struct ICTPFactory; }\n\nnamespace xloil\n{\n  class ICustomTaskPane;\n\n  namespace COM\n  {\n    ICustomTaskPane* createCustomTaskPane(\n      Office::ICTPFactory& ctpFactory, \n      const wchar_t* name,\n      const IDispatch* window = nullptr,\n      const wchar_t* progId = nullptr);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/RibbonExtensibility.cpp",
    "content": "#include \"RibbonExtensibility.h\"\n#include <xlOil/ExcelTypeLib.h>\n#include \"ClassFactory.h\"\n#include <xlOil/ExcelUI.h>\n#include <xlOil/Log.h>\n#include <map>\n#include <functional>\n\nusing std::wstring;\nusing std::map;\nusing std::vector;\nusing std::shared_ptr;\nusing namespace Office;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    class RibbonImpl :\n        public NoIDispatchImpl<ComObject<IRibbonExtensibility>>\n    {\n    private:\n\n      vector<RibbonCallback> _functions;\n      map<wstring, DISPID> _idsOfNames;\n      wstring _xml;\n      std::function<RibbonCallback(const wchar_t*)> _handler;\n\n      static constexpr DISPID theFirstDispid = 3;\n\n    public:\n      CComPtr<IRibbonUI> ribbonUI;\n\n      RibbonImpl()\n      {\n        // Function DispIds are:\n        //    1    raw_GetCustomUI\n        //    2    onLoadHandler - a standard ribbonUI callback\n        //    3... custom callbacks passed via the setRibbon/addCallback functions\n        // \n        _idsOfNames[L\"onLoadHandler\"] = 2;\n      }\n      ~RibbonImpl()\n      {}\n\n      virtual HRESULT __stdcall raw_GetCustomUI(\n        /*[in]*/ BSTR /*RibbonID*/,\n        /*[out,retval]*/ BSTR * RibbonXml) override\n      {\n        if (!_xml.empty())\n          *RibbonXml = SysAllocString(_xml.data());\n        return S_OK;\n      }\n\n      HRESULT onLoadHandler(IDispatch* disp)\n      {\n        IRibbonUI* ptr;\n        if (disp->QueryInterface(&ptr) == S_OK)\n          ribbonUI.Attach(ptr);\n        else\n          XLO_ERROR(\"Ribbon load didn't work\");\n        return S_OK;\n      }\n\n      void setRibbon(\n        const wchar_t* xml,\n        const std::function<RibbonCallback(const wchar_t*)>& handler)\n      {\n        if (!_xml.empty())\n          XLO_THROW(\"Already set\"); // TODO: reload addin?\n        _xml = xml;\n        auto i = _xml.find(L\"<customUI\") + wcslen(L\"<customUI\");\n        _xml.insert(i, L\" onLoad=\\\"onLoadHandler\\\"\");\n        _handler = handler;\n      }\n\n      int addCallback(const wchar_t* name, RibbonCallback&& fn)\n      {\n        _functions.emplace_back(fn);\n        auto dispid = theFirstDispid - 1 + (DISPID)_functions.size();\n        _idsOfNames[name] = dispid;\n        return dispid;\n      }\n\n      STDMETHOD(QueryInterface)(REFIID riid, void** ppv) noexcept\n      {\n        *ppv = NULL;\n        if (riid == IID_IUnknown || riid == IID_IDispatch\n          || riid == __uuidof(IRibbonExtensibility))\n        {\n          *ppv = this;\n          AddRef();\n          return S_OK;\n        }\n        return E_NOINTERFACE;\n      }\n#pragma region IDispatch\n\n      STDMETHOD(GetIDsOfNames)(\n        _In_ REFIID /*riid*/,\n        _In_reads_(cNames) _Deref_pre_z_ LPOLESTR* rgszNames,\n        _In_range_(0, 16384) UINT cNames,\n        LCID /*lcid*/,\n        _Out_ DISPID* rgdispid)\n      {\n        auto* fnName = rgszNames[0];\n        if (cNames != 1)\n          return DISP_E_UNKNOWNNAME;\n        auto found = _idsOfNames.find(fnName);\n        if (found == _idsOfNames.end())\n        {\n          try\n          {\n            auto func = _handler(fnName);\n            if (func)\n            {\n              *rgdispid = addCallback(fnName, std::move(func));\n              return S_OK;\n            }\n          }\n          catch (const std::exception& e)\n          {\n            XLO_ERROR(L\"Error finding handler '{0}': {1}\", fnName, utf8ToUtf16(e.what()));\n          }\n          catch (...)\n          {\n          }\n          XLO_ERROR(L\"Unknown handler '{0}' called by Ribbon\", fnName);\n          return DISP_E_UNKNOWNNAME;\n        }\n        *rgdispid = found->second;\n        return S_OK;\n      }\n\n      STDMETHOD(Invoke)(\n        _In_ DISPID dispidMember,\n        _In_ REFIID /*riid*/,\n        _In_ LCID /*lcid*/,\n        _In_ WORD /*wFlags*/,\n        _In_ DISPPARAMS* pdispparams,\n        _Out_opt_ VARIANT* pvarResult,\n        _Out_opt_ EXCEPINFO* /*pexcepinfo*/,\n        _Out_opt_ UINT* /*puArgErr*/)\n      {\n        // Remember the args are in reverse order\n        auto* rgvarg = pdispparams->rgvarg;\n\n        if (dispidMember == 1)\n        {\n          return raw_GetCustomUI(rgvarg[1].bstrVal, rgvarg[0].pbstrVal);\n        }\n        else if (dispidMember == 2)\n        {\n          return onLoadHandler(rgvarg[0].pdispVal);\n        }\n        else if (dispidMember - theFirstDispid < (int)_functions.size())\n        {\n          const auto nArgs = pdispparams->cArgs;\n\n          // Assign enough space: no Ribbon callback has this many args\n          VARIANT* args[4];\n\n          // First arg is the ribbon control\n          auto ctrl = (IRibbonControl*)rgvarg[nArgs - 1].pdispVal;\n\n          // Reverse order the other args\n          for (auto i = 1u; i < nArgs; ++i)\n            args[i - 1] = &rgvarg[nArgs - 1 - i];\n          \n          try\n          {\n            _functions[dispidMember - theFirstDispid](\n              RibbonControl{ ctrl->Id, ctrl->Tag },\n              pvarResult,\n              nArgs - 1,\n              args);\n          }\n          catch (const std::exception& e)\n          {\n            XLO_ERROR(\"Error during ribbon callback: {0}\", e.what());\n            // TODO: set exception?\n          }\n          catch (...)\n          {\n            return E_FAIL;\n          }\n        }\n        else\n        {\n          XLO_ERROR(\"Internal Error: unknown dispid called on ribbon Invoke.\");\n          return E_FAIL;\n        }\n        return S_OK;\n      }\n\n#pragma endregion\n\n    };\n\n    class Ribbon : public IRibbon\n    {\n    public:\n      Ribbon(\n        const wchar_t* xml, \n        const std::function<RibbonCallback(const wchar_t*)>& handler)\n      {\n        _ribbon = new RibbonImpl();\n        _ribbon->setRibbon(xml, handler);\n      }\n      void invalidate(const wchar_t* controlId) const override\n      {\n        if ((*_ribbon).ribbonUI)\n        {\n          if (controlId)\n            (*_ribbon).ribbonUI->InvalidateControl(controlId);\n          else\n            (*_ribbon).ribbonUI->Invalidate();\n        }\n      }\n\n      bool activateTab(const wchar_t* controlId) const override\n      {\n        return (*_ribbon).ribbonUI\n          ? (*_ribbon).ribbonUI->ActivateTab(controlId)\n          : false;\n      }\n\n      Office::IRibbonExtensibility* getRibbon() override\n      {\n        return _ribbon;\n      }\n\n      CComPtr<RibbonImpl> _ribbon;\n    };\n\n    shared_ptr<IRibbon> createRibbon(\n      const wchar_t* xml,\n      const std::function<RibbonCallback(const wchar_t*)>& handler)\n    {\n      return std::make_shared<Ribbon>(xml, handler);\n    }\n  }\n}\n"
  },
  {
    "path": "src/xlOil-COM/RibbonExtensibility.h",
    "content": "#pragma once\n\n#include <functional>\n#include <memory>\n\nnamespace Office { struct IRibbonExtensibility; }\nnamespace xloil { struct RibbonControl;  }\ntypedef struct tagVARIANT VARIANT;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    class IRibbon\n    {\n    public:\n      virtual Office::IRibbonExtensibility* getRibbon() = 0;\n      virtual void invalidate(const wchar_t* controlId = 0) const = 0;\n      virtual bool activateTab(const wchar_t* controlId) const = 0;\n    };\n\n    using RibbonCallback = std::function<\n      void(const RibbonControl&, VARIANT*, int, VARIANT**)>;\n\n    std::shared_ptr<IRibbon> createRibbon(\n      const wchar_t* xml,\n      const std::function<RibbonCallback(const wchar_t*)>& handler);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/RtdAsyncManager.cpp",
    "content": "#include \"RtdAsyncManager.h\"\n#include \"RtdManager.h\"\n#include <xlOil/RtdServer.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil/Caller.h>\n#include <xlOil/Events.h>\n#include <xlOil/ExcelCall.h>\n#include <xlOil/ExcelThread.h>\n#include <xloil/StringUtils.h>\n#include <combaseapi.h>\n#include <shared_mutex>\n\nusing std::wstring;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing std::make_shared;\nusing std::shared_lock;\nusing std::make_pair;\nusing std::unique_lock;\nusing std::shared_mutex;\n\n\nnamespace\n{\n  /// <summary>\n  /// Like a std::scoped_lock but uses a std::atomic_flag rather than a mutex.\n  /// Note it busy-waits for the lock!\n  /// </summary>\n  struct scoped_atomic_flag\n  {\n    std::atomic_flag* _flag;\n\n    scoped_atomic_flag(std::atomic_flag& flag)\n      : _flag(&flag)\n    {\n      while (flag.test_and_set(std::memory_order_acquire))\n      {\n        // Since C++20, it is possible to update atomic_flag's\n        // value only when there is a chance to acquire the lock.\n        // See also: https://stackoverflow.com/questions/62318642\n#if defined(__cpp_lib_atomic_flag_test)\n        while (lock.test(std::memory_order_relaxed))\n#else\n        // spin\n#endif\n      }\n    }\n    ~scoped_atomic_flag()\n    {\n      if (_flag)\n        _flag->clear(std::memory_order_release);\n    }\n    void swap(scoped_atomic_flag& that)\n    {\n      std::swap(_flag, that._flag);\n    }\n  };\n}\n\nnamespace xloil\n{\n  namespace COM\n  {\n    class AsyncTaskPublisher;\n\n    struct CellTasks\n    {\n      std::list<shared_ptr<AsyncTaskPublisher>> tasks;\n      int arrayCount = 0; // see comment in 'getValue()'\n      const wchar_t* arrayTopic = nullptr;\n      msxll::XLREF12 caller;\n      std::atomic_flag busy = ATOMIC_FLAG_INIT;\n\n      bool isSubarray(const msxll::XLREF12& ref) const\n      {\n        return ref.rwFirst >= caller.rwFirst && ref.rwLast <= caller.rwLast\n          && ref.colFirst >= caller.colFirst && ref.colLast <= caller.colLast;\n      }\n      void setCaller(const msxll::XLREF12& ref)\n      {\n        memcpy(&caller, &ref, sizeof(msxll::XLREF12));\n      }\n    };\n\n    using CellAddress = std::pair<unsigned, unsigned>;\n\n    using CellTaskMap = std::unordered_map<\n      CellAddress,\n      std::shared_ptr<CellTasks>,\n      pair_hash<unsigned, unsigned>>;\n\n    // TODO: could we just create a forwarding IRtdAsyncTask which intercepts 'cancel'\n    class AsyncTaskPublisher : public RtdPublisher\n    {\n      std::weak_ptr<CellTasks> _parent;\n\n    public:\n      AsyncTaskPublisher(\n        const wchar_t* topic,\n        IRtdServer& mgr,\n        const shared_ptr<IRtdTask>& task,\n        const std::weak_ptr<CellTasks>& parent)\n        : RtdPublisher(topic, mgr, task)\n        , _parent(parent)\n      {}\n\n      bool disconnect(size_t numSubscribers) override\n      {\n        if (numSubscribers != 0)\n          XLO_ERROR(L\"AsyncTaskPublisher: unexpected subscribers for {}\", topic());\n        RtdPublisher::disconnect(numSubscribers);\n        auto p = _parent.lock();\n        if (p)\n        {\n          scoped_atomic_flag lock(p->busy);\n          p->tasks.remove_if([&](auto& t) { return t.get() == this; });\n        }\n        return true;\n      }\n\n      bool taskMatches(const IRtdAsyncTask& that) const\n      {\n        return that == (const IRtdAsyncTask&)*task();\n      }\n    };\n\n    void startCellTask(\n      IRtdServer& _rtd,\n      const shared_ptr<CellTasks>& tasks,\n      const shared_ptr<IRtdAsyncTask>& task)\n    {\n      GUID guid;\n      wchar_t guidStr[64];\n\n      if (CoCreateGuid(&guid) != 0 || StringFromGUID2(guid, guidStr, _countof(guidStr)) == 0)\n        XLO_THROW(\"Internal: RtdAsyncManager failed to create GUID\");\n\n      tasks->tasks.emplace_back(new AsyncTaskPublisher(guidStr, _rtd, task, tasks));\n\n      _rtd.start(tasks->tasks.back());\n    }\n\n    auto newCellTasks(\n      CellTaskMap& tasksPerCell,\n      const CellAddress& address,\n      const msxll::XLREF12& ref)\n    {\n      auto [iTask, success] = tasksPerCell.try_emplace(address, new CellTasks());\n      auto tasksInCell = iTask->second;\n      tasksInCell->setCaller(ref);\n      return tasksInCell;\n    }\n\n    void writeArray(\n      CellTaskMap& tasksPerCell,\n      const shared_ptr<CellTasks>& val,\n      const unsigned sheetId,\n      const msxll::XLREF12& ref)\n    {\n      for (auto j = ref.colFirst; j <= ref.colLast; ++j)\n        for (auto i = ref.rwFirst; i <= ref.rwLast; ++i)\n        {\n          unsigned num = i * XL_MAX_COLS + j;\n          tasksPerCell[make_pair(sheetId, num)] = val;\n        }\n    }\n\n\n    namespace RtdAsyncManager\n    {\n      namespace\n      {\n        // Hold this mutex to a create the Impl class or to call its methods\n        static shared_mutex theManagerMutex;\n\n        class Impl\n        {\n        public:\n          Impl()\n            : _rtd(newRtdServer(nullptr, nullptr))\n          {\n            // We're a singleton so guaranteed to still exist at autoclose\n            Event::AutoClose() += [this]() {\n              clear();\n              _rtd.reset();\n            };\n          }\n\n          void clear()\n          {\n            _rtd->clear();\n            _tasksPerCell.clear();\n          }\n\n          auto findTargetCellTasks(\n            const msxll::XLREF12* ref,\n            unsigned arraySize,\n            unsigned sheetId,\n            unsigned cellNumber)\n          {\n            // Lock the dictionary of cell tasks and look for the address\n            // (1) New master (no previous record)\n            // (2) New master (former slave)\n            //     (a) Shares top left\n            //     (b) Doesn't\n            // (3) Slave increment (arraySize = 1, arrayCount > 0)\n\n            // The value we need to populate\n            shared_ptr<CellTasks> pTasksInCell;\n\n            const auto address = std::make_pair(sheetId, cellNumber);\n\n            const auto found = _tasksPerCell.find(address);\n            if (found == _tasksPerCell.end())\n            {\n              pTasksInCell = newCellTasks(_tasksPerCell, address, *ref);\n            }\n            else\n            {\n              pTasksInCell = found->second;\n              auto tasksInCell = pTasksInCell.get();\n\n              if (!pTasksInCell->isSubarray(*ref))\n              {\n                pTasksInCell = newCellTasks(_tasksPerCell, address, *ref);\n              }\n              else if (arraySize == 1 && tasksInCell->arrayCount > 0)\n              {\n                // Do nothing for now\n              }\n              else\n              {\n                tasksInCell->setCaller(*ref);\n              }\n            }\n\n            // If the caller is an array formula, when RTD is called in the subscribe()\n            // method, it will return xlretUncalced, but will trigger the calling\n            // function to be called again for each cell in the array. The caller in these\n            // subsequent calls will sometimes remain as the top left-cell and will sometimes \n            // cycle through the cells of the array.\n            // \n            // We want to start the task only once for the first call, with subsequent\n            // calls invoking subscribe quickly without needing to compare all function args.\n\n            if (arraySize > 1)\n              writeArray(_tasksPerCell, pTasksInCell, sheetId, *ref);\n\n            return pTasksInCell;\n          }\n          const std::shared_ptr<IRtdServer>& getRtd() const\n          {\n            return _rtd;\n          }\n         \n        private:\n          std::shared_ptr<IRtdServer> _rtd;\n          CellTaskMap _tasksPerCell;\n        };\n\n        static std::unique_ptr<Impl> theInstance;\n\n        Impl* getInstance(unique_lock<shared_mutex>& lock)\n        {\n          // Somewhat intricate logic around creating the instance:\n          //  * If we are the main thread, just create it\n          //  * Otherwise release the lock and send a request to \n          //    main thread to acquire the lock and create it.\n          //  * Wait for 5s, then give up\n          //  * We need the lock to call functions on theInstance\n          //    so reacquire it if lost\n          if (!theInstance)\n          {\n            if (isMainThread())\n              theInstance.reset(new Impl());\n            else\n            {\n              lock.unlock();\n\n              auto status = runExcelThread([]\n              {\n                std::unique_lock lock(theManagerMutex);\n                if (!theInstance)\n                  theInstance.reset(new Impl());\n              }).wait_for(std::chrono::seconds(5));\n\n              if (status != std::future_status::ready)\n                XLO_THROW(\"Rtd async manager timed out, try calling the function again\");\n\n              // Instance now exists, so get lock and get cracking\n              lock.lock();\n            }\n          }\n          return theInstance.get();\n        }\n\n        /// <summary>\n        /// Static, so does not need the mutex\n        /// </summary>\n        static auto getValueAndSubscribe(\n          const std::shared_ptr<IRtdServer>& rtd,\n          const std::shared_ptr<IRtdAsyncTask>& task,\n          const unsigned arraySize,\n          const shared_ptr<CellTasks>& pTasksInCell)\n        {\n          auto* tasksInCell = pTasksInCell.get();\n\n          // Now populate these variables\n          shared_ptr<const ExcelObj> result;\n          const wchar_t* foundTopic = nullptr;\n\n          {\n            // Lock 'tasksInCell' in case there is more than one RTD function in the cell.\n            // This is unlikely in itself and as they all execute on the same thread, contention\n            // problems are improbable, so we use a lightweight atomic_flag which implies a spin \n            // wait (before C++20).\n            scoped_atomic_flag lockCell(tasksInCell->busy);\n\n            if (arraySize == 1 && tasksInCell->arrayCount > 0)\n            {\n              --tasksInCell->arrayCount;\n              foundTopic = tasksInCell->arrayTopic;\n            }\n            else\n            {\n              // Compare our task to all other running tasks in the cell to see if we\n              // already have the answer\n              for (auto& t : tasksInCell->tasks)\n                if (t->taskMatches(*task))\n                {\n                  foundTopic = t->topic();\n                  if (t->done())\n                    result = rtd->peek(foundTopic);\n                  break;\n                }\n\n              if (!foundTopic)\n              {\n                // Couldn't find a matching task so start a new one\n                startCellTask(*rtd, pTasksInCell, task);\n                foundTopic = tasksInCell->tasks.back()->topic();\n              }\n\n              if (arraySize > 1)\n              {\n                tasksInCell->arrayCount = arraySize;\n                tasksInCell->arrayTopic = foundTopic;\n              }\n              else\n              {\n                tasksInCell->arrayCount = 0;\n                tasksInCell->arrayTopic = nullptr;\n              }\n            }\n          }\n\n          assert(foundTopic);\n          if (result)\n            return result;\n       \n          // If the task is still running we resubscribe to all other tasks in the cell.\n          // If an argument to this task is the result of another task in the same cell,\n          // not subscribing will cause Excel to send a disconnect to the inner task. When\n          // this task returns its result, it triggers a cell recalc which will start a new\n          // connection to the inner task and go into a perpetual loop. If the inner task\n          // is still connected, xlOil knows it has already produced a result and returns \n          // it, avoiding the loop.\n          for (auto& t : tasksInCell->tasks)\n            if (wcscmp(t->topic(), foundTopic) != 0)\n              rtd->subscribe(t->topic());\n          return rtd->subscribe(foundTopic);\n        }\n      }\n\n      void init()\n      {\n        // Acquire the lock then check if the instance has been created\n        unique_lock lock(theManagerMutex);\n        getInstance(lock);\n      }\n\n      std::shared_ptr<const ExcelObj>\n        getValue(\n          const std::shared_ptr<IRtdAsyncTask>& task)\n      {\n        if (!task)\n          return shared_ptr<const ExcelObj>();\n\n        const auto caller = CallerInfo();\n        const auto ref = caller.sheetRef();\n\n        // Sometimes fetching the caller fails - give up \n        if (!ref)\n          return shared_ptr<const ExcelObj>();\n\n        const auto arraySize = (ref->colLast - ref->colFirst + 1)\n          * (ref->rwLast - ref->rwFirst + 1);\n\n        // This is the cell number of the top-left cell for array callers\n        const unsigned cellNumber = ref->rwFirst * XL_MAX_COLS + ref->colFirst;\n\n        // It's OK to cast away half the sheetref ptr: it's likely the detail\n        // is in the lower part and it doesn't matter if we have collisions\n        // in the map since we check for explicit equality later.\n        const auto sheetId = (unsigned)(intptr_t)callExcel(\n          msxll::xlSheetId, caller.fullSheetName()).val.mref.idSheet;\n\n        // Acquire the lock then check if the instance has been created\n        unique_lock lock(theManagerMutex);\n\n        auto impl = getInstance(lock);\n\n        auto tasksInCell = impl->findTargetCellTasks(\n          ref, arraySize, cellNumber, sheetId);\n\n        auto rtdServer = impl->getRtd();\n\n        // We've finished with the task-per-cell lookup and can drop the lock\n        // required for the Impl\n        lock.unlock();\n\n        return getValueAndSubscribe(rtdServer, task, arraySize, tasksInCell);\n      }\n\n      void clear()\n      {\n        unique_lock lock(theManagerMutex);\n\n        if (!theInstance)\n          return;\n\n        theInstance->clear();\n      }\n    } // namespace RtdAsyncManager\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/RtdAsyncManager.h",
    "content": "#pragma once\n#include <xloil/RtdServer.h>\n#include <xloil/StringUtils.h>\n#include <shared_mutex>\n\nnamespace xloil\n{\n  namespace COM\n  {\n    namespace RtdAsyncManager\n    {\n      void init();\n\n      /// <summary>\n      /// Given an RtdAsync Task, returns a value, if one is has\n      /// already been published, or starts the task and subscribes.\n      /// This triggers a callback from Excel when a value is available\n      /// </summary>\n      /// <param name=\"task\"></param>\n      /// <returns></returns>\n      std::shared_ptr<const ExcelObj>\n        getValue(\n          const std::shared_ptr<IRtdAsyncTask>& task);\n\n      /// <summary>\n      /// Destroys all running Rtd Async tasks.  Used on teardown\n      /// </summary>\n      void clear();\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/RtdManager.cpp",
    "content": "#define WIN32_LEAN_AND_MEAN\n#include <atlbase.h>\n#include <atlcom.h>\n#include <atlwin.h>\n#include <Objbase.h>\n\n#include <xlOil/ExcelTypeLib.h>\n#include \"ComVariant.h\"\n#include \"ClassFactory.h\"\n#include \"RtdServerWorker.h\"\n\n#include <xlOil/ExcelThread.h>\n\n#include <xloil/RtdServer.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/Events.h>\n#include <xloil/Log.h>\n\n#include <memory>\n#include <atomic>\n\nusing std::vector;\nusing std::shared_ptr;\nusing std::make_shared;\nusing std::wstring;\nusing std::atomic;\n\n\nnamespace\n{\n  // ATL needs this for some reason\n  class AtlModule : public CAtlDllModuleT<AtlModule>\n  {} theAtlModule;\n}\n\nnamespace xloil \n{\n  namespace COM\n  {\n    template<class TWorker>\n    class\n      __declspec(novtable)\n      RtdServerImpl :\n        public CComObjectRootEx<CComSingleThreadModel>,\n        public CComCoClass<RtdServerImpl<TWorker>>,\n        public IDispatchImpl<\n          Excel::IRtdServer,\n          &__uuidof(Excel::IRtdServer),\n          &LIBID_Excel>\n    {\n    private:\n      TWorker _worker;\n      atomic<Excel::IRTDUpdateEvent*> _updateCallback;\n\n      void updateNotify()\n      {\n        runExcelThread([this]()\n        {\n          auto callback = _updateCallback.load();\n          if (callback)\n            callback->raw_UpdateNotify(); // Does this really need the COM API?\n        }, ExcelRunQueue::ENQUEUE, 0, 1000);\n      }\n\n    public:\n      TWorker& manager()\n      {\n        return _worker;\n      }\n\n      ~RtdServerImpl()\n      {\n        try\n        {\n          _worker.join();\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"RtdServer destructor: {0}\", e.what());\n        }\n      }\n\n      HRESULT _InternalQueryInterface(REFIID riid, void** ppv) throw()\n      {\n        *ppv = NULL;\n        if (riid == IID_IUnknown || riid == __uuidof(Excel::IRtdServer))\n        {\n          *ppv = (IUnknown*)this;\n          AddRef();\n          return S_OK;\n        }\n        return E_NOINTERFACE;\n      }\n\n      HRESULT __stdcall raw_ServerStart(\n        Excel::IRTDUpdateEvent* callback,\n        long* result) override\n      {\n        if (!callback || !result)\n          return E_POINTER;\n        try\n        {\n          _updateCallback = callback;\n          _worker.start([this]() { this->updateNotify(); });\n          *result = 1;\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Rtd server start: {0}\", e.what());\n        }\n        return S_OK;\n      }\n\n      HRESULT __stdcall raw_ConnectData(\n        long topicId,\n        SAFEARRAY** strings,\n        VARIANT_BOOL* newValue,\n        VARIANT* value) override\n      {\n        if (!strings || !newValue || !value)\n          return E_POINTER;\n\n        try\n        {\n          // We get the first topic string (and ignore the rest)\n          long index[] = { 0, 0 };\n          VARIANT topicAsVariant;\n          SafeArrayGetElement(*strings, index, &topicAsVariant);\n          _worker.connect(topicId, wstring(topicAsVariant.bstrVal));\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Rtd Disconnect: {0}\", e.what());\n        }\n        return S_OK;\n      }\n\n      HRESULT __stdcall raw_RefreshData(\n        long* topicCount,\n        SAFEARRAY** data) override\n      {\n        auto* updates = _worker.getUpdates();\n        if (!updates)\n          *topicCount = 0;\n        else\n        {\n          long ubound; // Bound is *inclusive*\n          SafeArrayGetUBound(updates, 2, &ubound);\n          *topicCount = ubound + 1;\n          *data = updates;\n        }\n        return S_OK;\n      }\n\n      HRESULT __stdcall raw_DisconnectData(long topicId) override\n      {\n        try\n        {\n          _worker.disconnect(topicId);\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Rtd Disconnect: {0}\", e.what());\n        }\n\n        return S_OK;\n      }\n\n      HRESULT __stdcall raw_Heartbeat(long* result) override\n      {\n        if (!result) return E_POINTER;\n        *result = 1;\n        return S_OK;\n      }\n\n      HRESULT __stdcall raw_ServerTerminate() override\n      {\n        try\n        {\n          XLO_DEBUG(L\"Server terminate received for '{}'\", _progId);\n          // Clearing _updateCallback prevents the sending of further updates \n          // which might crash Excel if sent during teardown.\n          _updateCallback = nullptr;\n          _worker.join();\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Rtd Terminate: {0}\", e.what());\n        }\n        return S_OK;\n      }\n\n      const wchar_t* _progId = nullptr;\n    };\n\n    class RtdServer : public IRtdServer\n    {\n      using ComImplType = CComObject<RtdServerImpl<RtdServerThreadedWorker<ExcelObj>>>;\n      auto& server() const { return _impl->manager(); }\n      CComPtr<ComImplType> _impl;\n\n      RegisterCom _registrar;\n\n    public:\n      RtdServer(const wchar_t* progId, const GUID* fixedClsid)\n        : _impl(new ComImplType())\n        , _registrar(\n          [p = _impl.p]() { return p; },\n          progId,\n          fixedClsid)\n      {\n        _impl->_progId = _registrar.progid();\n      }\n\n      ~RtdServer()\n      {\n        server().join();\n      }\n\n      void testConnect(long topicId, const std::wstring_view& topicName)\n      {\n        _impl->manager().connect(topicId, wstring(topicName));\n      }\n\n      void testDisconnect(long topicId)\n      {\n        _impl->manager().disconnect(topicId);\n      }\n\n      void start(\n        const shared_ptr<IRtdPublisher>& topic) override\n      {\n        server().addPublisher(topic);\n      }\n\n      shared_ptr<const ExcelObj> subscribe(const wchar_t * topic) override\n      {\n        shared_ptr<const ExcelObj> value;\n        // If there is a producer, but no value yet, put N/A\n        callRtd(topic);\n        if (server().value(topic, value) && !value)\n          value = make_shared<ExcelObj>(CellError::NA);\n        return value;\n      }\n      void subscribeOnly(const wchar_t* topic) override\n      {\n        callRtd(topic);\n      }\n      bool publish(const wchar_t* topic, ExcelObj&& value = ExcelObj( std::clock() )) override\n      {\n        server().update(topic, make_shared<ExcelObj>(std::move(value)));\n        return true;\n      }\n      shared_ptr<const ExcelObj> \n        peek(const wchar_t* topic) override\n      {\n        shared_ptr<const ExcelObj> value;\n        // If there is a producer, but no value yet, put N/A\n        if (server().value(topic, value) && !value)\n          value = make_shared<ExcelObj>(CellError::NA);\n        return value;\n      }\n      bool drop(const wchar_t* topic) override\n      {\n        return server().dropPublisher(topic);\n      }\n      const wchar_t* progId() const noexcept override\n      {\n        return _registrar.progid();\n      }\n\n      void clear() override\n      {\n        // This is likely be to called during teardown, so trap any errors\n        try\n        {\n          // Although we can't force Excel to finalise the RTD server when we\n          // want (as far as I know) we can deactive it and cut links to any \n          // external DLLs\n          server().quit();\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"RtdServer::clear: {0}\", e.what());\n        }\n      }\n    \n      /// <summary>\n      /// We don't use the value from the Rtd call, but it indicates to\n      /// Excel that the current UDF should be treated as an RTD function.\n      /// It prompts Excel to connect to the RTD server to link a topicId\n      /// to this topic string. Returns false if the excel call fails \n      /// (usually this will be due to xlretUncalced which occurs when the\n      /// calling cell is an array formula).\n      /// </summary>\n      bool callRtd(const wchar_t* topic) const\n      {\n        auto[val, retCode] = \n          tryCallExcel(msxll::xlfRtd, _registrar.progid(), L\"\", topic);\n        return retCode == 0;\n      }\n    };\n\n    std::shared_ptr<IRtdServer> newRtdServer(\n      const wchar_t* progId, const wchar_t* clsid)\n    {\n      if (!isMainThread())\n        XLO_THROW(\"RtdServer must be created on main thread\");\n\n      GUID guid;\n      if (clsid)\n        CLSIDFromString(clsid, &guid);\n\n      return make_shared<COM::RtdServer>(progId, clsid ? &guid : nullptr);\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/RtdManager.h",
    "content": "#pragma once\n#include <xloil/RtdServer.h>\n\nstruct tagSAFEARRAY;\nusing SAFEARRAY = tagSAFEARRAY;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    /// <summary>\n    /// Overridden Inteface for objects which handle calls from an\n    /// RTD COM Server\n    /// </summary>\n    struct IRtdServerWorker\n    {\n      void start(std::function<void()>&& updateNotify);\n      /// <summary>\n      /// Ensure the given topic is being published and link it to the\n      /// specified topicId\n      /// </summary>\n      void connect(long topicId, std::wstring&& topic);\n      /// <summary>\n      /// Delink the topicId (which may cause an associated topic publisher\n      /// to be stopped)\n      /// </summary>\n      /// <param name=\"topicId\"></param>\n      void disconnect(long topicId);\n      /// <summary>\n      /// Returns 2 x n SafeArray which has rows of [topicId, empty] for\n      /// each topicId with a new value\n      /// </summary>\n      SAFEARRAY* getUpdates();\n      /// <summary>\n      /// Stops any publishers. The server will be unavailable after\n      /// this call.\n      /// </summary>\n      void quit();\n    };\n\n    template <class TValue>\n    struct IRtdPublishManager\n    {\n      void update(std::wstring&& topic, const std::shared_ptr<TValue>& value);\n      void addPublisher(const std::shared_ptr<IRtdPublisher>& job);\n      bool dropPublisher(const wchar_t* topic);\n      bool value(const wchar_t* topic, std::shared_ptr<const TValue>& val) const;\n      void quit();\n      /// <summary>\n      /// Calls quit, then joins any publishers and worker threads. The object\n      /// is ready for destruction after this call returns.\n      /// </summary>\n      void join();\n    };\n\n    std::shared_ptr<IRtdServer> newRtdServer(\n      const wchar_t* progId, const wchar_t* clsid);\n  }\n}\n"
  },
  {
    "path": "src/xlOil-COM/RtdServerWorker.h",
    "content": "#pragma once\n#include \"RtdManager.h\"\n#include <xloil/Log.h>\n#include <xlOilHelpers/Utils.h>\n#include <atlbase.h>\n#include <string>\n#include <unordered_map>\n#include <unordered_set>\n#include <mutex>\n#include <shared_mutex>\n#include <memory>\n#include <vector>\n\nusing std::vector;\nusing std::shared_ptr;\nusing std::scoped_lock;\nusing std::unique_lock;\nusing std::shared_lock;\nusing std::wstring;\nusing std::unordered_set;\nusing std::unordered_map;\nusing std::pair;\nusing std::list;\nusing std::atomic;\nusing std::mutex;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    template <class TValue>\n    class RtdServerThreadedWorker : public IRtdServerWorker, public IRtdPublishManager<TValue>\n    {\n    public:\n\n      void start(std::function<void()>&& updateNotify)\n      {\n        _updateNotify = std::move(updateNotify);\n        _isRunning = true;\n        _workerThread = std::thread([=]() { this->workerThreadMain(); });\n      }\n      void connect(long topicId, wstring&& topic)\n      {\n        {\n          unique_lock lock(_mutexNewSubscribers);\n          _topicsToConnect.emplace_back(topicId, std::move(topic));\n        }\n        notify();\n      }\n      void disconnect(long topicId)\n      {\n        {\n          unique_lock lock(_mutexNewSubscribers);\n          _topicIdsToDisconnect.emplace_back(topicId);\n        }\n        notify();\n      }\n\n      SAFEARRAY* getUpdates() \n      { \n        auto updates = _readyUpdates.exchange(nullptr);\n        notify();\n        return updates;\n      }\n\n      void quit()\n      {\n        if (!isServerRunning())\n          return; // Already terminated, or never started\n\n        setQuitFlag();\n        // Let thread know we have set 'quit' flag\n        notify();\n      }\n\n      void join()\n      {\n        quit();\n        if (_workerThread.joinable())\n          _workerThread.join();\n      }\n\n      void update(wstring&& topic, const shared_ptr<TValue>& value)\n      {\n        if (!isServerRunning())\n          return;\n        {\n          scoped_lock lock(_mutexNewValues);\n          // TODO: can this be somehow lock free?\n          _newValues.emplace_back(make_pair(std::move(topic), value));\n        }\n        notify();\n      }\n\n      void addPublisher(const shared_ptr<IRtdPublisher>& job)\n      {\n        auto existingJob = job;\n        {\n          unique_lock lock(_lockRecords);\n          auto& record = _records[job->topic()];\n          if (record.publisher == job)\n            return;\n\n          std::swap(record.publisher, existingJob);\n          if (existingJob)\n            _cancelledPublishers.push_back(existingJob);\n        }\n        if (existingJob)\n          existingJob->stop();\n      }\n\n      bool dropPublisher(const wchar_t* topic)\n      {\n        // We must not hold the lock when calling functions on the publisher\n        // as they may try to call other functions on the RTD server. \n        shared_ptr<IRtdPublisher> publisher;\n        {\n          unique_lock lock(_lockRecords);\n          auto i = _records.find(topic);\n          if (i == _records.end())\n            return false;\n          std::swap(publisher, i->second.publisher);\n        }\n\n        // Signal the publisher to stop\n        publisher->stop();\n\n        // Destroy producer, the dtor of RtdPublisher waits for completion\n        publisher.reset();\n\n        // Publish empty value (which triggers a notify)\n        update(topic, shared_ptr<TValue>());\n        return true;\n      }\n\n      bool value(const wchar_t* topic, shared_ptr<const TValue>& val) const\n      {\n        shared_lock lock(_lockRecords);\n        auto found = _records.find(topic);\n        if (found == _records.end())\n          return false;\n\n        val = found->second.value;\n        return true;\n      }\n\n    private:\n\n      struct TopicRecord\n      {\n        shared_ptr<IRtdPublisher> publisher;\n        unordered_set<long> subscribers;\n        shared_ptr<TValue> value;\n      };\n\n      unordered_map<wstring, TopicRecord> _records;\n\n      list<pair<wstring, shared_ptr<TValue>>> _newValues;\n      vector<pair<long, wstring>> _topicsToConnect;\n      vector<long> _topicIdsToDisconnect;\n\n      // Publishers which have been cancelled but haven't finished terminating\n      list<shared_ptr<IRtdPublisher>> _cancelledPublishers;\n\n      std::function<void()> _updateNotify;\n      atomic<SAFEARRAY*> _readyUpdates;\n      atomic<bool> _isRunning;\n\n      // We use a separate lock for the newValues to avoid blocking too \n      // often: value updates are likely to come from other threads and \n      // simply need to write into newValues without accessing pub/sub info.\n      // We use _lockRecords for all other synchronisation\n      mutable mutex _mutexNewValues;\n      mutable mutex _mutexNewSubscribers;\n      mutable std::shared_mutex _lockRecords;\n\n      std::thread _workerThread;\n      std::condition_variable _workPendingNotifier;\n      atomic<bool> _workPending = false;\n\n      void notify() noexcept\n      {\n        _workPending = true;\n        _workPendingNotifier.notify_one();\n      }\n\n      void setQuitFlag()\n      {\n        _isRunning = false;\n      }\n\n      bool isServerRunning() const\n      {\n        return _isRunning;\n      }\n\n      void workerThreadMain()\n      {\n        unordered_set<long> readyTopicIds;\n        unordered_map<long, wstring> activeTopicIds;\n        try\n        {\n          while (isServerRunning())\n          {\n            // The worker does all the work!  In this order\n            //   1) Wait for wake notification\n            //   2) Check if quit/stop has been sent\n            //   3) Look for new values.\n            //      a) If any, put the matching topicIds in readyTopicIds\n            //      b) If Excel has picked up previous values, create an array of \n            //         updates and send an UpdateNotify.\n            //   4) Run any topic connect requests\n            //   5) Run any topic disconnect requests\n            //   6) Repeat\n            //\n            decltype(_newValues) newValues;\n\n            unique_lock lockValues(_mutexNewValues);\n            // This slightly convoluted code protects against spurious wakes and \n            // 'lost' wakes, i.e. if the CV is signalled but the worker is not\n            // in the waiting state.\n            if (!_workPending)\n              _workPendingNotifier.wait(lockValues, [&]() { return _workPending.load(); });\n            _workPending = false;\n\n            if (!isServerRunning())\n              break;\n\n            // Since _mutexNewValues is required to send updates, so we avoid holding it  \n            // and quickly swap out the list of new values. \n            std::swap(newValues, _newValues);\n            lockValues.unlock();\n\n            if (!newValues.empty())\n            {\n              shared_lock lock(_lockRecords);\n              auto iValue = newValues.begin();\n              for (; iValue != newValues.end(); ++iValue)\n              {\n                auto record = _records.find(iValue->first);\n                if (record == _records.end())\n                  continue;\n                record->second.value = iValue->second;\n                readyTopicIds.insert(record->second.subscribers.begin(), record->second.subscribers.end());\n              }\n            }\n\n            // When Excel calls RefreshData, it will take the SAFEARRAY in _readyUpdates and\n            // atomically replace it with null. If this ptr is not null, we know Excel\n            // has not yet picked up the new values, so we swap it out and resize the array\n            // to include the latest ready topics. We issue another _updateNotify to Excel,\n            // even if there are items in readyUpdates as sometimes things go out of sync and\n            // Excel does not call RefreshData (exact reasons unknown).\n            if (!readyTopicIds.empty())\n            {\n              const auto nReady = (ULONG)readyTopicIds.size();\n              auto topicArray = _readyUpdates.exchange(nullptr);\n              long nExisting = 0;\n\n              if (topicArray)\n              {\n                SafeArrayGetUBound(topicArray, 2, &nExisting); \n                ++nExisting; // Bound is *inclusive*\n                SAFEARRAYBOUND outer{ nExisting + nReady, 0 };\n                SafeArrayRedim(topicArray, &outer);\n              }\n              else\n              {\n                SAFEARRAYBOUND bounds[] = { { 2u, 0 }, { nReady, 0 } };\n                topicArray = SafeArrayCreate(VT_VARIANT, 2, bounds);\n              }\n\n              writeReadyTopicsArray(topicArray, readyTopicIds, nExisting);\n\n              _readyUpdates.exchange(topicArray);\n\n              _updateNotify();\n\n              readyTopicIds.clear();\n            }\n\n            decltype(_topicsToConnect) topicsToConnect;\n            decltype(_topicIdsToDisconnect) topicIdsToDisconnect;\n            {\n              unique_lock lock(_mutexNewSubscribers);\n\n              std::swap(_topicIdsToDisconnect, topicIdsToDisconnect);\n              std::swap(_topicsToConnect, topicsToConnect);\n            }\n\n            if (topicsToConnect.empty() && topicIdsToDisconnect.empty())\n              continue;\n\n            const bool doTrace = spdlog::default_logger_raw()->should_log(spdlog::level::trace);\n\n            if (doTrace)\n            {\n              wstring msg = L\"RTD connections: \";\n              for (auto& x : topicsToConnect)\n                msg.append(formatStr(L\"(%s -> %d), \", x.second.c_str(), x.first));\n              XLO_TRACE(msg);\n\n              msg = L\"RTD disconnections: \";\n              for (auto& x : topicIdsToDisconnect)\n                msg.append(formatStr(L\"%d, \", x));\n              XLO_TRACE(msg);\n            }\n\n            // The connect/disconnect logic seems unnecessarily tortuous. \n            // There are a few tricky bases to cover:\n            //   1) Do not hold locks when calling functions on the publisher\n            //      as they may re-enter the RTD framework.\n            //   2) Catch any exceptions from publisher calls to avoid killing\n            //      the RTD server\n            //   3) We may have a disconnect and connect on the same publisher\n            //      and want to avoid the publisher cancelling itself.\n            //   3) We may have a disconnect and connect on the same topic id\n            //      and need to ensure `activeTopicIds` ends in the correct\n            //      state\n            //   4) We may have a disconnect and connect on the same topic id\n            //      *and* the same publisher. In this case we want to cancel\n            //      out the requests. \n\n            // Sort pending connects / disconnects by topic ID, so we can more \n            // efficiently iterate one whilst looking up in the other. \n            std::sort(topicsToConnect.begin(), topicsToConnect.end(),\n              [](auto& l, auto& r) { return l.first < r.first; });\n            std::sort(topicIdsToDisconnect.begin(), topicIdsToDisconnect.end());\n\n            // Lookup the topic names for the IDs to disconnect, then remove\n            // them as they are no longer needed\n            decltype(_topicsToConnect) topicsToDisconnect;\n            if (!topicIdsToDisconnect.empty())\n            {\n              topicsToDisconnect.reserve(topicIdsToDisconnect.size());\n              for (auto id : topicIdsToDisconnect)\n              {\n                auto p = activeTopicIds.find(id);\n                if (p != activeTopicIds.end())\n                {\n                  topicsToDisconnect.emplace_back(id, p->second);\n                  activeTopicIds.erase(p);\n                }\n                else\n                  XLO_WARN(\"Could not find topic to disconnect for id {0}\", id);\n              }\n            }\n\n            // Step through the topics to connect, checking for a match\n            // in topicsToDisconnect. If one is found, skip the connect\n            // and zero the topic id which will skip the disconnect later.\n            // Otherwise connect the topic and update the active IDs\n            {\n              auto iDisconnect = topicsToDisconnect.begin();\n              const auto ttdEnd = topicsToDisconnect.end();\n              for (auto& [topicId, topic] : topicsToConnect)\n              {\n                iDisconnect = std::lower_bound(iDisconnect, ttdEnd, topicId,\n                  [](auto& l, auto& r) { return l.first < r; });\n                if (iDisconnect != ttdEnd\n                  && iDisconnect->first == topicId\n                  && iDisconnect->second == topic)\n                {\n                  if (doTrace)\n                    XLO_TRACE(L\"RTD matched connect against disconnect for ({} -> {})\", topicId, topic);\n                  iDisconnect->first = 0;\n                  ++iDisconnect;\n                }\n                else\n                  connectTopic(topicId, topic);\n\n                activeTopicIds.emplace(topicId, std::move(topic));\n              }\n            }\n\n            // Now we can run the disconnects, skipping any zeroed which matched against a connection\n            for (auto& [topicId, topic] : topicsToDisconnect)\n              if (topicId != 0)\n                disconnectTopic(topicId, topic);\n\n            // Remove any cancelled publishers which have finalised. Don't destroy \n            // them whilst holding the lock. \n            decltype(_cancelledPublishers) finalisedPublishers;\n            {\n              unique_lock lock(_lockRecords);\n              move_if(_cancelledPublishers, finalisedPublishers, [](auto x) { return x->done(); });\n            }\n\n            // Now run the dtors, but catch to avoid killing the RTD server\n            try \n            {\n              finalisedPublishers.clear();\n            }\n            catch (const std::exception& e)\n            {\n              XLO_ERROR(\"Error during publisher desctructor: {}\", e.what());\n            }\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"RTD Worker thread exited with error: {}\", e.what());\n        }\n        \n        try\n        {\n          // Clear all records, destroy all publishers\n          clear();\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"Error during RTD worker cleanup: {}\", e.what());\n        }\n      }\n\n      // \n      // Creates a 2 x n safearray which has rows of:\n      //     topicId | empty\n      // With the topicId for each updated topic. The second column can be used\n      // to pass an updated value to Excel, however, only string values are allowed\n      // which is too restricive. Passing empty tells Excel to call the function\n      // again to get the value\n      //\n      static void writeReadyTopicsArray(\n        SAFEARRAY* data,\n        const std::unordered_set<long>& topics,\n        const long startRow = 0)\n      {\n        void* element = nullptr;\n        auto iRow = startRow;\n        for (auto topic : topics)\n        {\n          long index[] = { 0, iRow };\n          auto ret = SafeArrayPtrOfIndex(data, index, &element);\n          assert(S_OK == ret);\n          *(VARIANT*)element = _variant_t(topic);\n\n          index[0] = 1;\n          ret = SafeArrayPtrOfIndex(data, index, &element);\n          assert(S_OK == ret);\n          *(VARIANT*)element = _variant_t();\n\n          ++iRow;\n        }\n      }\n\n      void connectTopic(long topicId, const wstring& topic)\n      {\n        // We need these values after we release the lock\n        shared_ptr<IRtdPublisher> publisher;\n        size_t numSubscribers;\n\n        {\n          XLO_TRACE(L\"RTD: connecting '{}' to topicId '{}'\", topic, topicId);\n          unique_lock lock(_lockRecords);\n          auto& record = _records[topic];\n          publisher = record.publisher;\n          record.subscribers.insert(topicId);\n          numSubscribers = record.subscribers.size();\n        }\n\n        // Let the publisher know how many subscribers they now have.\n        // We must not hold the lock when calling functions on the publisher\n        // as they may try to call other functions on the RTD server. \n        if (publisher)\n          publisher->connect(numSubscribers);\n      }\n\n      void disconnectTopic(long topicId, const wstring& topic)\n      {\n        shared_ptr<IRtdPublisher> publisher;\n        size_t numSubscribers;\n \n        try\n        {\n          // We must *not* hold the lock when calling methods of the publisher\n          // as they may try to call other functions on the RTD server. So we\n          // first handle the topic lookup and removing subscribers before\n          // releasing the lock and notifying the publisher.\n          {\n            unique_lock lock(_lockRecords);\n  \n            auto& record = _records[topic];\n            record.subscribers.erase(topicId);\n\n            numSubscribers = record.subscribers.size();\n            publisher = record.publisher;\n\n            if (!publisher && numSubscribers == 0)\n            {\n              XLO_TRACE(L\"Removing orphaned topic {}\", topic);\n              _records.erase(topic);\n            }\n          }\n\n          if (!publisher)\n            return;\n\n          XLO_TRACE(L\"RTD: disconnecting '{}' with topicId '{}'\", topic, topicId);\n\n          // If disconnect() causes the publisher to cancel its task,\n          // it will return true here. We may not be able to just delete it: \n          // we have to wait until any threads it created have exited\n          if (publisher->disconnect(numSubscribers))\n          {\n            XLO_TRACE(L\"Removing publisher and record for topic {}\", topic);\n\n            {\n              unique_lock lock(_lockRecords);\n\n              // Not done, so add to this list and check back later\n              if (!publisher->done())\n                _cancelledPublishers.emplace_back(publisher);\n\n              // Disconnect should only return true when num_subscribers = 0, \n              // so it's safe to erase the entire record\n              _records.erase(topic);\n            }\n          }\n        }\n        catch (const std::exception& e)\n        {\n          XLO_ERROR(\"RTD error whilst disconnecting '{}': {}\", topicId, e.what());\n        }\n      }\n\n      void clear()\n      {\n        // We must not hold any locks when calling functions on the publisher\n        // as they may try to call other functions on the RTD server. \n        list<shared_ptr<IRtdPublisher>> publishers;\n        {\n          unique_lock lock(_lockRecords);\n\n          for (auto& record : _records)\n            if (record.second.publisher)\n              publishers.emplace_back(std::move(record.second.publisher));\n\n          _records.clear();\n          _cancelledPublishers.clear();\n        }\n\n        for (auto& publisher : publishers)\n        {\n          try\n          {\n            publisher->disconnect(0);\n            if (!publisher->done())\n              publisher->stop();\n          }\n          catch (const std::exception& e)\n          {\n            XLO_INFO(L\"Failed to stop producer: '{0}': {1}\",\n              publisher->topic(), utf8ToUtf16(e.what()));\n          }\n        }\n      }\n    };\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/TaskPaneHostControl.cpp",
    "content": "#define WIN32_LEAN_AND_MEAN\n#include <atlbase.h>\n#include <atlctl.h>\n\n#include \"TaskPaneHostControl.h\"\n#include \"ClassFactory.h\"\n#include <xloil/Log.h>\n#include <xloil/ExcelUI.h>\n#include <xloil/State.h>\n\n#pragma comment(lib, \"comctl32.lib\")\n\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    /// <summary>\n    /// Implements much hackery, largely discovered by experimentation to ensure\n    /// that a target window is displayed over a task pane.  The \"shadowed\" window\n    /// attachment style in particular uses some steps that may be superfluous but\n    /// appear to make things work\n    /// </summary>\n    class ATL_NO_VTABLE TaskPaneHostControl :\n      public CComObjectRootEx<CComSingleThreadModel>,\n      public IDispatchImpl<IDispatch>,\n      public CComControl<TaskPaneHostControl>,\n      public IOleControlImpl<TaskPaneHostControl>,\n      public IOleObjectImpl<TaskPaneHostControl>,\n      public IOleInPlaceActiveObjectImpl<TaskPaneHostControl>,\n      public IViewObjectExImpl<TaskPaneHostControl>,\n      public IOleInPlaceObjectWindowlessImpl<TaskPaneHostControl>,\n      public ITaskPaneHostControl\n    {\n      HWND _attachedWindow = 0;\n      HWND _previousParent = 0;\n      HWND _workPane = 0;\n      HWND _parent = 0;\n      LONG_PTR _previousWindowStyle = 0;\n      shared_ptr<ICustomTaskPaneEvents> _destroyHandler = nullptr;\n      HWND _excelHwnd = 0;\n      static const GUID _clsid;\n\n    public:\n\n      TaskPaneHostControl() noexcept\n      {\n        m_bWindowOnly = 1;\n      }\n\n      ~TaskPaneHostControl() noexcept\n      {\n        detach();\n      }\n\n      void detach() noexcept\n      {\n        if (_attachedWindow == 0)\n          return;\n\n        XLO_DEBUG(\"Detaching and destroying task pane with hwnd={:x}\", (size_t)_attachedWindow);\n\n        ::RemoveWindowSubclass(_parent,\n          parentSubclassProc, (UINT_PTR)this);\n\n        if (attachedAsParent())\n        {\n          // Restore parent\n          ::SetParent(_attachedWindow, _previousParent);\n          \n        }\n        else\n        {\n          ::RemoveWindowSubclass(_excelHwnd,\n            handleMoveSubclassProc, (UINT_PTR)this);\n        }\n\n        // Restore previous window style\n        ::SetWindowLongPtr(_attachedWindow, GWL_STYLE, _previousWindowStyle);\n\n        // Hide the window so it doesn't jump around the screen before its creator can destroy it\n        ::ShowWindow(_attachedWindow, SW_HIDE);\n \n        _attachedWindow = 0;\n\n        if (_destroyHandler)\n        {\n          try\n          {\n            _destroyHandler->onDestroy();\n          }\n          catch (const std::exception& e)\n          {\n            XLO_ERROR(e.what());\n          }\n        }\n      }\n\n      static const CLSID& WINAPI GetObjectCLSID()\n      {\n        return _clsid;\n      }\n\n      void AttachWindow(HWND hwnd, bool asParent) override\n      {\n        XLO_DEBUG(\"Task pane host attaching to {:x}\", (size_t)hwnd);\n\n        _attachedWindow = hwnd; \n        _previousWindowStyle = ::GetWindowLongPtr(_attachedWindow, GWL_STYLE);\n        _parent = GetAttachableParent();\n\n        // Subclass the parent so that Note the subclass id is 'this' which\n        // we cast back in the WndProc.\n        SetWindowSubclass(_parent,\n          parentSubclassProc, (UINT_PTR)this, (DWORD_PTR)nullptr);\n\n        if (asParent)\n        {\n          _previousParent = ::SetParent(_attachedWindow, _parent);\n\n          XLO_DEBUG(\"Task pane host control adopted window {:x}. Previous parent {:x}\",\n            (size_t)hwnd, (size_t)_previousParent);\n\n          // Change style to frameless child\n          auto style = (_previousWindowStyle | WS_CHILD) & ~WS_THICKFRAME & ~WS_CAPTION;\n          ::SetWindowLongPtr(_attachedWindow, GWL_STYLE, style);\n\n          // Set the z-order and reposition the child at the top left of the parent.\n          ::SetWindowPos(m_hWnd, _attachedWindow, 0, 0, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);\n          ::SetWindowPos(_attachedWindow, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOZORDER);\n        }\n        else\n        {\n          auto style = _previousWindowStyle & ~WS_THICKFRAME & ~WS_CAPTION &\n            ~WS_EX_APPWINDOW & ~WS_EX_TOOLWINDOW;\n          ::SetWindowLongPtr(_attachedWindow, GWL_STYLE, style);\n\n          // Give the window an owner to stop it appearing in the taskbar\n          ::SetWindowLongPtr(_attachedWindow, GWLP_HWNDPARENT, (LONG_PTR)_parent);\n\n          // Show/hide the window to update teh style changes\n          ::ShowWindow(_attachedWindow, SW_HIDE);\n          ::ShowWindow(_attachedWindow, SW_SHOW);\n\n          moveAttachedWindow();\n\n          _excelHwnd = GetExcelHWND(_parent);\n\n          ::SetWindowSubclass(_excelHwnd, \n            handleMoveSubclassProc, (UINT_PTR)this, (DWORD_PTR)nullptr);\n        }\n      }\n\n      void AttachDestroyHandler(const std::shared_ptr<ICustomTaskPaneEvents>& handler) override\n      {\n        _destroyHandler = handler;\n      }\n\n      BEGIN_COM_MAP(TaskPaneHostControl)\n        COM_INTERFACE_ENTRY(IDispatch)\n        COM_INTERFACE_ENTRY(IViewObjectEx)\n        COM_INTERFACE_ENTRY(IViewObject2)\n        COM_INTERFACE_ENTRY(IViewObject)\n        COM_INTERFACE_ENTRY(IOleInPlaceObject)\n        COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObject)\n        COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)\n        COM_INTERFACE_ENTRY(IOleControl)\n        COM_INTERFACE_ENTRY(IOleObject)\n        COM_INTERFACE_ENTRY(ITaskPaneHostControl)\n      END_COM_MAP()\n\n      BEGIN_MSG_MAP(TaskPaneHostControl)\n        MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnPosChanging)\n        CHAIN_MSG_MAP(CComControl<TaskPaneHostControl>)\n        DEFAULT_REFLECTION_HANDLER()\n      END_MSG_MAP()\n\n      // IViewObjectEx\n      DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)\n\n      DECLARE_WND_CLASS(_T(\"xlOilAXHostControl\"))\n\n    private:\n      bool attachedAsParent() const \n      {\n        return _previousParent != nullptr;\n      }\n\n      /// <summary>\n      /// Returns the XLMAIN hwnd associated with the given window - Excel\n      /// can have multiple XLMAIN top level windows open, so this function\n      /// walks up the stack to find the target\n      /// </summary>\n      /// <param name=\"from\"></param>\n      /// <returns></returns>\n      HWND GetExcelHWND(HWND from)\n      {\n        constexpr wchar_t target[] = L\"XLMAIN\";\n        return getWindowByClass(from, target, 1 + _countof(target));\n      }\n\n      HWND GetAttachableParent()\n      {\n        // We can't link GUI window to just any old parent. In particular not\n        // m_hWnd of this class. This is because the DPI awareness for this\n        // window is set to System whereas the GUI toolkit root windows\n        // are at Per-Monitor or better; this causes GetParent to fail. Because\n        // this window's parent is also System awareness, we can't make our \n        // window Per-Monitor aware. Even if we call SetThreadDpiHostingBehavior\n        // with DPI_HOSTING_BEHAVIOR_MIXED - it just doesn't work. Instead we \n        // walk up the parent chain unti we find \"NUIPane\" which experimentation\n        // has shown will be a suitable parent.\n        // \n        // We will walk up the window stack until we find the target below.\n        constexpr wchar_t target[] = L\"NUIPane\";\n        return getWindowByClass(m_hWnd, target, 1 + _countof(target));\n      }\n\n      HWND getWindowByClass(HWND from, const wchar_t* className, size_t len = 0)\n      {\n        if (len == 0)\n          len = wcslen(className);\n\n        assert(len < 256);\n\n        // Create a buffer for window class names. Ensure the buffer is always null \n        // terminated for safety.\n        wchar_t winClass[256];\n        winClass[255] = 0;\n\n        HWND parent = from;\n        do\n        {\n          auto hwnd = parent;\n          parent = ::GetParent(hwnd);\n          if (parent == hwnd || parent == NULL)\n            XLO_THROW(L\"Failed to find parent window with class {}\", className);\n          ::GetClassName(parent, winClass, (int)len);\n        } while (wcscmp(className, winClass) != 0);\n\n        return parent;\n      }\n      \n      /// <summary>\n      /// Moves the attached window to occupy the same space as the parent panel\n      /// and be on top of the Excel main window.\n      /// </summary>\n      void moveAttachedWindow()\n      {\n        RECT attached;\n        ::GetWindowRect(_parent, &attached);\n\n        ::SetWindowPos(_attachedWindow,\n          0,\n          attached.left, attached.top,\n          0, 0,\n          SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED);\n\n        ::SetWindowPos(_attachedWindow,\n          HWND_TOP,\n          0, 0, 0, 0,\n          SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOMOVE);\n      }\n\n      HRESULT OnPosChanging(UINT message, WPARAM wParam, LPARAM lParam, BOOL& bHandled)\n      {\n        auto windowPos = (WINDOWPOS*)lParam;\n        if (_attachedWindow != 0 && windowPos->cx > 0 && windowPos->cy > 0)\n        {\n          ::SetWindowPos(\n            _attachedWindow,\n            0, 0, 0,\n            windowPos->cx, windowPos->cy,\n            SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);\n          if (!attachedAsParent())\n            moveAttachedWindow();\n        }\n        bHandled = true;\n        return (HRESULT)DefWindowProc(message, wParam, lParam);\n      }\n\n      static LRESULT CALLBACK parentSubclassProc(\n        HWND hWnd, UINT uMsg,\n        WPARAM wParam, LPARAM lParam, \n        UINT_PTR uIdSubclass,\n        DWORD_PTR /*dwRefData*/)\n      {\n        auto self = ((TaskPaneHostControl*)uIdSubclass);\n        switch (uMsg)\n        {\n        //case 0xD00:\n        case WM_CHILDACTIVATE:\n        {\n          if (!self->attachedAsParent())\n          {\n            // When a taskpane is popped out a new top level window is created to parent \n            // it, this window is destroyed when the task pane is docked so we need to keep\n            // up with the latest parent\n            auto workpane = ::GetParent(::GetParent(self->_parent));\n            if (workpane != self->_workPane)\n            {\n              ::RemoveWindowSubclass(self->_workPane,\n                handlePositionSubclassProc, (UINT_PTR)self);\n              self->_workPane = workpane;\n              ::SetWindowSubclass(self->_workPane,\n                handlePositionSubclassProc, (UINT_PTR)self, (DWORD_PTR)nullptr);\n              self->moveAttachedWindow();\n            }\n          }\n          break;\n        }\n        case WM_DESTROY:\n          // When we get a WM_DESTROY we dettach the window. Some GUI toolkits (e.g. Qt)\n          // object to their windows being destroyed from unexpected sources and dump a\n          // core to register their displeasure.\n          ((TaskPaneHostControl*)uIdSubclass)->detach();\n          break;\n        case WM_WINDOWPOSCHANGING:\n        {\n          // We get here when the Office backstage view is opened, which hides the\n          // task panes\n          if (!self->attachedAsParent())\n          {\n            WINDOWPOS* p = (WINDOWPOS*)lParam;\n            if ((p->flags & SWP_HIDEWINDOW) != 0)\n              ::ShowWindow(self->_attachedWindow, SW_HIDE);\n\n            // You might think that SWP_SHOWWINDOW should be the correct flag\n            // here, but experimentation shows that SWP_NOCOPYBITS works\n            else if ((p->flags & SWP_NOCOPYBITS) != 0)\n              ::ShowWindow(self->_attachedWindow, SW_SHOW);\n          }\n          break;\n        }\n        }\n        return DefSubclassProc(hWnd, uMsg, wParam, lParam);\n      }\n\n      static LRESULT CALLBACK handleMoveSubclassProc(\n        HWND hWnd, UINT uMsg,\n        WPARAM wParam, LPARAM lParam, \n        UINT_PTR uIdSubclass,\n        DWORD_PTR /*dwRefData*/)\n      {\n        auto self = ((TaskPaneHostControl*)uIdSubclass);\n        auto retVal = DefSubclassProc(hWnd, uMsg, wParam, lParam);\n\n        // If anything interesting happens, i.e. the window moves, we create\n        // a callback to moveAttachedWindow by which time the window will be in\n        // its new position as expected by moveAttachedWindow.\n        switch (uMsg)\n        {\n        case WM_USER + 643:\n          self->moveAttachedWindow();\n          break;\n        case WM_SIZE:\n        case WM_MOVE:\n          ::PostMessage(hWnd, WM_USER + 643, 0, 0);\n          break;\n        }\n        return retVal;\n      }\n\n      static LRESULT CALLBACK handlePositionSubclassProc(\n        HWND hWnd, UINT uMsg,\n        WPARAM wParam, LPARAM lParam,\n        UINT_PTR uIdSubclass,\n        DWORD_PTR /*dwRefData*/)\n      {\n        auto self = ((TaskPaneHostControl*)uIdSubclass);\n        auto retVal = DefSubclassProc(hWnd, uMsg, wParam, lParam);\n\n        switch (uMsg)\n        {\n        case WM_USER + 643:\n          self->moveAttachedWindow();\n          break;\n        case WM_SIZE:\n        case WM_MOVE:\n        {\n          ::PostMessage(hWnd, WM_USER + 643, 0, 0);\n          break;\n        }\n        case WM_WINDOWPOSCHANGING:\n        {\n          WINDOWPOS* p = (WINDOWPOS*)lParam;\n          if ((p->flags & SWP_NOZORDER) == 0 && ::IsWindowVisible(self->_attachedWindow))\n          {\n            // Fix the z order\n            ::SetWindowPos(self->_attachedWindow,\n              p->hwndInsertAfter,\n              0, 0, 0, 0,\n              SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);\n            p->hwndInsertAfter = self->_attachedWindow;\n          }\n          break;\n        }\n        }\n        return retVal;\n      }\n    };\n\n\n    // {EBE296D2-2373-437C-9FF5-934865BAB572}\n    const GUID TaskPaneHostControl::_clsid =\n    { 0xebe296d2, 0x2373, 0x437c, { 0x9f, 0xf5, 0x93, 0x48, 0x65, 0xba, 0xb5, 0x72 } };\n\n    const wchar_t* taskPaneHostControlProgId()\n    {\n      static RegisterCom registrar(\n        []() { return (IDispatch*)new CComObject<TaskPaneHostControl>(); },\n        L\"xlOilAXHostControl\", \n        &TaskPaneHostControl::GetObjectCLSID());\n      return registrar.progid();\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/TaskPaneHostControl.h",
    "content": "#include <comdef.h>\n#include <memory>\n\nnamespace xloil\n{\n  class ICustomTaskPaneEvents;\n\n  namespace COM\n  {\n    struct __declspec(uuid(\"2ADAD4E5-0793-4151-8D29-07B05C4B0557\"))\n      ITaskPaneHostControl : public IUnknown\n    {\n      /// <summary>\n      /// Makes the specified borderless and keeps it in the right place over\n      /// the host control.\n      ///  \n      /// There are two attachment styles:\n      ///   \"as parent\": much simpler, the target window gets a task pane parent,\n      ///   so moving, z-order and visibility are handled automatically by Win32\n      /// \n      ///   \"shadowed\": xlOil keeps the window with the correct location, z-order \n      ///   and visibility \n      /// \n      /// The \"shadowed\" style exists because certain window managers (Wx) misbehave\n      /// if their windows are re-parented.\n      /// </summary>\n      virtual void AttachWindow(HWND hwnd, bool asParent=true) = 0;\n      /// <summary>\n      /// Specifies a handler for the onDestroy event called when the pane\n      /// receives a WM_DESTROY message. Pass a null pointer to detatch the\n      /// handler.\n      /// </summary>\n      virtual void AttachDestroyHandler(\n        const std::shared_ptr<ICustomTaskPaneEvents>& handler) = 0;\n    };\n\n    /// <summary>\n    /// Registers the task pane hosting COM control and returns the progid\n    /// </summary>\n    /// <returns></returns>\n    const wchar_t* taskPaneHostControlProgId();\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/WorkbookScopeFunctions.cpp",
    "content": "#include \"WorkbookScopeFunctions.h\"\n#include \"Connect.h\"\n#include \"ComVariant.h\"\n#include <xlOil-Dynamic/LocalFunctions.h>\n#include <xlOil/Range.h>\n#include <xlOil/Register.h>\n#include <xlOilHelpers/Environment.h>\n#include <xloil/FuncSpec.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/State.h>\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/ExcelThread.h>\n#include <xlOil/AppObjects.h>\n#include <vector>\n#include <memory>\n\nusing std::vector;\nusing std::shared_ptr;\nusing std::wstring;\nusing std::wstring_view;\nusing namespace VBIDE;\n\nnamespace xloil\n{\n  namespace COM\n  {\n    namespace\n    {\n      bool checkRegistryKeys()\n      {\n        auto excelVersion = Environment::excelProcess().version;\n        auto regKey = fmt::format(L\"Software\\\\Microsoft\\\\Office\\\\{0}.0\\\\Excel\\\\Security\\\\AccessVBOM\", excelVersion);\n        DWORD currentUser = 666, localMachine = 666;\n        getWindowsRegistryValue(L\"HKCU\", regKey.c_str(), currentUser);\n        getWindowsRegistryValue(L\"HKLM\", regKey.c_str(), localMachine);\n        if (currentUser == 0 || localMachine == 0)\n          XLO_THROW(\"Allow access to VBA Object Model in \"\n            \"File > Options > Trust Center > Trust Center Settings > Macro Settings\");\n        return true;\n      }\n      \n    }\n\n    struct Writer\n    {\n      int line;\n      VBIDE::_CodeModulePtr mod;\n\n      template <typename S, typename... Args>\n      void write(const S& fmtStr, Args&&... args)\n      {\n        mod->InsertLines(line++, fmt::format(fmtStr, std::forward<Args>(args)...).c_str());\n      }\n\n      /// <summary>\n      /// Write a line which is save to auto-break at spaces. Such a line should\n      /// not contain strings which may contain spaces. The line length limit\n      /// in VBA is 1024 chars.\n      /// </summary>\n      template <typename S, typename... Args>\n      void writeBreakable(const S& fmtStr, Args&&... args)\n      {\n        wstring text = fmt::format(fmtStr, std::forward<Args>(args)...);\n        while (text.length() > 1000)\n        {\n          auto lastSpace = wstring_view(text.data(), 1000).find_last_of(L' ');\n          mod->InsertLines(line++, (wstring(text.data(), lastSpace + 1) + L'_').c_str());\n          text.erase(0, lastSpace + 1);\n        }\n        mod->InsertLines(line++, text.c_str());\n      }\n    };\n\n    void writeLocalFunctionsToVBA(\n      const wchar_t* workbookName,\n      const vector<shared_ptr<const LocalWorksheetFunc>>& registeredFuncs,\n      const wchar_t* vbaModuleName,\n      const bool append)\n    {\n      try\n      {\n        // Check we have trusted access to VBA object model\n        static bool registryChecked = checkRegistryKeys();\n\n        auto workbook = thisApp().workbooks().get(workbookName);\n\n        VBIDE::_VBProjectPtr vbProj;\n        try\n        {\n          vbProj = workbook.com().VBProject;\n        }\n        catch (const _com_error& e)\n        {\n          if (e.Error() == 0x800A03EC) // Name not found\n            XLO_THROW(\"Could not get VBProject object: allow access to the VBA Object Model in \"\n              \"Excel > File > Options > Trust Center > Trust Center Settings > Macro Settings\");\n          throw;\n        }\n        struct _VBComponent* vbFound = 0;\n        _VBComponentPtr vbMod;\n        auto startLine = 1;\n        if (SUCCEEDED(vbProj->VBComponents->raw_Item(_variant_t(vbaModuleName), &vbFound)))\n        {\n          vbMod = vbProj->VBComponents->Item(vbaModuleName);\n          if (!append)\n            vbMod->CodeModule->DeleteLines(1, vbMod->CodeModule->CountOfLines);\n          else\n            startLine = vbMod->CodeModule->CountOfLines + 1;\n        }\n        else\n        {\n          vbMod = vbProj->VBComponents->Add(vbext_ct_StdModule);\n          vbMod->PutName(vbaModuleName);\n        }\n\n        Writer writer{ startLine, vbMod->CodeModule };\n        if (startLine == 1)\n          writer.write(L\"Declare PtrSafe Function localFunctionEntryPoint \"\n            \"Lib \\\"xloil.dll\\\" \"\n            \"(ByRef funcId as LongPtr, \"\n            \" ByRef ret as variant, \"\n            \" ByRef args as variant) as Long\");\n\n        for (size_t i = 0; i < registeredFuncs.size(); ++i)\n        {\n          auto& func = *registeredFuncs[i]->info();\n\n          if (func.args.size() > XL_MAX_VBA_FUNCTION_ARGS)\n            XLO_THROW(\"Local functions may have at most 60 arguements due to VBA limitations\");\n\n          // We declare all args as optional variant and let the called \n          // function handle things.\n          wstring args, optionalArgs;\n          for (auto& arg : func.args)\n          {\n            args += arg.name + L',';\n            optionalArgs += L\"Optional \" + arg.name + L\",\";\n          }\n\n          // Drop final comma\n          if (!optionalArgs.empty()) optionalArgs.pop_back();\n          if (!args.empty()) args.pop_back();\n\n          // We write:\n          // \n          // Public Function name(Optional arg0, Optional arg1,...)\n          //   Dim args: args = Array(arg0, arg1, ...)\n          //   localFunctionEntryPoint workbook, 'name, name, args\n          // End Function\n          // \n          // For a command we replace Function with Sub and add a dummy return\n          // as localFunctionEntryPoint expects a return value\n          //\n          const bool isSub = (func.options & FuncInfo::COMMAND) != 0;\n          const auto& name = func.name;\n          const auto funcType = isSub ? L\"Sub\" : L\"Function\";\n          const auto retVar = isSub ? L\"dummy\" : name;\n          const auto funcId = registeredFuncs[i]->registerId();\n\n          //TODO: AddFromString all at once?\n          writer.writeBreakable(L\"Public {2} {0}({1})\", name, optionalArgs, funcType);\n          writer.writeBreakable(L\"  Dim xlo_args: xlo_args=Array({0})\", args);\n          if (isSub)\n            writer.write(L\"  Dim dummy\");\n          writer.write(L\"  localFunctionEntryPoint {0}, {1}, xlo_args\",\n            funcId, retVar);\n          writer.write(L\"End {0}\", funcType);\n        }\n      }\n      XLO_RETHROW_COM_ERROR;\n    }\n\n    using wcs = std::char_traits<wchar_t>;\n\n    void removeExistingXlOilVBA(const wchar_t* workbookName)\n    {\n      try \n      {\n        static bool registryChecked = checkRegistryKeys();\n\n        auto workbook = thisApp().workbooks().get(workbookName);\n\n        auto vbProj = workbook.com().VBProject;\n          \n        for (auto i = 1; i <= vbProj->VBComponents->Count; ++i)\n        {\n          auto item = vbProj->VBComponents->Item(i);\n          if (wcs::compare(item->Name, theAutoGenModulePrefix, wcs::length(theAutoGenModulePrefix)) == 0)\n            vbProj->VBComponents->Remove(item);\n        }\n      }\n      XLO_RETHROW_COM_ERROR;\n    }\n  }\n}\n"
  },
  {
    "path": "src/xlOil-COM/WorkbookScopeFunctions.h",
    "content": "#pragma once\n#include <vector>\n#include <string>\n#include <memory>\n\nnamespace xloil\n{\n  struct FuncInfo;\n  class LocalWorksheetFunc;\n  \n  constexpr wchar_t* theAutoGenModulePrefix = L\"xlOil_\";\n\n  namespace COM\n  {\n    void writeLocalFunctionsToVBA(\n      const wchar_t* workbookName,\n      const std::vector<std::shared_ptr<const LocalWorksheetFunc>>& registeredFuncs,\n      const wchar_t* vbaModuleName,\n      const bool append);\n\n    void removeExistingXlOilVBA(const wchar_t* workbookName);\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/XllContextInvoke.cpp",
    "content": "#include \"XllContextInvoke.h\"\n#include <xlOil/ExcelTypeLib.h>\n#include <xlOil/ExcelThread.h>\n#include \"Connect.h\"\n#include <xlOil/ExcelObj.h>\n#include <xlOil/AppObjects.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/Log.h>\n\nnamespace xloil\n{\n  template <class TFunc>\n  auto tryComCall(TFunc fn) -> typename std::invoke_result<TFunc>::type\n  {\n    try\n    {\n      return fn();\n    }\n    XLO_RETHROW_COM_ERROR;\n  }\n\n  static const std::function<bool()>* theBoolFunc = nullptr;\n  static int theExcelCallFunc = 0;\n  static XLOIL_XLOPER* theExcelCallResult = nullptr;\n  static XLOIL_XLOPER** theExcelCallArgs = nullptr;\n  static int theExcelCallNumArgs = 0;\n\n  XLO_ENTRY_POINT(XLOIL_XLOPER*) xloRunInXLLContext()\n  {\n    static ExcelObj result(0);\n    try\n    {\n      InXllContext context;\n      if (theBoolFunc)\n        result.val.w = (*theBoolFunc)() ? 1 : 0;\n      else\n        result.val.w = Excel12v(\n          theExcelCallFunc, theExcelCallResult, theExcelCallNumArgs, theExcelCallArgs);\n    }\n    catch (...)\n    {\n    }\n    return &result;\n  }\n  auto dummy = XLO_REGISTER_LATER(xloRunInXLLContext)\n    .macro().hidden();\n\n  bool runInXllContext(const std::function<bool()>& f)\n  {\n    // May go wrong in a multi-thread evironment.\n    if (InXllContext::check())\n    {\n      return f();\n    }\n\n    // Crashes when called from window proc at startup - investigate?\n    //auto[result, xlret] = tryCallExcel(msxll::xlfGetDocument, 1);\n    //if (xlret == 0)\n\n    theBoolFunc = &f;\n\n    return tryComCall([]()\n    {\n      auto result = COM::attachedApplication().com().Run(\"xloRunInXLLContext\");\n      if (result.vt == VT_ERROR)\n        XLO_THROW(L\"COM Error {0:#x}\", (unsigned)result.scode);\n      return result;\n    });\n  }\n\n  int runInXllContext(int func, ExcelObj* result, int nArgs, const ExcelObj** args)\n  {\n    if (InXllContext::check())\n    {\n      return Excel12v(func, result, nArgs, (XLOIL_XLOPER**)args);\n    }\n\n    theBoolFunc = nullptr;\n    theExcelCallFunc = func;\n    theExcelCallResult = result;\n    theExcelCallArgs = (XLOIL_XLOPER**)args;\n    theExcelCallNumArgs = nArgs;\n\n    auto ret = tryComCall([]()\n    { \n      return COM::attachedApplication().com().Run(\"xloRunInXLLContext\");\n    });\n\n    if (!ret)\n      return msxll::xlretInvXlfn;\n    \n    if (SUCCEEDED(VariantChangeType(&ret, &ret, 0, VT_I4)))\n      return ret.lVal;\n\n    return msxll::xlretInvXlfn;\n  }\n}"
  },
  {
    "path": "src/xlOil-COM/XllContextInvoke.h",
    "content": "#pragma once\n#include <functional>\n\nnamespace Excel { struct _Application; }\nnamespace xloil { class ExcelObj; }\n\nnamespace xloil\n{\n  /// <summary>\n  /// Calling XLL specific functions is generally not allowed unless you\n  /// are on the main thread and are in an XLL function called by Excel.\n  /// This function runs the supplied function object under that context.\n  /// Should only be called from the main thread.\n  /// </summary>\n  bool runInXllContext(const std::function<bool()>& f);\n\n  /// <summary>\n  /// Calling XLL specific functions is generally not allowed unless you\n  /// are on the main thread and are in an XLL function called by Excel.\n  /// This function runs Excel12v on the supplied arguments in that context.\n  /// Should only be called from the main thread.\n  /// </summary>\n  int runInXllContext(\n    int func, ExcelObj* result, int nArgs, const ExcelObj** args);\n}"
  },
  {
    "path": "src/xlOil-COM/xlOil-COM.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"DebugStatic|Win32\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"DebugStatic|x64\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|Win32\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|x64\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}</ProjectGuid>\n    <RootNamespace>xlOil.COM</RootNamespace>\n    <ProjectName>xlOil-COM</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='DebugStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <MultiProcessorCompilation>false</MultiProcessorCompilation>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Release'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <PostBuildEvent>\n      <Command Condition=\"'$(Configuration)'=='DebugStatic'\">lib /OUT:$(OutDir)xlOil-External.lib $(OutDir)..\\Debug\\spdlog.lib $(OutDir)..\\Debug\\rdcfswatcher.lib</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <PostBuildEvent>\n      <Command Condition=\"'$(Configuration)'=='ReleaseStatic'\">lib /OUT:$(OutDir)xlOil-External.lib $(OutDir)..\\Release\\spdlog.lib $(OutDir)..\\Release\\rdcfswatcher.lib</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"ClassFactory.h\" />\n    <ClInclude Include=\"ComAddin.h\" />\n    <ClInclude Include=\"ComEventSink.h\" />\n    <ClInclude Include=\"ComVariant.h\" />\n    <ClInclude Include=\"Connect.h\" />\n    <ClInclude Include=\"CustomTaskPane.h\" />\n    <ClInclude Include=\"RibbonExtensibility.h\" />\n    <ClInclude Include=\"RtdAsyncManager.h\" />\n    <ClInclude Include=\"RtdManager.h\" />\n    <ClInclude Include=\"RtdServerWorker.h\" />\n    <ClInclude Include=\"TaskPaneHostControl.h\" />\n    <ClInclude Include=\"WorkbookScopeFunctions.h\" />\n    <ClInclude Include=\"XllContextInvoke.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"API\\ExcelThread.cpp\" />\n    <ClCompile Include=\"API\\ComUtils.cpp\" />\n    <ClCompile Include=\"API\\Events.cpp\" />\n    <ClCompile Include=\"API\\ExcelRange.cpp\" />\n    <ClCompile Include=\"API\\RtdServer.cpp\" />\n    <ClCompile Include=\"AppObjects.cpp\" />\n    <ClCompile Include=\"ClassFactory.cpp\" />\n    <ClCompile Include=\"ComAddin.cpp\" />\n    <ClCompile Include=\"ComEventSink.cpp\" />\n    <ClCompile Include=\"ComVariant.cpp\" />\n    <ClCompile Include=\"Connect.cpp\" />\n    <ClCompile Include=\"CustomTaskPane.cpp\" />\n    <ClCompile Include=\"RibbonExtensibility.cpp\" />\n    <ClCompile Include=\"RtdAsyncManager.cpp\" />\n    <ClCompile Include=\"RtdManager.cpp\" />\n    <ClCompile Include=\"TaskPaneHostControl.cpp\" />\n    <ClCompile Include=\"WorkbookScopeFunctions.cpp\" />\n    <ClCompile Include=\"XllContextInvoke.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-COM/xlOil-COM.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClInclude Include=\"ClassFactory.h\" />\n    <ClInclude Include=\"ComAddin.h\" />\n    <ClInclude Include=\"ComEventSink.h\" />\n    <ClInclude Include=\"ComVariant.h\" />\n    <ClInclude Include=\"Connect.h\" />\n    <ClInclude Include=\"RibbonExtensibility.h\" />\n    <ClInclude Include=\"RtdManager.h\" />\n    <ClInclude Include=\"WorkbookScopeFunctions.h\" />\n    <ClInclude Include=\"XllContextInvoke.h\" />\n    <ClInclude Include=\"CustomTaskPane.h\" />\n    <ClInclude Include=\"RtdAsyncManager.h\" />\n    <ClInclude Include=\"RtdServerWorker.h\" />\n    <ClInclude Include=\"TaskPaneHostControl.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"ComAddin.cpp\" />\n    <ClCompile Include=\"ComEventSink.cpp\" />\n    <ClCompile Include=\"ComVariant.cpp\" />\n    <ClCompile Include=\"Connect.cpp\" />\n    <ClCompile Include=\"RibbonExtensibility.cpp\" />\n    <ClCompile Include=\"RtdManager.cpp\" />\n    <ClCompile Include=\"WorkbookScopeFunctions.cpp\" />\n    <ClCompile Include=\"XllContextInvoke.cpp\" />\n    <ClCompile Include=\"API\\Events.cpp\">\n      <Filter>API</Filter>\n    </ClCompile>\n    <ClCompile Include=\"API\\ExcelRange.cpp\">\n      <Filter>API</Filter>\n    </ClCompile>\n    <ClCompile Include=\"API\\RtdServer.cpp\">\n      <Filter>API</Filter>\n    </ClCompile>\n    <ClCompile Include=\"API\\ExcelThread.cpp\">\n      <Filter>API</Filter>\n    </ClCompile>\n    <ClCompile Include=\"CustomTaskPane.cpp\" />\n    <ClCompile Include=\"API\\ComUtils.cpp\">\n      <Filter>API</Filter>\n    </ClCompile>\n    <ClCompile Include=\"AppObjects.cpp\">\n      <Filter>API</Filter>\n    </ClCompile>\n    <ClCompile Include=\"RtdAsyncManager.cpp\" />\n    <ClCompile Include=\"ClassFactory.cpp\" />\n    <ClCompile Include=\"TaskPaneHostControl.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Filter Include=\"API\">\n      <UniqueIdentifier>{f381d3b3-32c5-430f-ace5-8dff780c44cf}</UniqueIdentifier>\n    </Filter>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-Dynamic/DynamicRegistration.cpp",
    "content": "#include <xloil/DynamicRegister.h>\n#include <xloil/ExcelObj.h>\n#include <xlOil/Register.h>\n#include <xlOil/FuncSpec.h>\n#include <xlOil/State.h>\n#include <xlOil/Log.h>\n#include <xlOil/Throw.h>\n#include <xlOil/StaticRegister.h>\n#include <xlOil-XLL/FuncRegistry.h>\n#include <xlOil-Dynamic/PEHelper.h>\n#include <xlOil-Dynamic/Thunker.h>\n#include <xlOil-Dynamic/ExternalRegionAllocator.h>\n#include <xlOil/Preprocessor.h>\n#include <xlOil/Async.h>\n\nusing std::vector;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing std::string;\nusing std::wstring;\nusing std::make_shared;\nusing namespace msxll;\nusing std::static_pointer_cast;\n\n#define XLOIL_STUB_NAME xloil_stub\n\nextern \"C\"  __declspec(dllexport) void* __stdcall XLOIL_STUB_NAME()\n{\n  return nullptr;\n}\n\nnamespace xloil\n{\n  namespace\n  {\n    constexpr char* XLOIL_STUB_NAME_STR = XLO_STR(XLOIL_STUB_NAME);\n\n    class PageUnlock\n    {\n    public:\n      PageUnlock(void* address, size_t size)\n        : _address(address)\n        , _size(size)\n      {\n        if (!VirtualProtect(address, size, PAGE_READWRITE, &_permission))\n          XLO_THROW(Helpers::writeWindowsError());\n      }\n      ~PageUnlock()\n      {\n        VirtualProtect(_address, _size, _permission, &_permission);\n      }\n    private:\n      void* _address;\n      size_t _size;\n      DWORD _permission;\n    };\n\n    class ThunkHolder\n    {\n      unique_ptr<DllExportTable> theExportTable;\n      int theFirstStub;\n\n      ThunkHolder()\n        : theExportTable(new DllExportTable((HMODULE)Environment::coreModuleHandle()))\n        , theAllocator(\n            theExportTable->imageBase(), theExportTable->maxFunctionAddress())\n      {\n        theCoreDllName = Environment::coreDllName();\n        theFirstStub = theExportTable->findOrdinal(\n          decorateCFunction(XLOIL_STUB_NAME_STR, 0).c_str());\n        if (theFirstStub < 0)\n          XLO_THROW(\"Could not find xlOil stub\");\n      }\n\n    public:\n      const wchar_t* theCoreDllName;\n      ExternalRegionAllocator theAllocator;\n\n      static ThunkHolder& get() {\n        static ThunkHolder instance;\n        return instance;\n      }\n\n      auto callBuildThunk(\n        const void* callback,\n        const void* contextData,\n        const size_t numArgs,\n        const bool hasReturnVal)\n      {\n        // TODO: cache thunks with same number of args and callback?\n        ThunkWriter writer(callback, contextData, numArgs, hasReturnVal);\n\n        auto codeBytesNeeded = writer.codeSize();\n\n        // We use a custom allocator for the thunks, which must have\n        // addresses in the range to be [imageBase, imageBase + DWORD_MAX]\n        // described in the DLL export table. Using VirtualAlloc with\n        // MEM_TOP_DOWN for some reason is not guaranteed to return\n        // addresses above imageBase.\n        auto* thunk = theAllocator.alloc((unsigned)codeBytesNeeded);\n\n        DWORD dummy;\n        if (!VirtualProtect(thunk, codeBytesNeeded, PAGE_READWRITE, &dummy))\n          XLO_THROW(Helpers::writeWindowsError());\n\n        // TODO: compact the alloc if codeBytesWritten < codeBytesNeeded?\n        auto codeBytesWritten = writer.writeCode((char*)thunk, codeBytesNeeded);\n\n        // It's good security practice to remove write permissions if we're\n        // giving execute permissions, which the thunk code clearly requires\n        if (!VirtualProtect(thunk, codeBytesNeeded, PAGE_EXECUTE_READ, &dummy))\n          XLO_THROW(Helpers::writeWindowsError());\n\n        return std::make_pair(thunk, codeBytesWritten);\n      }\n\n      /// <summary>\n      /// Locates a suitable entry point in our DLL and hooks the specifed thunk to it\n      /// </summary>\n      /// <returns>The name of the entry point selected</returns>\n      auto hookEntryPoint(const void* thunk)\n      {\n        // Hook the thunk by modifying the export address table\n        theExportTable->hook(theFirstStub, (void*)thunk);\n\n        const auto entryPoint = decorateCFunction(XLOIL_STUB_NAME_STR, 0);\n\n#ifdef _DEBUG\n        // Check the thunk is hooked to Windows' satisfaction\n        void* procNew = GetProcAddress((HMODULE)Environment::coreModuleHandle(),\n          entryPoint.c_str());\n        XLO_ASSERT(procNew == thunk);\n#endif\n\n        return entryPoint;\n      }\n    };\n  }\n\n  class RegisteredCallback : public RegisteredWorksheetFunc\n  {\n  public:\n    RegisteredCallback(\n      const shared_ptr<const DynamicSpec>& spec, \n      const void* callback,\n      const bool callbackHasReturn)\n      : RegisteredWorksheetFunc(spec)\n    {\n      auto& registry = ThunkHolder::get();\n      auto[thunk, thunkSize] = registry.callBuildThunk(\n        callback, spec->_context.get(), spec->info()->numArgs(), callbackHasReturn);\n      _thunk = thunk;\n      _thunkSize = thunkSize;\n      _registerId = doRegister();\n    }\n\n    ~RegisteredCallback()\n    {\n      ThunkHolder::get().theAllocator.free(_thunk);\n    }\n\n    int doRegister() const\n    {\n      auto& registry = ThunkHolder::get();\n\n      // Point a suitable entry point at our thunk and get its name\n      XLO_DEBUG(L\"Hooking thunk for {0}\", info()->name);\n      auto entryPoint = registry.hookEntryPoint(_thunk);\n      \n      return registerFuncRaw(info(), entryPoint.c_str(), registry.theCoreDllName);\n    }\n\n    virtual bool reregister(const std::shared_ptr<const WorksheetFuncSpec>& other) override\n    {\n      auto* thisType = dynamic_cast<const DynamicSpec*>(other.get());\n      if (!thisType)\n        return false;\n\n      auto& newInfo = other->info();\n      auto newContext = thisType->_context;\n      auto& context = spec()._context;\n\n      XLO_ASSERT(info()->name == newInfo->name);\n      if (_thunk \n        && info()->numArgs() == newInfo->numArgs() \n        && info()->options == newInfo->options)\n      {\n        const bool infoMatches = *info() == *newInfo;\n        const bool contextMatches = context == newContext;\n\n        if (!contextMatches)\n        {\n          XLO_DEBUG(L\"Patching function context for '{0}'\", newInfo->name);\n          PageUnlock unlockPage(_thunk, _thunkSize);\n          auto didPatch = patchThunkData((char*)_thunk, _thunkSize, context.get(), newContext.get());\n          if (!didPatch)\n          {\n            XLO_ERROR(L\"Failed to patch context for '{0}'\", newInfo->name);\n            return false;\n          }\n        }\n        \n        // Rewrite spec so new context and info pointers are kept alive\n        _spec = other;\n    \n        // If the FuncInfo is identical, no need to re-register\n        if (infoMatches)\n          return true;\n\n        // Otherwise do full re-registration\n        XLO_DEBUG(L\"Reregistering function '{0}'\", newInfo->name);\n        deregister();\n        _registerId = doRegister();\n        \n        return true;\n      }\n      return false;\n    }\n\n    const DynamicSpec& spec() const\n    {\n      return static_cast<const DynamicSpec&>(*_spec);\n    }\n\n  private:\n    void* _thunk;\n    size_t _thunkSize;\n  };\n\n  XLOIL_EXPORT shared_ptr<RegisteredWorksheetFunc> DynamicSpec::registerFunc() const\n  {\n    return make_shared<RegisteredCallback>(\n      static_pointer_cast<const DynamicSpec>(this->shared_from_this()), _callback, _hasReturn);\n  }\n\n  namespace\n  {\n    template<class TRet>\n    TRet invokeLambda(\n      const LambdaSpec<TRet>* data,\n      const ExcelObj** args) noexcept\n    {\n      try\n      {\n        return data->function(*data->info(), args);\n      }\n      catch (const std::exception& e)\n      {\n        if constexpr (std::is_same_v<TRet, ExcelObj*>)\n          return returnValue(e);\n        else\n        {\n          XLO_WARN(e.what());\n          if constexpr (std::is_same_v<TRet, int>)\n            return 0;\n        }\n      }\n    }\n  }\n\n  std::shared_ptr<RegisteredWorksheetFunc> LambdaSpec<ExcelObj*>::registerFunc() const\n  {\n    auto thisPtr = std::static_pointer_cast<const LambdaSpec<ExcelObj*>>(this->shared_from_this());\n    auto thatPtr = make_shared<DynamicSpec>(info(), &invokeLambda<ExcelObj*>, thisPtr);\n    return thatPtr->registerFunc();\n  }\n  std::shared_ptr<RegisteredWorksheetFunc> LambdaSpec<int>::registerFunc() const\n  {\n    auto thisPtr = std::static_pointer_cast<const LambdaSpec<int>>(this->shared_from_this());\n    auto thatPtr = make_shared<DynamicSpec>(info(), &invokeLambda<int>, thisPtr);\n    return thatPtr->registerFunc();\n  }\n  std::shared_ptr<RegisteredWorksheetFunc> LambdaSpec<void>::registerFunc() const\n  {\n    auto thisPtr = std::static_pointer_cast<const LambdaSpec<void>>(this->shared_from_this());\n    auto thatPtr = make_shared<DynamicSpec>(info(), &invokeLambda<void>, thisPtr);\n    return thatPtr->registerFunc();\n  }\n}"
  },
  {
    "path": "src/xlOil-Dynamic/ExternalRegionAllocator.h",
    "content": "#pragma once\n#include <xloil/WindowsSlim.h>\n#include <map>\n#include <set>\n#include <cassert>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Allocator which returns memory regions in a specified address range.\n  /// This is done by repeated calls to VirtualAlloc until one sticks and \n  /// the since allocator is also unoptimised so is not likely to have high\n  /// performance. It's purpose is to provide space for dynamically written \n  /// thunks, which must have addresses in the range  \n  /// [imageBase,  min(imageBase + MAXDWORD, address_max)] to be described \n  /// in the DLL export table.\n  /// \n  /// The allocator keeps its data structures external to the allocated \n  /// memory. This allows for locking the page write permissions of the\n  /// allocated memory using VirtualProtect which is good security practice\n  /// since those regions need to be executable to act as thunks.\n  /// </summary>\n  class ExternalRegionAllocator\n  {\n  private:\n    static constexpr unsigned MIN_BLOCKSIZE = 4;\n\n    struct Block\n    {\n      short offset;\n      bool operator<(const Block& that) const { return offset < that.offset; }\n    };\n    struct FreeBlock\n    {\n      char* chunk;\n      Block block;\n    };\n    class Chunk\n    {\n    private:\n      std::set<Block> _blocks;\n      short _size;\n      short _bytesUsed;\n\n    public:\n      Chunk(unsigned size) \n        : _size(short(size >> MIN_BLOCKSIZE)), _bytesUsed(0) \n      {}\n\n      void* toAddress(void* chunkStart, Block block) const\n      {\n        return (char*)chunkStart + (size_t(block.offset) << MIN_BLOCKSIZE);\n      }\n      Block appendBlock(unsigned blockSize)\n      {\n        auto[i, success] = _blocks.emplace(Block{ _bytesUsed });\n        _bytesUsed += short(blockSize >> MIN_BLOCKSIZE);\n        return *i;\n      }\n      unsigned getBlockSize(typename decltype(_blocks)::iterator i) const\n      {\n        if (i == _blocks.end())\n          return 0;\n        auto offset = i->offset;\n        if (++i == _blocks.end())\n          return 0;\n        return (i->offset - offset) << MIN_BLOCKSIZE;\n      }\n      auto findBlock(char* chunkStart, void* memPtr) const\n      {\n        auto block = Block{ (short)((char*)memPtr - chunkStart) >> MIN_BLOCKSIZE };\n        return _blocks.find(block);\n      }\n      auto splitBlock(char* chunkStart, Block block, unsigned size)\n      {\n        auto[i, success] = _blocks.emplace(Block{ short(block.offset + (size >> MIN_BLOCKSIZE)) });\n        auto blocksize = getBlockSize(i);\n        return std::make_pair(blocksize, FreeBlock{ chunkStart, short(block.offset + (size >> MIN_BLOCKSIZE)) });\n      }\n      unsigned free(unsigned size)\n      {\n        return _bytesUsed -= short(size >> MIN_BLOCKSIZE);\n      }\n      unsigned available() const { return (_size - _bytesUsed) << MIN_BLOCKSIZE; }\n      unsigned size() const { return _size << MIN_BLOCKSIZE; }\n    };\n\n\n  public:\n\n    ExternalRegionAllocator(void* minAddress, void* maxAddress = (void*)UINTPTR_MAX)\n      : _minAddress(minAddress)\n    {\n      SYSTEM_INFO si;\n      GetSystemInfo(&si);\n      _maxAddress = std::min(maxAddress, si.lpMaximumApplicationAddress);\n      _pageSize = si.dwPageSize;\n      assert(_maxAddress > _minAddress);\n      // assert pagesize is a power of 2?\n    }\n\n    ~ExternalRegionAllocator()\n    {\n      for (auto i : _chunks)\n        VirtualFree(i.first, 0, MEM_RELEASE);\n    }\n\n    auto alloc(unsigned bytesRequested)\n    {\n      bytesRequested = align(bytesRequested, 1 << MIN_BLOCKSIZE);\n      auto iCurrent = _chunks.begin();\n      if (iCurrent != _chunks.end() && iCurrent->second.available() >= bytesRequested)\n      {\n        auto newBlock = iCurrent->second.appendBlock(bytesRequested);\n        return iCurrent->second.toAddress(iCurrent->first, newBlock);\n      }\n\n      auto iFree = _freeList.lower_bound(bytesRequested);\n      if (iFree != _freeList.end())\n      {\n        auto[chunkData, chunk] = *_chunks.find(iFree->second.chunk);\n        auto* foundAddress = chunk.toAddress(chunkData, iFree->second.block);\n        if (iFree->first - bytesRequested > 1 << MIN_BLOCKSIZE)\n          _freeList.emplace(\n            chunk.splitBlock(chunkData, iFree->second.block, bytesRequested));\n        else\n          _freeList.erase(iFree);\n        return foundAddress;\n      }\n\n      auto bytesToAlloc = align(bytesRequested, _pageSize);\n      auto* allocated = _allocateChunk(bytesRequested);\n      if (!allocated)\n        throw _badAllocError;\n      _chunks.emplace(std::make_pair((char*)allocated, Chunk(bytesToAlloc)));\n      return alloc(bytesRequested);\n    }\n\n    auto free(void* memPtr)\n    {\n      auto iChunk = _chunks.lower_bound((char*)memPtr);\n      if (iChunk == _chunks.end() || iChunk->first > memPtr) \n        --iChunk;\n\n      auto [chunkData, chunk] = *iChunk;\n\n      auto iBlock = chunk.findBlock(chunkData, memPtr);\n      auto blockSize = chunk.getBlockSize(iBlock);\n\n      if (chunk.free(blockSize) == 0)\n      {\n        // Remove all from free list\n        auto chunkEnd = chunkData + chunk.size();\n        auto iFree = _freeList.begin();\n        while (iFree != _freeList.end())\n        {\n          if (iFree->second.chunk >= chunkData && iFree->second.chunk < chunkEnd)\n            iFree = _freeList.erase(iFree);\n          else\n            ++iFree;\n        }\n        _chunks.erase(iChunk);\n        VirtualFree(chunkData, 0, MEM_RELEASE);\n      }\n      else\n        _freeList.emplace(std::make_pair(blockSize, FreeBlock{ chunkData, *iBlock }));\n    }\n\n  private:\n\n    inline unsigned align(unsigned val, unsigned powerOf2)\n    {\n      const auto mask = powerOf2 - 1;\n      return val + mask & ~(mask);\n    }\n\n    /// <summary>\n    /// Searches for a page top down from maxAddress or the lowest chunk\n    /// already allocated. Returns null if a page cannot be allocated\n    /// above minAddress\n    /// </summary>\n    inline void* _allocateChunk(unsigned numBytes) const\n    {\n      void* p = nullptr;\n      for (auto address = (char*)(!_chunks.empty() ? _chunks.begin()->first : _maxAddress);\n        address > _minAddress && p == nullptr;\n        address -= _pageSize)\n          p = VirtualAlloc(address, numBytes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n      return p;\n    }\n\n  private:\n    // Map from allocated data to chunk descriptor\n    std::map<char*, Chunk> _chunks; \n    // Map from block size to block locator\n    std::multimap<unsigned, FreeBlock> _freeList; \n    void* _maxAddress;\n    void* _minAddress;\n    DWORD _pageSize;\n    std::bad_alloc _badAllocError;\n  };\n}"
  },
  {
    "path": "src/xlOil-Dynamic/LocalFunctions.cpp",
    "content": "#include \"LocalFunctions.h\"\n#include <xlOil/StaticRegister.h>\n#include <xlOil/DynamicRegister.h>\n#include <xlOil/Range.h>\n#include <xlOil/ExcelObj.h>\n#include <xlOil/ExcelCall.h>\n#include <xlOil/Log.h>\n#include <xloil/FuncSpec.h>\n#include <xlOil-COM/ComVariant.h>\n#include <xlOil-COM/WorkbookScopeFunctions.h>\n#include <xlOil-XLL/Intellisense.h>\n#include <xloil/ExcelThread.h>\n#include <oleacc.h>\n#include <map>\n\nusing std::wstring;\nusing std::map;\nusing std::shared_ptr;\nusing std::vector;\nusing std::make_shared;\nusing std::move;\n\nnamespace xloil\n{\n  // GLOBALS\n  namespace\n  {\n    // Only write/read this from the main thread\n    map<intptr_t, shared_ptr<const WorksheetFuncSpec>> theLocalFuncRegistry;\n\n    using LocalFunctionMap = std::map<std::wstring, std::shared_ptr<const LocalWorksheetFunc>>;\n\n    void unregisterLocalFuncs(LocalFunctionMap& toRemove)\n    {\n      for (auto& [k, v] : toRemove)\n        theLocalFuncRegistry.erase(v->registerId());\n    }\n\n    bool theIsExecutingLocalFunction = false;\n  }\n\n  LocalWorksheetFunc::LocalWorksheetFunc(\n    const std::shared_ptr<const WorksheetFuncSpec>& spec)\n    : _spec(spec)\n  {}\n\n  LocalWorksheetFunc::~LocalWorksheetFunc()\n  {\n  }\n\n  const std::shared_ptr<const WorksheetFuncSpec>& LocalWorksheetFunc::spec() const\n  {\n    return _spec;\n  }\n\n  const std::shared_ptr<const FuncInfo>& LocalWorksheetFunc::info() const\n  {\n    return _spec->info();\n  }\n\n  intptr_t LocalWorksheetFunc::registerId() const\n  {\n    return (intptr_t)_spec.get();\n  }\n\n  void registerLocalFuncs(\n    LocalFunctionMap& existing,\n    const wchar_t* workbookName,\n    const std::vector<std::shared_ptr<const WorksheetFuncSpec>>& funcs,\n    const wchar_t* vbaModuleName,\n    const LocalFuncs action)\n  {\n    LocalFunctionMap toRemove;\n\n    // WerRewrite the module if asked to or if the name of any new\n    // function matches any existing one (because the parameters may\n    // have changed)\n    auto rewriteVBAModule = action != LocalFuncs::APPEND_MODULE;\n\n    if (rewriteVBAModule)\n      existing.swap(toRemove);\n    \n    vector<shared_ptr<const LocalWorksheetFunc>> toRegister;\n\n    for (auto& func : funcs)\n    {\n      toRegister.push_back(make_shared<LocalWorksheetFunc>(func));\n      auto found = existing.find(func->name());\n      if (found != existing.end())\n      {\n        rewriteVBAModule = true;\n        toRemove.insert(existing.extract(found));\n      }\n    }\n\n    const auto nNewFuncs = toRegister.size();\n\n    if (rewriteVBAModule)\n    {\n      for (auto& f : existing)\n        toRegister.push_back(f.second);\n    }\n    \n    const auto iNewFuncsEnd = toRegister.begin() + nNewFuncs;\n    for (auto i = toRegister.begin(); i != iNewFuncsEnd; ++i)\n      existing.emplace(i->get()->info()->name, *i);\n\n    runExcelThread([\n        workbookName = wstring(workbookName), \n        vbaModuleName = wstring(vbaModuleName),\n        funcsToWrite= move(toRegister),\n        toRemove = move(toRemove), \n        rewriteVBAModule,\n        action\n    ]() mutable\n    {\n      if (action == LocalFuncs::CLEAR_MODULES)\n        COM::removeExistingXlOilVBA(workbookName.c_str());\n\n      unregisterLocalFuncs(toRemove);\n      COM::writeLocalFunctionsToVBA(\n        workbookName.c_str(), \n        funcsToWrite, \n        vbaModuleName.c_str(), \n        !rewriteVBAModule);\n      for (auto& f : funcsToWrite)\n        theLocalFuncRegistry.emplace(f->registerId(), f->spec());\n    });\n\n    // FuncInfo for Intellisense\n    vector<shared_ptr<const FuncInfo>> funcInfos;\n    for (auto& f : toRegister)\n      funcInfos.emplace_back(f->info());\n\n    // We send this a separate call because it requires the XLL API\n    runExcelThread([funcInfos = std::move(funcInfos)]()\n    {\n      publishIntellisenseInfo(funcInfos);\n    }, ExcelRunQueue::XLL_API | ExcelRunQueue::ENQUEUE);\n  }\n\n  void clearLocalFunctions(\n    LocalFunctionMap& existing)\n  {\n    LocalFunctionMap toRemove;\n    existing.swap(toRemove);\n    runExcelThread([toRemove = move(toRemove)]() mutable\n      {\n        unregisterLocalFuncs(toRemove);\n      });\n  }\n\n  bool isExecutingLocalFunction() \n  {\n    return theIsExecutingLocalFunction;\n  }\n}\n\nusing namespace xloil;\nint __stdcall localFunctionEntryPoint(\n  const intptr_t* funcId,\n  VARIANT* returnVal,\n  const VARIANT* args)\n{\n  // This ensures the function is exported undecorated in x86 and x64\n#pragma comment(linker, \"/EXPORT:\" __FUNCTION__\"=\" __FUNCDNAME__)\n\n  try\n  {\n    VariantClear(returnVal);\n\n   /* if (funcId->vt != VT_INT)\n      XLO_THROW(\"WorkbookName and funcName parameters must be strings\");*/\n\n    auto found = theLocalFuncRegistry.find(*funcId);\n    if (found == theLocalFuncRegistry.end())\n      XLO_THROW(\"Local funcId {0} not found\", *funcId);\n\n    auto& func = *found->second;\n\n    const auto nArgs = func.info()->numArgs();\n\n    if ((args->vt & VT_ARRAY) == 0)\n      XLO_THROW(\"Args must be an array\");\n\n    auto pArray = args->parray;\n    const auto dims = pArray->cDims;\n \n    if (dims != 1)\n      XLO_THROW(\"Expecting 1d array of variant for 'args'\");\n\n    const auto arrSize = pArray->rgsabound[0].cElements;\n    if (arrSize != nArgs)\n      XLO_THROW(\"Expecting {0} args, got {1}\", nArgs, arrSize);\n\n    const ExcelObj** xllArgPtr = nullptr;\n    vector<ExcelObj> xllArgs;\n    vector<const ExcelObj*> argPtrs;\n\n    if (arrSize > 0)\n    {\n      VARTYPE vartype;\n      SafeArrayGetVartype(pArray, &vartype);\n      if (vartype != VT_VARIANT)\n        XLO_THROW(\"Expecting an array of variant for 'args'\");\n\n      VARIANT* pData;\n      if (FAILED(SafeArrayAccessData(pArray, (void**)&pData)))\n        XLO_THROW(\"Failed accessing 'args' array\");\n\n      std::shared_ptr<SAFEARRAY> arrayFinaliser(pArray, SafeArrayUnaccessData);\n\n      xllArgs.reserve(nArgs);\n      argPtrs.reserve(nArgs);\n\n      for (auto i = 0u; i < arrSize; ++i)\n      {\n        xllArgs.emplace_back(\n          COM::variantToExcelObj(pData[i], func.info()->args[i].type & FuncArg::Range));\n        argPtrs.emplace_back(&xllArgs.back());\n      }\n\n      xllArgPtr = &argPtrs[0];\n    }\n\n    theIsExecutingLocalFunction = true;\n    auto* result = func.call(xllArgPtr);\n    theIsExecutingLocalFunction = false;\n\n    // Commands (subroutines) can return a null pointer\n    if (result)\n    {\n      COM::excelObjToVariant(returnVal, *result);\n\n      if ((result->xltype & msxll::xlbitDLLFree) != 0)\n        delete result;\n    }\n\n    return S_OK;\n  }\n  catch (const std::exception& e)\n  {\n    theIsExecutingLocalFunction = false;\n    *returnVal = COM::stringToVariant(e.what());\n    return E_FAIL;\n  }\n}\n"
  },
  {
    "path": "src/xlOil-Dynamic/LocalFunctions.h",
    "content": "#pragma once\n#include <xlOil/DynamicRegister.h>\n#include <map>\n\nnamespace xloil\n{\n  class LocalWorksheetFunc\n  {\n  public:\n    LocalWorksheetFunc(const std::shared_ptr<const WorksheetFuncSpec>& spec);\n\n    ~LocalWorksheetFunc();\n\n    intptr_t registerId() const;\n\n    const std::shared_ptr<const WorksheetFuncSpec>& spec() const;\n    const std::shared_ptr<const FuncInfo>& info() const;\n\n  private:\n    std::shared_ptr<const WorksheetFuncSpec> _spec;\n  };\n\n  /// <summary>\n  /// Action when registering local functions:\n  ///   * Append to name module if possible. Append can only take place when \n  ///     the new functions do not share names with the existing ones\n  ///   * Replace with a new VBA module, de-registering all existing local \n  ///     functions\n  ///   * Clear all xlOil local function stubs in this workbook (prefixed with\n  ///     xlOil_) before registering functions (implies Replace)\n  /// </summary>\n  enum class LocalFuncs\n  {\n    APPEND_MODULE,\n    REPLACE_MODULE,\n    CLEAR_MODULES\n  };\n\n  void registerLocalFuncs(\n    std::map<std::wstring, std::shared_ptr<const LocalWorksheetFunc>>& existing,\n    const wchar_t* workbookName,\n    const std::vector<std::shared_ptr<const WorksheetFuncSpec>>& funcs,\n    const wchar_t* vbaModuleName,\n    const LocalFuncs action);\n\n  void clearLocalFunctions(\n    std::map<std::wstring, std::shared_ptr<const LocalWorksheetFunc>>& existing);\n  \n  /// <summary>\n  /// Returns true if a local function is currently executing\n  /// </summary>\n  bool isExecutingLocalFunction();\n}"
  },
  {
    "path": "src/xlOil-Dynamic/PEHelper.cpp",
    "content": "#include \"PEHelper.h\"\n#include <cassert>\n#include <algorithm>\n\nusing xloil::Helpers::Exception;\n\nxloil::DllExportTable::DllExportTable(HMODULE hInstance)\n{\n  if (!hInstance)\n    throw std::runtime_error(\"DllExportTable: null HINSTANCE\");\n\n  // Express image as BYTE pointer as offsets in the PE format\n  // are usually in number of bytes\n  _imageBase = (BYTE*)hInstance;\n\n  auto* pDosHeader = (PIMAGE_DOS_HEADER)_imageBase;\n  if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)\n    throw Exception(\"Dll export table: fatal error - bad DOS image\");\n\n  auto* pNTHeader = (PIMAGE_NT_HEADERS)(_imageBase + pDosHeader->e_lfanew);\n  if (pNTHeader->Signature != IMAGE_NT_SIGNATURE)\n    throw Exception(\"Dll export table: fatal error - bad NT image\");\n    \n  auto optHdr = pNTHeader->OptionalHeader;\n  auto& exportEntry = optHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];\n  auto* pExportDirectory = (PIMAGE_EXPORT_DIRECTORY)(_imageBase + exportEntry.VirtualAddress);\n \n  _funcAddresses   = (DWORD*)(_imageBase + pExportDirectory->AddressOfFunctions);\n  _namesToOrdinals = (WORD* )(_imageBase + pExportDirectory->AddressOfNameOrdinals);\n  _funcNames       = (DWORD*)(_imageBase + pExportDirectory->AddressOfNames);\n\n  _numNames = pExportDirectory->NumberOfNames;\n  _numFuncs = pExportDirectory->NumberOfFunctions;\n}\n\nint xloil::DllExportTable::findOrdinal(const char* funcName)\n{\n  // The table function names is lexically ordered. We do need to \n  // to a trick with the comparison functor since the table actually\n  // contains offsets from ImageBase rather than strings\n  auto found = std::lower_bound(_funcNames, _funcNames + _numNames, 0,\n    [base = _imageBase, funcName](DWORD a, DWORD b)\n    { \n      return strcmp(\n        a > 0 ? (const char*)(base + a) : funcName,\n        b > 0 ? (const char*)(base + b) : funcName) < 0;\n    }\n  );\n  if (found != _funcNames + _numNames)\n    return (int)_namesToOrdinals[found - _funcNames];\n  return -1;\n}\n\n#pragma warning(disable: 4302 4311)\nbool xloil::DllExportTable::hook(size_t ordinal, void* hook)\n{\n  if (ordinal >= _numFuncs)\n    throw Exception(\"Function ordinal beyond export table bounds during hook\");\n  if (hook < _imageBase)\n    throw Exception(\"Hook function must be beyond ImageBase\");\n\n  auto* target = _funcAddresses + ordinal;\n\n  DWORD oldProtect;\n  if (!VirtualProtect(target, sizeof(DWORD), PAGE_READWRITE, &oldProtect)) \n    return false;\n\n  *target = DWORD((BYTE*)hook - _imageBase);\n\n  if (!VirtualProtect(target, sizeof(DWORD), oldProtect, &oldProtect)) \n    return false;\n\n  return true;\n}\n\nconst char* xloil::DllExportTable::getName(size_t ordinal) const\n{\n  for (size_t i = 0; i < _numNames; ++i)\n    if (_namesToOrdinals[i] == ordinal)\n      return (const char*)(size_t)_funcNames[i];\n  return nullptr;\n}\n\nvoid* xloil::DllExportTable::functionPointer(size_t ordinal) const\n{\n  return (void*)(_funcAddresses[ordinal] + size_t(_imageBase));\n}"
  },
  {
    "path": "src/xlOil-Dynamic/PEHelper.h",
    "content": "#pragma once\n#include <xlOilHelpers/Exception.h>\n#include <xlOil/WindowsSlim.h>\n\nnamespace xloil\n{\n  \n  /// <summary>\n  /// Manages hooking into the DLL export table\n  /// </summary>\n  class DllExportTable\n  {\n  private:\n    DWORD* _funcAddresses;\n    WORD* _namesToOrdinals;\n    DWORD* _funcNames;\n    size_t _numNames;\n    size_t _numFuncs;\n    BYTE* _imageBase;\n\n  public:\n    DllExportTable(HMODULE image);\n\n    /// <summary>\n    /// Finds a function's ordinal given its name\n    /// </summary>\n    /// <param name=\"funcName\"></param>\n    /// <returns>The ordinal or -1 if not found</returns>\n    int findOrdinal(const char* funcName);\n\n    /// <summary>\n    /// Hooks a function at the specified function ordinal, that is, points the the \n    /// export table entry for that function to the hook address. It does not change\n    /// the exported function name. The hook function address must be greater than \n    /// the DLL's imagebase.\n    /// </summary>\n    /// <param name=\"offset\"></param>\n    /// <param name=\"hook\"></param>\n    /// <returns>true if hook succeeded, else false</returns>\n    bool hook(size_t ordinal, void* hook);\n\n    /// <summary>\n    /// Returns the exported function name given an ordinal or null pointer if the \n    /// ordinal is out of range or not exported by name\n    /// </summary>\n    const char* getName(size_t ordinal) const;\n\n    /// <summary>\n    /// Returns a pointer to an exported function given its ordinal\n    /// </summary>\n    /// <param name=\"ordinal\"></param>\n    /// <returns></returns>\n    void* functionPointer(size_t ordinal) const;\n    /// <summary>\n    /// Address of imageBase i.e. the start of our executable in memory\n    /// </summary>\n    /// <returns></returns>\n    void* imageBase() const { return _imageBase; }\n\n    /// <summary>\n    /// The highest possible address of a function in the export table\n    /// </summary>\n    /// <returns></returns>\n    void* maxFunctionAddress() const \n    { \n#ifdef _WIN64\n      return (BYTE*)_imageBase + MAXDWORD; \n#else\n      return (void*)MAXDWORD;\n#endif\n    }\n  };\n\n\n  // With Win32 function C function names are decorated. It no longer \n  // seemed like a good idea with x64.\n  inline std::string \n    decorateCFunction(const char* name, const size_t numPtrArgs)\n  {\n#ifdef _WIN64\n    (void)numPtrArgs;\n    return std::string(name);\n#else\n    return formatStr(\"_%s@%d\", name, sizeof(void*) * numPtrArgs);\n#endif // _WIN64\n  }\n}"
  },
  {
    "path": "src/xlOil-Dynamic/Thunker.cpp",
    "content": "#include \"Thunker.h\"\n#include <xlOil/Register.h>\n#include <xlOilHelpers/Exception.h>\n#include <xlOil/Log.h>\n\n// See asmjit/core/build.h\n#define ASMJIT_STATIC\n#define ASMJIT_NO_LOGGING\n#define ASMJIT_NO_VALIDATION\n#define ASMJIT_NO_JIT\n\n// We could also define NO_BUILDER, NO_COMPILER and NO_INTROSPECTION for x64\n// but it only saves 3kb in the compiled binary as they are optimised away\n\n#include <asmjit/src/asmjit/asmjit.h>\n#include <string>\n#include <algorithm>\nusing std::string;\nusing xloil::Helpers::Exception;\nusing std::unique_ptr;\nusing namespace asmjit;\n\nclass xloper12;\n\nnamespace xloil {\n  class ExcelObj;\n}\n\nnamespace\n{\n  /// <summary>\n  /// We create the asmjit::CodeInfo object ourselves rather than rely on the\n  /// JitRuntime object as this saves about 10kb of optimised binary\n  /// </summary>\n  /// <returns></returns>\n  auto createCodeInfo()\n  {\n    using namespace asmjit;\n    CodeInfo info;\n    info._archInfo = CpuInfo::host().archInfo();\n#ifdef _WIN64\n    info._stackAlignment = 16;\n#else\n    info._stackAlignment = uint8_t(sizeof(uintptr_t));\n#endif\n    info._cdeclCallConv = CallConv::kIdHostCDecl;\n    info._stdCallConv = CallConv::kIdHostStdCall;\n    info._fastCallConv = CallConv::kIdHostFastCall;\n    return info;\n  }\n\n  static asmjit::CodeInfo theCodeInfo = createCodeInfo();\n\n \n\n  // This is jitRuntime.add() but with in-place allocation\n  Error asmJitWriteCode(uint8_t* dst, CodeHolder* code, size_t& codeSize) noexcept\n  {\n    ASMJIT_PROPAGATE(code->flatten());\n    ASMJIT_PROPAGATE(code->resolveUnresolvedLinks());\n\n    size_t estimatedCodeSize = code->codeSize();\n    if (estimatedCodeSize == 0)\n      return DebugUtils::errored(kErrorNoCodeGenerated);\n\n    // Relocate the code.\n    Error err = code->relocateToBase(uintptr_t((void*)dst));\n    if (err)\n      return err;\n\n    // Recalculate the final code size and shrink the memory we allocated for it\n    // in case that some relocations didn't require records in an address table.\n    codeSize = code->codeSize();\n\n    for (Section* section : code->_sections) {\n      size_t offset = size_t(section->offset());\n      size_t bufferSize = size_t(section->bufferSize());\n      size_t virtualSize = size_t(section->virtualSize());\n\n      ASMJIT_ASSERT(offset + bufferSize <= codeSize);\n      memcpy(dst + offset, section->data(), bufferSize);\n\n      if (virtualSize > bufferSize) {\n        ASMJIT_ASSERT(offset + virtualSize <= codeSize);\n        memset(dst + offset + bufferSize, 0, virtualSize - bufferSize);\n      }\n    }\n\n    return kErrorOk;\n  }\n}\n\nnamespace xloil\n{\n  // Saves 80kb in the release build vs using full asmjit and removes 16 arg limit\n  void handRoll64(CodeHolder* code,\n    void* callback,\n    const void* data,\n    size_t numArgs,\n    bool /*hasReturnVal*/)\n  {\n    asmjit::x86::Assembler asmb(code);\n\n    XLO_DEBUG(\"Building thunk with {0} arguments\", numArgs);\n\n    CallConv cc;\n    cc.init(CallConv::kIdHostStdCall);\n\n    // The frame emits the correct function prolog & epilog.  Much of the below\n    // is copied from asmjit's FuncSignature initialisation, but without the 16\n    // arg limit\n    FuncFrame frame;\n\n    frame.reset();\n\n    frame._archId = uint8_t(cc.archId());\n    frame._spRegId = x86::Gp::kIdSp;\n    frame._saRegId = x86::Gp::kIdBad;\n\n    const auto naturalStackAlignment = cc.naturalStackAlignment();\n    auto minDynamicAlignment = Support::max<uint32_t>(naturalStackAlignment, 16);\n\n    if (minDynamicAlignment == naturalStackAlignment)\n      minDynamicAlignment <<= 1;\n\n    frame._naturalStackAlignment = uint8_t(naturalStackAlignment);\n    frame._minDynamicAlignment = uint8_t(minDynamicAlignment);\n    frame._redZoneSize = uint8_t(cc.redZoneSize());\n    frame._spillZoneSize = uint8_t(cc.spillZoneSize());\n    frame._finalStackAlignment = frame._naturalStackAlignment;\n\n    // Masks of dirty and preserved registers. Not actually used as we only \n    // use volatile reg is the asm below.\n    //   frame._preservedRegs[x86::Reg::kGroupGp] = cc.preservedRegs(x86::Reg::kGroupGp);\n    // Exclude ESP/RSP - this register is never included in saved GP regs.\n    //   frame._preservedRegs[BaseReg::kGroupGp] &= ~Support::bitMask(x86::Gp::kIdSp);\n\n    // We will need some local stack to create the array of xloper* which \n    // is sent to the callback\n    constexpr auto ptrSize = sizeof(void*);\n    const auto stackSize = numArgs * ptrSize;\n    frame.setLocalStackSize((uint32_t)stackSize);\n\n    // Need to allocate some spill zone for the call to the callback\n    frame.updateCallStackSize(cc.spillZoneSize()); \n\n    frame.finalize();\n\n    // Note we do not preserve the frame pointer as there is litte benefit\n    // in debugging the thunk\n    asmb.emitProlog(frame);\n    \n    // See the help for FuncFrame to understand why these stack offsets work.\n    // There doesn't seem to be a clean way of getting to the first stack argument\n    // without manually skipping the spill zone\n    x86::Mem localStack(x86::rsp, frame.localStackOffset());\n    x86::Mem stackArgs(x86::rsp, frame.saOffsetFromSP() + frame.spillZoneSize());\n\n    const auto startArg = 0;\n    \n    // Under x64 Microsoft calling convention the args will be in rcx, rdx, r8, r9\n    // with the remainder on the stack. \n    // We copy each of the 4 register arguments to an array in our stack, then copy\n    // the remaining stack arguments from earlier in the stack via rax. (rax is \n    // considered volatile so we can clobber it)\n    for (size_t i = startArg; i < numArgs; ++i)\n    {\n      const auto offset = (ptrSize * (i - (uint32_t)startArg));\n      auto stackPos = localStack.cloneAdjusted(offset);\n      // TODO: this would be nicer as a cascading switch, but it won't write faster code!\n      switch (i + 1)\n      {\n      case 1:\n        asmb.mov(stackPos, x86::rcx); break;\n      case 2:\n        asmb.mov(stackPos, x86::rdx); break;\n      case 3:\n        asmb.mov(stackPos, x86::r8); break;\n      case 4:\n        asmb.mov(stackPos, x86::r9); break;\n      default:\n        asmb.mov(x86::rax, stackArgs.cloneAdjusted((i - 4) * ptrSize));\n        asmb.mov(stackPos, x86::rax);\n      }\n    }\n\n    // Setup arguments for callback\n    asmb.lea(x86::rdx, localStack);\n    asmb.mov(x86::rcx, imm(data));\n\n    asmb.call(imm((void*)callback));\n\n    // We don't care whether the callback returns an (an xloper*) or not\n    // we just don't touch anthing and return to the caller\n    asmb.emitEpilog(frame);\n  }\n\n  void createArrayOfArgsOnStack(\n    asmjit::x86::Compiler& cc, x86::Mem& stackPtr, size_t startArg, size_t endArg)\n  {\n    const size_t numArgs = endArg - startArg;\n    if (numArgs == 0)\n      return;\n\n    constexpr auto ptrSize = (int32_t)sizeof(void*);\n\n    // Get some space on the stack\n    stackPtr = cc.newStack((unsigned)numArgs * ptrSize, alignof(void*));\n\n    // Copy function arguments to array on the stack\n    for (auto i = (int32_t)startArg; i < (int32_t)endArg; i++)\n    {\n      const auto offset = (ptrSize * (i - (uint32_t)startArg));\n      x86::Mem stackPos = stackPtr.cloneAdjusted(offset);\n      x86::Gp arg = cc.newUIntPtr(\"arg\");\n      cc.setArg(i, arg);\n      cc.mov(stackPos, arg);\n    }\n  }\n\n  void writeFunctionBody(\n    asmjit::x86::Compiler& cc,\n    const void* callback,\n    const void* data,\n    size_t numArgs,\n    bool retVal)\n  {\n    // Take args passed to thunk and put them into an array on the stack\n    // This should give us an xloper12** which we load into argsPtr\n    x86::Mem argsPtr;\n    createArrayOfArgsOnStack(cc, argsPtr, 0, numArgs);\n    \n    x86::Gp args = cc.newUIntPtr(\"arg2\");\n    cc.lea(args, argsPtr);\n\n    // Setup the signature to call the target callback, this is not a stdcall\n    // that was only required for the call from Excel to xlOil\n    auto sig = FuncSignatureT<void, const void*, const ExcelObj**>(CallConv::kIdHost);\n    if (retVal)\n      sig._ret = Type::IdOfT<ExcelObj*>::kTypeId;\n\n    FuncCallNode* call(cc.call(imm(callback), sig));\n\n    call->setArg(0, imm(data));\n    call->setArg(1, args);\n\n    if (retVal)\n    {\n      // Allocate a register for the return value, in fact \n      // this is a no-op as we just return the callback value\n      x86::Gp ret = cc.newUIntPtr(\"ret\");\n\n      call->setRet(0, ret);\n\n      // Pass callback return as our return\n      cc.ret(ret);\n    }\n  }\n\n  void buildThunk(\n    const void* callback,\n    const void* data,\n    const size_t numArgs,\n    const bool hasReturnVal,\n    asmjit::CodeHolder& codeHolder)\n  {\n    using namespace asmjit;\n\n    XLO_DEBUG(\"Building thunk with {0} arguments\", numArgs);\n\n    // Initialise JIT compiler\n    x86::Compiler cc(&codeHolder);\n\n    // Begin code\n\n    // Declare thunk function signature: need stdcall for Excel functions.\n    // We assume all arguments are xloper12*.\n    auto ptrType = Type::IdOfT<xloper12*>::kTypeId;\n    FuncSignatureBuilder signature(CallConv::kIdHostStdCall);\n    for (size_t i = 0; i < numArgs; i++)\n      signature.addArg(ptrType);\n\n    // Normal callbacks should return, async ones will not, so set return\n    // type appropriately.\n    signature.setRet(hasReturnVal ? ptrType : Type::kIdVoid);\n\n    cc.addFunc(signature);\n\n    // Write the appropriate function body for the callback type\n    writeFunctionBody(cc, callback, data, numArgs, hasReturnVal);\n\n    cc.endFunc();\n\n    auto err = cc.finalize();\n    if (err)\n      throw Exception(\"Thunk compilation failed: %s\", DebugUtils::errorAsString(err));\n  }\n\n   ThunkWriter::ThunkWriter(\n    const void* callback,\n    const void* contextData,\n    const size_t numArgs,\n    const bool hasReturnVal,\n    ThunkWriter::SlowBuild)\n  {\n    _holder = new CodeHolder();\n    _holder->init(theCodeInfo);\n    buildThunk(callback, contextData, numArgs, hasReturnVal, *_holder);\n  }\n\n  ThunkWriter::ThunkWriter(\n    const void* callback,\n    const void* contextData,\n    const size_t numArgs,\n    const bool hasReturnVal)\n  {\n    _holder = new CodeHolder();\n    _holder->init(theCodeInfo);\n#if _WIN64\n    handRoll64(_holder, (void*)callback, contextData, numArgs, hasReturnVal);\n#else\n    if (numArgs > 16)\n      throw Exception(\"In Win32 builds, there is a limit of 16 args for non-local UDFs. Raise a github issue if this is a problem!\");\n    buildThunk(callback, contextData, numArgs, hasReturnVal, *_holder);\n#endif\n  }\n\n  ThunkWriter::~ThunkWriter()\n  {\n    delete _holder;\n  }\n  size_t ThunkWriter::codeSize() const\n  {\n    return _holder->codeSize();\n  }\n  size_t ThunkWriter::writeCode(char* buffer, size_t bufferSize)\n  {\n    if (!buffer || _holder->codeSize() > bufferSize)\n      throw Exception(\"Cannot write thunk: no buffer or buffer too small\");\n\n    size_t codeSize;\n    auto err = asmJitWriteCode((uint8_t*)buffer, _holder, codeSize);\n    if (err != kErrorOk)\n      throw Exception(\"Thunk write failed: %s\", DebugUtils::errorAsString(err));\n\n    return codeSize;\n  }\n\n\n  bool patchThunkData(char* thunk, size_t thunkSize, const void* fromData, const void* toData) noexcept\n  {\n    if (fromData == toData)\n      return true;\n\n    char bufferBefore[10], bufferAfter[10];\n    auto bufsize = sizeof(bufferBefore);\n\n    {\n      CodeHolder code;\n      code.init(theCodeInfo);\n      x86::Assembler as(&code);\n#ifdef _WIN64\n      as.mov(x86::rcx, imm(fromData));\n#else\n      // the size of the opcode, 4, is required for asmjit\n      as.mov(as.ptr_zsp(0, 4), imm(fromData)); \n#endif\n      if (kErrorOk != asmJitWriteCode((uint8_t*)bufferBefore, &code, bufsize))\n        return false;\n    }\n\n    auto found = std::search(thunk, thunk + thunkSize, \n      bufferBefore, bufferBefore + bufsize);\n    if (found == thunk + thunkSize)\n      return false;\n\n    // Do not change bufsize to ensure we  only write the same amount of code\n    {\n      CodeHolder code;\n      code.init(theCodeInfo);\n      x86::Assembler as(&code);\n#ifdef _WIN64\n      as.mov(x86::rcx, imm(toData));\n#else\n      as.mov(as.ptr_zsp(0, 4), imm(toData));\n#endif\n      if (kErrorOk != asmJitWriteCode((uint8_t*)bufferAfter, &code, bufsize))\n        return false;\n    }\n\n    memcpy(found, bufferAfter, bufsize);\n\n    return true;\n  }\n}"
  },
  {
    "path": "src/xlOil-Dynamic/Thunker.h",
    "content": "#pragma once\n\nnamespace asmjit { class CodeHolder; }\nnamespace xloil\n{\n  /// <summary>\n  /// Builds a thunk like the following\n  ///   xloper12* func(xloper12* arg1, xloper12* arg2, ...)\n  ///   {\n  ///     xloper12* args[numArgs];\n  ///     args[0] = arg1; args[1] = arg2; ...\n  ///     return callback(contextData, args);\n  ///   }\n  /// \n  /// Or for async functions:\n  ///   xloper12* func(xloper12* handle, xloper12* arg1, xloper12* arg2, ...)\n  ///   {\n  ///     xloper12* args[numArgs];\n  ///     args[0] = arg1; args[1] = arg2; ...\n  ///     asyncCallback(contextData, handle, args);\n  ///   }\n  /// \n  /// In x86_64 assembly, this looks like:\n  ///   sub         rsp,38h  \n  ///   mov         qword ptr[rsp + 20h], rcx\n  ///   mov         qword ptr[rsp + 28h], rdx\n  ///   mov         qword ptr[rsp + 30h], r8\n  ///   mov         rcx, 23250C10570h\n  ///   lea         rdx, [rsp + 20h]\n  ///   call        xloil::callback(07FFD47DAA89Ch)\n  ///   add         rsp, 38h\n  ///   ret\n  /// \n  /// In x86 it will be like:\n  ///   sub         esp,0Ch  \n  ///   mov         eax,dword ptr [esp+10h]  \n  ///   mov         dword ptr [esp+8],eax  \n  ///   lea         eax,[esp+8]  \n  ///   mov         dword ptr [esp],1C565A70h  \n  ///   mov         dword ptr [esp+4],eax  \n  ///   call        xloil::callback(210FF8E9h)\n  ///   add         esp,0Ch  \n  ///   ret         4  \n  /// </summary>\n  class ThunkWriter\n  {\n  public:\n    /// <summary>\n    /// In x64, a hand optimised version of buildThunk is used which runs faster\n    /// and reduces  final binary size by ~80kb by avoiding the use of asmjit's \n    /// compiler. The resulting ASM code is faster by avoiding spills, \n    /// particuarly for async functions and when number of args exceeds 5.\n    /// This can be disabled with the SLOW_BUILD parameter\n    /// </summary>\n    /// <param name=\"callback\"></param>\n    /// <param name=\"contextData\"></param>\n    /// <param name=\"numArgs\"></param>\n    /// <param name=\"hasReturnVal\"></param>\n    ThunkWriter(\n      const void* callback,\n      const void* contextData,\n      const size_t numArgs,\n      const bool hasReturnVal);\n\n    enum SlowBuild {SLOW_BUILD};\n    ThunkWriter(\n      const void* callback,\n      const void* contextData,\n      const size_t numArgs,\n      const bool hasReturnVal,\n      SlowBuild);\n\n    ~ThunkWriter();\n    /// <summary>\n    /// Writes code to provided buffer, returning number of bytes written.\n    /// If <param ref=\"buffer\"> is null, returns size of buffer required.\n    /// </summary>\n    /// <param name=\"buffer\"></param>\n    /// <param name=\"bufSize\"></param>\n    /// <returns></returns>\n    size_t writeCode(char* buffer, size_t bufSize);\n    size_t codeSize() const;\n    asmjit::CodeHolder* _holder;\n\n  private:\n    ThunkWriter(ThunkWriter&) = delete;\n  };\n  \n  /// <summary>\n  /// Patches the context data object in a given thunk to a new location.\n  /// <see ref=\"ThunkWriter\">\n  /// </summary>\n  bool patchThunkData(\n    char* thunk,\n    size_t thunkSize,\n    const void* fromData,\n    const void* toData) noexcept;\n}"
  },
  {
    "path": "src/xlOil-Dynamic/xlOil-Dynamic.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"DebugStatic|Win32\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"DebugStatic|x64\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|Win32\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|x64\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}</ProjectGuid>\n    <RootNamespace>xlOil.COM</RootNamespace>\n    <ProjectName>xlOil-Dynamic</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='DebugStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <MultiProcessorCompilation>false</MultiProcessorCompilation>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Release'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"DynamicRegistration.cpp\" />\n    <ClCompile Include=\"LocalFunctions.cpp\" />\n    <ClCompile Include=\"PEHelper.cpp\" />\n    <ClCompile Include=\"Thunker.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"LocalFunctions.h\" />\n    <ClInclude Include=\"PEHelper.h\" />\n    <ClInclude Include=\"SimpleAllocator.h\" />\n    <ClInclude Include=\"Thunker.h\" />\n    <ClInclude Include=\"ExternalRegionAllocator.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-Dynamic/xlOil-Dynamic.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"DynamicRegistration.cpp\" />\n    <ClCompile Include=\"LocalFunctions.cpp\" />\n    <ClCompile Include=\"PEHelper.cpp\" />\n    <ClCompile Include=\"Thunker.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"LocalFunctions.h\" />\n    <ClInclude Include=\"PEHelper.h\" />\n    <ClInclude Include=\"Thunker.h\" />\n    <ClInclude Include=\"SimpleAllocator.h\" />\n    <ClInclude Include=\"ExternalRegionAllocator.h\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-Funcs/ExcelObjCache.cpp",
    "content": "#include <xloil/ExcelObjCache.h>\n#include <xloil/ObjectCache.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/StaticRegister.h>\n\nnamespace xloil\n{\n  namespace\n  {\n    using Factory = ObjectCacheFactory<std::unique_ptr<const ExcelObj>>;\n    Factory::cache_type cache(Factory::cache());\n  }\n}\n\nusing namespace xloil;\n\nXLO_FUNC_START(\n  xloRef(const ExcelObj& pxOper)\n)\n{\n  return returnValue(makeCached<ExcelObj>(pxOper));\n}\nXLO_FUNC_END(xloRef).threadsafe()\n  .help(L\"Adds the specified value or range or array to the object cache and \"\n         \"returns a string reference\")\n  .arg(L\"ValOrArray\", L\"Data to be stored\");\n\n\nXLO_FUNC_START(\n  xloVal(const ExcelObj& pxOper)\n)\n{\n  // We return a pointer to the stored object directly without setting\n  // the flag which tells Excel to free it.\n  auto result = getCached<ExcelObj>(pxOper.asStringView());\n  if (result)\n    return returnReference(*result);\n  return returnValue(CellError::Value);\n}\nXLO_FUNC_END(xloVal).threadsafe()\n  .help(L\"Given a string reference, returns a stored array or value. Cached values \"\n         \"are not saved so will need to be recreated by a full recalc (Ctrl-Alt-F9) \"\n         \"on workbook open\")\n  .arg(L\"CacheRef\", L\"Cache reference string\");\n\n"
  },
  {
    "path": "src/xlOil-Funcs/xlOil-Funcs.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"DebugStatic|Win32\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"DebugStatic|x64\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|Win32\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|x64\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{A310C8C5-CE14-4DD3-8A0D-61491741558A}</ProjectGuid>\n    <RootNamespace>xlOil</RootNamespace>\n    <ProjectName>xlOil-Funcs</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='DebugStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Release'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"ExcelObjCache.cpp\" />\n    <ClCompile Include=\"xloHelp.cpp\" />\n    <ClCompile Include=\"xloLog.cpp\" />\n    <ClCompile Include=\"xloVersion.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-Funcs/xlOil-Funcs.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"ExcelObjCache.cpp\" />\n    <ClCompile Include=\"xloHelp.cpp\" />\n    <ClCompile Include=\"xloLog.cpp\" />\n    <ClCompile Include=\"xloVersion.cpp\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-Funcs/xloHelp.cpp",
    "content": "\n#include <xloil/StaticRegister.h>\n#include <xloil-xll/FuncRegistry.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/Throw.h>\nnamespace xloil\n{\n  XLO_FUNC_START(xloHelp(\n    const ExcelObj& function\n  ))\n  {\n    const auto funcName = function.get<std::wstring_view>();\n    // Why does wstring_view not work with find?\n    const auto found = registeredFuncsByName().find(std::wstring(funcName));\n    if (found == registeredFuncsByName().end())\n      XLO_THROW(L\"Function '{0}' not found\", funcName);\n    const auto func = found->second;\n    const auto info = func->info();\n\n    size_t stringLen = info->name.size() + info->help.size();\n    const auto& args = info->args;\n    const auto nArgs = args.size();\n    for (auto& arg : args)\n      stringLen += arg.name.size() + arg.help.size();\n    \n    ExcelArrayBuilder builder(1 + (ExcelObj::row_t)nArgs, 2, stringLen);\n    builder(0, 0) = info->name;\n    builder(0, 1) = info->help;\n    for (auto i = 0u; i < nArgs; ++i)\n    {\n      builder(1 + i, 0) = args[i].name;\n      builder(1 + i, 1) = args[i].help;\n    }\n\n    return returnValue(builder.toExcelObj());\n  }\n  XLO_FUNC_END(xloHelp).threadsafe()\n    .help(L\"Give help on an function as 2-column array. \"\n      \"First row is the function name and help string. Subsequent rows are \"\n      \"argument names and their descriptions\")\n    .arg(L\"function\", L\"Name of xloil registered function\");\n}"
  },
  {
    "path": "src/xlOil-Funcs/xloLog.cpp",
    "content": "#include <xloil/StaticRegister.h>\n#include <xloil/Preprocessor.h>\n#include <xloil/Log.h>\n#include <xloil/LogWindow.h>\n#include <xloil-XLL/LogWindowSink.h>\n#include <spdlog/sinks/basic_file_sink.h>\n#include <spdlog/sinks/rotating_file_sink.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START(xloLog(\n    const ExcelObj& showWindow\n  ))\n  {\n    spdlog::default_logger()->flush();\n\n    if (showWindow.get<bool>(false))\n      openLogWindow();\n    // TODO: better to add the log file name to the addin context?\n    // TODO: this only returns the main log file path - each addin context could have one\n    for (auto& sink : spdlog::default_logger()->sinks())\n    {\n      \n      if (auto p = dynamic_cast<spdlog::sinks::basic_file_sink_mt*>(sink.get()))\n        return returnValue(p->filename());\n      else if (auto q = dynamic_cast<spdlog::sinks::rotating_file_sink_mt*>(sink.get()))\n        return returnValue(q->filename());\n    }\n    return returnValue(CellError::NA);\n  }\n  XLO_FUNC_END(xloLog).threadsafe()\n    .help(L\"Flushes the log to file and returns the path of the main log file\")\n    .arg(L\"ShowWindow\", L\"Opens the log window if True\");\n}"
  },
  {
    "path": "src/xlOil-Funcs/xloReload.cpp",
    "content": "#include <xloil-xll/FuncRegistry.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/Loaders/PluginLoader.h>\n\n// See dodgy issues here: https://bugs.python.org/issue34309\n\nnamespace xloil\n{\n  bool reloadPlugin(const wchar_t* pluginName) noexcept\n  {\n    auto& loadedPlugins = getLoadedPlugins();\n    auto found = loadedPlugins.find(pluginName);\n    if (found == loadedPlugins.end())\n      return false;\n\n    XLO_INFO(L\"Reloading plugin {}\", pluginName);\n\n    auto[name, plugin] = *found;\n\n    rtdAsyncManagerClear();\n    unloadPluginImpl(name.c_str(), plugin);\n    loadedPlugins.erase(found);\n\n\n    vector<wstring> names = { name };\n    loadPlugins(plugin.Context, names);\n    return true;\n  }\n\n  XLO_FUNC_START(xloReload(\n    const ExcelObj& plugin\n  ))\n  {\n    const auto pluginName = plugin.toString();\n    return returnValue(reloadPlugin(pluginName.c_str()));\n  }\n  XLO_FUNC_END(xloReload).threadsafe()\n    .help(L\"Reloads a plugin\")\n    .arg(L\"function\", L\"Name of plugin\");\n}"
  },
  {
    "path": "src/xlOil-Funcs/xloVersion.cpp",
    "content": "\n#include <xloil/StaticRegister.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/Preprocessor.h>\n#include <xloil/Version.h>\n#include <boost/preprocessor/seq/cat.hpp>\n\nnamespace xloil\n{\n  XLO_FUNC_START(xloVersion())\n  {\n    constexpr wchar_t* version = XLOIL_VERSION_STR;\n\n    constexpr wchar_t* info[2][2] = { \n      { L\"Version\", version },\n      { L\"BuildDate\", XLO_WSTR(__DATE__) } \n    };\n\n    size_t stringLen = 0;\n    for (auto i = 0; i < _countof(info); ++i)\n      for (auto j = 0; j < _countof(info[i]); ++j)\n        stringLen += wcslen(info[i][j]);\n      \n    ExcelArrayBuilder builder(2, 2, stringLen);\n    for (auto i = 0; i < _countof(info); ++i)\n      for (auto j = 0; j < _countof(info[i]); ++j)\n        builder(i, j) = info[i][j];\n\n    return returnValue(builder.toExcelObj());\n  }\n  XLO_FUNC_END(xloVersion).threadsafe()\n    .help(L\"Version info\");\n}"
  },
  {
    "path": "src/xlOil-Loader/LoaderEntryPoint.cpp",
    "content": "#include <xloilHelpers/Environment.h>\n#include <xloilHelpers/Settings.h>\n#include <xlOil/XlCallSlim.h>\n#include <xlOil/Loaders/CoreEntryPoint.h>\n#include <xlOil/ExportMacro.h>\n#include <xlOil/ExcelCall.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil/Events.h>\n#include <xlOil/LogWindow.h>\n#include <xloil/XllEntryPoint.h>\n#define TOML_ABI_NAMESPACES 0\n#include <toml++/toml.h>\n#include <filesystem>\n#define DELAYIMP_INSECURE_WRITABLE_HOOKS\n#include <delayimp.h>\n#include <fstream>\n#include <sstream>\n#include <string>\n\nnamespace fs = std::filesystem;\n\nusing std::string;\nusing std::wstring;\nusing namespace xloil;\nusing std::vector;\nusing std::shared_ptr;\nusing namespace std::string_literals;\n\nnamespace\n{\n  // Name of core dll. Not sure if there's an automatic way to get this\n  // maybe some build env vars?\n  constexpr wchar_t* const xloil_dll = L\"xlOil.dll\";\n  constexpr char* const xloil_dll_c = \"xlOil.dll\";\n\n  void writeToStartUpLog(const char* msg, bool openWindow=false) noexcept\n  {\n    OutputDebugStringA(msg);\n    try\n    {\n      loadFailureLogWindow(XllInfo::dllHandle, utf8ToUtf16(msg), openWindow);\n    }\n    catch (...) {}\n  }\n}\n\n/// <summary>\n/// Hook for delay load failures so we an return a sensible error\n/// if xlOil.dll is not found\n/// </summary>\nFARPROC WINAPI delayLoadFailureHook(unsigned dliNotify, DelayLoadInfo* pdli) noexcept\n{\n  char msg[512];\n  int result;\n\n  if (dliNotify == dliFailGetProc)\n    result = sprintf_s(msg, sizeof(msg), \"Unable to find procedure: %s in %s\", pdli->dlp.szProcName, pdli->szDll);\n  else\n    result = sprintf_s(msg, sizeof(msg), \"Unable to load library: %s\", pdli->szDll);\n\n  if (result > 0)\n    writeToStartUpLog(msg);\n\n  return nullptr;\n}\n\nextern \"C\" PfnDliHook __pfnDliFailureHook2 = nullptr;\n\nnamespace\n{\n  void loadEnvironmentBlock(const toml::table& settings)\n  {\n    auto environment = Settings::environmentVariables(settings[XLOIL_SETTINGS_ADDIN_SECTION]);\n\n    for (auto&[key, val] : environment)\n    {\n      auto value = expandWindowsRegistryStrings(\n        expandEnvironmentStrings(val));\n\n      SetEnvironmentVariable(key.c_str(), value.c_str());\n    }\n  }\n\n  auto findAllCoreDllImports() noexcept\n  {\n    // If the delay load fails, it will throw a SEH exception, so we must use\n    // __try/__except to avoid this crashing Excel.\n    auto previousHook = __pfnDliFailureHook2;\n    auto found = true;\n    __pfnDliFailureHook2 = &delayLoadFailureHook;\n    __try\n    {\n      __HrLoadAllImportsForDll(xloil_dll_c); // This is CASE SENSITIVE!\n    }\n    __except (EXCEPTION_EXECUTE_HANDLER)\n    {\n      // TODO: add GetExceptionCode() info, without using string\n      found = false;\n    }\n    __pfnDliFailureHook2 = previousHook;\n    return found;\n  }\n}\n\nstruct xlOilCoreAddin\n{\n  std::vector<std::shared_ptr<const RegisteredWorksheetFunc>> theFunctions;\n  std::vector<std::string> _loadingMessages;\n\n  template<class...Args>\n  void log(const char* fmt, Args...args)\n  {\n    _loadingMessages.emplace_back(formatStr(fmt, std::forward<Args>(args)...));\n  }\n\n  void autoOpen()\n  {\n    try\n    {\n      using XllInfo::xllPath;\n\n      std::unique_ptr<PushDllDirectory> setDllDir;\n\n      // First we try to load a settings file to see if it tells us\n      // to run a startup trace\n      const auto settings = findSettingsFile(xllPath.c_str());\n      \n      std::error_code fsErr;\n      if (settings)\n        log(\"Found ini file at '%s'\", settings->source().path->c_str());\n\n      // Next we need to find xloil.dll. The strategy is\n      //   1. Is it already loaded?\n      //   2. Is it in the same directory as the XLL? Then use SetDllDirectory\n      //   3. Apply any environment variables (in particular PATH) which\n      //      are specifed in the ini file\n      //   4. Look for xloil.ini and apply those env vars as well\n      // Hope the above has setup the environment in the right way!\n      const auto ourXllDir = fs::path(xllPath).remove_filename();\n      if (GetModuleHandle(xloil_dll) != 0) // Is it already loaded?\n      {\n        _loadingMessages.emplace_back(\"xlOil.dll already loaded\");\n      }\n      else if (fs::exists(ourXllDir / xloil_dll, fsErr)) // Check same directory as XLL\n      {\n        log(\"Found xlOil.dll in xll directory. Calling SetDllDirectory('%s')\",\n            ourXllDir.string().c_str());\n        setDllDir.reset(new PushDllDirectory(ourXllDir.c_str()));\n      }\n      else\n      {\n        // Load the environment block from our settings file (if it exists)\n        if (settings)\n          loadEnvironmentBlock(*settings);\n\n        // If we aren't xloil.xll (where we would already have loaded xloil.ini)\n        // look for xloil.ini and see if it contains an enviroment block\n        if (_wcsicmp(fs::path(xllPath).filename().c_str(), L\"xloil.xll\") != 0)\n        {\n          auto coreSettings = findSettingsFile(\n            fs::path(xllPath).replace_filename(xloil_dll).c_str());\n          if (coreSettings)\n          {\n            log(\"Found xloil.ini at '%s'\", coreSettings->source().path->c_str());\n            loadEnvironmentBlock(*coreSettings);\n          }\n        }\n      }\n\n      log(\"Environment PATH=%s\", getEnvironmentVar(\"PATH\").c_str());\n    \n      if (!findAllCoreDllImports())\n        throw std::runtime_error(\"Failed to load xlOil.dll, check XLOIL_PATH in ini file\");\n\n      auto ret = xloil::coreAutoOpenHandler(XllInfo::xllPath.c_str());\n\n      if (ret == 1)\n      {\n        XLO_DEBUG(\"Registering xlHandleCalculationCancelled\");\n        tryCallExcel(msxll::xlEventRegister,\n          \"xlHandleCalculationCancelled\", msxll::xleventCalculationCanceled);\n      }\n\n      theXllIsOpen = true;\n    }\n    catch (const std::exception& e)\n    {\n      for (auto& msg : _loadingMessages)\n        writeToStartUpLog(msg.c_str());\n\n      writeToStartUpLog(e.what(), true);\n    }\n\n    _loadingMessages.clear();\n  }\n\n  void autoClose()\n  {\n    XLO_DEBUG(\"xlOil Core: Closing\");\n    xloil::coreAutoCloseHandler(XllInfo::xllPath.c_str());\n\n    theFunctions.clear();\n    theXllIsOpen = false;\n  }\n\n  static auto addInManagerInfo()\n  {\n    return std::wstring(L\"xlOil Core\");\n  }\n};\n\n_XLO_DECLARE_ADDIN_IMPL(xlOilCoreAddin, xlOilCoreAddin::addInManagerInfo());"
  },
  {
    "path": "src/xlOil-Loader/xlOil-Loader.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{F7E97195-7624-4E54-AA15-A1F85C96C609}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>xlOil</RootNamespace>\n    <ProjectName>xlOil-Loader</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n  </ImportGroup>\n  <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <TargetName>xlOil</TargetName>\n    <TargetExt>.xll</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <AdditionalDependencies>xlOil-XLL.lib;spdlog.lib;xlcall32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <DelayLoadDLLs>xlOil.dll</DelayLoadDLLs>\n      <ImportLibrary>$(OutDir)xlOil_Loader.lib</ImportLibrary>\n      <ProgramDatabaseFile>$(OutDir)xlOil_Loader.pdb</ProgramDatabaseFile>\n      <ModuleDefinitionFile>xlOilAddin.def</ModuleDefinitionFile>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\xlOil-XLL\\XlCall.cpp\" />\n    <ClCompile Include=\"LoaderEntryPoint.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <CopyFileToFolders Include=\"..\\..\\config\\xloil_local.ini\">\n      <FileType>Document</FileType>\n      <DestinationFileName>xloil.ini</DestinationFileName>\n      <ExcludedFromBuild Condition=\"'$(Platform)'!='x64'\">true</ExcludedFromBuild>\n    </CopyFileToFolders>\n  </ItemGroup>\n  <ItemGroup>\n    <CopyFileToFolders Include=\"..\\..\\config\\xloil_local_32.ini\">\n      <FileType>Document</FileType>\n      <DestinationFileName>xloil.ini</DestinationFileName>\n      <ExcludedFromBuild Condition=\"'$(Platform)'!='Win32'\">true</ExcludedFromBuild>\n    </CopyFileToFolders>\n    <None Include=\"xlOilAddin.def\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\xlOilHelpers\\xlOilHelpers.vcxproj\">\n      <Project>{f7aa4c6f-c223-4ed1-bbb3-836e7ec044f2}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-Loader/xlOilAddin.def",
    "content": "LIBRARY xlOil.xll\n\nEXPORTS\n\txlAutoOpen\n\txlAutoClose\n\txlAutoFree12\n\txlHandleCalculationCancelled"
  },
  {
    "path": "src/xlOil-XLL/ArrayBuilder.cpp",
    "content": "#include <xloil/ArrayBuilder.h>\n\nnamespace xloil\n{\n  detail::ArrayBuilderAlloc ExcelArrayBuilder::initialiseAllocator(\n    row_t& nRows, col_t& nCols, size_t strLength, bool padTo2DimArray)\n  {\n    // Add the terminators and string counts to total length. Maybe \n    // not every cell will be a string so this is an over-estimate\n    if (strLength > 0)\n      strLength += nCols * nRows * 2;\n\n    if (padTo2DimArray)\n    {\n      if (nRows == 1) nRows = 2;\n      if (nCols == 1) nCols = 2;\n    }\n\n    auto arrSize = nRows * nCols;\n\n    return detail::ArrayBuilderAlloc(arrSize, strLength);\n  }\n\n  ExcelArrayBuilder::ExcelArrayBuilder(\n    row_t nRows, col_t nCols,\n    size_t totalStrLength, bool padTo2DimArray)\n    : _nRows(nRows)\n    , _nColumns(nCols)\n    , _allocator(initialiseAllocator(_nRows, _nColumns, totalStrLength, padTo2DimArray))\n  {\n    if (padTo2DimArray)\n    {\n      // Add padding\n      if (nCols < _nColumns)\n        for (row_t i = 0; i < nRows; ++i)\n          (*this)(i, nCols) = CellError::NA;\n\n      if (nRows < _nRows)\n        for (col_t j = 0; j < _nColumns; ++j)\n          (*this)(nRows, j) = CellError::NA;\n    }\n  }\n\n  namespace\n  {\n    /// <summary>\n    /// Repoint all strings to the correct place, give a contiguous array\n    /// of pstring data\n    /// </summary>\n    void fixStrings(ExcelObj* pStart, size_t size, wchar_t* stringData)\n    {\n      const auto pEnd = pStart + size;\n      auto pStr = detail::PStringStackIterator(stringData);\n      for (; pStart != pEnd; ++pStart)\n      {\n        if (pStart->xltype == msxll::xltypeStr)\n        {\n          pStart->val.str.data = *pStr;\n          ++pStr;\n        }\n      }\n    }\n  }\n\n  ExcelObj SequentialArrayBuilder::toExcelObj()\n  {\n    if (_target != last())\n      XLO_THROW(\"Array not fully populated during build\");\n\n    const auto bytesOfArray = _objects.size();\n    const auto bytesOfStrings = sizeof(wchar_t) * _strings.size();\n    auto arrayData = new char[bytesOfArray + bytesOfStrings];\n\n    auto stringData = (wchar_t*)(arrayData + bytesOfArray);\n    memcpy(arrayData, _objects.data(), bytesOfArray);\n    wmemcpy(stringData, _strings.data(), _strings.size());\n\n    fixStrings((ExcelObj*)arrayData, nRows() * nColumns(), stringData);\n\n    return ExcelObj((ExcelObj*)arrayData, _nRows, _nColumns);\n  }\n\n  void SequentialArrayBuilder::copyToBuilder(\n    detail::ArrayBuilderIterator targetBegin, detail::ArrayBuilderIterator targetEnd)\n  {\n    auto sourcePtr = (ExcelObj*)_objects.data();\n    auto sourceEnd = last();\n    auto pStr = detail::PStringStackIterator(_strings.data());\n\n    for (; targetBegin != targetEnd && sourcePtr != sourceEnd; ++targetBegin, ++sourcePtr)\n    {\n      if (sourcePtr->xltype == msxll::xltypeStr)\n      {\n        auto pbuf = *pStr;\n        targetBegin->copy_string(pbuf + 1, pbuf[0]);\n        ++pStr;\n      }\n      else\n        targetBegin->take(std::move(*sourcePtr));\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/Async.cpp",
    "content": "#include <xloil/Async.h>\n#include <xloil/ExcelCall.h>\n#include <xlOil/WindowsSlim.h>\n\nnamespace xloil\n{\n  XLOIL_EXPORT void asyncReturn(\n    const ExcelObj& asyncHandle, const ExcelObj& value)\n  {\n    const ExcelObj* callBackArgs[2];\n    callBackArgs[0] = &asyncHandle;\n    callBackArgs[1] = &value;\n    // Need to use a raw call as the return value from xlAsyncReturn seems \n    // to be garbage - just a zeroed block of memory\n    ExcelObj result;\n    callExcelRaw(msxll::xlAsyncReturn, &result, 2, callBackArgs);\n  }\n\n  XLOIL_EXPORT bool yieldAndCheckIfEscPressed()\n  {\n    auto[res, ret] = tryCallExcel(msxll::xlAbort);\n    return (ret == 0 && res.cast<bool>());\n  }\n}\n\n"
  },
  {
    "path": "src/xlOil-XLL/Caller.cpp",
    "content": "#include <xloil/Caller.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/State.h>\n#include <xloil/ExcelArray.h>\n#include <xlOil/WindowsSlim.h>\n#include <xlOil/XlCallSlim.h>\n#include <xlOilHelpers/Environment.h>\n#include <array>\n\nusing namespace msxll;\n\nnamespace\n{\n  // Gross code to detect if being called by function wiz. Verbatim from:\n  // https://docs.microsoft.com/en-us/office/client-developer/excel/how-to-call-xll-functions-from-the-function-wizard-or-replace-dialog-boxes?redirectedfrom=MSDN#Y241\n\n  // Another possible way of detecting this is that MSO.dll will not be on\n  // the call stack if called from a worksheet directly, although reading the \n  // call stack is not for free...\n\n#define CLASS_NAME_BUFFSIZE  50\n#define WINDOW_TEXT_BUFFSIZE  50\n  // Data structure used as input to xldlg_enum_proc(), called by\n  // called_from_paste_fn_dlg(), called_from_replace_dlg(), and\n  // called_from_Excel_dlg(). These functions tell the caller whether\n  // the current worksheet function was called from one or either of\n  // these dialog boxes.\n  struct xldlg_enum_struct\n  {\n    bool is_dlg;\n    HWND  hwnd;\n    const char *window_title_text; // set to NULL if don't care\n    DWORD pid;\n  };\n\n#pragma warning(disable: 4311 4302)\n  // The callback function called by Windows for every top-level window.\n  bool CALLBACK xldlg_enum_proc(HWND hwnd, xldlg_enum_struct *p_enum)\n  {\n    // Check if the parent window is Excel.\n    // Note: Because of the change from MDI (Excel 2010) to SDI (Excel 2013) we \n    // check the process IDs\n    if (p_enum->pid == 0)\n    {\n      if (GetParent(hwnd) != p_enum->hwnd)\n        return TRUE; // Tells Windows to continue iterating.\n    }\n    else\n    {\n      DWORD pid = NULL;\n      GetWindowThreadProcessId(hwnd, &pid);\n      if (pid != p_enum->pid)\n        return TRUE;\n    }\n \n    char class_name[CLASS_NAME_BUFFSIZE + 1];\n    //  Ensure that class_name is always null terminated for safety.\n    class_name[CLASS_NAME_BUFFSIZE] = 0;\n    GetClassNameA(hwnd, class_name, CLASS_NAME_BUFFSIZE);\n\n    //  Do a case-insensitve comparison for the Excel dialog window\n    //  class name with the Excel version number truncated.\n    size_t len; // The length of the window's title text\n    if (_strnicmp(class_name, \"bosa_sdm_xl\", 11) != 0)\n      return TRUE;\n    \n    // Check if a searching for a specific title string\n    if (p_enum->window_title_text)\n    {\n      // Get the window's title and see if it matches the given text.\n      char buffer[WINDOW_TEXT_BUFFSIZE + 1];\n      buffer[WINDOW_TEXT_BUFFSIZE] = 0;\n\n      len = GetWindowTextA(hwnd, buffer, WINDOW_TEXT_BUFFSIZE);\n      if (len == 0) // No title\n      {\n        if (p_enum->window_title_text[0] != 0)\n          return TRUE; // No match, so keep iterating\n      }\n      // Window has a title so do a case-insensitive comparison of the\n      // title and the search text, if provided.\n      else if (p_enum->window_title_text[0] != 0\n        && _stricmp(buffer, p_enum->window_title_text) != 0)\n        return TRUE; // Keep iterating\n    }\n    p_enum->is_dlg = true;\n    return FALSE; // Tells Windows to stop iterating.\n  }\n\n  bool called_from_paste_fn_dlg()\n  {\n    DWORD pid = 0;\n    const char* windowName;\n    auto& state = xloil::Environment::excelProcess();\n    if (state.version < 13)\n      windowName = \"\";\n    else\n    {\n      windowName = \"Function Arguments\";\n      pid = GetProcessId(GetCurrentProcess());\n    }\n\n    // Search for bosa_sdm_xl* dialog box with no title string.\n    xldlg_enum_struct es = { false, (HWND)state.hWnd, windowName, pid };\n    EnumWindows((WNDENUMPROC)xldlg_enum_proc, (LPARAM)&es);\n    return es.is_dlg;\n  }\n}\n\nnamespace xloil\n{\n  namespace\n  {\n    // Max col is XFD, i.e 2^14, we run to XFZ\n    constexpr size_t COL_NAME_CACHE_SIZE = XL_MAX_COLS + 22;\n    constexpr size_t COL_NAME_WIDTH = 3;\n\n    auto fillColumnNameCache()\n    {\n      std::array<char, COL_NAME_CACHE_SIZE * COL_NAME_WIDTH> result;\n      auto* ptr = result.data();\n\n      for (auto d = 'A'; d <= 'Z'; ++d)\n      {\n        *ptr++ = d;\n        *ptr++ = 0;\n        *ptr++ = 0;\n      }\n\n      for (auto c = 'A'; c <= 'Z'; ++c)\n        for (auto d = 'A'; d <= 'Z'; ++d)\n        {\n          *ptr++ = c;\n          *ptr++ = d;\n          *ptr++ = 0;\n        }\n\n      for (auto c = 'A'; c <= 'X'; ++c)\n        for (auto d = 'A'; d <= (c == 'X' ? 'F' : 'Z'); ++d)\n          for (auto e = 'A'; e <= 'Z'; ++e)\n          {\n            *ptr++ = c;\n            *ptr++ = d;\n            *ptr++ = e;\n          }\n\n      assert(ptr == result.data() + result.size());\n\n      return result;\n    }\n\n    static auto theColumnNameCache = fillColumnNameCache();\n\n    template<class TChar>\n    uint8_t writeColumn(size_t colIndex, TChar buf[3])\n    {\n      auto colName = &theColumnNameCache[colIndex * COL_NAME_WIDTH];\n      buf[0] = colName[0];\n      if (colIndex < 26)\n        return 1;\n      buf[1] = colName[1];\n      if (colIndex < 26 + 26 * 26)\n        return 2;\n      buf[2] = colName[2];\n      return 3;\n    }\n\n    uint8_t writeColumnNameW(size_t colIndex, wchar_t*& buf)\n    {\n      auto n = writeColumn(colIndex, buf);\n      buf += n;\n      return n;\n    }\n\n    void writeDecimal(size_t value, wchar_t*& buf, size_t& bufSize)\n    {\n      auto nWritten = unsignedToString<10>(value, buf, bufSize);\n      buf += nWritten;\n      bufSize -= nWritten;\n    }\n\n    struct WriteA1\n    {\n      bool fixedRow, fixedCol;\n\n      static constexpr size_t MAX_LEN = XL_CELL_ADDRESS_A1_MAX_LEN;\n      void operator()(size_t row, size_t col, wchar_t*& buf, size_t& bufSize) const\n      {\n        if (fixedCol) *buf++ = L'$';\n        bufSize -= writeColumnNameW(col, buf);\n        if (fixedRow) *buf++ = L'$';\n        writeDecimal(row + 1u, buf, bufSize);\n      }\n    };\n\n    struct WriteRC\n    {\n      bool fixedRow, fixedCol;\n      // Note we add one everywhere here as row/col is zero-based but \n      // A1/RC format is 1-based\n      static constexpr size_t MAX_LEN = XL_CELL_ADDRESS_RC_MAX_LEN;\n\n      void operator()(size_t row, size_t col, wchar_t*& buf, size_t& bufSize) const\n      {\n        if (fixedRow) *buf++ = L'$';\n        *buf++ = L'R';\n        bufSize -= 1;\n        writeDecimal(row + 1u, buf, bufSize);\n        if (fixedCol) *buf++ = L'$';\n        *buf++ = L'C';\n        bufSize -= 1;\n        writeDecimal(col + 1u, buf, bufSize);\n      }\n    };\n\n    template<class TWriter>\n    uint16_t writeLocalAddressImpl(\n      const msxll::XLREF12& ref,\n      const TWriter writer,\n      wchar_t* buf,\n      size_t bufSize)\n    {\n      // Rather than checking the bufSize at every step, just give up\n      // if it can't hold the maxiumum possible size\n      if (bufSize < TWriter::MAX_LEN)\n        return 0;\n\n      auto initialBuf = buf;\n      if (ref.rwFirst == ref.rwLast && ref.colFirst == ref.colLast)\n      {\n        // Single cell address\n        writer(ref.rwFirst, ref.colFirst, buf, bufSize);\n      }\n      else\n      {\n        // Range address\n        writer(ref.rwFirst, ref.colFirst, buf, bufSize);\n        *buf++ = L':';\n        --bufSize;\n        writer(ref.rwLast, ref.colLast, buf, bufSize);\n      }\n\n      *buf = L'\\0'; // Don't increment so we don't count terminator\n      return (uint16_t)(buf - initialBuf);\n    }\n\n    uint16_t writeLocalAddress(\n      wchar_t* buf,\n      size_t bufLen,\n      const msxll::XLREF12& sheetRef,\n      const AddressStyle style)\n    {\n      const bool a1Style = (style & AddressStyle::RC) == 0;\n      const bool fixedRow = (style & AddressStyle::ROW_FIXED) != 0;\n      const bool fixedCol = (style & AddressStyle::COL_FIXED) != 0;\n\n      return a1Style\n        ? writeLocalAddressImpl(sheetRef, WriteA1{ fixedRow, fixedCol }, buf, bufLen)\n        : writeLocalAddressImpl(sheetRef, WriteRC{ fixedRow, fixedCol }, buf, bufLen);\n\n    }\n\n    uint16_t writeSheetAddress(\n      wchar_t* buf,\n      size_t bufLen,\n      const msxll::XLREF12& sheetRef,\n      const std::wstring_view& fullSheetName,\n      const AddressStyle style)\n    {\n      uint16_t nWritten = 0;\n      const auto sheetNameLength = (uint16_t)fullSheetName.length();\n\n      // There are some complicated but unwritten rules on when Excel quotes\n      // the sheet name in an address.  See https://stackoverflow.com/questions/41677779/\n      // We avoid the complexity of checking this and simply quote everything\n      if (sheetNameLength > 0)\n      {\n        const auto sheetNameStr = fullSheetName.data();\n        const bool quoteSheetName = (style & AddressStyle::NOQUOTE) == 0;\n\n        if (quoteSheetName)\n        {\n          if (bufLen <= sheetNameLength + 1u + 2)\n            return 0;\n\n          *(buf++) = L'\\'';\n          wmemcpy(buf, sheetNameStr, sheetNameLength);\n          buf += sheetNameLength;\n          *(buf++) = L'\\'';\n\n          nWritten += 2;\n        }\n        else\n        {\n          if (bufLen <= sheetNameLength + 1u)\n            return 0;\n          wmemcpy(buf, sheetNameStr, sheetNameLength);\n          buf += sheetNameLength;\n        }\n\n        *(buf++) = L'!'; // Separator character\n        nWritten += sheetNameLength + 1u;\n        bufLen -= nWritten;\n      }\n\n      nWritten += writeLocalAddress(buf, bufLen, sheetRef, style);\n\n      return nWritten;\n    }\n\n    int writeAddressImpl(\n      wchar_t* buf,\n      size_t bufLen,\n      const ExcelObj& address,\n      const PStringRef& sheetName,\n      AddressStyle style)\n    {\n      switch (address.type())\n      {\n      case ExcelType::SRef:\n      {\n        return writeSheetAddress(buf, bufLen, address.val.sref.ref,\n          sheetName, style);\n      }\n      case ExcelType::Ref:\n      {\n        return writeSheetAddress(buf, bufLen, address.val.mref.lpmref->reftbl[0],\n          sheetName, style);\n      }\n      case ExcelType::Str: // Graphic object or Auto_Open/Auto_Close/Auto_Activate/... macro caller\n      {\n        // The sheet name is the active sheet at the time CallerInfo was created\n        // Buttons can only be clicked on the active sheet I presume!\n        const auto sheetNameLen = sheetName.length();\n        const auto objectName = address.cast<PStringRef>();\n        const uint16_t maxLen =\n          ((style & AddressStyle::RC) != 0 \n            ? XL_FULL_ADDRESS_RC_MAX_LEN \n            : XL_FULL_ADDRESS_A1_MAX_LEN)\n          - sheetNameLen;\n        // Never return a string longer than the advertised max length\n        const auto nameLen = std::min<uint16_t>(objectName.length(), maxLen);\n\n        size_t nWritten = 0;\n\n        if (sheetNameLen > 0)\n        {\n          wmemcpy_s(\n            buf, bufLen,\n            sheetName.pstr(), sheetNameLen);\n          buf[sheetNameLen] = L'!';\n          nWritten += sheetNameLen + 1;\n        }\n\n        wmemcpy_s(\n          buf + nWritten, bufLen - nWritten,\n          objectName.pstr(), nameLen);\n\n        nWritten += nameLen;\n\n        return (int)std::min(bufLen, nWritten);\n      }\n      case ExcelType::Num: // DLL caller\n      {\n        return _snwprintf_s(buf, bufLen, bufLen, L\"DLL(%d)\", address.cast<int>());\n      }\n      case ExcelType::Multi:\n      {\n        ExcelArray arr(address, false);\n        switch (arr.size())\n        {\n        case 2: // 2 element array describing a toolbar\n          return _snwprintf_s(buf, bufLen, bufLen, L\"Toolbar(%d)\", arr.at(0).cast<int>());\n        case 4: // 4 element array describing a menu\n          return _snwprintf_s(buf, bufLen, bufLen, L\"Menu(%d)\", arr.at(0).cast<int>());\n        default:\n          XLO_THROW(\"Caller: address is badly formed array\");\n        }\n      }\n      default: // Other callers\n        constexpr wchar_t nonWorksheetCaller[] = L\"Unknown\";\n        if (bufLen < _countof(nonWorksheetCaller))\n          return 0;\n        wcscpy_s(buf, bufLen, nonWorksheetCaller);\n        return _countof(nonWorksheetCaller);\n      }\n    }\n  }\n\n  namespace\n  {\n    // A local reference used to get the active sheet name\n    ExcelObj theA1Ref(msxll::xlref12{ 1, 1, 1, 1 });\n  }\n\n  CallerInfo::CallerInfo()\n  {\n    callExcelRaw(xlfCaller, &_address);\n    callExcelRaw(xlSheetNm, &_sheetName,\n      _address.isType(ExcelType::RangeRef) ? &_address : &theA1Ref);\n  }\n\n  CallerInfo::CallerInfo(\n    const ExcelObj& address, const wchar_t* fullSheetName)\n    : _address(address)\n  {\n    if (fullSheetName)\n      _sheetName = fullSheetName;\n  }\n\n  uint16_t CallerInfo::addressLength(AddressStyle style) const\n  {\n    // Any value in more precise guess?\n    const auto sheetName = fullSheetName();\n    if (!sheetName.empty())\n    {\n      const bool a1Style = (style & AddressStyle::RC) == 0;\n      const bool quoteSheet = (style & AddressStyle::NOQUOTE) == 0;\n      // Sheetname + quotes + ! + address\n      return sheetName.length() + 1\n        + a1Style ? XL_FULL_ADDRESS_A1_MAX_LEN : XL_FULL_ADDRESS_RC_MAX_LEN\n        + quoteSheet ? 2 : 0;\n    }\n\n    // Not a worksheet caller\n    auto addressStr = _address.cast<PStringRef>();\n    if (!addressStr.empty())\n      return addressStr.length();\n\n    return 19; // Max is \"Toolbar(<some int id>)\"\n  }\n\n  int CallerInfo::writeAddress(\n    wchar_t* buf,\n    size_t bufLen,\n    AddressStyle style) const\n  {\n    return writeAddressImpl(\n      buf, bufLen, _address, _sheetName.cast<PStringRef>(), style);\n  }\n\n  std::wstring CallerInfo::address(AddressStyle style) const\n  {\n    std::wstring result;\n    result.resize(addressLength(style));\n    const auto nChars = writeAddress(result.data(), result.size(), style);\n    result.resize(nChars);\n    return result;\n  }\n\n  std::wstring CallerInfo::localAddress(AddressStyle style) const\n  {\n    wchar_t buf[XL_CELL_ADDRESS_RC_MAX_LEN];\n\n    const msxll::XLREF12* sheetRef;\n    switch (_address.type())\n    {\n    case ExcelType::SRef: sheetRef = &_address.val.sref.ref; break;\n    case ExcelType::Ref:  sheetRef = _address.val.mref.lpmref->reftbl;  break;\n    default:\n      return std::wstring();\n    }\n\n    auto nWritten = writeLocalAddress(buf, _countof(buf), *sheetRef, style);\n\n    return std::wstring(buf, nWritten);\n  }\n\n  uint8_t writeColumnName(size_t colIndex, char buf[4])\n  {\n    return writeColumn(colIndex, buf);\n  }\n\n  XLOIL_EXPORT uint16_t xlrefWriteWorkbookAddress(\n    const msxll::IDSHEET& sheet,\n    const msxll::XLREF12& ref,\n    wchar_t* buf,\n    size_t bufSize,\n    AddressStyle style)\n  {\n    ExcelObj sheetNm;\n    sheetNm.xltype = msxll::xltypeRef;\n    sheetNm.val.mref.idSheet = sheet;\n    callExcelRaw(msxll::xlSheetNm, &sheetNm, &sheetNm);\n\n    return writeSheetAddress(buf, bufSize, ref, sheetNm.cast<PStringRef>(), style);\n  }\n\n\n  XLOIL_EXPORT uint16_t xlrefToAddress(\n    const msxll::XLREF12& ref,\n    wchar_t* buf,\n    size_t bufSize,\n    const std::wstring_view& sheetName,\n    AddressStyle style)\n  {\n    return writeSheetAddress(buf, bufSize, ref, sheetName, style);\n  }\n\n\n  namespace\n  {\n    struct ColumnNameAlphabet\n    {\n      static constexpr int8_t _alphabet[] = {\n        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,\n        -1, -1, -1, -1, -1, -1,\n        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,\n      };\n      uint8_t operator()(int16_t c) const\n      {\n        return (uint8_t)((c < 'A' || c > 'z') ? -1 : _alphabet[c - 'A']);\n      }\n    };\n\n    template<class Char, Char What>\n    void skipOne(const Char*& c)\n    {\n      if (*c == What) ++c;\n    }\n\n    auto parseColLetters(const wchar_t*& c, const wchar_t* last)\n    {\n      // See notes above\n      skipOne<wchar_t, L'$'>(c);\n      // Look for a 3 char string as the column number.  A=1 and Z=26 but\n      // there is no zero, so it is not base-27, hence we must use the \n      // `THigh` parameter of parseUnsigned.\n      // \n      // We subtract 1 as A1-refs are 1-based but XLREF12 is zero based. \n      // This means failure to read anything will return -1, which gives an \n      // error condition later.\n      auto end = std::min(c + 3, last);\n      auto val = (int)detail::parseUnsigned<decltype(c), ColumnNameAlphabet, 26, 26>(c, end) - 1;\n      return val > XL_MAX_COLS ? -1 : val;\n    }\n    /// <summary>\n    /// Parse a number up to XL_MAX_COLS (16384), returning -1 on failure.\n    /// </summary>\n    template<size_t TNDigits, size_t TMaxVal>\n    auto readNumberPart(const wchar_t*& c, const wchar_t* end)\n    {\n      // Skip the dollar symbol as it doesn't impact address conversion\n      skipOne<wchar_t, L'$'>(c);\n      end = std::min(c + TNDigits, end);\n      int val = (int)parseUnsigned<10>(c, end) - 1;\n      return val > TMaxVal ? -1 : val;\n    }\n\n    template<wchar_t TPrefix, size_t TNDigits, size_t TMaxVal>\n    auto readPrefixedNumber(const wchar_t*& c, const wchar_t* end)\n    {\n      if (c == end)\n        return -1;\n      skipOne<wchar_t, L'$'>(c);\n      if (*c == TPrefix || *c == TPrefix + (L'a' - L'A'))\n      {\n        ++c;\n        return readNumberPart<TNDigits, TMaxVal>(c, end);\n      }\n      return -1;\n    }\n\n    constexpr auto(*parseR)(const wchar_t*&, const wchar_t*) = &readPrefixedNumber<L'R', 7, XL_MAX_ROWS>;\n    constexpr auto(*parseC)(const wchar_t*&, const wchar_t*) = &readPrefixedNumber<L'C', 5, XL_MAX_COLS>;\n    constexpr auto(*parseRowNumber)(const wchar_t*&, const wchar_t*) = &readNumberPart<7, XL_MAX_ROWS>;\n  }\n\n  bool localAddressToXlRef(const std::wstring_view& address, msxll::XLREF12& r)\n  {\n    const wchar_t* c = address.data();\n    const wchar_t* end = c + address.size();\n    memset(&r, 0, sizeof(decltype(r)));\n\n    r.colFirst = parseColLetters(c, end);\n    r.rwFirst = parseRowNumber(c, end);\n\n    if (c == end)\n    {\n      r.colLast = r.colFirst;\n      r.rwLast = r.rwFirst;\n    }\n    else if (*c == L':') // Look for the address separator\n    {\n      ++c;\n      r.colLast = parseColLetters(c, end);\n      r.rwLast = parseRowNumber(c, end);\n    }\n    else\n    {\n      // Failed to read address as A1-type, try RC-type.  We know that \n      // The first Rxxx will have been read by the A1-parser as the \n      // row number.\n      r.colFirst = parseC(c, end);\n      if (c == end)\n      {\n        r.colLast = r.colFirst;\n        r.rwLast = r.rwFirst;\n      }\n      else if (*c == L':')\n      {\n        ++c;\n        r.rwLast = parseR(c, end);\n        r.colLast = parseC(c, end);\n      }\n      else\n        return false;\n    }\n\n    // Return true if parsing was successful\n    return r.colFirst >= 0 && r.rwFirst >= 0 && r.rwLast >= 0 && r.colLast >= 0;\n  }\n\n\n  bool addressToXlRef(\n    const std::wstring_view& address,\n    msxll::XLREF12& result,\n    std::wstring* sheetName)\n  {\n    const auto pling = address.find_last_of(L'!');\n    if (sheetName)\n      *sheetName = address.substr(0, pling);\n    return localAddressToXlRef(address.substr(pling + 1), result);\n  }\n\n\n  bool inFunctionWizard()\n  {\n    return called_from_paste_fn_dlg();\n  }\n}\n"
  },
  {
    "path": "src/xlOil-XLL/Date.cpp",
    "content": "#include <xlOil/Date.h>\n#include <cmath>\n#include <chrono>\n#include <streambuf>\n#include <istream>\n#include <iomanip>\n#include <unordered_set>\n\nusing namespace std::chrono;\nusing std::vector;\nusing std::string;\nusing std::wstring;\n\nnamespace xloil\n{\n  namespace\n  {\n    constexpr auto microsecsPerDay = double(duration_cast<microseconds>(hours(24)).count());\n  }\n\n  /// Verbatim from https://www.codeproject.com/Articles/2750/Excel-Serial-Date-to-Day-Month-Year-and-Vice-Versa\n  bool excelSerialDateToYMD(int nSerialDate, int &nYear, int &nMonth, int &nDay) noexcept\n  {\n    if (nSerialDate > XL_MAX_SERIAL_DATE || nSerialDate < 0)\n      return false;\n\n    // Excel/Lotus 123 have a bug with 29-02-1900. 1900 is not a\n    // leap year, but Excel/Lotus 123 think it is...\n    if (nSerialDate == 60)\n    {\n      nDay = 29;\n      nMonth = 2;\n      nYear = 1900;\n\n      return true;\n    }\n    else if (nSerialDate < 60)\n    {\n      // Because of the 29-02-1900 bug, any serial date \n      // under 60 is one off... Compensate.\n      nSerialDate++;\n    }\n\n    // Modified Julian to DMY calculation with an addition of 2415019\n    int l = nSerialDate + 68569 + 2415019;\n    int n = int((4 * l) / 146097);\n    l = l - int((146097 * n + 3) / 4);\n    int i = int((4000 * (l + 1)) / 1461001);\n    l = l - int((1461 * i) / 4) + 31;\n    int j = int((80 * l) / 2447);\n    nDay = l - int((2447 * j) / 80);\n    l = int(j / 11);\n    nMonth = j + 2 - (12 * l);\n    nYear = 100 * (n - 49) + i + l;\n    return true;\n  }\n\n  bool excelSerialDatetoYMDHMS(\n    double serial, int &nYear, int &nMonth, int &nDay, int& nHours, int& nMins, int& nSecs, int& uSecs) noexcept\n  {\n    // Allow for time component in max date\n    if (serial > (double)(XL_MAX_SERIAL_DATE + 1) || serial < 0) \n      return false;\n\n    double intpart;\n    if (std::modf(serial, &intpart) != 0.0)\n    {\n      auto us = microseconds(long long((serial - intpart) * microsecsPerDay));\n      auto secs = duration_cast<seconds>(us);\n      us -= duration_cast<microseconds>(secs);\n      auto mins = duration_cast<minutes>(secs);\n      secs -= duration_cast<seconds>(mins);\n      auto hour = duration_cast<hours>(mins);\n      mins -= duration_cast<minutes>(hour);\n\n      nHours = hour.count();\n      nMins = mins.count();\n      nSecs = (int)secs.count();\n      uSecs = (int)us.count();\n    }\n    else\n      nHours = nMins = nSecs = uSecs = 0;\n\n    return excelSerialDateToYMD(int(intpart), nYear, nMonth, nDay);\n  }\n\n  /// Verbatim from https://www.codeproject.com/Articles/2750/Excel-Serial-Date-to-Day-Month-Year-and-Vice-Versa\n  int excelSerialDateFromYMD(int nYear, int nMonth, int nDay) noexcept\n  {\n    // Excel/Lotus 123 have a bug with 29-02-1900. 1900 is not a\n    // leap year, but Excel/Lotus 123 think it is...\n    if (nDay == 29 && nMonth == 02 && nYear == 1900)\n      return 60;\n\n    // DMY to Modified Julian calculated with an extra subtraction of 2415019.\n    long nSerialDate =\n      int((1461 * (nYear + 4800 + int((nMonth - 14) / 12))) / 4) +\n      int((367 * (nMonth - 2 - 12 * ((nMonth - 14) / 12))) / 12) -\n      int((3 * (int((nYear + 4900 + int((nMonth - 14) / 12)) / 100))) / 4) +\n      nDay - 2415019 - 32075;\n\n    if (nSerialDate < 60)\n    {\n      // Because of the 29-02-1900 bug, any serial date \n      // under 60 is one off... Compensate.\n      nSerialDate--;\n    }\n\n    return (int)nSerialDate;\n  }\n\n  double excelSerialDateFromYMDHMS(\n    int nYear, int nMonth, int nDay, int nHours, int nMins, int nSecs, int uSecs) noexcept\n  {\n    const auto micros = duration_cast<microseconds>(\n      hours(nHours) + minutes(nMins) + seconds(nSecs)).count() + uSecs;\n    const auto serial = excelSerialDateFromYMD(nYear, nMonth, nDay) \n      + micros / microsecsPerDay;\n    return serial;\n  }\n\n  // Thanks to:\n  // https://stackoverflow.com/questions/13059091/creating-an-input-stream-from-constant-memory/13059195#13059195\n  struct wmembuf : std::wstreambuf \n  {\n    wmembuf(wchar_t const* base, size_t size) \n    {\n      str(base, size);\n    }\n    void str(wchar_t const* base, size_t size)\n    {\n      wchar_t* p = const_cast<wchar_t*>(base);\n      this->setg(p, p, p + size);\n    }\n  };\n  struct wimemstream : virtual wmembuf, std::wistream\n  {\n    using std::wistream::imbue;\n    wimemstream(wchar_t const* base, size_t size)\n      : wmembuf(base, size)\n      , std::wistream(static_cast<std::wstreambuf*>(this))\n    {}\n    void str(wchar_t const* base, size_t size)\n    {\n      wmembuf::str(base, size);\n    }\n  };\n\n  vector<wstring> theDateFormats;\n\n  bool stringToDateTime(\n    const std::wstring_view& str,\n    std::tm& result, \n    const wchar_t* format)\n  {\n    wimemstream stream(str.data(), str.length());\n    memset(&result, 0, sizeof(std::tm));\n\n    if (format)\n    {\n      stream >> std::get_time(&result, format);\n      return !stream.fail();\n    }\n    else\n    {\n      for (auto& form : theDateFormats)\n      {\n        stream >> std::get_time(&result, form.c_str());\n        if (!stream.fail())\n          return true;\n        stream.clear();\n        stream.str(str.data(), str.length());\n      }\n      return false;\n    }\n  }\n\n  vector<wstring>& theDateTimeFormats()\n  {\n    return theDateFormats;\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/ExcelArray.cpp",
    "content": "#include <xlOil/ExcelArray.h>\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Range.h>\n#include <xloil/ArrayBuilder.h>\n\nnamespace xloil\n{\n  ExcelArray::ExcelArray(const ExcelObj& obj, bool trim)\n  {\n    if (obj.isType(ExcelType::Multi))\n    {\n      _data = (const ExcelObj*)obj.val.array.lparray;\n      _baseCols = (col_t)obj.val.array.columns;\n      if (trim)\n        trimmedArraySize(obj, _rows, _columns);\n      else\n      {\n        _rows = obj.val.array.rows;\n        _columns = (col_t)obj.val.array.columns;\n      }\n    }\n    else if (obj.isType(ExcelType::ArrayValue))\n    {\n      _data = &obj;\n      _rows = 1;\n      _columns = 1;\n      _baseCols = 1;\n    }\n    else\n      XLO_THROW(L\"Type {0} not allowed as an array element\", enumAsWCString(obj.type()));\n  }\n\n  ExcelObj ExcelArray::toExcelObj() const\n  {\n    // Single value return\n    if (nCols() == 1 && nRows() == 1)\n      return at(0);\n\n    // Empty array\n    if (dims() == 0)\n      return ExcelObj();\n\n    size_t strLen = 0;\n    for (auto& v : (*this))\n      strLen += v.stringLength();\n\n    ExcelArrayBuilder builder(nRows(), nCols(), strLen);\n    for (auto i = 0u; i < nRows(); ++i)\n      for (auto j = 0u; j < nCols(); ++j)\n        builder(i, j) = at(i, j);\n\n    return builder.toExcelObj();\n  }\n  \n  bool ExcelArray::trimmedArraySize(const ExcelObj& obj, row_t& nRows, col_t& nCols)\n  {\n    if ((obj.xtype() & msxll::xltypeMulti) == 0)\n    {\n      nRows = 0; nCols = 0;\n      return false;\n    }\n\n    const auto& arr = obj.val.array;\n    const auto start = (ExcelObj*)arr.lparray;\n    nRows = arr.rows;\n    nCols = arr.columns;\n\n    auto p = start + nCols * nRows - 1;\n\n    for (; nRows > 0; --nRows)\n      for (int c = (int)nCols - 1; c >= 0; --c, --p)\n        if (p->isNonEmpty())\n          goto StartColSearch;\n\n  StartColSearch:\n    for (; nCols > 0; --nCols)\n      for (p = start + nCols - 1; p < (start + nCols * nRows); p += arr.columns)\n        if (p->isNonEmpty())\n          goto SearchDone;\n\n  SearchDone:\n    return true;\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/ExcelCall.cpp",
    "content": "#include <xlOil/ExcelCall.h>\n#include <xlOil/ExcelObj.h>\n#include \"ExcelCallMapping.h\"\n#include <cassert>\nusing namespace msxll;\nusing std::string;\n\nnamespace xloil\n{\n  const wchar_t* xlRetCodeToString(int ret, bool checkXllContext)\n  {\n    if (checkXllContext)\n    {\n      ExcelObj dummy;\n      if (Excel12v(xlStack, &dummy, 0, nullptr) == xlretInvXlfn)\n        return L\"XLL function called outside XLL Context\";\n    }\n    switch (ret)\n    {\n    case xlretSuccess:    return L\"success\";\n    case xlretAbort:      return L\"macro was stopped by the user\";\n    case xlretInvXlfn:    return L\"invalid function number, or calling function does not have permission to call the function or command\";\n    case xlretInvCount:   return L\"invalid number of arguments\";\n    case xlretInvXloper:  return L\"invalid XLOPER structure\";\n    case xlretStackOvfl:  return L\"stack overflow\";\n    case xlretFailed:     return L\"command failed\";\n    case xlretUncalced:   return L\"attempt to read an uncalculated cell: this requires macro sheet permission\";\n    case xlretNotThreadSafe:  return L\"not allowed during multi-threaded calc\";\n    case xlretInvAsynchronousContext: return L\"invalid asynchronous function handle\";\n    case xlretNotClusterSafe:  return L\"not supported on cluster\";\n    default:\n      return L\"unknown error\";\n    }\n  }\n  \n  // TODO: currently unused, supposed to indicate functions which are safe to call outside XLL context\n  // I'm not sure they are in fact safe!\n  bool isSafeFunction(int funcNumber)\n  {\n    switch (funcNumber)\n    {\n    case xlFree:\n    case xlStack:\n    case xlSheetId:\n    case xlSheetNm:\n    case xlGetInst:\n    case xlGetHwnd:\n    case xlGetInstPtr:\n    case xlAsyncReturn:\n      return true;\n    default:\n      return false;\n    }\n  }\n\n  XLOIL_EXPORT int callExcelRaw(\n    int func, ExcelObj* result, size_t nArgs, const ExcelObj** args) noexcept\n  {\n    auto ret = Excel12v(func, result, (int)nArgs, (XLOIL_XLOPER**)args);\n    if (result)\n      result->resultFromExcel();\n    return ret;\n  }\n\n  namespace\n  {\n    using namespace FuncMap;\n    int lookup(const char* fname)\n    {\n      // Make the name lowercase and transform any dots to underscores\n      auto name = string(fname);\n      std::transform(name.begin(), name.end(), name.begin(), [](char c)\n      {\n        return c == '.' ? '_' : (char)std::tolower(c);\n      });\n\n      // Lower bound lookup using a comparison to Entry.name\n      auto i = std::lower_bound(sortedNames, sortedNames + _countof(sortedNames), name,\n        [](const FuncMap::Entry& e, const string& s) { \n          return strcmp(e.name, s.c_str()) < 0; \n        });\n\n      return strcmp(i->name, name.c_str()) == 0 ? i->number : -1;\n    }\n\n    const char* name(unsigned funcNum) noexcept\n    {\n      unsigned iName;\n      if ((funcNum & msxll::xlCommand) != 0)\n      {\n        funcNum &= ~msxll::xlCommand;\n        if (funcNum >= _countof(cmdNumToName))\n          return nullptr;\n        iName = cmdNumToName[funcNum];\n      }\n      else\n      {\n        if (funcNum >= _countof(funcNumToName))\n          return nullptr;\n        iName = funcNumToName[funcNum];\n      }\n      if (iName < 0)\n        return nullptr;\n      return sortedNames[iName].name;\n    }\n  }\n\n  int excelFuncNumber(const char* name)\n  {\n    return lookup(name);\n  }\n  const char* excelFuncName(const unsigned number) noexcept\n  {\n    return name(number);\n  }\n}\n"
  },
  {
    "path": "src/xlOil-XLL/ExcelCallMapping.h",
    "content": "#pragma once\n#include <xlOil/XlCallSlim.h>\n\nusing namespace msxll;\n\nnamespace xloil\n{\n  namespace FuncMap\n  {\n    struct Entry\n    {\n      const char name[23]; // Smallest size which compiles\n      unsigned short number;\n    };\n\n    Entry sortedNames[] = { \n      {\"a1r1c1\",xlcA1R1c1},\n      {\"abort\",xlAbort},\n      {\"abs\",xlfAbs},\n      {\"absref\",xlfAbsref},\n      {\"accrint\",xlfAccrint},\n      {\"accrintm\",xlfAccrintm},\n      {\"acos\",xlfAcos},\n      {\"acosh\",xlfAcosh},\n      {\"acot\",xlfAcot},\n      {\"acoth\",xlfAcoth},\n      {\"activate\",xlcActivate},\n      {\"activatenext\",xlcActivateNext},\n      {\"activatenotes\",xlcActivateNotes},\n      {\"activateprev\",xlcActivatePrev},\n      {\"activecell\",xlfActiveCell},\n      {\"activecellfont\",xlcActiveCellFont},\n      {\"addarrow\",xlcAddArrow},\n      {\"addbar\",xlfAddBar},\n      {\"addchartautoformat\",xlcAddChartAutoformat},\n      {\"addcommand\",xlfAddCommand},\n      {\"addinmanager\",xlcAddinManager},\n      {\"addlistitem\",xlcAddListItem},\n      {\"addmenu\",xlfAddMenu},\n      {\"addoverlay\",xlcAddOverlay},\n      {\"addprintarea\",xlcAddPrintArea},\n      {\"address\",xlfAddress},\n      {\"addtool\",xlcAddTool},\n      {\"addtoolbar\",xlfAddToolbar},\n      {\"aggregate\",xlfAggregate},\n      {\"alert\",xlcAlert},\n      {\"alignment\",xlcAlignment},\n      {\"amordegrc\",xlfAmordegrc},\n      {\"amorlinc\",xlfAmorlinc},\n      {\"and\",xlfAnd},\n      {\"appactivate\",xlcAppActivate},\n      {\"appactivatemicrosoft\",xlcAppActivateMicrosoft},\n      {\"applynames\",xlcApplyNames},\n      {\"applystyle\",xlcApplyStyle},\n      {\"appmaximize\",xlcAppMaximize},\n      {\"appminimize\",xlcAppMinimize},\n      {\"appmove\",xlcAppMove},\n      {\"apprestore\",xlcAppRestore},\n      {\"appsize\",xlcAppSize},\n      {\"apptitle\",xlfAppTitle},\n      {\"arabic\",xlfArabic},\n      {\"areas\",xlfAreas},\n      {\"argument\",xlfArgument},\n      {\"arrangeall\",xlcArrangeAll},\n      {\"asc\",xlfAsc},\n      {\"asin\",xlfAsin},\n      {\"asinh\",xlfAsinh},\n      {\"assigntoobject\",xlcAssignToObject},\n      {\"assigntotool\",xlcAssignToTool},\n      {\"atan\",xlfAtan},\n      {\"atan2\",xlfAtan2},\n      {\"atanh\",xlfAtanh},\n      {\"attachtext\",xlcAttachText},\n      {\"attachtoolbars\",xlcAttachToolbars},\n      {\"attributes\",xlcAttributes},\n      {\"autocorrect\",xlcAutocorrect},\n      {\"autooutline\",xlcAutoOutline},\n      {\"avedev\",xlfAvedev},\n      {\"average\",xlfAverage},\n      {\"averagea\",xlfAveragea},\n      {\"averageif\",xlfAverageif},\n      {\"averageifs\",xlfAverageifs},\n      {\"axes\",xlcAxes},\n      {\"bahttext\",xlfBahttext},\n      {\"base\",xlfBase},\n      {\"beep\",xlcBeep},\n      {\"besseli\",xlfBesseli},\n      {\"besselj\",xlfBesselj},\n      {\"besselk\",xlfBesselk},\n      {\"bessely\",xlfBessely},\n      {\"beta_dist\",xlfBeta_dist},\n      {\"beta_inv\",xlfBeta_inv},\n      {\"betadist\",xlfBetadist},\n      {\"betainv\",xlfBetainv},\n      {\"bin2dec\",xlfBin2dec},\n      {\"bin2hex\",xlfBin2hex},\n      {\"bin2oct\",xlfBin2oct},\n      {\"binom_dist\",xlfBinom_dist},\n      {\"binom_dist_range\",xlfBinom_dist_range},\n      {\"binom_inv\",xlfBinom_inv},\n      {\"binomdist\",xlfBinomdist},\n      {\"bitand\",xlfBitand},\n      {\"bitlshift\",xlfBitlshift},\n      {\"bitor\",xlfBitor},\n      {\"bitrshift\",xlfBitrshift},\n      {\"bitxor\",xlfBitxor},\n      {\"border\",xlcBorder},\n      {\"bringtofront\",xlcBringToFront},\n      {\"calculatedocument\",xlcCalculateDocument},\n      {\"calculatenow\",xlcCalculateNow},\n      {\"calculation\",xlcCalculation},\n      {\"call\",xlfCall},\n      {\"caller\",xlfCaller},\n      {\"cancelcopy\",xlcCancelCopy},\n      {\"cancelkey\",xlfCancelKey},\n      {\"ceiling\",xlfCeiling},\n      {\"ceiling_math\",xlfCeiling_math},\n      {\"ceiling_precise\",xlfCeiling_precise},\n      {\"cell\",xlfCell},\n      {\"cellprotection\",xlcCellProtection},\n      {\"changelink\",xlcChangeLink},\n      {\"char\",xlfChar},\n      {\"chartadddata\",xlcChartAddData},\n      {\"charttrend\",xlcChartTrend},\n      {\"chartwizard\",xlcChartWizard},\n      {\"checkboxproperties\",xlcCheckboxProperties},\n      {\"checkcommand\",xlfCheckCommand},\n      {\"chidist\",xlfChidist},\n      {\"chiinv\",xlfChiinv},\n      {\"chisq_dist\",xlfChisq_dist},\n      {\"chisq_dist_rt\",xlfChisq_dist_rt},\n      {\"chisq_inv\",xlfChisq_inv},\n      {\"chisq_inv_rt\",xlfChisq_inv_rt},\n      {\"chisq_test\",xlfChisq_test},\n      {\"chitest\",xlfChitest},\n      {\"choose\",xlfChoose},\n      {\"clean\",xlfClean},\n      {\"clear\",xlcClear},\n      {\"clearoutline\",xlcClearOutline},\n      {\"clearprintarea\",xlcClearPrintArea},\n      {\"clearroutingslip\",xlcClearRoutingSlip},\n      {\"close\",xlcClose},\n      {\"closeall\",xlcCloseAll},\n      {\"code\",xlfCode},\n      {\"colorpalette\",xlcColorPalette},\n      {\"column\",xlfColumn},\n      {\"columns\",xlfColumns},\n      {\"columnwidth\",xlcColumnWidth},\n      {\"combin\",xlfCombin},\n      {\"combina\",xlfCombina},\n      {\"combination\",xlcCombination},\n      {\"complex\",xlfComplex},\n      {\"concatenate\",xlfConcatenate},\n      {\"confidence\",xlfConfidence},\n      {\"confidence_norm\",xlfConfidence_norm},\n      {\"confidence_t\",xlfConfidence_t},\n      {\"consolidate\",xlcConsolidate},\n      {\"constrainnumeric\",xlcConstrainNumeric},\n      {\"convert\",xlfConvert},\n      {\"copy\",xlcCopy},\n      {\"copychart\",xlcCopyChart},\n      {\"copypicture\",xlcCopyPicture},\n      {\"copytool\",xlcCopyTool},\n      {\"correl\",xlfCorrel},\n      {\"cos\",xlfCos},\n      {\"cosh\",xlfCosh},\n      {\"cot\",xlfCot},\n      {\"coth\",xlfCoth},\n      {\"count\",xlfCount},\n      {\"counta\",xlfCounta},\n      {\"countblank\",xlfCountblank},\n      {\"countif\",xlfCountif},\n      {\"countifs\",xlfCountifs},\n      {\"coupdaybs\",xlfCoupdaybs},\n      {\"coupdays\",xlfCoupdays},\n      {\"coupdaysnc\",xlfCoupdaysnc},\n      {\"coupncd\",xlfCoupncd},\n      {\"coupnum\",xlfCoupnum},\n      {\"couppcd\",xlfCouppcd},\n      {\"covar\",xlfCovar},\n      {\"covariance_p\",xlfCovariance_p},\n      {\"covariance_s\",xlfCovariance_s},\n      {\"createnames\",xlcCreateNames},\n      {\"createobject\",xlfCreateObject},\n      {\"createpublisher\",xlcCreatePublisher},\n      {\"critbinom\",xlfCritbinom},\n      {\"csc\",xlfCsc},\n      {\"csch\",xlfCsch},\n      {\"cubekpimember\",xlfCubekpimember},\n      {\"cubemember\",xlfCubemember},\n      {\"cubememberproperty\",xlfCubememberproperty},\n      {\"cuberankedmember\",xlfCuberankedmember},\n      {\"cubeset\",xlfCubeset},\n      {\"cubesetcount\",xlfCubesetcount},\n      {\"cubevalue\",xlfCubevalue},\n      {\"cumipmt\",xlfCumipmt},\n      {\"cumprinc\",xlfCumprinc},\n      {\"customizetoolbar\",xlcCustomizeToolbar},\n      {\"customrepeat\",xlfCustomRepeat},\n      {\"customundo\",xlfCustomUndo},\n      {\"cut\",xlcCut},\n      {\"datadelete\",xlcDataDelete},\n      {\"datafind\",xlcDataFind},\n      {\"datafindnext\",xlcDataFindNext},\n      {\"datafindprev\",xlcDataFindPrev},\n      {\"dataform\",xlcDataForm},\n      {\"datalabel\",xlcDataLabel},\n      {\"dataseries\",xlcDataSeries},\n      {\"date\",xlfDate},\n      {\"datedif\",xlfDatedif},\n      {\"datestring\",xlfDatestring},\n      {\"datevalue\",xlfDatevalue},\n      {\"daverage\",xlfDaverage},\n      {\"day\",xlfDay},\n      {\"days\",xlfDays},\n      {\"days360\",xlfDays360},\n      {\"db\",xlfDb},\n      {\"dbcs\",xlfDbcs},\n      {\"dcount\",xlfDcount},\n      {\"dcounta\",xlfDcounta},\n      {\"ddb\",xlfDdb},\n      {\"dec2bin\",xlfDec2bin},\n      {\"dec2hex\",xlfDec2hex},\n      {\"dec2oct\",xlfDec2oct},\n      {\"decimal\",xlfDecimal},\n      {\"definename\",xlcDefineName},\n      {\"definestyle\",xlcDefineStyle},\n      {\"degrees\",xlfDegrees},\n      {\"deletearrow\",xlcDeleteArrow},\n      {\"deletebar\",xlfDeleteBar},\n      {\"deletechartautoformat\",xlcDeleteChartAutoformat},\n      {\"deletecommand\",xlfDeleteCommand},\n      {\"deleteformat\",xlcDeleteFormat},\n      {\"deletemenu\",xlfDeleteMenu},\n      {\"deletename\",xlcDeleteName},\n      {\"deletenote\",xlcDeleteNote},\n      {\"deleteoverlay\",xlcDeleteOverlay},\n      {\"deletestyle\",xlcDeleteStyle},\n      {\"deletetool\",xlcDeleteTool},\n      {\"deletetoolbar\",xlfDeleteToolbar},\n      {\"delta\",xlfDelta},\n      {\"demote\",xlcDemote},\n      {\"deref\",xlfDeref},\n      {\"devsq\",xlfDevsq},\n      {\"dget\",xlfDget},\n      {\"dialogbox\",xlfDialogBox},\n      {\"directory\",xlfDirectory},\n      {\"disableinput\",xlcDisableInput},\n      {\"disc\",xlfDisc},\n      {\"display\",xlcDisplay},\n      {\"dmax\",xlfDmax},\n      {\"dmin\",xlfDmin},\n      {\"documents\",xlfDocuments},\n      {\"dollar\",xlfDollar},\n      {\"dollarde\",xlfDollarde},\n      {\"dollarfr\",xlfDollarfr},\n      {\"dproduct\",xlfDproduct},\n      {\"dstdev\",xlfDstdev},\n      {\"dstdevp\",xlfDstdevp},\n      {\"dsum\",xlfDsum},\n      {\"duplicate\",xlcDuplicate},\n      {\"duration\",xlfDuration},\n      {\"dvar\",xlfDvar},\n      {\"dvarp\",xlfDvarp},\n      {\"echo\",xlcEcho},\n      {\"echo\",xlfEcho},\n      {\"ecma_ceiling\",xlfEcma_ceiling},\n      {\"edate\",xlfEdate},\n      {\"editboxproperties\",xlcEditboxProperties},\n      {\"editcolor\",xlcEditColor},\n      {\"editdelete\",xlcEditDelete},\n      {\"editionoptions\",xlcEditionOptions},\n      {\"editobject\",xlcEditObject},\n      {\"editrepeat\",xlcEditRepeat},\n      {\"editseries\",xlcEditSeries},\n      {\"edittool\",xlcEditTool},\n      {\"effect\",xlfEffect},\n      {\"enablecommand\",xlfEnableCommand},\n      {\"enableobject\",xlcEnableObject},\n      {\"enabletipwizard\",xlcEnableTipwizard},\n      {\"enabletool\",xlfEnableTool},\n      {\"encodeurl\",xlfEncodeurl},\n      {\"enterdata\",xlcEnterData},\n      {\"eomonth\",xlfEomonth},\n      {\"erf\",xlfErf},\n      {\"erf_precise\",xlfErf_precise},\n      {\"erfc\",xlfErfc},\n      {\"erfc_precise\",xlfErfc_precise},\n      {\"error\",xlcError},\n      {\"error\",xlfError},\n      {\"errorbarx\",xlcErrorbarX},\n      {\"errorbary\",xlcErrorbarY},\n      {\"errortype\",xlfErrorType},\n      {\"evaluate\",xlfEvaluate},\n      {\"even\",xlfEven},\n      {\"exact\",xlfExact},\n      {\"exec\",xlfExec},\n      {\"execute\",xlfExecute},\n      {\"exp\",xlfExp},\n      {\"expon_dist\",xlfExpon_dist},\n      {\"expondist\",xlfExpondist},\n      {\"extendpolygon\",xlcExtendPolygon},\n      {\"extract\",xlcExtract},\n      {\"f_dist\",xlfF_dist},\n      {\"f_dist_rt\",xlfF_dist_rt},\n      {\"f_inv\",xlfF_inv},\n      {\"f_inv_rt\",xlfF_inv_rt},\n      {\"f_test\",xlfF_test},\n      {\"fact\",xlfFact},\n      {\"factdouble\",xlfFactdouble},\n      {\"false\",xlfFalse},\n      {\"fclose\",xlfFclose},\n      {\"fdist\",xlfFdist},\n      {\"fileclose\",xlcFileClose},\n      {\"filedelete\",xlcFileDelete},\n      {\"files\",xlfFiles},\n      {\"fillauto\",xlcFillAuto},\n      {\"filldown\",xlcFillDown},\n      {\"fillgroup\",xlcFillGroup},\n      {\"fillleft\",xlcFillLeft},\n      {\"fillright\",xlcFillRight},\n      {\"fillup\",xlcFillUp},\n      {\"fillworkgroup\",xlcFillWorkgroup},\n      {\"filter\",xlcFilter},\n      {\"filteradvanced\",xlcFilterAdvanced},\n      {\"filtershowall\",xlcFilterShowAll},\n      {\"filterxml\",xlfFilterxml},\n      {\"find\",xlfFind},\n      {\"findb\",xlfFindb},\n      {\"findfile\",xlcFindFile},\n      {\"finv\",xlfFinv},\n      {\"fisher\",xlfFisher},\n      {\"fisherinv\",xlfFisherinv},\n      {\"fixed\",xlfFixed},\n      {\"floor\",xlfFloor},\n      {\"floor_math\",xlfFloor_math},\n      {\"floor_precise\",xlfFloor_precise},\n      {\"font\",xlcFont},\n      {\"fontproperties\",xlcFontProperties},\n      {\"fopen\",xlfFopen},\n      {\"forecast\",xlfForecast},\n      {\"formatauto\",xlcFormatAuto},\n      {\"formatchart\",xlcFormatChart},\n      {\"formatcharttype\",xlcFormatCharttype},\n      {\"formatfont\",xlcFormatFont},\n      {\"formatlegend\",xlcFormatLegend},\n      {\"formatmain\",xlcFormatMain},\n      {\"formatmove\",xlcFormatMove},\n      {\"formatnumber\",xlcFormatNumber},\n      {\"formatoverlay\",xlcFormatOverlay},\n      {\"formatshape\",xlcFormatShape},\n      {\"formatsize\",xlcFormatSize},\n      {\"formattext\",xlcFormatText},\n      {\"formula\",xlcFormula},\n      {\"formulaarray\",xlcFormulaArray},\n      {\"formulaconvert\",xlfFormulaConvert},\n      {\"formulafill\",xlcFormulaFill},\n      {\"formulafind\",xlcFormulaFind},\n      {\"formulafindnext\",xlcFormulaFindNext},\n      {\"formulafindprev\",xlcFormulaFindPrev},\n      {\"formulagoto\",xlcFormulaGoto},\n      {\"formulareplace\",xlcFormulaReplace},\n      {\"formulatext\",xlfFormulatext},\n      {\"fpos\",xlfFpos},\n      {\"fread\",xlfFread},\n      {\"freadln\",xlfFreadln},\n      {\"freezepanes\",xlcFreezePanes},\n      {\"frequency\",xlfFrequency},\n      {\"fsize\",xlfFsize},\n      {\"ftest\",xlfFtest},\n      {\"full\",xlcFull},\n      {\"fullscreen\",xlcFullScreen},\n      {\"functionwizard\",xlcFunctionWizard},\n      {\"fv\",xlfFv},\n      {\"fvschedule\",xlfFvschedule},\n      {\"fwrite\",xlfFwrite},\n      {\"fwriteln\",xlfFwriteln},\n      {\"gallery3darea\",xlcGallery3dArea},\n      {\"gallery3dbar\",xlcGallery3dBar},\n      {\"gallery3dcolumn\",xlcGallery3dColumn},\n      {\"gallery3dline\",xlcGallery3dLine},\n      {\"gallery3dpie\",xlcGallery3dPie},\n      {\"gallery3dsurface\",xlcGallery3dSurface},\n      {\"galleryarea\",xlcGalleryArea},\n      {\"gallerybar\",xlcGalleryBar},\n      {\"gallerycolumn\",xlcGalleryColumn},\n      {\"gallerycustom\",xlcGalleryCustom},\n      {\"gallerydoughnut\",xlcGalleryDoughnut},\n      {\"galleryline\",xlcGalleryLine},\n      {\"gallerypie\",xlcGalleryPie},\n      {\"galleryradar\",xlcGalleryRadar},\n      {\"galleryscatter\",xlcGalleryScatter},\n      {\"gamma\",xlfGamma},\n      {\"gamma_dist\",xlfGamma_dist},\n      {\"gamma_inv\",xlfGamma_inv},\n      {\"gammadist\",xlfGammadist},\n      {\"gammainv\",xlfGammainv},\n      {\"gammaln\",xlfGammaln},\n      {\"gammaln_precise\",xlfGammaln_precise},\n      {\"gauss\",xlfGauss},\n      {\"gcd\",xlfGcd},\n      {\"geomean\",xlfGeomean},\n      {\"gestep\",xlfGestep},\n      {\"getbar\",xlfGetBar},\n      {\"getcell\",xlfGetCell},\n      {\"getchartitem\",xlfGetChartItem},\n      {\"getdef\",xlfGetDef},\n      {\"getdocument\",xlfGetDocument},\n      {\"getformula\",xlfGetFormula},\n      {\"getlinkinfo\",xlfGetLinkInfo},\n      {\"getmovie\",xlfGetMovie},\n      {\"getname\",xlfGetName},\n      {\"getnote\",xlfGetNote},\n      {\"getobject\",xlfGetObject},\n      {\"getpivotdata\",xlfGetpivotdata},\n      {\"getpivotfield\",xlfGetPivotField},\n      {\"getpivotitem\",xlfGetPivotItem},\n      {\"getpivottable\",xlfGetPivotTable},\n      {\"gettool\",xlfGetTool},\n      {\"gettoolbar\",xlfGetToolbar},\n      {\"getwindow\",xlfGetWindow},\n      {\"getworkbook\",xlfGetWorkbook},\n      {\"getworkspace\",xlfGetWorkspace},\n      {\"goalseek\",xlcGoalSeek},\n      {\"goto\",xlfGoto},\n      {\"gridlines\",xlcGridlines},\n      {\"group\",xlfGroup},\n      {\"growth\",xlfGrowth},\n      {\"halt\",xlfHalt},\n      {\"harmean\",xlfHarmean},\n      {\"help\",xlfHelp},\n      {\"hex2bin\",xlfHex2bin},\n      {\"hex2dec\",xlfHex2dec},\n      {\"hex2oct\",xlfHex2oct},\n      {\"hide\",xlcHide},\n      {\"hideallinkannots\",xlcHideallInkannots},\n      {\"hideallnotes\",xlcHideallNotes},\n      {\"hidecurrnote\",xlcHidecurrNote},\n      {\"hidedialog\",xlcHideDialog},\n      {\"hideobject\",xlcHideObject},\n      {\"hline\",xlcHline},\n      {\"hlookup\",xlfHlookup},\n      {\"hour\",xlfHour},\n      {\"hpage\",xlcHpage},\n      {\"hscroll\",xlcHscroll},\n      {\"hyperlink\",xlfHyperlink},\n      {\"hypgeom_dist\",xlfHypgeom_dist},\n      {\"hypgeomdist\",xlfHypgeomdist},\n      {\"iferror\",xlfIferror},\n      {\"ifna\",xlfIfna},\n      {\"imabs\",xlfImabs},\n      {\"imaginary\",xlfImaginary},\n      {\"imargument\",xlfImargument},\n      {\"imconjugate\",xlfImconjugate},\n      {\"imcos\",xlfImcos},\n      {\"imcosh\",xlfImcosh},\n      {\"imcot\",xlfImcot},\n      {\"imcsc\",xlfImcsc},\n      {\"imcsch\",xlfImcsch},\n      {\"imdiv\",xlfImdiv},\n      {\"imexp\",xlfImexp},\n      {\"imln\",xlfImln},\n      {\"imlog10\",xlfImlog10},\n      {\"imlog2\",xlfImlog2},\n      {\"impower\",xlfImpower},\n      {\"improduct\",xlfImproduct},\n      {\"imreal\",xlfImreal},\n      {\"imsec\",xlfImsec},\n      {\"imsech\",xlfImsech},\n      {\"imsin\",xlfImsin},\n      {\"imsinh\",xlfImsinh},\n      {\"imsqrt\",xlfImsqrt},\n      {\"imsub\",xlfImsub},\n      {\"imsum\",xlfImsum},\n      {\"imtan\",xlfImtan},\n      {\"index\",xlfIndex},\n      {\"indirect\",xlfIndirect},\n      {\"info\",xlfInfo},\n      {\"initiate\",xlfInitiate},\n      {\"input\",xlfInput},\n      {\"insert\",xlcInsert},\n      {\"insertdatatable\",xlcInsertdatatable},\n      {\"insertmapobject\",xlcInsertMapObject},\n      {\"insertobject\",xlcInsertObject},\n      {\"insertpicture\",xlcInsertPicture},\n      {\"inserttitle\",xlcInsertTitle},\n      {\"int\",xlfInt},\n      {\"intercept\",xlfIntercept},\n      {\"intrate\",xlfIntrate},\n      {\"ipmt\",xlfIpmt},\n      {\"irr\",xlfIrr},\n      {\"isblank\",xlfIsblank},\n      {\"iserr\",xlfIserr},\n      {\"iserror\",xlfIserror},\n      {\"iseven\",xlfIseven},\n      {\"isformula\",xlfIsformula},\n      {\"islogical\",xlfIslogical},\n      {\"isna\",xlfIsna},\n      {\"isnontext\",xlfIsnontext},\n      {\"isnumber\",xlfIsnumber},\n      {\"iso_ceiling\",xlfIso_ceiling},\n      {\"isodd\",xlfIsodd},\n      {\"isoweeknum\",xlfIsoweeknum},\n      {\"ispmt\",xlfIspmt},\n      {\"isref\",xlfIsref},\n      {\"istext\",xlfIstext},\n      {\"isthaidigit\",xlfIsthaidigit},\n      {\"justify\",xlcJustify},\n      {\"kurt\",xlfKurt},\n      {\"labelproperties\",xlcLabelProperties},\n      {\"large\",xlfLarge},\n      {\"lasterror\",xlfLastError},\n      {\"layout\",xlcLayout},\n      {\"lcm\",xlfLcm},\n      {\"left\",xlfLeft},\n      {\"leftb\",xlfLeftb},\n      {\"legend\",xlcLegend},\n      {\"len\",xlfLen},\n      {\"lenb\",xlfLenb},\n      {\"lineprint\",xlcLinePrint},\n      {\"linest\",xlfLinest},\n      {\"linkcombo\",xlcLinkCombo},\n      {\"linkformat\",xlcLinkFormat},\n      {\"links\",xlfLinks},\n      {\"listboxproperties\",xlcListboxProperties},\n      {\"listnames\",xlcListNames},\n      {\"ln\",xlfLn},\n      {\"log\",xlfLog},\n      {\"log10\",xlfLog10},\n      {\"logest\",xlfLogest},\n      {\"loginv\",xlfLoginv},\n      {\"lognorm_dist\",xlfLognorm_dist},\n      {\"lognorm_inv\",xlfLognorm_inv},\n      {\"lognormdist\",xlfLognormdist},\n      {\"lookup\",xlfLookup},\n      {\"lower\",xlfLower},\n      {\"macrooptions\",xlcMacroOptions},\n      {\"mailaddmailer\",xlcMailAddMailer},\n      {\"maildeletemailer\",xlcMailDeleteMailer},\n      {\"maileditmailer\",xlcMailEditMailer},\n      {\"mailforward\",xlcMailForward},\n      {\"maillogoff\",xlcMailLogoff},\n      {\"maillogon\",xlcMailLogon},\n      {\"mailnextletter\",xlcMailNextLetter},\n      {\"mailreply\",xlcMailReply},\n      {\"mailreplyall\",xlcMailReplyAll},\n      {\"mailsendmailer\",xlcMailSendMailer},\n      {\"mainchart\",xlcMainChart},\n      {\"maincharttype\",xlcMainChartType},\n      {\"match\",xlfMatch},\n      {\"max\",xlfMax},\n      {\"maxa\",xlfMaxa},\n      {\"mdeterm\",xlfMdeterm},\n      {\"mduration\",xlfMduration},\n      {\"median\",xlfMedian},\n      {\"menueditor\",xlcMenuEditor},\n      {\"mergestyles\",xlcMergeStyles},\n      {\"message\",xlcMessage},\n      {\"mid\",xlfMid},\n      {\"midb\",xlfMidb},\n      {\"min\",xlfMin},\n      {\"mina\",xlfMina},\n      {\"minute\",xlfMinute},\n      {\"minverse\",xlfMinverse},\n      {\"mirr\",xlfMirr},\n      {\"mmult\",xlfMmult},\n      {\"mod\",xlfMod},\n      {\"mode\",xlfMode},\n      {\"mode_mult\",xlfMode_mult},\n      {\"mode_sngl\",xlfMode_sngl},\n      {\"month\",xlfMonth},\n      {\"move\",xlcMove},\n      {\"movebrk\",xlcMoveBrk},\n      {\"movetool\",xlcMoveTool},\n      {\"moviecommand\",xlfMovieCommand},\n      {\"mround\",xlfMround},\n      {\"multinomial\",xlfMultinomial},\n      {\"munit\",xlfMunit},\n      {\"n\",xlfN},\n      {\"na\",xlfNa},\n      {\"names\",xlfNames},\n      {\"negbinom_dist\",xlfNegbinom_dist},\n      {\"negbinomdist\",xlfNegbinomdist},\n      {\"networkdays\",xlfNetworkdays},\n      {\"networkdays_intl\",xlfNetworkdays_intl},\n      {\"new\",xlcNew},\n      {\"newwebquery\",xlcNewwebquery},\n      {\"newwindow\",xlcNewWindow},\n      {\"nominal\",xlfNominal},\n      {\"norm_dist\",xlfNorm_dist},\n      {\"norm_inv\",xlfNorm_inv},\n      {\"norm_s_dist\",xlfNorm_s_dist},\n      {\"norm_s_inv\",xlfNorm_s_inv},\n      {\"normal\",xlcNormal},\n      {\"normdist\",xlfNormdist},\n      {\"norminv\",xlfNorminv},\n      {\"normsdist\",xlfNormsdist},\n      {\"normsinv\",xlfNormsinv},\n      {\"not\",xlfNot},\n      {\"note\",xlcNote},\n      {\"note\",xlfNote},\n      {\"now\",xlfNow},\n      {\"nper\",xlfNper},\n      {\"npv\",xlfNpv},\n      {\"numberstring\",xlfNumberstring},\n      {\"numbervalue\",xlfNumbervalue},\n      {\"objectproperties\",xlcObjectProperties},\n      {\"objectprotection\",xlcObjectProtection},\n      {\"oct2bin\",xlfOct2bin},\n      {\"oct2dec\",xlfOct2dec},\n      {\"oct2hex\",xlfOct2hex},\n      {\"odd\",xlfOdd},\n      {\"oddfprice\",xlfOddfprice},\n      {\"oddfyield\",xlfOddfyield},\n      {\"oddlprice\",xlfOddlprice},\n      {\"oddlyield\",xlfOddlyield},\n      {\"offset\",xlfOffset},\n      {\"ondata\",xlcOnData},\n      {\"ondoubleclick\",xlcOnDoubleclick},\n      {\"onentry\",xlcOnEntry},\n      {\"onkey\",xlcOnKey},\n      {\"onrecalc\",xlcOnRecalc},\n      {\"onsheet\",xlcOnSheet},\n      {\"ontime\",xlcOnTime},\n      {\"onwindow\",xlcOnWindow},\n      {\"open\",xlcOpen},\n      {\"opendialog\",xlfOpenDialog},\n      {\"openlinks\",xlcOpenLinks},\n      {\"openmail\",xlcOpenMail},\n      {\"opentext\",xlcOpenText},\n      {\"optionscalculation\",xlcOptionsCalculation},\n      {\"optionschart\",xlcOptionsChart},\n      {\"optionsedit\",xlcOptionsEdit},\n      {\"optionsgeneral\",xlcOptionsGeneral},\n      {\"optionslistsadd\",xlcOptionsListsAdd},\n      {\"optionslistsdelete\",xlcOptionsListsDelete},\n      {\"optionslistsget\",xlfOptionsListsGet},\n      {\"optionsme\",xlcOptionsMe},\n      {\"optionsmenono\",xlcOptionsMenono},\n      {\"optionssave\",xlcOptionsSave},\n      {\"optionsspell\",xlcOptionsSpell},\n      {\"optionstransition\",xlcOptionsTransition},\n      {\"optionsview\",xlcOptionsView},\n      {\"or\",xlfOr},\n      {\"outline\",xlcOutline},\n      {\"overlay\",xlcOverlay},\n      {\"overlaycharttype\",xlcOverlayChartType},\n      {\"pagesetup\",xlcPageSetup},\n      {\"parse\",xlcParse},\n      {\"paste\",xlcPaste},\n      {\"pastelink\",xlcPasteLink},\n      {\"pastepicture\",xlcPastePicture},\n      {\"pastepicturelink\",xlcPastePictureLink},\n      {\"pastespecial\",xlcPasteSpecial},\n      {\"pastetool\",xlcPasteTool},\n      {\"patterns\",xlcPatterns},\n      {\"pause\",xlfPause},\n      {\"pduration\",xlfPduration},\n      {\"pearson\",xlfPearson},\n      {\"percentile\",xlfPercentile},\n      {\"percentile_exc\",xlfPercentile_exc},\n      {\"percentile_inc\",xlfPercentile_inc},\n      {\"percentrank\",xlfPercentrank},\n      {\"percentrank_exc\",xlfPercentrank_exc},\n      {\"percentrank_inc\",xlfPercentrank_inc},\n      {\"permut\",xlfPermut},\n      {\"permutationa\",xlfPermutationa},\n      {\"phi\",xlfPhi},\n      {\"phonetic\",xlfPhonetic},\n      {\"pi\",xlfPi},\n      {\"picklist\",xlcPicklist},\n      {\"pivotadddata\",xlfPivotAddData},\n      {\"pivotaddfields\",xlcPivotAddFields},\n      {\"pivotfield\",xlcPivotField},\n      {\"pivotfieldgroup\",xlcPivotFieldGroup},\n      {\"pivotfieldproperties\",xlcPivotFieldProperties},\n      {\"pivotfieldungroup\",xlcPivotFieldUngroup},\n      {\"pivotitem\",xlcPivotItem},\n      {\"pivotitemproperties\",xlcPivotItemProperties},\n      {\"pivotrefresh\",xlcPivotRefresh},\n      {\"pivotshowpages\",xlcPivotShowPages},\n      {\"pivottablechart\",xlcPivotTableChart},\n      {\"pivottablewizard\",xlcPivotTableWizard},\n      {\"placement\",xlcPlacement},\n      {\"pmt\",xlfPmt},\n      {\"poisson\",xlfPoisson},\n      {\"poisson_dist\",xlfPoisson_dist},\n      {\"poke\",xlfPoke},\n      {\"postdocument\",xlcPostDocument},\n      {\"power\",xlfPower},\n      {\"ppmt\",xlfPpmt},\n      {\"precision\",xlcPrecision},\n      {\"preferred\",xlcPreferred},\n      {\"presstool\",xlfPressTool},\n      {\"price\",xlfPrice},\n      {\"pricedisc\",xlfPricedisc},\n      {\"pricemat\",xlfPricemat},\n      {\"print\",xlcPrint},\n      {\"printersetup\",xlcPrinterSetup},\n      {\"printpreview\",xlcPrintPreview},\n      {\"prob\",xlfProb},\n      {\"product\",xlfProduct},\n      {\"promote\",xlcPromote},\n      {\"proper\",xlfProper},\n      {\"protectdocument\",xlcProtectDocument},\n      {\"protectrevisions\",xlcProtectRevisions},\n      {\"pushbuttonproperties\",xlcPushbuttonProperties},\n      {\"pv\",xlfPv},\n      {\"quartile\",xlfQuartile},\n      {\"quartile_exc\",xlfQuartile_exc},\n      {\"quartile_inc\",xlfQuartile_inc},\n      {\"quit\",xlcQuit},\n      {\"quotient\",xlfQuotient},\n      {\"radians\",xlfRadians},\n      {\"rand\",xlfRand},\n      {\"randbetween\",xlfRandbetween},\n      {\"rank\",xlfRank},\n      {\"rank_avg\",xlfRank_avg},\n      {\"rank_eq\",xlfRank_eq},\n      {\"rate\",xlfRate},\n      {\"received\",xlfReceived},\n      {\"reftext\",xlfReftext},\n      {\"register\",xlfRegister},\n      {\"registerid\",xlfRegisterId},\n      {\"relref\",xlfRelref},\n      {\"removelistitem\",xlcRemoveListItem},\n      {\"removepagebreak\",xlcRemovePageBreak},\n      {\"renamecommand\",xlfRenameCommand},\n      {\"renameobject\",xlcRenameObject},\n      {\"replace\",xlfReplace},\n      {\"replaceb\",xlfReplaceb},\n      {\"replacefont\",xlcReplaceFont},\n      {\"rept\",xlfRept},\n      {\"request\",xlfRequest},\n      {\"resettool\",xlcResetTool},\n      {\"resettoolbar\",xlfResetToolbar},\n      {\"restart\",xlfRestart},\n      {\"result\",xlfResult},\n      {\"resume\",xlcResume},\n      {\"resume\",xlfResume},\n      {\"right\",xlfRight},\n      {\"rightb\",xlfRightb},\n      {\"rmprintarea\",xlcRmPrintArea},\n      {\"roman\",xlfRoman},\n      {\"round\",xlfRound},\n      {\"roundbahtdown\",xlfRoundbahtdown},\n      {\"roundbahtup\",xlfRoundbahtup},\n      {\"rounddown\",xlfRounddown},\n      {\"roundup\",xlfRoundup},\n      {\"routedocument\",xlcRouteDocument},\n      {\"routingslip\",xlcRoutingSlip},\n      {\"row\",xlfRow},\n      {\"rowheight\",xlcRowHeight},\n      {\"rows\",xlfRows},\n      {\"rri\",xlfRri},\n      {\"rsq\",xlfRsq},\n      {\"rtd\",xlfRtd},\n      {\"run\",xlcRun},\n      {\"save\",xlcSave},\n      {\"saveas\",xlcSaveAs},\n      {\"savecopyas\",xlcSaveCopyAs},\n      {\"savedialog\",xlfSaveDialog},\n      {\"savenewobject\",xlcSaveNewObject},\n      {\"savetoolbar\",xlfSaveToolbar},\n      {\"saveworkbook\",xlcSaveWorkbook},\n      {\"saveworkspace\",xlcSaveWorkspace},\n      {\"scale\",xlcScale},\n      {\"scenarioadd\",xlcScenarioAdd},\n      {\"scenariocells\",xlcScenarioCells},\n      {\"scenariodelete\",xlcScenarioDelete},\n      {\"scenarioedit\",xlcScenarioEdit},\n      {\"scenarioget\",xlfScenarioGet},\n      {\"scenariomerge\",xlcScenarioMerge},\n      {\"scenarioshow\",xlcScenarioShow},\n      {\"scenarioshownext\",xlcScenarioShowNext},\n      {\"scenariosummary\",xlcScenarioSummary},\n      {\"scrollbarproperties\",xlcScrollbarProperties},\n      {\"search\",xlfSearch},\n      {\"searchb\",xlfSearchb},\n      {\"sec\",xlfSec},\n      {\"sech\",xlfSech},\n      {\"second\",xlfSecond},\n      {\"select\",xlcSelect},\n      {\"selectall\",xlcSelectAll},\n      {\"selectchart\",xlcSelectChart},\n      {\"selectend\",xlcSelectEnd},\n      {\"selection\",xlfSelection},\n      {\"selectlastcell\",xlcSelectLastCell},\n      {\"selectlistitem\",xlcSelectListItem},\n      {\"selectplotarea\",xlcSelectPlotArea},\n      {\"selectspecial\",xlcSelectSpecial},\n      {\"sendkeys\",xlcSendKeys},\n      {\"sendmail\",xlcSendMail},\n      {\"sendtoback\",xlcSendToBack},\n      {\"series\",xlfSeries},\n      {\"seriesaxes\",xlcSeriesAxes},\n      {\"seriesorder\",xlcSeriesOrder},\n      {\"seriessum\",xlfSeriessum},\n      {\"seriesx\",xlcSeriesX},\n      {\"seriesy\",xlcSeriesY},\n      {\"setcontrolvalue\",xlcSetControlValue},\n      {\"setcriteria\",xlcSetCriteria},\n      {\"setdatabase\",xlcSetDatabase},\n      {\"setdialogdefault\",xlcSetDialogDefault},\n      {\"setdialogfocus\",xlcSetDialogFocus},\n      {\"setextract\",xlcSetExtract},\n      {\"setlistitem\",xlcSetListItem},\n      {\"setname\",xlfSetName},\n      {\"setpagebreak\",xlcSetPageBreak},\n      {\"setpreferred\",xlcSetPreferred},\n      {\"setprintarea\",xlcSetPrintArea},\n      {\"setprinttitles\",xlcSetPrintTitles},\n      {\"setupdatestatus\",xlcSetUpdateStatus},\n      {\"setvalue\",xlfSetValue},\n      {\"share\",xlcShare},\n      {\"sharename\",xlcShareName},\n      {\"sheet\",xlfSheet},\n      {\"sheetbackground\",xlcSheetBackground},\n      {\"sheets\",xlfSheets},\n      {\"shortmenus\",xlcShortMenus},\n      {\"showactivecell\",xlcShowActiveCell},\n      {\"showbar\",xlfShowBar},\n      {\"showclipboard\",xlcShowClipboard},\n      {\"showdetail\",xlcShowDetail},\n      {\"showdialog\",xlcShowDialog},\n      {\"showinfo\",xlcShowInfo},\n      {\"showlevels\",xlcShowLevels},\n      {\"showtoolbar\",xlcShowToolbar},\n      {\"sign\",xlfSign},\n      {\"sin\",xlfSin},\n      {\"sinh\",xlfSinh},\n      {\"size\",xlcSize},\n      {\"skew\",xlfSkew},\n      {\"skew_p\",xlfSkew_p},\n      {\"sln\",xlfSln},\n      {\"slope\",xlfSlope},\n      {\"small\",xlfSmall},\n      {\"sort\",xlcSort},\n      {\"sortspecial\",xlcSortSpecial},\n      {\"soundnote\",xlcSoundNote},\n      {\"soundplay\",xlcSoundPlay},\n      {\"spelling\",xlcSpelling},\n      {\"spellingcheck\",xlfSpellingCheck},\n      {\"split\",xlcSplit},\n      {\"sqrt\",xlfSqrt},\n      {\"sqrtpi\",xlfSqrtpi},\n      {\"standardfont\",xlcStandardFont},\n      {\"standardize\",xlfStandardize},\n      {\"standardwidth\",xlcStandardWidth},\n      {\"stdev\",xlfStdev},\n      {\"stdev_p\",xlfStdev_p},\n      {\"stdev_s\",xlfStdev_s},\n      {\"stdeva\",xlfStdeva},\n      {\"stdevp\",xlfStdevp},\n      {\"stdevpa\",xlfStdevpa},\n      {\"step\",xlfStep},\n      {\"steyx\",xlfSteyx},\n      {\"style\",xlcStyle},\n      {\"subscribeto\",xlcSubscribeTo},\n      {\"substitute\",xlfSubstitute},\n      {\"subtotal\",xlfSubtotal},\n      {\"subtotalcreate\",xlcSubtotalCreate},\n      {\"subtotalremove\",xlcSubtotalRemove},\n      {\"sum\",xlfSum},\n      {\"sumif\",xlfSumif},\n      {\"sumifs\",xlfSumifs},\n      {\"summaryinfo\",xlcSummaryInfo},\n      {\"sumproduct\",xlfSumproduct},\n      {\"sumsq\",xlfSumsq},\n      {\"sumx2my2\",xlfSumx2my2},\n      {\"sumx2py2\",xlfSumx2py2},\n      {\"sumxmy2\",xlfSumxmy2},\n      {\"syd\",xlfSyd},\n      {\"t\",xlfT},\n      {\"t_dist\",xlfT_dist},\n      {\"t_dist_2t\",xlfT_dist_2t},\n      {\"t_dist_rt\",xlfT_dist_rt},\n      {\"t_inv\",xlfT_inv},\n      {\"t_inv_2t\",xlfT_inv_2t},\n      {\"t_test\",xlfT_test},\n      {\"table\",xlcTable},\n      {\"taborder\",xlcTabOrder},\n      {\"tan\",xlfTan},\n      {\"tanh\",xlfTanh},\n      {\"tbilleq\",xlfTbilleq},\n      {\"tbillprice\",xlfTbillprice},\n      {\"tbillyield\",xlfTbillyield},\n      {\"tdist\",xlfTdist},\n      {\"terminate\",xlfTerminate},\n      {\"text\",xlfText},\n      {\"textbox\",xlfTextBox},\n      {\"textref\",xlfTextref},\n      {\"texttocolumns\",xlcTextToColumns},\n      {\"thaidayofweek\",xlfThaidayofweek},\n      {\"thaidigit\",xlfThaidigit},\n      {\"thaimonthofyear\",xlfThaimonthofyear},\n      {\"thainumsound\",xlfThainumsound},\n      {\"thainumstring\",xlfThainumstring},\n      {\"thaistringlength\",xlfThaistringlength},\n      {\"thaiyear\",xlfThaiyear},\n      {\"time\",xlfTime},\n      {\"timevalue\",xlfTimevalue},\n      {\"tinv\",xlfTinv},\n      {\"today\",xlfToday},\n      {\"tracerclear\",xlcTracerClear},\n      {\"tracerdisplay\",xlcTracerDisplay},\n      {\"tracererror\",xlcTracerError},\n      {\"tracernavigate\",xlcTracerNavigate},\n      {\"transpose\",xlfTranspose},\n      {\"traversenotes\",xlcTraverseNotes},\n      {\"trend\",xlfTrend},\n      {\"trim\",xlfTrim},\n      {\"trimmean\",xlfTrimmean},\n      {\"true\",xlfTrue},\n      {\"trunc\",xlfTrunc},\n      {\"ttest\",xlfTtest},\n      {\"type\",xlfType},\n      {\"undo\",xlcUndo},\n      {\"ungroup\",xlcUngroup},\n      {\"ungroupsheets\",xlcUngroupSheets},\n      {\"unhide\",xlcUnhide},\n      {\"unichar\",xlfUnichar},\n      {\"unicode\",xlfUnicode},\n      {\"unlockednext\",xlcUnlockedNext},\n      {\"unlockedprev\",xlcUnlockedPrev},\n      {\"unprotectrevisions\",xlcUnprotectRevisions},\n      {\"unregister\",xlfUnregister},\n      {\"updatelink\",xlcUpdateLink},\n      {\"upper\",xlfUpper},\n      {\"usdollar\",xlfUsdollar},\n      {\"value\",xlfValue},\n      {\"var\",xlfVar},\n      {\"var_p\",xlfVar_p},\n      {\"var_s\",xlfVar_s},\n      {\"vara\",xlfVara},\n      {\"varp\",xlfVarp},\n      {\"varpa\",xlfVarpa},\n      {\"vbaactivate\",xlcVbaactivate},\n      {\"vbainsertfile\",xlcVbaInsertFile},\n      {\"vbamakeaddin\",xlcVbaMakeAddin},\n      {\"vbaproceduredefinition\",xlcVbaProcedureDefinition},\n      {\"vdb\",xlfVdb},\n      {\"view3d\",xlcView3d},\n      {\"viewdefine\",xlcViewDefine},\n      {\"viewdelete\",xlcViewDelete},\n      {\"viewget\",xlfViewGet},\n      {\"viewshow\",xlcViewShow},\n      {\"vline\",xlcVline},\n      {\"vlookup\",xlfVlookup},\n      {\"volatile\",xlfVolatile},\n      {\"vpage\",xlcVpage},\n      {\"vscroll\",xlcVscroll},\n      {\"wait\",xlcWait},\n      {\"webpublish\",xlcWebPublish},\n      {\"webservice\",xlfWebservice},\n      {\"weekday\",xlfWeekday},\n      {\"weeknum\",xlfWeeknum},\n      {\"weibull\",xlfWeibull},\n      {\"weibull_dist\",xlfWeibull_dist},\n      {\"windowmaximize\",xlcWindowMaximize},\n      {\"windowminimize\",xlcWindowMinimize},\n      {\"windowmove\",xlcWindowMove},\n      {\"windowrestore\",xlcWindowRestore},\n      {\"windows\",xlfWindows},\n      {\"windowsize\",xlcWindowSize},\n      {\"windowtitle\",xlfWindowTitle},\n      {\"workbookactivate\",xlcWorkbookActivate},\n      {\"workbookadd\",xlcWorkbookAdd},\n      {\"workbookcopy\",xlcWorkbookCopy},\n      {\"workbookdelete\",xlcWorkbookDelete},\n      {\"workbookhide\",xlcWorkbookHide},\n      {\"workbookinsert\",xlcWorkbookInsert},\n      {\"workbookmove\",xlcWorkbookMove},\n      {\"workbookname\",xlcWorkbookName},\n      {\"workbooknew\",xlcWorkbookNew},\n      {\"workbooknext\",xlcWorkbookNext},\n      {\"workbookoptions\",xlcWorkbookOptions},\n      {\"workbookprev\",xlcWorkbookPrev},\n      {\"workbookprotect\",xlcWorkbookProtect},\n      {\"workbookscroll\",xlcWorkbookScroll},\n      {\"workbookselect\",xlcWorkbookSelect},\n      {\"workbooktabsplit\",xlcWorkbookTabSplit},\n      {\"workbookunhide\",xlcWorkbookUnhide},\n      {\"workday\",xlfWorkday},\n      {\"workday_intl\",xlfWorkday_intl},\n      {\"workgroup\",xlcWorkgroup},\n      {\"workgroupoptions\",xlcWorkgroupOptions},\n      {\"workspace\",xlcWorkspace},\n      {\"xirr\",xlfXirr},\n      {\"xnpv\",xlfXnpv},\n      {\"xor\",xlfXor},\n      {\"year\",xlfYear},\n      {\"yearfrac\",xlfYearfrac},\n      {\"yield\",xlfYield},\n      {\"yielddisc\",xlfYielddisc},\n      {\"yieldmat\",xlfYieldmat},\n      {\"z_test\",xlfZ_test},\n      {\"zoom\",xlcZoom},\n      {\"ztest\",xlfZtest},\n    };\n\n    short funcNumToName[] = { \n      151,\n      -1,\n      480,\n      476,\n      846,\n      61,\n      543,\n      533,\n      734,\n      128,\n      562,\n      586,\n      832,\n      236,\n      316,\n      812,\n      147,\n      865,\n      52,\n      652,\n      827,\n      281,\n      509,\n      511,\n      1,\n      469,\n      811,\n      727,\n      517,\n      458,\n      715,\n      541,\n      500,\n      913,\n      896,\n      293,\n      32,\n      626,\n      581,\n      549,\n      201,\n      242,\n      195,\n      234,\n      233,\n      240,\n      914,\n      245,\n      872,\n      503,\n      893,\n      512,\n      410,\n      407,\n      411,\n      -1,\n      690,\n      356,\n      585,\n      667,\n      702,\n      547,\n      473,\n      697,\n      532,\n      191,\n      883,\n      196,\n      553,\n      974,\n      938,\n      425,\n      545,\n      764,\n      584,\n      44,\n      736,\n      129,\n      599,\n      2,\n      707,\n      45,\n      760,\n      891,\n      272,\n      838,\n      899,\n      248,\n      790,\n      95,\n      225,\n      946,\n      777,\n      235,\n      13,\n      769,\n      720,\n      53,\n      48,\n      5,\n      118,\n      424,\n      931,\n      506,\n      462,\n      487,\n      391,\n      394,\n      796,\n      510,\n      279,\n      104,\n      518,\n      911,\n      686,\n      497,\n      723,\n      278,\n      894,\n      712,\n      842,\n      126,\n      563,\n      229,\n      310,\n      101,\n      475,\n      488,\n      482,\n      474,\n      856,\n      561,\n      322,\n      294,\n      351,\n      348,\n      347,\n      359,\n      358,\n      346,\n      194,\n      884,\n      817,\n      855,\n      203,\n      389,\n      704,\n      874,\n      459,\n      705,\n      94,\n      16,\n      21,\n      18,\n      260,\n      109,\n      710,\n      804,\n      216,\n      214,\n      388,\n      228,\n      119,\n      535,\n      546,\n      548,\n      298,\n      472,\n      673,\n      152,\n      97,\n      -1,\n      -1,\n      -1,\n      -1,\n      461,\n      716,\n      670,\n      280,\n      871,\n      719,\n      413,\n      386,\n      684,\n      291,\n      387,\n      405,\n      403,\n      390,\n      239,\n      481,\n      395,\n      583,\n      836,\n      918,\n      241,\n      246,\n      897,\n      479,\n      202,\n      212,\n      909,\n      -1,\n      -1,\n      912,\n      311,\n      761,\n      713,\n      498,\n      724,\n      542,\n      501,\n      731,\n      730,\n      47,\n      200,\n      699,\n      -1,\n      -1,\n      24,\n      198,\n      886,\n      924,\n      -1,\n      -1,\n      -1,\n      -1,\n      537,\n      850,\n      813,\n      148,\n      866,\n      49,\n      6,\n      54,\n      227,\n      166,\n      932,\n      494,\n      182,\n      181,\n      338,\n      392,\n      873,\n      460,\n      409,\n      396,\n      199,\n      639,\n      -1,\n      -1,\n      722,\n      350,\n      26,\n      222,\n      -1,\n      718,\n      276,\n      402,\n      401,\n      825,\n      275,\n      42,\n      948,\n      746,\n      263,\n      676,\n      706,\n      404,\n      60,\n      75,\n      380,\n      76,\n      83,\n      110,\n      111,\n      131,\n      136,\n      168,\n      277,\n      283,\n      295,\n      313,\n      314,\n      315,\n      317,\n      378,\n      379,\n      98,\n      430,\n      516,\n      513,\n      565,\n      577,\n      579,\n      578,\n      580,\n      830,\n      594,\n      648,\n      668,\n      870,\n      940,\n      854,\n      852,\n      853,\n      117,\n      146,\n      162,\n      323,\n      352,\n      470,\n      641,\n      738,\n      839,\n      818,\n      898,\n      683,\n      226,\n      384,\n      412,\n      851,\n      491,\n      815,\n      981,\n      493,\n      819,\n      691,\n      642,\n      645,\n      550,\n      895,\n      885,\n      -1,\n      557,\n      393,\n      135,\n      672,\n      654,\n      400,\n      398,\n      399,\n      696,\n      210,\n      843,\n      847,\n      154,\n      153,\n      754,\n      619,\n      486,\n      192,\n      193,\n      587,\n      726,\n      609,\n      744,\n      928,\n      397,\n      428,\n      651,\n      62,\n      534,\n      544,\n      837,\n      919,\n      835,\n      917,\n      66,\n      876,\n      877,\n      878,\n      879,\n      880,\n      881,\n      489,\n      728,\n      729,\n      882,\n      739,\n      177,\n      172,\n      173,\n      174,\n      414,\n      415,\n      416,\n      204,\n      205,\n      206,\n      591,\n      593,\n      592,\n      77,\n      79,\n      78,\n      455,\n      442,\n      447,\n      433,\n      454,\n      444,\n      446,\n      445,\n      452,\n      437,\n      443,\n      435,\n      436,\n      434,\n      449,\n      134,\n      456,\n      448,\n      780,\n      292,\n      828,\n      695,\n      223,\n      385,\n      477,\n      484,\n      558,\n      267,\n      269,\n      70,\n      71,\n      72,\n      69,\n      971,\n      972,\n      679,\n      978,\n      471,\n      703,\n      231,\n      678,\n      977,\n      867,\n      868,\n      869,\n      677,\n      976,\n      237,\n      238,\n      571,\n      259,\n      179,\n      178,\n      250,\n      266,\n      975,\n      156,\n      157,\n      158,\n      159,\n      160,\n      161,\n      244,\n      536,\n      597,\n      598,\n      595,\n      596,\n      698,\n      939,\n      30,\n      31,\n      141,\n      3,\n      4,\n      966,\n      566,\n      383,\n      559,\n      496,\n      357,\n      171,\n      175,\n      176,\n      431,\n      155,\n      848,\n      63,\n      64,\n      27,\n      80,\n      82,\n      137,\n      138,\n      116,\n      290,\n      163,\n      164,\n      282,\n      376,\n      377,\n      551,\n      552,\n      572,\n      573,\n      643,\n      644,\n      646,\n      647,\n      669,\n      692,\n      693,\n      700,\n      701,\n      834,\n      833,\n      857,\n      858,\n      859,\n      860,\n      861,\n      916,\n      915,\n      941,\n      567,\n      967,\n      249,\n      483,\n      -1,\n      73,\n      74,\n      112,\n      113,\n      114,\n      115,\n      286,\n      287,\n      288,\n      289,\n      429,\n      514,\n      515,\n      564,\n      574,\n      575,\n      862,\n      979,\n      268,\n      270,\n      381,\n      100,\n      319,\n      7,\n      8,\n      149,\n      150,\n      169,\n      170,\n      762,\n      763,\n      457,\n      439,\n      440,\n      441,\n      450,\n      451,\n      84,\n      86,\n      88,\n      85,\n      87,\n      649,\n      132,\n      973,\n      640,\n      67,\n      207,\n      197,\n      81,\n      375,\n      816,\n      382,\n      650,\n      737,\n      904,\n      905,\n      560,\n      43,\n      485,\n      588,\n      799,\n      801,\n      345,\n      478,\n      432,\n      99,\n      318,\n      453,\n      438,\n      309,\n      937,\n      264\n    };\n\n    short cmdNumToName[] = { \n      68,\n      608,\n      610,\n      125,\n      741,\n      742,\n      297,\n      630,\n      680,\n      681,\n      694,\n      570,\n      46,\n      947,\n      944,\n      353,\n      124,\n      740,\n      -1,\n      -1,\n      -1,\n      -1,\n      793,\n      794,\n      791,\n      709,\n      320,\n      232,\n      687,\n      674,\n      0,\n      92,\n      93,\n      -1,\n      185,\n      285,\n      184,\n      785,\n      784,\n      820,\n      190,\n      863,\n      331,\n      29,\n      840,\n      89,\n      102,\n      130,\n      900,\n      183,\n      142,\n      632,\n      120,\n      636,\n      253,\n      463,\n      303,\n      300,\n      -1,\n      -1,\n      -1,\n      208,\n      165,\n      343,\n      340,\n      770,\n      803,\n      366,\n      367,\n      368,\n      371,\n      372,\n      374,\n      133,\n      675,\n      22,\n      408,\n      792,\n      65,\n      499,\n      55,\n      15,\n      767,\n      772,\n      638,\n      530,\n      628,\n      749,\n      328,\n      335,\n      256,\n      631,\n      490,\n      417,\n      903,\n      970,\n      336,\n      339,\n      337,\n      186,\n      187,\n      341,\n      342,\n      9,\n      10,\n      12,\n      906,\n      907,\n      144,\n      765,\n      217,\n      215,\n      930,\n      423,\n      933,\n      426,\n      934,\n      427,\n      28,\n      568,\n      96,\n      805,\n      540,\n      -1,\n      633,\n      33,\n      211,\n      735,\n      330,\n      334,\n      344,\n      774,\n      773,\n      35,\n      714,\n      349,\n      808,\n      826,\n      607,\n      600,\n      230,\n      247,\n      627,\n      508,\n      296,\n      747,\n      188,\n      143,\n      606,\n      935,\n      327,\n      304,\n      302,\n      219,\n      582,\n      802,\n      -1,\n      -1,\n      -1,\n      795,\n      -1,\n      127,\n      220,\n      945,\n      942,\n      271,\n      103,\n      91,\n      603,\n      40,\n      39,\n      41,\n      38,\n      37,\n      90,\n      776,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      531,\n      629,\n      768,\n      611,\n      775,\n      829,\n      139,\n      821,\n      360,\n      362,\n      363,\n      364,\n      925,\n      406,\n      968,\n      301,\n      910,\n      685,\n      224,\n      806,\n      -1,\n      901,\n      589,\n      745,\n      797,\n      798,\n      243,\n      36,\n      50,\n      590,\n      422,\n      788,\n      167,\n      841,\n      57,\n      810,\n      -1,\n      682,\n      252,\n      809,\n      329,\n      332,\n      604,\n      257,\n      209,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      502,\n      -1,\n      -1,\n      265,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      373,\n      539,\n      254,\n      634,\n      635,\n      824,\n      -1,\n      980,\n      -1,\n      721,\n      466,\n      943,\n      814,\n      554,\n      -1,\n      -1,\n      822,\n      823,\n      333,\n      284,\n      324,\n      -1,\n      -1,\n      361,\n      365,\n      299,\n      -1,\n      180,\n      25,\n      255,\n      601,\n      602,\n      950,\n      955,\n      951,\n      959,\n      748,\n      -1,\n      -1,\n      107,\n      221,\n      556,\n      963,\n      949,\n      51,\n      -1,\n      145,\n      717,\n      140,\n      637,\n      -1,\n      666,\n      305,\n      957,\n      -1,\n      -1,\n      751,\n      752,\n      750,\n      753,\n      756,\n      757,\n      758,\n      665,\n      658,\n      656,\n      660,\n      655,\n      -1,\n      613,\n      615,\n      625,\n      19,\n      538,\n      56,\n      920,\n      614,\n      -1,\n      -1,\n      921,\n      -1,\n      923,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      733,\n      -1,\n      732,\n      525,\n      -1,\n      -1,\n      467,\n      258,\n      370,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      106,\n      -1,\n      661,\n      -1,\n      954,\n      624,\n      616,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      307,\n      -1,\n      -1,\n      520,\n      521,\n      527,\n      528,\n      523,\n      526,\n      189,\n      468,\n      321,\n      519,\n      953,\n      965,\n      952,\n      956,\n      -1,\n      369,\n      -1,\n      17,\n      213,\n      105,\n      59,\n      864,\n      807,\n      766,\n      902,\n      844,\n      845,\n      711,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      962,\n      958,\n      960,\n      964,\n      354,\n      961,\n      -1,\n      -1,\n      759,\n      663,\n      875,\n      326,\n      505,\n      888,\n      -1,\n      -1,\n      -1,\n      -1,\n      890,\n      887,\n      889,\n      657,\n      659,\n      108,\n      492,\n      507,\n      251,\n      662,\n      504,\n      612,\n      421,\n      787,\n      261,\n      689,\n      786,\n      306,\n      308,\n      121,\n      355,\n      20,\n      789,\n      708,\n      771,\n      783,\n      743,\n      -1,\n      617,\n      618,\n      778,\n      781,\n      782,\n      273,\n      274,\n      325,\n      779,\n      524,\n      123,\n      34,\n      522,\n      605,\n      831,\n      755,\n      849,\n      312,\n      14,\n      262,\n      922,\n      -1,\n      464,\n      969,\n      529,\n      -1,\n      -1,\n      58,\n      -1,\n      -1,\n      -1,\n      671,\n      -1,\n      653,\n      -1,\n      929,\n      926,\n      927,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      800,\n      465,\n      621,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      576,\n      495,\n      725,\n      122,\n      23,\n      555,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      420,\n      419,\n      218,\n      892,\n      11,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      688,\n      908,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      620,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      936,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      569,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      664,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      622,\n      -1,\n      623,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      -1,\n      418\n    };\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/ExcelObj.cpp",
    "content": "#include <xloil/ExcelObj.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/NumericTypeConverters.h>\n#include <xloil/Throw.h>\n#include <xloil/Date.h>\n#include <xloil/Log.h>\n#include <xloil/StringUtils.h>\n#include <xlOil/ExcelRef.h>\n#include <xloil/ArrayBuilder.h>\n#include <xloil/ExcelArray.h>\n#include <xloil/StringUtils.h>\n#include <array>\n#include <algorithm>\n#include <cstring>\n#include <vector>\n#include <string>\n\nusing std::string;\nusing std::wstring;\nusing std::vector;\nusing namespace msxll;\nusing namespace std::string_literals;\n\nnamespace xloil\n{\nnamespace\n{\n  static_assert(sizeof(xloper12) == sizeof(xloil::ExcelObj));\n\n  wchar_t* makePStringBuffer(size_t nChars)\n  {\n    nChars = std::min<size_t>(nChars, XL_STRING_MAX_LEN);\n    auto buf = new wchar_t[nChars + 1];\n    buf[0] = (wchar_t)nChars;\n    return buf;\n  }\n\n  wchar_t* pascalWStringFromC(const char* cstr, size_t len)\n  {\n    assert(cstr);\n    // The wchar buffer may be too long if there are multibyte chars in the input\n    auto pstr = makePStringBuffer(len);\n    auto nChars = MultiByteToWideChar(CP_UTF8, 0, cstr, int(len), pstr + 1, pstr[0]);\n    // nChars <= pstr[0] so cast to wchar is OK\n    *pstr = (wchar_t)nChars;\n    if (nChars == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER)\n    {\n      nChars = MultiByteToWideChar(\n        CP_UTF8, 0, cstr, std::min<int>(nChars, XL_STRING_MAX_LEN), pstr + 1, pstr[0]);\n    }\n    return pstr;\n  }\n\n  size_t totalStringLength(const xloper12* arr, size_t nRows, size_t nCols)\n  {\n    size_t total = 0;\n    auto endData = arr + (nRows * nCols);\n    for (; arr != endData; ++arr)\n      if (arr->xltype == xltypeStr)\n        total += arr->val.str.data[0];\n    return total;\n  }\n}\n\n  // TODO: https://stackoverflow.com/questions/52737760/how-to-define-string-literal-with-character-type-that-depends-on-template-parame\n  const wchar_t* enumAsWCString(CellError e)\n  {\n    switch (e)\n    {\n    case CellError::Null: return L\"#NULL\";\n    case CellError::Div0: return L\"#DIV/0\";\n    case CellError::Value: return L\"#VALUE!\";\n    case CellError::Ref: return L\"#REF!\";\n    case CellError::Name: return L\"#NAME?\";\n    case CellError::Num: return L\"#NUM!\";\n    case CellError::NA: return L\"#N/A\";\n    case CellError::GettingData: return L\"#GETTING_DATA\";\n    default:\n      return L\"#ERR!\";\n    }\n  }\n  const wchar_t* enumAsWCString(ExcelType e)\n  {\n    switch (e)\n    {\n      case ExcelType::Num:     return L\"Num\";\n      case ExcelType::Str :    return L\"Str\";\n      case ExcelType::Bool:    return L\"Bool\";\n      case ExcelType::Ref :    return L\"Ref\";\n      case ExcelType::Err :    return L\"Err\";\n      case ExcelType::Flow:    return L\"Flow\";\n      case ExcelType::Multi:   return L\"Multi\";\n      case ExcelType::Missing: return L\"Missing\";\n      case ExcelType::Nil :    return L\"Nil\";\n      case ExcelType::SRef:    return L\"SRef\";\n      case ExcelType::Int :    return L\"Int\";\n      case ExcelType::BigData: return L\"BigData\";\n      default:\n        return L\"Unknown\";\n    }\n  }\n\n\n  ExcelObj::ExcelObj(ExcelType t)\n  {\n    switch (t)\n    {\n    case ExcelType::Num: val.num = 0; break;\n    case ExcelType::Int: val.w = 0; break;\n    case ExcelType::Bool: val.xbool = 0; break;\n    case ExcelType::Str: val.str = Const::EmptyStr().val.str; break;\n    case ExcelType::Err: val.err = (int)CellError::NA; break;\n    case ExcelType::Multi: val.array.rows = 0; val.array.columns = 0; break;\n    case ExcelType::SRef:\n    case ExcelType::Flow:\n    case ExcelType::BigData:\n      XLO_THROW(\"Flow and SRef and BigData types not supported\");\n    }\n    xltype = int(t);\n  }\n\n  void ExcelObj::createFromChars(const char* chars, size_t len)\n  {\n    val.str.data = len == 0\n      ? Const::EmptyStr().val.str.data\n      : pascalWStringFromC(chars, len);\n    val.str.xloil_view = false;\n    xltype = xltypeStr;\n  }\n\n  ExcelObj::ExcelObj(const std::tm& dt)\n    : ExcelObj(excelSerialDateFromYMDHMS(\n        dt.tm_year + 1900, dt.tm_mon + 1, dt.tm_mday,\n        dt.tm_hour, dt.tm_min, dt.tm_sec, 0))\n  {}\n\n  ExcelObj::ExcelObj(msxll::IDSHEET sheet, const msxll::xlref12 & ref)\n  {\n    if (ref.rwFirst >= XL_MAX_ROWS || ref.rwFirst > ref.rwLast)\n      XLO_THROW(\"ExcelRef out of range fromRow={0}, toRow={1}\", ref.rwFirst, ref.rwLast);\n    if (ref.colFirst >= XL_MAX_COLS || ref.colFirst > ref.colLast)\n      XLO_THROW(\"ExcelRef out of range fromCol={0}, toCol={1}\", ref.colFirst, ref.colLast);\n\n    val.mref.idSheet = sheet;\n    val.mref.lpmref = new msxll::XLMREF12[1];\n    val.mref.lpmref->count = 1;\n    val.mref.lpmref->reftbl[0] = ref;\n    xltype = msxll::xltypeRef | msxll::xlbitDLLFree;\n  }\n\n\n  void ExcelObj::reset() noexcept\n  {\n    if ((xltype & xlbitXLFree) != 0)\n    {\n      callExcelRaw(xlFree, this, this); // arg is not really const here!\n    }\n    else\n    {\n      switch (xtype())\n      {\n      case xltypeStr:\n        if (val.str.data != nullptr && val.str.data != Const::EmptyStr().val.str.data\n          && !val.str.xloil_view)\n          PStringAllocator<wchar_t>().deallocate(val.str.data, 0);\n        break;\n\n      case xltypeMulti:\n        // Arrays are allocated as an array of char which contains all their strings\n        // So we don't need to loop and free them individually. If we are at this point\n        // we must have created the ExcelObj ourselves, so it is safe to use the\n        // xloil_view extension.\n        if (!val.array.xloil_view)\n          delete[] (char*)(val.array.lparray);\n        break;\n\n      case xltypeBigData:\n        // Only delete if count > 0. Excel uses bigdata for async return handles and sets\n        // lpbData to an int handle, but leaves cbData = 0.  We never create a bigdata object\n        // (other than copying async handles) so this delete should not be triggered.\n        if (val.bigdata.cbData > 0)\n          delete[](char*)val.bigdata.h.lpbData;\n        break;\n\n      case xltypeRef:\n        delete[] (char*)val.mref.lpmref;\n        break;\n      }\n    }\n    xltype = xltypeNil;\n  }\n\n  namespace\n  {\n    struct Compare\n    {\n      template<class T> int operator()(T l, T r) const\n      {\n        return l < r ? -1 : (l == r ? 0 : 1);\n      }\n    };\n    struct CompareEqual\n    {\n      template<class T> int operator()(T l, T r) const\n      {\n        return l == r ? 0 : -1;\n      }\n    };\n  }\n\n  template <class TCmp>\n  int doCompare(\n    const ExcelObj& left, \n    const ExcelObj& right, \n    bool caseSensitive,\n    bool recursive) noexcept\n  {\n    if (&left == &right)\n      return 0;\n\n    const auto lType = left.xtype();\n    const auto rType = right.xtype();\n    if (lType == rType)\n    {\n      switch (lType)\n      {\n      case xltypeNum:\n        return TCmp()(left.val.num, right.val.num);\n      case xltypeBool:\n        return TCmp()(left.val.xbool, right.val.xbool);\n      case xltypeInt:\n        return TCmp()(left.val.w, right.val.w);\n      case xltypeErr:\n        return TCmp()(left.val.err, right.val.err);\n      case xltypeMissing:\n      case xltypeNil:\n        return 0;\n\n      case xltypeStr:\n      {\n        auto lLen = left.val.str.data[0];\n        auto rLen = right.val.str.data[0];\n        auto len = std::min(lLen, rLen);\n        auto c = caseSensitive\n          ? _wcsncoll(left.val.str.data + 1, right.val.str.data + 1, len)\n          : _wcsnicoll(left.val.str.data + 1, right.val.str.data + 1, len);\n        return c != 0 ? c : TCmp()(lLen, rLen);\n      }\n      case xltypeMulti:\n      {\n        auto ret = TCmp()(left.val.array.columns * left.val.array.rows,\n          right.val.array.columns * right.val.array.rows);\n        if (ret != 0)\n          return ret;\n        if (!recursive)\n          return 0;\n\n        auto arrL = left.val.array.lparray;\n        auto arrR = right.val.array.lparray;\n        const auto end = arrL + (left.val.array.columns * left.val.array.rows);\n        while (ret == 0 && arrL < end)\n          ret = TCmp()((ExcelObj&)*arrL++, (ExcelObj&)*arrR++);\n        return ret;\n      }\n      case xltypeRef:\n      case xltypeSRef:\n        // Case doesn't matter as we control the string representation for ranges\n        return wcscmp(left.toString().c_str(), right.toString().c_str());\n\n      default: // BigData or Flow types - not sure why you would be comparing these?!\n        return 0;\n      }\n    }\n    else\n    {\n      // If both types are num/int/bool we can compare as doubles\n      constexpr int typeNumeric = xltypeNum | xltypeBool | xltypeInt;\n\n      if (((lType | rType) & ~typeNumeric) == 0)\n        return TCmp()(left.get<double>(), right.get<double>());\n\n      // Errors come last\n      if (((lType | rType) & xltypeErr) != 0)\n        return rType == xltypeErr ? -1 : 1;\n\n      // We want all numerics to come before string, so mask them to zero\n      return (lType & ~typeNumeric) < (rType & ~typeNumeric) ? -1 : 1;\n    }\n  }\n\n  bool ExcelObj::operator==(const ExcelObj& that) const\n  {\n    return doCompare<CompareEqual>(*this, that, true, true) == 0;\n  }\n\n  int ExcelObj::compare(\n    const ExcelObj& left,\n    const ExcelObj& right,\n    bool caseSensitive,\n    bool recursive) noexcept\n  {\n    return doCompare<Compare>(left, right, caseSensitive, recursive);\n  }\n\n  std::wstring ExcelObj::toStringRecursive(const wchar_t* separator) const\n  {\n    switch (xtype())\n    {\n    case xltypeNum:\n      return formatStr(L\"%G\", val.num);\n\n    case xltypeBool:\n      return wstring(val.xbool ? L\"TRUE\" : L\"FALSE\");\n\n    case xltypeInt:\n      return std::to_wstring(val.w);\n\n    case xltypeStr:\n    {\n      const size_t len = val.str.data ? val.str.data[0] : 0;\n      return len == 0 ? wstring() : wstring(val.str.data + 1, len);\n    }\n\n    case xltypeMissing:\n    case xltypeNil:\n      return L\"\";\n\n    case xltypeErr:\n      return enumAsWCString(CellError(val.err));\n\n    case xltypeSRef:\n    case xltypeRef:\n      return ExcelRef(*this).value().toStringRecursive(separator);\n\n    case xltypeMulti:\n    {\n      ExcelArray arr(*this); // Note that this trims the array\n      wstring str;\n      str.reserve(arr.size() * 8); // 8 is an arb choice\n      if (separator)\n      {\n        wstring sep(separator);\n        for (ExcelArray::size_type i = 0; i < arr.size(); ++i)\n          str += arr(i).toStringRecursive() + sep;\n        if (!str.empty())\n          str.erase(str.size() - sep.length());\n      }\n      else\n        for (ExcelArray::size_type i = 0; i < arr.size(); ++i)\n          str += arr(i).toStringRecursive();\n      return str;\n    }\n\n    default:\n      return L\"#???\";\n    }\n  }\n  std::wstring ExcelObj::toString() const noexcept\n  {\n    try\n    {\n      switch (xtype())\n      {\n      case xltypeSRef:\n      case xltypeRef:\n      {\n        ExcelRef range(*this);\n        return range.address();\n      }\n      case xltypeMulti:\n        return formatStr(L\"[%d x %d]\", val.array.rows, val.array.columns);\n      default:\n        return toStringRecursive();\n      }\n    }\n    catch (...)\n    {\n      // TODO: when does this ever happen?\n      return L\"<ERROR>\"s;\n    }\n  }\n\n  uint16_t ExcelObj::maxStringLength() const noexcept\n  {\n    switch (xtype())\n    {\n    case xltypeInt:\n    case xltypeNum:\n      return 20;\n\n    case xltypeBool:\n      return 5;\n\n    case xltypeStr:\n      return val.str.data[0];\n\n    case xltypeMissing:\n    case xltypeNil:\n      return 0;\n\n    case xltypeErr:\n      return 8;\n\n    case xltypeSRef:\n      return XL_CELL_ADDRESS_RC_MAX_LEN + XL_SHEET_NAME_MAX_LEN;\n\n    case xltypeRef:\n      return 256 + XL_CELL_ADDRESS_RC_MAX_LEN + XL_SHEET_NAME_MAX_LEN;\n\n    case xltypeMulti:\n    {\n      size_t n = 0;\n      auto p = (const ExcelObj*)val.array.lparray;\n      const auto pEnd = p + (val.array.rows * val.array.columns);\n      while (p < pEnd) n += (p++)->maxStringLength();\n      return (int16_t)std::min<size_t>(USHRT_MAX, n);\n    }\n    default:\n      return 4;\n    }\n  }\n\n  void ExcelObj::overwriteComplex(ExcelObj& to, const ExcelObj& from)\n  {\n    switch (from.xltype & ~(xlbitXLFree | xlbitDLLFree))\n    {\n    case xltypeNum:\n    case xltypeBool:\n    case xltypeErr:\n    case xltypeMissing:\n    case xltypeNil:\n    case xltypeInt:\n    case xltypeSRef:\n      (msxll::XLOPER12&)to = (const msxll::XLOPER12&)from;\n      break;\n\n    case xltypeStr:\n    {\n      const auto len = from.val.str.data[0];\n      // preserve view?\n#if _DEBUG\n      to.val.str.data = new wchar_t[len + 2];\n      to.val.str.data[len + 1] = L'\\0';  // Allows debugger to read string\n#else\n      to.val.str.data = new wchar_t[len + 1];\n#endif\n      wmemcpy_s(to.val.str.data, len + 1, from.val.str.data, len + 1);\n      to.xltype = xltypeStr;\n      break;\n    }\n    case xltypeMulti:\n    {\n      const auto nRows = from.val.array.rows;\n      const auto nCols = from.val.array.columns;\n\n      const auto* pSrc = (const ExcelObj*)from.val.array.lparray;\n\n      size_t strLength = totalStringLength(pSrc, nRows, nCols);\n      ExcelArrayBuilder arr(nRows, (ExcelArray::col_t)nCols, strLength, false);\n\n      for (auto i = 0; i < nRows; ++i)\n        for (auto j = 0; j < nCols; ++j)\n        {\n          switch (pSrc->xltype)\n          {\n          case xltypeStr:\n          {\n            arr(i, j) = pSrc->cast<PStringRef>();\n            break;\n          }\n          default:\n            arr(i, j) = *pSrc;\n          }\n          ++pSrc;\n        }\n\n      // Overwrite \"to\"\n      new (&to) ExcelObj(arr.toExcelObj());\n      break;\n    }\n\n    case xltypeBigData:\n    {\n      auto cbData = from.val.bigdata.cbData;\n\n      // Either it's a block of data to copy or a handle from Excel\n      if (cbData > 0 && from.val.bigdata.h.lpbData)\n      {\n        auto pbyte = new char[cbData];\n        memcpy_s(pbyte, cbData, from.val.bigdata.h.lpbData, cbData);\n        to.val.bigdata.h.lpbData = (BYTE*)pbyte;\n      }\n      else\n        to.val.bigdata.h.hdata = from.val.bigdata.h.hdata;\n\n      to.val.bigdata.cbData = cbData;\n      to.xltype = xltypeBigData;\n\n      break;\n    }\n\n    case xltypeRef:\n    {\n      auto* fromMRef = from.val.mref.lpmref;\n      // mref can be null after a call to xlSheetId\n      auto count = fromMRef ? fromMRef->count : 0;\n      if (count > 0)\n      {\n        auto size = sizeof(XLMREF12) + sizeof(XLREF12)*(count - 1);\n        auto* newMRef = new char[size];\n        memcpy_s(newMRef, size, (char*)fromMRef, size);\n        to.val.mref.lpmref = (LPXLMREF12)newMRef;\n      }\n      else\n        to.val.mref.lpmref = nullptr;\n      to.val.mref.idSheet = from.val.mref.idSheet;\n      to.xltype = xltypeRef;\n\n      break;\n    }\n    default:\n      XLO_THROW(\"Unhandled xltype during copy\");\n    }\n  }\n\n  namespace Const\n  {\n    namespace\n    {\n      static ExcelObj theMissing(ExcelType::Missing);\n\n      static std::array<ExcelObj, _countof(theCellErrors)> theErrorObjs =\n      {\n        ExcelObj(CellError::Null),\n        ExcelObj(CellError::Div0),\n        ExcelObj(CellError::Value),\n        ExcelObj(CellError::Ref),\n        ExcelObj(CellError::Name),\n        ExcelObj(CellError::Num),\n        ExcelObj(CellError::NA),\n        ExcelObj(CellError::GettingData)\n      };\n\n      static ExcelObj theEmptyString(PString::steal(L\"\\0\"));\n    }\n\n    const ExcelObj& Missing()\n    {\n      return theMissing;\n    }\n\n    const ExcelObj& Error(CellError e)\n    {\n      switch (e)\n      {\n      case CellError::Null:        return theErrorObjs[0];\n      case CellError::Div0:        return theErrorObjs[1];\n      case CellError::Value:       return theErrorObjs[2];\n      case CellError::Ref:         return theErrorObjs[3];\n      case CellError::Name:        return theErrorObjs[4];\n      case CellError::Num:         return theErrorObjs[5];\n      case CellError::NA:          return theErrorObjs[6];\n      case CellError::GettingData: return theErrorObjs[7];\n      }\n      XLO_THROW(\"Unexpected CellError type\");\n    }\n    const ExcelObj& EmptyStr()\n    {\n      return theEmptyString;\n    }\n  }\n}\n\nnamespace std\n{\n  size_t hash<xloil::ExcelObj>::operator ()(const xloil::ExcelObj& value) const\n  {\n    switch (value.xtype())\n    {\n    case xltypeInt: return hash<int>()(value.val.w);\n    case xltypeNum: return hash<double>()(value.val.w);\n    case xltypeBool: return hash<bool>()(value.val.xbool);\n    case xltypeStr: return hash<wstring_view>()(value.cast<xloil::PStringRef>().view());\n    case xltypeMissing:\n    case xltypeNil: return 0;\n    case xltypeErr: return hash<int>()(value.val.err);\n    case xltypeSRef:\n    {\n      return xloil::boost_hash_combine(377,\n        value.val.sref.ref.colFirst,\n        value.val.sref.ref.colLast,\n        value.val.sref.ref.rwFirst,\n        value.val.sref.ref.rwLast);\n    }\n    case xltypeRef:\n    {\n      return xloil::boost_hash_combine(377, value.val.mref.idSheet, value.val.mref.lpmref);\n    }\n    case xltypeMulti:\n      return hash<void*>()(value.val.array.lparray);\n    default:\n      return 0;\n    }\n  }\n}\n"
  },
  {
    "path": "src/xlOil-XLL/ExcelRef.cpp",
    "content": "#include <xloil/ExcelRef.h>\n\n\nnamespace xloil\n{\n  XLOIL_EXPORT ExcelRef::ExcelRef(const ExcelObj& from)\n  {\n    switch (from.type())\n    {\n    case ExcelType::SRef:\n    {\n      // If we don't know th sheet ID, we first call xlSheetNm to get \n      // the 'current' i.e. currently calculating sheet, then fetch \n      // the sheet ID.  Calling xlSheetId directly with no argument \n      // gets the front sheet, i.e. topmost window or 'active' sheet.\n      ExcelObj sheetName;\n      callExcelRaw(msxll::xlSheetNm, &sheetName, &from);\n      if (0 != callExcelRaw(msxll::xlSheetId, &_obj, &sheetName))\n        XLO_THROW(\"ExcelRef: could not determine sheet for local reference\");\n      create(_obj.val.mref.idSheet, from.val.sref.ref);\n      break;\n    }\n    case ExcelType::Ref:\n    {\n      if (from.val.mref.lpmref->count != 1)\n        XLO_THROW(\"ExcelRef: only contiguous refs are supported\");\n      create(from.val.mref.idSheet, *from.val.mref.lpmref[0].reftbl);\n      break;\n    }\n    default:\n      XLO_THROW(\"ExcelRange: expecting reference type\");\n    }\n  }\n\n  XLOIL_EXPORT ExcelRef::ExcelRef(const std::wstring_view& address)\n  {\n    // If address contains a '!', get sheetId of that name otherwise use\n    // the active sheet (which we get by passing no args). Sheet name\n    // may be quoted - xlSheetId doesn't like this so we must de-quote\n    const auto pling = address.find_last_of(L'!');\n    const auto quoted = address[0] == L'\\'' ? 1 : 0;\n    auto [sheetId, ret] = pling > 0\n      ? tryCallExcel(msxll::xlSheetId, address.substr(0 + quoted, pling - quoted * 2))\n      : tryCallExcel(msxll::xlSheetId);\n\n    if (ret != 0 || !sheetId.isType(ExcelType::Ref))\n      XLO_THROW(L\"Could not find sheet name from address {}\", address);\n\n    msxll::XLREF12 sref;\n    if (!localAddressToXlRef(address.substr(pling + 1), sref))\n    {\n      // If the address cannot be parsed, it may be RC format or an Excel\n      // range name, so we call the API to resolve it. Note, indirect only  \n      // returns an sref, even if the address contains a sheet name.\n      sref = callExcel(msxll::xlfIndirect, address).val.sref.ref;\n    }\n  \n    _obj = ExcelObj(sheetId.val.mref.idSheet, sref);\n  }\n\n  XLOIL_EXPORT ExcelRef::ExcelRef(\n    msxll::IDSHEET sheetId, const msxll::xlref12& ref)\n  {\n    create(sheetId, ref);\n  }\n\n  void ExcelRef::create(\n    msxll::IDSHEET sheetId, \n    const msxll::xlref12& ref)\n  {\n    _obj = ExcelObj(sheetId, ref);\n  }\n\n  void XllRange::setFormula(const std::wstring_view& formula, bool array)\n  {\n    // Formulae must use RC style references\n    if (size() > 1 && array)\n      callExcel(msxll::xlcFormulaArray, formula, _ref);\n    else\n      callExcel(msxll::xlcFormula, formula, _ref);\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/FPArray.cpp",
    "content": "#include <xloil/FPArray.h>\n#include <xlOil/Events.h>\n#include <xlOil/Throw.h>\n#include <mutex>\n\nusing std::vector;\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  namespace\n  {\n    auto createArray(size_t nRows, size_t nCols)\n    {\n      if (nRows == 0 || nCols == 0)\n        XLO_THROW(\"Cannot create an empty FPArray\");\n\n      auto n = nRows * nCols;\n      \n      shared_ptr<FPArray> fp(\n        (FPArray*)new char[sizeof(msxll::_FP12) + n * sizeof(double)],\n        [](auto* p) { delete[] p; });\n      assert(fp.get());\n\n      fp->rows = (int)nRows;\n      fp->columns = (int)nCols;\n      return fp;\n    }\n\n    static vector<shared_ptr<FPArray>> theAliveArrays;\n    static std::mutex theAliveArraysLock;\n\n    // No need for lock as events are single threaded\n    static auto handler = Event::AfterCalculate() += []() { theAliveArrays.clear(); };\n\n    static auto theEmptyArray = []() {\n      auto fp = createArray(1, 1);\n      (*fp)(0, 0) = std::numeric_limits<double>::quiet_NaN();\n      return fp;\n    }();\n  }\n\n  shared_ptr<FPArray> FPArray::create(size_t nRows, size_t nCols)\n  {\n    auto fp = createArray(nRows, nCols);\n    std::lock_guard lock(theAliveArraysLock);\n    theAliveArrays.push_back(fp);\n    return fp;\n  }\n\n  FPArray* FPArray::empty()\n  {\n    return theEmptyArray.get();\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/FuncRegistry.cpp",
    "content": "#include \"FuncRegistry.h\"\n#include \"Intellisense.h\"\n\n#include <xlOil/Register.h>\n#include <xlOil/ExcelCall.h>\n\n#include <xlOil/ExcelObj.h>\n#include <xlOil/StaticRegister.h>\n#include <xlOil/Log.h>\n#include <xlOil/StringUtils.h>\n#include <xlOil/State.h>\n#include <xlOil-Dynamic/PEHelper.h>\n\n#include <codecvt>\n#include <map>\n#include <filesystem>\nnamespace fs = std::filesystem;\n\nusing std::vector;\nusing std::shared_ptr;\nusing std::unique_ptr;\nusing std::string;\nusing std::wstring;\nusing std::map;\nusing std::make_shared;\nusing namespace msxll;\n\nnamespace xloil\n{\n  XLOIL_EXPORT FuncInfo::~FuncInfo()\n  {\n  }\n\n  XLOIL_EXPORT bool FuncInfo::operator==(const FuncInfo& that) const\n  {\n    return name == that.name && help == that.help && category == that.category\n      && options == that.options && std::equal(args.begin(), args.end(), that.args.begin(), that.args.end());\n  }\n  XLOIL_EXPORT bool FuncInfo::isValid() const\n  {\n    bool async = false;\n    for (auto& arg : args)\n      if (arg.type & FuncArg::AsyncHandle)\n        async = true;\n    // Confirm we don't set more than one of these\n    return (((options & FuncInfo::MACRO_TYPE) > 0)\n      + ((options & FuncInfo::THREAD_SAFE) > 0)\n      + ((options & FuncInfo::COMMAND) > 0)\n      + (async) <= 1);\n  }\n}\n\nnamespace xloil\n{\n  class FunctionRegistry\n  {\n  public:\n    const wchar_t* theCoreDllName;\n\n  private:\n    map<wstring, RegisteredFuncPtr> theRegistry;\n\n    FunctionRegistry()\n    {\n      theCoreDllName = Environment::coreDllName();\n    }\n\n    ~FunctionRegistry()\n    {\n      teardown();\n    }\n\n  public:\n    static FunctionRegistry& get()\n    {\n      static FunctionRegistry instance;\n      return instance;\n    }\n\n    void teardown()\n    {\n      // If we reach static destruction and still have registered functions is means\n      // something was not properly cleaned up during XLL autoClose. We are not in \n      // an XLL context so trying to deregister will fail or even crash Excel.\n      for (auto& entry : theRegistry)\n        entry.second->forget();\n      theRegistry.clear();\n    }\n\n    static int registerWithExcel(\n      const shared_ptr<const FuncInfo>& info,\n      const char* entryPoint,\n      const wchar_t* moduleName)\n    {\n      // Look for xlAutoFree12 in the registering module. If it does not exist\n      // we will silently leak memory as Excel cannot free the values we return\n      // to it. We assume we got things right in the Core DLL, so we don't perform\n      // this check for every dynamic registration.\n      if (wcscmp(moduleName, get().theCoreDllName) != 0)\n      {\n        const auto moduleHandle = GetModuleHandle(moduleName);\n        if (!moduleHandle)\n          XLO_THROW(L\"Could not retrive module handle for '{}' during function regisration\");\n        const auto autoFreeFunc = GetProcAddress(moduleHandle, \"xlAutoFree12\");\n        if (!autoFreeFunc)\n          XLO_THROW(L\"Module '{}' must define xlAutoFree12 to register Excel functions\", moduleName);\n      }\n\n      auto numArgs = info->args.size();\n      int opts = info->options;\n\n      if (numArgs > XL_MAX_UDF_ARGS)\n        XLO_THROW(\"Number of positional arguments ({}) exceeds maximum allowed by Excel ({})\",\n          numArgs, XL_MAX_UDF_ARGS);\n\n      if (!info->isValid())\n        XLO_THROW(\"Invalid combination of function options\");\n\n      // Build the argument type descriptor\n      string argTypes;\n      if (opts & FuncInfo::COMMAND)\n        argTypes += 'A';  // Commands always return int\n      else if (opts & FuncInfo::ARRAY)\n        argTypes += \"K%\";  // FP12 struct\n      else\n        argTypes += 'U';  // Otherwise return an XLOPER12 unless overridden below\n\n      int iArg = 0;\n      for (auto& arg : info->args)\n      {\n        if (arg.type & FuncArg::Range)\n          argTypes += 'U';  // XLOPER12 values/arrays and Ranges\n        else if (arg.type & FuncArg::Obj)\n          argTypes += 'Q';  // XLOPER12 values/arrays\n        else if (arg.type & FuncArg::Array)\n          argTypes += \"K%\"; // FP12 struct\n        else if (arg.type & FuncArg::AsyncHandle)\n        {\n          argTypes += \"X\";   // Async return handle\n          argTypes[0] = '>'; // Async returns void\n        }\n        else\n          XLO_THROW(L\"Internal: Unknown argtype '{}' for arg '{}'\", arg.type, arg.name);\n\n        if (arg.type & FuncArg::ReturnVal)\n          if (argTypes[0] != 'U')\n            XLO_THROW(L\"Only one argument can be specified as a return value for arg '{}'\", arg.name);\n          else if (iArg > 8)\n            XLO_THROW(L\"Return in-place arg must be in the first 9 for arg '{}'\", arg.name);\n          else\n            argTypes[0] = ('1' + (char)iArg); // Return numbered arg in place\n        ++iArg;\n      }\n\n      // Set function option suffixes\n      if (opts & FuncInfo::VOLATILE)\n        argTypes += '!';\n      else if (opts & FuncInfo::MACRO_TYPE)\n        argTypes += '#';\n      else if (opts & FuncInfo::THREAD_SAFE)\n      {\n        argTypes += '$';\n        if (opts & FuncInfo::VOLATILE)\n          XLO_THROW(\"Cannot declare function thread-safe and volatile\");\n      }\n\n      // Concatenate argument names, adding optional indicator if requested\n      wstring argNames;\n      for (auto x : info->args)\n        if (x.type & FuncArg::Optional)\n          argNames.append(formatStr(L\"[%s],\", x.name.c_str()));\n        else\n          argNames.append(x.name).append(L\",\");\n\n      if (numArgs > 0)\n        argNames.pop_back();  // Delete final comma\n\n      const bool truncatedArgNames = argNames.length() > 255;\n      if (truncatedArgNames)\n      {\n        XLO_INFO(L\"Excel does not support a concatenated argument name length of \"\n          \"more than 255 chars (including commas). Truncating for function '{0}'\", info->name);\n        argNames.resize(255);\n      }\n\n      // Build argument help strings. If we had to truncate the arg name string\n      // add the arg names to the argument help string\n      vector<wstring> argHelp;\n      if (truncatedArgNames)\n        for (auto x : info->args)\n          argHelp.emplace_back(fmt::format(L\"({0}) {1}\", x.name, x.help));\n      else\n        for (auto x : info->args)\n          argHelp.emplace_back(x.help);\n\n      // Pad the last arg help with a couple of spaces to workaround an Excel bug\n      if (numArgs > 0 && !argHelp.back().empty())\n        argHelp.back() += L\"  \";\n\n      // Truncate argument help strings to 255 chars\n      for (auto& h : argHelp)\n        if (h.size() > XL_ARG_HELP_STRING_MAX_LENGTH)\n        {\n          XLO_INFO(L\"Excel does not support argument help strings longer than 255 chars. \"\n            \"Truncating for function '{0}'\", info->name);\n          h.resize(255);\n        }\n\n      // Set the function type\n      int macroType = 1;\n      if (opts & FuncInfo::COMMAND)\n        macroType = 2;\n      else if (opts & FuncInfo::HIDDEN)\n        macroType = 0;\n\n      // Function help string. Yup, more 255 char limits, those MS folks are terse\n      auto truncatedHelp = info->help;\n      if (info->help.length() > XL_ARG_HELP_STRING_MAX_LENGTH)\n      {\n        constexpr auto maxLen = XL_ARG_HELP_STRING_MAX_LENGTH;\n        XLO_INFO(L\"Excel does not support help strings longer than {1} chars. \"\n          \"Truncating for function '{0}'\", info->name, maxLen);\n        truncatedHelp.assign(info->help.c_str(), maxLen);\n        truncatedHelp[maxLen - 3] = '.'; truncatedHelp[maxLen - 2] = '.'; truncatedHelp[maxLen - 1] = '.';\n      }\n\n      // TODO: entrypoint will always be ascii\n      XLO_DEBUG(L\"Registering \\\"{0}\\\" at entry point {1} with {2} args\",\n        info->name, utf8ToUtf16(entryPoint), numArgs);\n\n      auto registerId = callExcel(xlfRegister,\n        moduleName,\n        entryPoint,\n        argTypes,\n        info->name,\n        argNames,\n        macroType,\n        info->category,\n        nullptr, nullptr,\n        truncatedHelp.empty() ? info->help : truncatedHelp,\n        unpack(argHelp));\n      if (registerId.type() != ExcelType::Num)\n        XLO_THROW(L\"Register '{0}' failed\", info->name);\n\n      // We must be in XLL context to register a function, so can call this:\n      publishIntellisenseInfo(info);\n\n      return registerId.get<int>();\n    }\n\n    void throwIfPresent(const wstring& name) const\n    {\n      if (theRegistry.find(name) != theRegistry.end())\n        XLO_THROW(L\"Function {0} already registered\", name);\n    }\n\n  public:\n    RegisteredFuncPtr add(const shared_ptr<const WorksheetFuncSpec>& spec)\n    {\n      auto& name = spec->info()->name;\n      throwIfPresent(name);\n\n      return theRegistry.emplace(name, spec->registerFunc()).first->second;\n    }\n\n    void remove(const wchar_t* funcName)\n    {\n      theRegistry.erase(funcName);\n    }\n\n    void clear()\n    {\n      for (auto f : theRegistry)\n        const_cast<RegisteredWorksheetFunc&>(*f.second).deregister();\n      theRegistry.clear();\n    }\n\n    auto& all()\n    {\n      return theRegistry;\n    }\n  };\n\n  RegisteredWorksheetFunc::RegisteredWorksheetFunc(const shared_ptr<const WorksheetFuncSpec>& spec)\n    : _spec(spec)\n  {}\n\n  RegisteredWorksheetFunc::~RegisteredWorksheetFunc()\n  {\n    deregister();\n  }\n\n  bool RegisteredWorksheetFunc::deregister()\n  {\n    if (_registerId == 0)\n      return false;\n\n    auto& name = info()->name;\n    XLO_DEBUG(L\"Deregistering {0}\", name);\n\n    auto [result, ret] = tryCallExcel(xlfUnregister, double(_registerId));\n    if (ret != msxll::xlretSuccess || result.type() != ExcelType::Bool || !result.get<bool>())\n    {\n      XLO_WARN(L\"Unregister failed for {0}\", name);\n      return false;\n    }\n\n    // Cunning trick to workaround SetName where function is not removed from wizard\n    // by registering a hidden function (i.e. a command) then removing it.  It \n    // doesn't matter which entry point we bind to as long as the function pointer\n    // won't be registered as an Excel func.\n    // https://stackoverflow.com/questions/15343282/how-to-remove-an-excel-udf-programmatically\n\n    // SetExcel12EntryPt is automatically created by xlcall.cpp, but is only used for\n    // clusters, which we aren't supporting at this current time.\n    auto arbitraryFunction = decorateCFunction(\"SetExcel12EntryPt\", 1);\n    auto [tempRegId, retVal] = tryCallExcel(\n      xlfRegister, \n      FunctionRegistry::get().theCoreDllName, \n      arbitraryFunction.c_str(), \n      \"I\", name, nullptr, 2);\n    tryCallExcel(xlfSetName, name); // SetName with no arg un-sets the name\n    tryCallExcel(xlfUnregister, tempRegId);\n    _registerId = 0;\n\n    FunctionRegistry::get().remove(name.c_str());\n\n    return true;\n  }\n\n  int RegisteredWorksheetFunc::registerId() const\n  {\n    return _registerId;\n  }\n\n  const std::shared_ptr<const FuncInfo>& RegisteredWorksheetFunc::info() const\n  {\n    return _spec->info();\n  }\n  const std::shared_ptr<const WorksheetFuncSpec>& RegisteredWorksheetFunc::spec() const\n  {\n    return _spec;\n  }\n  bool RegisteredWorksheetFunc::reregister(const std::shared_ptr<const WorksheetFuncSpec>& /*other*/)\n  {\n    return false;\n  }\n\n  class RegisteredStatic : public RegisteredWorksheetFunc\n  {\n  public:\n    RegisteredStatic(const std::shared_ptr<const StaticWorksheetFunction>& spec)\n      : RegisteredWorksheetFunc(spec)\n    {\n      auto& registry = FunctionRegistry::get();\n      _registerId = registry.registerWithExcel(\n        spec->info(),\n        decorateCFunction(spec->_entryPoint.c_str(), spec->info()->numArgs()).c_str(),\n        spec->_dllName.c_str());\n    }\n  };\n\n  std::shared_ptr<RegisteredWorksheetFunc> StaticWorksheetFunction::registerFunc() const\n  {\n    try\n    {\n      return make_shared<RegisteredStatic>(\n        std::static_pointer_cast<const StaticWorksheetFunction>(this->shared_from_this()));\n    }\n    catch (const std::exception& e)\n    {\n      XLO_THROW(\"{0}. Error registering '{1}'\", e.what(), utf16ToUtf8(this->name()));\n    }\n  }\n\n  RegisteredFuncPtr registerFunc(const std::shared_ptr<const WorksheetFuncSpec>& spec) noexcept\n  {\n    try\n    {\n      return FunctionRegistry::get().add(spec);\n    }\n    catch (std::exception& e)\n    {\n      XLO_ERROR(L\"Failed to register func {0}: {1}\",\n        spec->info()->name.c_str(), utf8ToUtf16(e.what()));\n      return RegisteredFuncPtr();\n    }\n  }\n\n  int\n    registerFuncRaw(\n      const std::shared_ptr<const FuncInfo>& info,\n      const char* entryPoint,\n      const wchar_t* moduleName)\n  {\n    auto& registry = FunctionRegistry::get();\n    return registry.registerWithExcel(info, entryPoint, moduleName);\n  }\n\n  const map<wstring, RegisteredFuncPtr>& registeredFuncsByName()\n  {\n    return FunctionRegistry::get().all();\n  }\n\n  void teardownFunctionRegistry()\n  {\n    FunctionRegistry::get().teardown();\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/FuncRegistry.h",
    "content": "#pragma once\n#include <xlOil/Register.h>\n#include <xlOil/FuncSpec.h>\n#include <memory>\n#include <map>\n\nnamespace xloil\n{\n  class RegisteredWorksheetFunc\n  {\n  public:\n    RegisteredWorksheetFunc(const std::shared_ptr<const WorksheetFuncSpec>& spec);\n\n    ~RegisteredWorksheetFunc();\n\n    /// <summary>\n    /// De-registers the function in Excel and invalidates this object.\n    /// Returns true on success.\n    /// </summary>\n    bool deregister();\n\n    int registerId() const;\n\n    const std::shared_ptr<const WorksheetFuncSpec>& spec() const;\n    const std::shared_ptr<const FuncInfo>& info() const;\n\n    /// <summary>\n    /// Attempts some jiggery-pokery to avoid fully re-registering the function in Excel or \n    /// rebuilding the thunk code.  If it can't do this, de-registers the function and \n    /// returns false\n    /// </summary>\n    /// <returns>false if you need to call registerFunc</returns>\n    virtual bool reregister(const std::shared_ptr<const WorksheetFuncSpec>& other);\n\n    /// <summary>\n    /// 'Forgets' the registration - this stops any attempt to deregister the function\n    /// when the object is destroyed.\n    /// </summary>\n    void forget() { _registerId = 0; }\n\n  protected:\n    int _registerId;\n    std::shared_ptr<const WorksheetFuncSpec> _spec;\n  };\n\n  using RegisteredFuncPtr = std::shared_ptr<RegisteredWorksheetFunc>;\n\n  /// <summary>\n  /// Will fail unless called in XLL context\n  /// </summary>\n  /// <param name=\"info\"></param>\n  /// <returns></returns>\n  RegisteredFuncPtr\n    registerFunc(\n      const std::shared_ptr<const WorksheetFuncSpec>& info) noexcept;\n\n  int \n    registerFuncRaw(\n      const std::shared_ptr<const FuncInfo>& info,\n      const char* entryPoint,\n      const wchar_t* moduleName);\n\n  const std::map<std::wstring, RegisteredFuncPtr>& \n    registeredFuncsByName();\n\n  /// <summary>\n  /// Called during teardown to release resources used by registered\n  /// functions. Does not attempt the deregister the functions as \n  /// the Excel APIs are not available after autoClose.\n  /// </summary>\n  void teardownFunctionRegistry();\n}"
  },
  {
    "path": "src/xlOil-XLL/Intellisense.cpp",
    "content": "#include <xloil/WindowsSlim.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/StringUtils.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/FuncSpec.h>\n#include <xloil/Events.h>\n#include <xloil/ExcelArray.h>\n#include <xloil-XLL/FuncRegistry.h>\n#include <xloil/State.h>\n#include <xloilHelpers/Environment.h>\n#include <xloilHelpers/GuidUtils.h>\n#include <list>\n#include <string>\n#include <filesystem>\n\nusing std::string;\nusing std::wstring;\nusing std::make_shared;\nusing std::shared_ptr;\n\nnamespace\n{\n  const GUID theExcelDnaNamespaceGuid = \n    { 0x306D016E, 0xCCE8, 0x4861, { 0x9D, 0xA1, 0x51, 0xA2, 0x7C, 0xBE, 0x34, 0x1A} };\n\n  // Excel-DNA looks for a function `RegistrationInfo_<GUID>` where GUID is generated\n  // by the algorithm in stableGuidFromString with the ExcelDNA namespace and the XLL \n  // path. The RegistrationInfo function should take a version number a return a \n  // specially formatted array describing registered functions and their help strings\n\tstatic wstring RegistrationInfoName(wstring xllPath)\n\t{\n    GUID guid;\n    xloil::stableGuidFromString(guid, theExcelDnaNamespaceGuid, xllPath);\n    return wstring(L\"RegistrationInfo_\") + xloil::guidToWString(guid, xloil::GuidToString::HEX);\n\t}\n\n  // Multiple Intellisense servers can exist in the same Excel session, but only one\n  // will be active.  If a server is running, that server is described by the \n  // environment variable EXCELDNA_INTELLISENSE_ACTIVE_SERVER which takes the form\n  // `<xll path>,<serverId>,<version>`.  We are only interested in the *serverId*.\n\twstring findActiveIntelliServer()\n\t{\n    auto active = xloil::getEnvironmentVar(L\"EXCELDNA_INTELLISENSE_ACTIVE_SERVER\");\n    if (active.empty())\n      return active;\n    auto comma = active.find_first_of(L',');\n    auto serverId = active.substr(comma + 1, active.find_last_of(L',') - comma - 1);\n\t\treturn serverId;\n\t}\n\n  // Calling `IntelliSenseServerControl_<GUID>(\"REFRESH\")` where <GUID> is a serverId\n  // triggers the server to look for new functions in the various sources it searches\n  // including calling `RegistrationInfo_xxx` for known XLL addins.  The serverId is \n  // determined by findActiveIntelliServer.\n  void triggerIntellisenseRefresh()\n  {\n    auto activeServer = findActiveIntelliServer();\n    if (!activeServer.empty())\n      xloil::tryCallExcel(msxll::xlUDF, L\"IntelliSenseServerControl_\" + activeServer, L\"REFRESH\");\n  }\n}\n\nnamespace xloil\n{\n  namespace\n  {\n    std::list<shared_ptr<const FuncInfo>> thePendingFuncInfos;\n    static int theIntellisenseInfoVersion = 0;\n    static wstring theIntellisenseRegisteredXll;\n  }\n\n  void publishIntellisenseInfo(const std::shared_ptr<const FuncInfo>& info)\n  {\n    if (theIntellisenseRegisteredXll.empty())\n      return;\n    thePendingFuncInfos.push_back(info);\n    triggerIntellisenseRefresh();\n  }\n\n  void publishIntellisenseInfo(const std::vector<std::shared_ptr<const FuncInfo>>& infos)\n  {\n    if (theIntellisenseRegisteredXll.empty())\n      return;\n    thePendingFuncInfos.insert(thePendingFuncInfos.end(), infos.begin(), infos.end());\n    triggerIntellisenseRefresh();\n  }\n\n  // The RegistrationInfo function should take a version number a return a specially \n  // formatted array describing registered functions and their help strings.  \n  // The version number passed in is the version number returned by the previous call\n  // (or -1 for the first call). We do not use this version number to keep track of\n  // registrations, rather keeping a queue of pending info. However, the returned version\n  // number must be larger that the supplied one or Excel-DNA will not process the \n  // returned array.\n  // \n  // The returned array is sparse: the column positions correspond to argument numbers\n  // for xlfRegister, but Excel-DNA only requires some of xlfRegister arguments to \n  // display the help.\n  XLO_ENTRY_POINT(ExcelObj*) IntellisenseRegistrationInfo(const ExcelObj& /*version*/)\n  {\n    try\n    {\n      if (thePendingFuncInfos.empty())\n        return returnValue(CellError::Num); // signals that no update is required\n\n      // Do two passes through the function names because the array builder \n      // needs all the sizes upfront.  The strings are the XLL path, \n      // then each function name, category, help string, argument names\n      // and argument help.\n      size_t totalStrLen = theIntellisenseRegisteredXll.size();\n      size_t maxNumArgs = 0;\n      ExcelArray::row_t nFuncs = 0;\n      for (auto& info : thePendingFuncInfos)\n      {\n        totalStrLen += info->name.size();\n        totalStrLen += info->category.size();\n        totalStrLen += info->help.size();\n        for (auto x : info->args)\n        {\n          totalStrLen += x.name.size() + 1 + 2; // allow for comma and []\n          totalStrLen += x.help.size();\n        }\n        maxNumArgs = std::max(maxNumArgs, info->args.size());\n        ++nFuncs;\n      }\n\n      ExcelArrayBuilder block(1 + nFuncs, 10 + (ExcelArray::col_t)maxNumArgs, totalStrLen);\n      block.fillNA();\n\n      block(0, 0) = theIntellisenseRegisteredXll;\n      block(0, 1) = theIntellisenseInfoVersion;\n\n      ExcelObj::row_t i = 1;\n      for (auto& info : thePendingFuncInfos)\n      {\n        wstring argNames;\n        for (auto x : info->args)\n          if (x.type & FuncArg::Optional)\n            argNames.append(formatStr(L\"[%s],\", x.name.c_str()));\n          else\n            argNames.append(x.name).append(L\",\");\n        if (info->numArgs() > 0)\n          argNames.pop_back();  // Delete final comma\n\n        // The row must start with Empty/Nil or Excel-DNA will skip it\n        block(i, 0) = ExcelType::Nil; \n        block(i, 3) = info->name;\n        block(i, 4) = argNames;\n        block(i, 8) = info->category;\n        block(i, 9) = info->help;\n        \n        // Write argument help strings from position 10 onwards\n        for (size_t iArg = 0; iArg < info->numArgs(); ++iArg)\n          block(i, 10 + iArg) = info->args[iArg].help;\n\n        ++i;\n      }\n      \n      thePendingFuncInfos.clear();\n      ++theIntellisenseInfoVersion;\n\n      return returnValue(block.toExcelObj());\n    }\n    catch (const std::exception& err)\n    {\n      return xloil::returnValue(err);\n    }\n  }\n\n  void registerIntellisenseHook(const wchar_t* xllPath)\n  {\n    XLO_REGISTER_LATER(IntellisenseRegistrationInfo)\n      .name(RegistrationInfoName(xllPath))\n      .arg(L\"version\").hidden();\n    theIntellisenseRegisteredXll = xllPath;\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/Intellisense.h",
    "content": "#pragma once\n#include <memory>\n#include <vector>\n\nnamespace xloil\n{\n  struct FuncInfo;\n  /// <summary>\n  /// Will fail, possibly spectacularly, unless called in XLL context\n  /// </summary>\n  void publishIntellisenseInfo(const std::shared_ptr<const FuncInfo>& info);\n  void publishIntellisenseInfo(const std::vector<std::shared_ptr<const FuncInfo>>& infos);\n  void registerIntellisenseHook(const wchar_t* xllPath);\n}"
  },
  {
    "path": "src/xlOil-XLL/Log.cpp",
    "content": "#include <xlOil/Log.h>\n#include <xlOil/StringUtils.h>\n#include <xlOil/Events.h>\n#include <xlOil/Throw.h>\n#include <xlOil/State.h>\n#include <xlOilHelpers/Exception.h>\n#include \"LogWindowSink.h\"\n#include <spdlog/sinks/basic_file_sink.h>\n#include <spdlog/sinks/msvc_sink.h>\n#include <spdlog/sinks/rotating_file_sink.h>\n#include <filesystem>\n\nusing std::wstring;\nusing std::string;\nusing std::make_shared;\nnamespace fs = std::filesystem;\n\nnamespace xloil\n{\n  std::shared_ptr<spdlog::logger> loggerInitialise(\n    const std::string_view& debugLevel,\n    bool makeDefault)\n  {\n    const auto debugWriterLevel = spdlog::level::from_str(string(debugLevel));\n\n    auto logger = make_shared<spdlog::logger>(\"logger\");\n\n    if (debugWriterLevel != spdlog::level::off)\n    {\n      auto dbgWrite = make_shared<spdlog::sinks::msvc_sink_mt>();\n      dbgWrite->set_level(debugWriterLevel);\n      logger->sinks().push_back(dbgWrite);\n    }\n\n    spdlog::initialize_logger(logger);\n\n    if (makeDefault)\n      spdlog::set_default_logger(logger);\n\n    return logger;\n  }\n\n  void loggerSetFlush(\n    const std::shared_ptr<spdlog::logger>& logger,\n    const std::string_view& flushLevel)\n  {\n    const auto flushSpdLevel = spdlog::level::from_str(string(flushLevel));\n    logger->flush_on(flushSpdLevel);\n  }\n\n  void loggerAddPopupWindowSink(\n    const std::shared_ptr<spdlog::logger>& logger)\n  {\n    auto& state = Environment::excelProcess();\n    auto logWindow = makeLogWindowSink(\n      (HWND)state.hWnd,\n      (HINSTANCE)Environment::coreModuleHandle());\n\n    logger->sinks().push_back(logWindow);\n  }\n\n  std::wstring loggerAddRotatingFileSink(\n    const std::shared_ptr<spdlog::logger>& logger,\n    const std::wstring_view& logFilePath, const char* logLevel,\n    const size_t maxFileSizeKb, const size_t numFiles)\n  {\n    auto filename = wstring(logFilePath);\n\n    // Open for exclusive acces to check if another Excel instance is using the log file\n    auto handle = CreateFile(\n      filename.c_str(), \n      GENERIC_READ,\n      0, // no sharing, exclusive\n      NULL, OPEN_ALWAYS, 0, NULL);\n\n    if ((handle != NULL) && (handle != INVALID_HANDLE_VALUE))\n      CloseHandle(handle);\n    else\n      filename = fs::path(filename).replace_extension(std::to_wstring(GetCurrentThreadId()) + L\".log\");\n\n    auto fileWrite = make_shared<spdlog::sinks::rotating_file_sink_mt>(\n      filename, maxFileSizeKb * 1024, numFiles);\n    fileWrite->set_level(spdlog::level::from_str(logLevel));\n    logger->sinks().push_back(fileWrite);\n\n    if (fileWrite->level() < logger->level())\n      logger->set_level(fileWrite->level());\n\n    return fileWrite->filename();\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/LogWindow.cpp",
    "content": "#define NOMINMAX\n#define WIN32_LEAN_AND_MEAN\n#include <Windows.h>\n\n#include <xloil/LogWindow.h>\n#include <xloil/ExcelThread.h>\n#include <xloil/StringUtils.h>\n#include <xlOilHelpers/Environment.h>\n#include <xlOilHelpers/Exception.h>\n#include <list>\n\nusing std::wstring;\nusing std::string;\nusing std::shared_ptr;\nusing std::make_shared;\n\nnamespace xloil\n{\n  class LogWindow : public ILogWindow\n  {\n    HWND theMainWindow;\n    HWND theTextControl;\n    HMENU theTextControlId = (HMENU)101;\n    WNDPROC theMenuHandler;\n    bool theWindowIsOpen = false;\n    std::list<wstring> _messages;\n    wstring _windowText;\n    size_t _maxSize;\n    shared_ptr<ATOM> _windowClass;\n    static constexpr const wchar_t* theWindowClass = L\"xlOil_Log\";\n\n    static auto createWindowClass(HINSTANCE hInstance, const wchar_t* windowClass)\n    {\n      // Define the main window class\n      WNDCLASSEX win;\n      win.cbSize = sizeof(WNDCLASSEX);\n      win.hInstance = hInstance;\n      win.lpszClassName = windowClass;\n      win.lpfnWndProc = StaticWindowProc;\n      win.style = CS_HREDRAW | CS_VREDRAW;\n\n      // Use default icons and mouse pointer\n      win.hIcon = LoadIcon(NULL, IDI_APPLICATION);\n      win.hIconSm = LoadIcon(NULL, IDI_APPLICATION);\n      win.hCursor = LoadCursor(NULL, IDC_ARROW);\n\n      win.lpszMenuName = NULL;\n      win.cbClsExtra = 0;  // No extra bytes after the window class\n      win.cbWndExtra = sizeof(void*);\n      win.hbrBackground = GetSysColorBrush(COLOR_3DFACE); // Use default colour\n\n      auto atom = RegisterClassEx(&win);\n\n      return std::shared_ptr<ATOM>(new ATOM(atom), [](ATOM* atom) {\n        UnregisterClass((LPCWSTR)LOWORD(*atom), nullptr);\n        delete atom;\n      });\n    }\n\n  public:\n    LogWindow(\n      HWND parentWnd,\n      HINSTANCE hInstance,\n      const wchar_t* winTitle,\n      HMENU menuBar,\n      WNDPROC menuHandler,\n      size_t maxSize)\n      : _maxSize(maxSize)\n    {\n      static auto winClass = createWindowClass(hInstance, theWindowClass);\n\n      // Take a reference to the window class so we never try to unregister the\n      // class while there are open windows remaining.\n      _windowClass = winClass;\n\n      // If we try to create a window from our class during xlAutoOpen, we will get\n      // the cryptic \"ntdll.dll (EXCEL.EXE) RangeChecks instrumentation code detected \n      // an out of range array access\".  Whatever Excel gets up to during start-up\n      // seems to screw around with the Win32 API.  We use the existence or \n      // otherwise of a parentHwnd to determine if we are in this perilous state\n      auto hwnd = FindWindow(theWindowClass, winTitle);\n      if (!hwnd)\n        hwnd = CreateWindowEx(\n          0,\n          parentWnd ? theWindowClass : L\"EDIT\",\n          winTitle,\n          parentWnd\n          ? WS_OVERLAPPEDWINDOW  // Title bar, minimimise, close and resize controls\n          : WS_OVERLAPPEDWINDOW | WS_VSCROLL | ES_LEFT | ES_MULTILINE,\n          CW_USEDEFAULT, CW_USEDEFAULT, // (x, y)-position\n          CW_USEDEFAULT, CW_USEDEFAULT, // width, height\n          HWND_DESKTOP,\n          menuBar,\n          hInstance,\n          this);\n\n      if (!hwnd)\n        throw Helpers::Exception(L\"Failed to create LogWindow: %s\",\n          Helpers::writeWindowsError().c_str());\n\n      if (!parentWnd)\n        theTextControl = hwnd;\n\n      theMenuHandler = menuHandler;\n      theMainWindow = hwnd;\n    }\n\n  private:\n    static LRESULT CALLBACK StaticWindowProc(\n      HWND hwnd,\n      UINT message,\n      WPARAM wParam,\n      LPARAM lParam)\n    {\n      LogWindow* instance;\n      if (message == WM_CREATE)\n      {\n        auto create = (CREATESTRUCT*)lParam;\n        instance = (LogWindow*)create->lpCreateParams;\n        SetWindowLongPtr(hwnd, 0, (LONG_PTR)instance);\n      }\n      else\n        instance = (LogWindow*)GetWindowLongPtr(hwnd, 0);\n\n      if (instance)\n        return instance->WindowProc(hwnd, message, wParam, lParam);\n\n      return DefWindowProc(hwnd, message, wParam, lParam);\n    }\n\n    LRESULT CALLBACK WindowProc(\n      HWND hwnd,\n      UINT message,\n      WPARAM wParam,\n      LPARAM lParam)\n    {\n      constexpr int xOffset = 5, yOffset = 5;\n\n      switch (message)\n      {\n      case WM_CREATE:\n        theTextControl = CreateWindow(L\"EDIT\", // an edit control\n          NULL,        // no window title \n          WS_CHILD | WS_VISIBLE | WS_VSCROLL |\n          ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,\n          0, 0, 0, 0,  // we will set size in WM_SIZE message \n          hwnd,        // parent window \n          theTextControlId,\n          (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE),\n          NULL);       // pointer not needed \n\n        if (!theTextControl)\n          return EXIT_FAILURE;\n\n        return 0;\n\n      case WM_SETFOCUS:\n        SetFocus(theTextControl);\n        return 0;\n\n      case WM_SIZE:\n        // Make the edit control the size of the window's client area. \n        MoveWindow(theTextControl,\n          xOffset, yOffset,      // starting x- and y-coordinates \n          LOWORD(lParam) - xOffset,        // width of client area \n          HIWORD(lParam) - yOffset,        // height of client area \n          TRUE);                 // repaint window \n        return 0;\n\n      case WM_CLOSE:\n        LogWindow::theWindowIsOpen = false;\n        ShowWindow(hwnd, SW_HIDE);\n        return 0;\n\n      case WM_COMMAND:\n        if (theMenuHandler)\n          return theMenuHandler(hwnd, message, wParam, lParam);\n      }\n      return DefWindowProc(hwnd, message, wParam, lParam);\n    }\n\n    // Just scroll to the end, word-wrap seems to confuse the\n    // line count, so we just specify a big number for numLines\n    void setTextBoxContents(const wchar_t* text, size_t numLines = 66666666)\n    {\n      // Add text to the window. \n      SendMessage(theTextControl, WM_SETTEXT, 0, (LPARAM)text);\n      // Scroll to the last line\n      SendMessage(theTextControl, EM_LINESCROLL, 0, numLines);\n    }\n\n    bool isOpen() const\n    {\n      return theWindowIsOpen;\n    }\n\n    void appendToWindow(const wstring& msg)\n    {\n      auto wmsg(msg);\n\n      // Fix any unix line endings (e.g. from python)\n      auto pos = (size_t)-1;\n      while ((pos = wmsg.find(L'\\n', pos + 1)) != string::npos)\n      {\n        if (wmsg[pos - 1] != L'\\r')\n          wmsg.replace(pos, 1, L\"\\r\\n\");\n      }\n\n      _windowText.append(wmsg).append(L\"\\r\\n\");\n    }\n\n  protected:\n    virtual void showWindow() noexcept\n    {\n      setTextBoxContents(_windowText.c_str());\n      ShowWindow(theMainWindow, SW_SHOWNORMAL);\n      BringWindowToTop(theMainWindow);\n      theWindowIsOpen = true;\n    }\n\n    virtual void setWindowText() noexcept\n    {\n      setTextBoxContents(_windowText.c_str());\n    }\n\n  public:\n    void openWindow() noexcept override\n    {\n      if (isOpen())\n        return;\n\n      _windowText.clear();\n      for (auto& msg : _messages)\n        appendToWindow(msg);\n\n      showWindow();\n    }\n\n    void appendMessage(wstring&& msg) noexcept override\n    {\n      _messages.emplace_back(std::forward<wstring>(msg));\n\n      if (_messages.size() > _maxSize)\n        _messages.pop_front();\n\n      if (isOpen())\n      {\n        appendToWindow(_messages.back());\n        setWindowText();\n      }\n    }\n  };\n\n  // Should only call window drawing API functions on the main thread\n  class LogWindowThreaded : public LogWindow\n  {\n  public:\n    using LogWindow::LogWindow;\n\n  protected:\n    virtual void showWindow() noexcept\n    {\n      runExcelThread([this]\n      {\n        LogWindow::showWindow();\n      }, 0);\n    }\n\n    virtual void setWindowText() noexcept\n    {\n      runExcelThread([this]\n      {\n        LogWindow::setWindowText();\n      }, 0);\n    }\n  };\n\n  shared_ptr<ILogWindow> createLogWindow(\n    HWND parentWindow,\n    HINSTANCE parentInstance,\n    const wchar_t* winTitle,\n    HMENU menuBar,\n    WNDPROC menuHandler,\n    size_t historySize) noexcept\n  {\n    try\n    {\n      return make_shared<LogWindowThreaded>(\n        parentWindow, parentInstance, winTitle, menuBar, menuHandler, historySize);\n    }\n    catch (...)\n    {\n      return shared_ptr<ILogWindow>();\n    }\n  }\n\n  void loadFailureLogWindow(HINSTANCE parent, const std::wstring_view& msg, bool openWindow)\n  {\n    // This function is always called from the main thread so can use\n    // statics and the single-threaded version of LogWindow. \n    auto t = std::time(nullptr);\n    tm tm;\n    localtime_s(&tm, &t);\n    auto msgStr = formatStr(L\"%d-%d-%d: \", tm.tm_hour, tm.tm_min, tm.tm_sec).append(msg);\n\n    static auto logWindow = make_shared<LogWindow>(\n      (HWND)0, parent, L\"xlOil Load Failure\", (HMENU)0, (WNDPROC)0, 100);\n\n    OutputDebugString(msgStr.data());\n    logWindow->appendMessage(std::move(msgStr));\n    if (openWindow)\n      logWindow->openWindow();\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/LogWindowSink.cpp",
    "content": "#define WIN32_LEAN_AND_MEAN\n#include <windows.h>\n\n#include \"LogWindowSink.h\"\n#include <xloil/StringUtils.h>\n#include <xlOilHelpers/Environment.h>\n#include <xlOilHelpers/Exception.h>\n#include <xlOil/LogWindow.h>\n#include <spdlog/sinks/base_sink.h>\n#include <spdlog/pattern_formatter.h>\n#include <spdlog/spdlog.h>\n#include <mutex>\n#include <regex>\n\n\nusing std::wstring;\nusing std::string;\nusing std::shared_ptr;\n\nnamespace {\n  constexpr short ID_CAPTURELEVEL = 400u;\n  constexpr short ID_POPUPLEVEL = 500u;\n  constexpr const wchar_t* LEVEL_NAMES[] = {\n    L\"Trace\", L\"Debug\", L\"Info\", L\"Warning\", L\"Error\", L\"Critical\", L\"Off\"                                                                    \\\n  };\n}\n\nnamespace xloil\n{\n  namespace MainLogWindow\n  {\n    HMENU theMenuBar;\n    auto theCaptureLogLevel = spdlog::level::err;\n    auto thePopupLevel      = spdlog::level::err;\n\n    void setLogLevelRadioGroup(int base, int item)\n    {\n      CheckMenuRadioItem(\n        theMenuBar,\n        base,                     // first item in range \n        base + SPDLOG_LEVEL_OFF,  // last item in range \n        base + item,              // item to check \n        MF_BYCOMMAND              // IDs, not positions \n      );\n    }\n\n    void setCaptureLevel(spdlog::level::level_enum level)\n    {\n      setLogLevelRadioGroup(ID_CAPTURELEVEL, level);\n      theCaptureLogLevel = level;\n    }\n\n    void setPopupLevel(spdlog::level::level_enum level)\n    {\n      setLogLevelRadioGroup(ID_POPUPLEVEL, level);\n      thePopupLevel = level;\n      if (theCaptureLogLevel > thePopupLevel)\n        setCaptureLevel(level);\n    }\n\n    LRESULT CALLBACK MenuWindowProc(\n      HWND hwnd,\n      UINT message,\n      WPARAM wParam,\n      LPARAM lParam)\n    {\n      switch (message)\n      {\n      case WM_COMMAND:\n      {\n        const auto id = LOWORD(wParam);\n        if (id >= ID_CAPTURELEVEL && id <= ID_CAPTURELEVEL + SPDLOG_LEVEL_OFF)\n        {\n          setCaptureLevel((spdlog::level::level_enum)(id - ID_CAPTURELEVEL));\n        }\n        else if (id >= ID_POPUPLEVEL && id <= ID_POPUPLEVEL + SPDLOG_LEVEL_OFF)\n        {\n          setPopupLevel((spdlog::level::level_enum)(id - ID_POPUPLEVEL));\n        }\n      }\n      }\n\n      return DefWindowProc(hwnd, message, wParam, lParam);\n    }\n  }\n\n  class LogWindowSink : public spdlog::sinks::base_sink<std::mutex>\n  {\n  public:\n    using level_enum = spdlog::level::level_enum;\n\n    LogWindowSink(\n      HWND parentWindow, \n      HINSTANCE parentInstance)\n    {\n      auto hMenubar = CreateMenu();\n      auto hCaptureMenu = CreateMenu();\n      auto hPopupMenu = CreateMenu();\n      for (short level = SPDLOG_LEVEL_OFF; level >= SPDLOG_LEVEL_TRACE; --level)\n      {\n        AppendMenu(hCaptureMenu, MF_STRING, ID_CAPTURELEVEL + level, LEVEL_NAMES[level]);\n        AppendMenu(hPopupMenu,   MF_STRING, ID_POPUPLEVEL + level,   LEVEL_NAMES[level]);\n      }\n\n      AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hCaptureMenu, L\"Capture Level\");\n      AppendMenu(hMenubar, MF_POPUP, (UINT_PTR)hPopupMenu,   L\"Popup Level\");\n\n      MainLogWindow::theMenuBar = hMenubar;\n\n      set_pattern_(\"\"); // Just calls set_formatter_\n      _window = createLogWindow(\n        parentWindow, \n        parentInstance, \n        L\"xlOil Log\", \n        MainLogWindow::theMenuBar, \n        MainLogWindow::MenuWindowProc, \n        100);\n    }\n\n    void sink_it_(const spdlog::details::log_msg& msg) override\n    {\n      if (msg.level < MainLogWindow::theCaptureLogLevel)\n        return;\n\n      spdlog::memory_buf_t formatted;\n      formatter_->format(msg, formatted);\n      _window->appendMessage(\n        utf8ToUtf16(\n          std::string_view(formatted.data(), formatted.size())));\n\n      if (msg.level >= MainLogWindow::thePopupLevel)\n        _window->openWindow();\n    }\n\n    void flush_() override {}\n    \n    void set_formatter_(std::unique_ptr<spdlog::formatter> sink_formatter) override\n    {\n      base_sink::set_formatter_(std::make_unique<spdlog::pattern_formatter>(\n        \"[%H:%M:%S] [%l] %v\"));\n    }\n\n    void openWindow()\n    {\n      _window->openWindow();\n    }\n\n  private:\n    shared_ptr<ILogWindow> _window;\n  };\n\n  namespace\n  {\n    shared_ptr<LogWindowSink> theLogWindow;\n  }\n\n  std::shared_ptr<spdlog::sinks::sink>\n    makeLogWindowSink(\n      HWND parentWindow, \n      HINSTANCE parentInstance)\n  {\n    static auto ptr = new LogWindowSink(parentWindow, parentInstance);\n    theLogWindow.reset(ptr);\n    return theLogWindow;\n  }\n\n  void openLogWindow()\n  {\n    theLogWindow->openWindow();\n  }\n\n  void setLogWindowPopupLevel(const char* popupLevel)\n  {\n    const auto spdLevel = spdlog::level::from_str(popupLevel);\n    MainLogWindow::setPopupLevel(spdLevel);\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/LogWindowSink.h",
    "content": "#pragma once\n#include <memory>\n#include <xloil/WindowsSlim.h>\nnamespace spdlog { namespace sinks { class sink; } }\n\nnamespace xloil\n{\n  std::shared_ptr<spdlog::sinks::sink>\n    makeLogWindowSink(\n      HWND parentWindow,\n      HINSTANCE parentInstance);\n\n  void openLogWindow();\n  void setLogWindowPopupLevel(const char* popupLevel);\n}"
  },
  {
    "path": "src/xlOil-XLL/State.cpp",
    "content": "#include <xloil/State.h>\n#include <xlOil/WindowsSlim.h>\n#include <xloil/Throw.h>\n#include <xloil/ExcelCall.h>\n#include \"Intellisense.h\"\n#include <filesystem>\n\nnamespace xloil\n{\n  namespace\n  {\n    static HMODULE theCoreModuleHandle = nullptr;\n\n    static std::wstring ourDllName;\n    static std::wstring ourDllPath;\n    static Environment::ExcelProcessInfo ourExcelState;\n\n    // TODO: make this startup stuff noexcept?\n    void setDllPath(HMODULE handle)\n    {\n      ourDllPath = captureWStringBuffer(\n        [handle](auto* buf, auto len)\n        {\n          return GetModuleFileName(handle, buf, (DWORD)len);\n        });\n      ourDllName = std::filesystem::path(ourDllPath).filename();\n    }\n\n    int getExcelVersion()\n    {\n      // https://github.com/MicrosoftDocs/office-developer-client-docs/blob/...\n      // master/docs/excel/calling-into-excel-from-the-dll-or-xll.md\n      auto versionStr = callExcel(msxll::xlfGetWorkspace, 2);\n      return std::stoi(versionStr.toString());\n    }\n\n    HINSTANCE getExcelHInstance()\n    {\n      auto instPtr = callExcel(msxll::xlGetInstPtr);\n      return (HINSTANCE)instPtr.val.bigdata.h.hdata;\n    }\n\n    HWND getExcelHWnd()\n    {\n      auto hwnd = callExcel(msxll::xlGetHwnd);\n      return (HWND)IntToPtr(hwnd.val.w);\n    }\n\n    bool checkDynamicArraySupport() \n    {\n      // https://excel-dna.net/docs/archive/wiki/Dynamic-Arrays/\n      auto [result, retcode] = tryCallExcel(msxll::xlfFilter, 1, 1);\n      return retcode == 0;\n    }\n  }\n\n  namespace Environment\n  {\n    XLOIL_EXPORT void initAppContext()\n    {\n      ourExcelState.version = getExcelVersion();\n      ourExcelState.hInstance = getExcelHInstance();\n      ourExcelState.hWnd = (long long)getExcelHWnd();\n      ourExcelState.mainThreadId = GetCurrentThreadId();\n      ourExcelState.supportsDynamicArrays = checkDynamicArraySupport();\n    }\n    void setCoreHandle(void* coreHInstance)\n    {\n      if (theCoreModuleHandle)\n        return;\n\n      theCoreModuleHandle = (HMODULE)coreHInstance;\n      setDllPath(theCoreModuleHandle);\n    }\n    void* coreModuleHandle() noexcept\n    {\n      return theCoreModuleHandle;\n    }\n   \n    const wchar_t* coreDllPath() noexcept\n    {\n      return ourDllPath.c_str();\n    }\n    const wchar_t* coreDllName() noexcept\n    {\n      return ourDllName.c_str();\n    }\n\n    ExcelProcessInfo::ExcelProcessInfo()\n      : version(0)\n      , hInstance(nullptr)\n      , hWnd(0)\n      , mainThreadId(0)\n    {}\n\n\n    XLOIL_EXPORT const ExcelProcessInfo& excelProcess() noexcept\n    {\n      return ourExcelState;\n    }\n\n    void registerIntellisense(const wchar_t* xllPath)\n    {\n      registerIntellisenseHook(xllPath);\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/StaticRegister.cpp",
    "content": "#include <xlOil/StaticRegister.h>\n#include <xlOil-XLL/FuncRegistry.h>\n#include <xlOil/StringUtils.h>\n#include <xlOil/FuncSpec.h>\n#include <xlOil/Throw.h>\n#include <xlOil/ExcelCall.h>\n#include <filesystem>\n\nusing std::vector;\nusing std::make_shared;\nusing std::wstring;\n\nnamespace xloil\n{\n  detail::FuncInfoBuilderBase::FuncInfoBuilderBase(size_t nArgs, const int* types)\n    : _info(new FuncInfo())\n    , _iArg(0)\n  {\n    _info->args.resize(nArgs);\n    for (size_t i = 0; i < nArgs; ++i)\n      _info->args[i].type = types[i];\n  }\n\n  std::shared_ptr<FuncInfo> detail::FuncInfoBuilderBase::getInfo()\n  {\n    auto nArgs = _info->args.size();\n\n    for (size_t i = 0; i < nArgs; ++i)\n      if (_info->args[i].name.empty())\n        _info->args[i].name = fmt::format(L\"Arg_{}\", i);\n\n    return _info;\n  }\n\n  namespace detail\n  {\n    std::list<StaticRegistrationBuilder>& getFuncRegistryQueue()\n    {\n      static std::list<StaticRegistrationBuilder> theQueue;\n      return theQueue;\n    }\n\n    StaticRegistrationBuilder& createRegistrationMemo(\n      const char* entryPoint_, int funcOpts, size_t nArgs, const int* types)\n    {\n      getFuncRegistryQueue().emplace_back(entryPoint_, funcOpts, nArgs, types);\n      return getFuncRegistryQueue().back();\n    }\n\n    std::vector<std::shared_ptr<const WorksheetFuncSpec>>\n      processRegistryQueue(const wchar_t* moduleName)\n    {\n      std::vector<std::shared_ptr<const WorksheetFuncSpec>> result;\n      auto& queue = getFuncRegistryQueue();\n      for (auto f : queue)\n        result.emplace_back(f.writeFuncSpec(moduleName));\n\n      queue.clear();\n      return result;\n    }\n\n    std::vector<std::shared_ptr<const RegisteredWorksheetFunc>>\n      registerStaticFuncs(const wchar_t* moduleName, std::wstring& errors)\n    {\n      const auto specs = processRegistryQueue(moduleName);\n      std::vector<std::shared_ptr<const RegisteredWorksheetFunc>> result;\n      for (auto& spec : specs)\n        try\n        {\n          result.emplace_back(spec->registerFunc());\n        }\n        catch (const std::exception& e)\n        {\n          errors += fmt::format(L\"{0}: {1}\\n\", spec->name(), utf8ToUtf16(e.what()));\n        }\n      return result;\n    }\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/Throw.cpp",
    "content": "#include <xloil/Throw.h>\n#include <xloil/Log.h>\n#include <xlOilHelpers/Exception.h>\n\nnamespace xloil\n{\n  XLOIL_EXPORT void logException(\n    const char* path,\n    const int line,\n    const char* func,\n    const char* msg) noexcept\n  {\n    try\n    {\n      auto lastSlash = strrchr(path, '\\\\');\n      XLO_DEBUG(\"{0} (in {2}:{3} during {1})\",\n        msg, func, lastSlash ? lastSlash + 1 : path, line);\n    }\n    catch (...)\n    {\n    }\n  }\n\n  std::wstring writeWindowsError()\n  {\n    return Helpers::writeWindowsError();\n  }\n}"
  },
  {
    "path": "src/xlOil-XLL/XlCall.cpp",
    "content": "/*\n**  This file defines the entry points\n**  which are used in the Microsoft Excel C API.\n*/\n#include <Excel2013SDK/src/xlcall.cpp>\n"
  },
  {
    "path": "src/xlOil-XLL/XllEvents.cpp",
    "content": "#include <xlOil/Events.h>\n\nnamespace xloil\n{\n  namespace Event\n  {\n    XLOIL_DEFINE_EVENT(CalcCancelled);\n  }\n}\n"
  },
  {
    "path": "src/xlOil-XLL/xlOil-XLL.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"DebugStatic|Win32\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"DebugStatic|x64\">\n      <Configuration>DebugStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|Win32\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseStatic|x64\">\n      <Configuration>ReleaseStatic</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}</ProjectGuid>\n    <RootNamespace>xlOil</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup>\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='DebugStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup>\n    <IncludePath>$(SolutionDir)external\\Excel2013SDK\\INCLUDE;$(IncludePath)</IncludePath>\n  </PropertyGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup />\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='DebugStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='ReleaseStatic'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_STATIC_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)'=='Release'\">\n    <ClCompile>\n      <PreprocessorDefinitions>XLOIL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"ArrayBuilder.cpp\" />\n    <ClCompile Include=\"Async.cpp\" />\n    <ClCompile Include=\"Caller.cpp\" />\n    <ClCompile Include=\"Date.cpp\" />\n    <ClCompile Include=\"FPArray.cpp\" />\n    <ClCompile Include=\"Intellisense.cpp\" />\n    <ClCompile Include=\"Log.cpp\" />\n    <ClCompile Include=\"LogWindow.cpp\" />\n    <ClCompile Include=\"LogWindowSink.cpp\" />\n    <ClCompile Include=\"Throw.cpp\" />\n    <ClCompile Include=\"ExcelArray.cpp\" />\n    <ClCompile Include=\"ExcelCall.cpp\" />\n    <ClCompile Include=\"ExcelObj.cpp\" />\n    <ClCompile Include=\"ExcelRef.cpp\" />\n    <ClCompile Include=\"FuncRegistry.cpp\" />\n    <ClCompile Include=\"State.cpp\" />\n    <ClCompile Include=\"StaticRegister.cpp\" />\n    <ClCompile Include=\"XlCall.cpp\" />\n    <ClCompile Include=\"XllEvents.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"ExcelCallMapping.h\" />\n    <ClInclude Include=\"FuncRegistry.h\" />\n    <ClInclude Include=\"Intellisense.h\" />\n    <ClInclude Include=\"LogWindowSink.h\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "src/xlOil-XLL/xlOil-XLL.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"Caller.cpp\" />\n    <ClCompile Include=\"Date.cpp\" />\n    <ClCompile Include=\"ExcelArray.cpp\" />\n    <ClCompile Include=\"ExcelCall.cpp\" />\n    <ClCompile Include=\"ExcelObj.cpp\" />\n    <ClCompile Include=\"ExcelRef.cpp\" />\n    <ClCompile Include=\"StaticRegister.cpp\" />\n    <ClCompile Include=\"XlCall.cpp\" />\n    <ClCompile Include=\"State.cpp\" />\n    <ClCompile Include=\"FuncRegistry.cpp\" />\n    <ClCompile Include=\"Async.cpp\" />\n    <ClCompile Include=\"XllEvents.cpp\" />\n    <ClCompile Include=\"Throw.cpp\" />\n    <ClCompile Include=\"LogWindow.cpp\" />\n    <ClCompile Include=\"Intellisense.cpp\" />\n    <ClCompile Include=\"FPArray.cpp\" />\n    <ClCompile Include=\"Log.cpp\" />\n    <ClCompile Include=\"LogWindowSink.cpp\" />\n    <ClCompile Include=\"ArrayBuilder.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"FuncRegistry.h\" />\n    <ClInclude Include=\"ExcelCallMapping.h\" />\n    <ClInclude Include=\"Intellisense.h\" />\n    <ClInclude Include=\"LogWindowSink.h\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "src/xlOilHelpers/Environment.cpp",
    "content": "#include \"Environment.h\"\n#include <xloil/StringUtils.h>\n#include <xloil/WindowsSlim.h>\n#include \"Exception.h\"\n#include <regex>\n#include <cassert>\n\nusing std::wstring;\nusing std::wregex;\nusing std::wsmatch;\nusing std::wsregex_iterator;\n\nnamespace xloil\n{\n    std::wstring getEnvironmentVar(const wchar_t * name)\n    {\n      return captureWStringBuffer(\n        [name](auto* buf, auto len)\n      {\n        return GetEnvironmentVariableW(name, buf, (DWORD)len);\n      });\n    }\n\n    std::string getEnvironmentVar(const char * name)\n    {\n      return captureStringBuffer(\n        [name](auto* buf, auto len)\n      {\n        return GetEnvironmentVariableA(name, buf, (DWORD)len);\n      });\n    }\n\n    bool setEnvironmentVar(const wchar_t* name, const wchar_t* value)\n    {\n      // The CRT (getenv) makes a copy of the environment variable block of the process, \n      // on startup so we need ensure both the getenv block and Win32 environment are\n      // modified. However based on https://stackoverflow.com/questions/13742429, we \n      // shouldn't need call the Win32 API function.\n      return _wputenv_s(name, value) != EINVAL;\n    }\n\n    bool setEnvironmentVar(const char* name, const char* value)\n    {\n      return _putenv_s(name, value) != EINVAL;\n    }\n\n    std::wstring expandEnvironmentStrings(const wchar_t* str)\n    {\n      return captureWStringBuffer(\n        [str](auto* buf, auto len)\n      {\n        return ExpandEnvironmentStringsW(str, buf, (DWORD)len);\n      });\n    }\n\n    PushEnvVar::PushEnvVar(const wstring& name, const wstring& value)\n      : PushEnvVar(name.c_str(), value.c_str())\n    {}\n\n    PushEnvVar::PushEnvVar(const wchar_t* name, const wchar_t* value)\n      : _name(name)\n      , _previous(getEnvironmentVar(name))\n    {\n      auto s = expandEnvironmentStrings(value);\n      SetEnvironmentVariable(name, s.c_str());\n    }\n\n    PushEnvVar::~PushEnvVar()\n    {\n      pop();\n    }\n\n    void PushEnvVar::pop()\n    {\n      if (_name.empty())\n        return;\n\n      SetEnvironmentVariable(_name.c_str(), _previous.c_str());\n      _name.clear();\n      _previous.clear();\n    }\n    PushDllDirectory::PushDllDirectory(const wchar_t* path) noexcept\n    {\n      static_assert(_countof(_previous) == MAX_PATH);\n      GetDllDirectory(_countof(_previous), _previous);\n      SetDllDirectory(path);\n    }\n    PushDllDirectory::PushDllDirectory(const char* path) noexcept\n    {\n      static_assert(_countof(_previous) == MAX_PATH);\n      GetDllDirectory(_countof(_previous), _previous);\n      SetDllDirectoryA(path);\n    }\n    PushDllDirectory::~PushDllDirectory() noexcept\n    {\n      SetDllDirectory(_previous);\n    }\n    namespace\n    {\n      inline bool getWindowsRegistryValue(\n        const std::wstring_view& hive,\n        const std::wstring_view& location,\n        int regType,\n        void* buffer,\n        DWORD* bufSize)\n      {\n        HKEY root;\n        if (hive == L\"HKLM\")\n          root = HKEY_LOCAL_MACHINE;\n        else if (hive == L\"HKCU\")\n          root = HKEY_CURRENT_USER;\n        else if (hive == L\"HKCR\")\n          root = HKEY_CLASSES_ROOT;\n        else\n          return false;\n\n        const auto lastSlash = location.rfind(L'\\\\');\n        const auto subKey = wstring(location.substr(0, lastSlash));\n        const auto value = lastSlash + 1 < location.size()\n          ? wstring(location.substr(lastSlash + 1)) : wstring();\n\n        return ERROR_SUCCESS == RegGetValue(\n          root,\n          subKey.c_str(),\n          value.c_str(),\n          regType,\n          nullptr /*type not required*/,\n          buffer,\n          bufSize);\n      }\n    }\n\n    bool getWindowsRegistryValue(\n      const std::wstring_view& hive,\n      const std::wstring_view& location,\n      std::wstring& result)\n    {\n      wchar_t buffer[1024];\n      DWORD bufSize = _countof(buffer);\n      if (getWindowsRegistryValue(hive, location, RRF_RT_REG_SZ, buffer, &bufSize))\n      {\n        result = buffer;\n        return true;\n      }\n      return false;\n    }\n\n    bool getWindowsRegistryValue(\n      const std::wstring_view& hive,\n      const std::wstring_view& location,\n      unsigned long& result)\n    {\n      char buffer[sizeof(DWORD)];\n      DWORD bufSize = sizeof(DWORD);\n      if (getWindowsRegistryValue(hive, location, RRF_RT_REG_DWORD, buffer, &bufSize))\n      {\n        result = *(DWORD*)buffer;\n        return true;\n      }\n      return false;\n    }\n\n    static wregex registryExpander(L\"<(HK[A-Z][A-Z])\\\\\\\\([^>]*)>\",\n      std::regex_constants::optimize | std::regex_constants::ECMAScript);\n\n    wstring expandWindowsRegistryStrings(const std::wstring& str)\n    {\n      wstring result;\n\n      wsregex_iterator next(str.begin(), str.end(), registryExpander);\n      wsregex_iterator end;\n      wsmatch match;\n      wstring regValue;\n      if (next == end)\n        return str;\n      while (next != end)\n      {\n        match = *next;\n        assert(match.size() == 3);\n        result += match.prefix().str();\n        if (getWindowsRegistryValue(match[1].str(), match[2].str(), regValue))\n          result += regValue;\n        next++;\n      }\n      result += match.suffix().str();\n\n      return result;\n    }\n\n    namespace Helpers\n    {\n      std::wstring writeWindowsError()\n      {\n        wchar_t* lpMsgBuf = nullptr;\n        const auto dw = GetLastError();\n        const auto size = FormatMessage(\n          FORMAT_MESSAGE_ALLOCATE_BUFFER |\n          FORMAT_MESSAGE_FROM_SYSTEM |\n          FORMAT_MESSAGE_IGNORE_INSERTS,\n          NULL,\n          dw,\n          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n          (LPTSTR)&lpMsgBuf,\n          0, NULL);\n\n        // Frees the buffer on exit\n        const auto msgBuf = std::unique_ptr<wchar_t, decltype(&LocalFree)>(\n          lpMsgBuf, LocalFree);\n\n        return wstring(lpMsgBuf, size);\n      }\n\n      std::pair<HANDLE, std::wstring> makeTempFile()\n      {\n        wchar_t szTempFileName[MAX_PATH];\n        wchar_t lpTempPathBuffer[MAX_PATH];\n\n        //  Gets the temp path env string (no guarantee it's a valid path).\n        auto retVal = GetTempPath(MAX_PATH, lpTempPathBuffer);\n        if (retVal > MAX_PATH || retVal == 0)\n          throw Exception(\"GetTempPath failed\");\n\n        retVal = GetTempFileName(lpTempPathBuffer,\n          L\"XLO\", // prefix \n          0,      // use system time for uniquifier\n          szTempFileName);\n        if (retVal == 0)\n          throw Exception(\"GetTempFileName failed\");\n\n        //  Creates the new file to write to for the upper-case version.\n        auto handle = CreateFile((LPTSTR)szTempFileName, // file name \n          GENERIC_READ,        // open for write \n          FILE_SHARE_READ | FILE_SHARE_WRITE,     // share everything\n          NULL,                 // default security \n          CREATE_ALWAYS,        // overwrite existing\n          FILE_ATTRIBUTE_TEMPORARY, //| FILE_FLAG_DELETE_ON_CLOSE,\n          NULL);                // no template \n\n        if (handle == INVALID_HANDLE_VALUE)\n          throw Exception(\"CreateFile failed\");\n\n        return std::make_pair(handle, wstring(szTempFileName));\n      }\n    }\n  }"
  },
  {
    "path": "src/xlOilHelpers/Environment.h",
    "content": "#pragma once\n#include <string>\n\ntypedef void* HANDLE;\n\nnamespace xloil\n{\n  /// <summary>\n  /// Returns the value of specified environment variable\n  /// or an empty string if it does not exist\n  /// </summary>\n  std::wstring getEnvironmentVar(const wchar_t* name);\n  std::string getEnvironmentVar(const char * name);\n\n\n  /// <summary>\n  /// Sets the enviroment variable to a given value, returning \n  /// false if the action fails\n  /// </summary>\n  bool setEnvironmentVar(const wchar_t* name, const wchar_t* value);\n  bool setEnvironmentVar(const char* name, const char* value);\n\n  /// <summary>\n  /// Expands environment variables in the specified string.\n  /// Equivalent to the Windows API ExpandEnvironmentStrings\n  /// </summary>\n  std::wstring expandEnvironmentStrings(const wchar_t* str);\n  inline std::wstring expandEnvironmentStrings(const std::wstring& str)\n  {\n    return expandEnvironmentStrings(str.c_str());\n  }\n\n  /// <summary>\n  /// Sets an environment variable and unsets when the object goes out of scope.\n  /// </summary>\n  class PushEnvVar\n  {\n  private:\n    std::wstring _previous;\n    std::wstring _name;\n\n  public:\n    PushEnvVar(const std::wstring& name, const std::wstring& value);\n    PushEnvVar(const wchar_t* name, const wchar_t* value);\n    ~PushEnvVar();\n    void pop();\n  };\n\n  /// <summary>\n  /// Calls SetDllDirectory on the provided path and restores the previous\n  /// value in it's dtor.  Safer than calling SetDllDirectory(NULL) which\n  /// resets the search path.\n  /// </summary>\n  class PushDllDirectory\n  {\n  private:\n    wchar_t _previous[260]; // MAX_PATH = 260\n  public:\n    PushDllDirectory(const wchar_t* path) noexcept;\n    PushDllDirectory(const char* path) noexcept;\n    ~PushDllDirectory() noexcept;\n  };\n\n  /// <summary>\n  /// Gets a string value from the registry give a hive and key.\n  /// Hive can be HKCU, HKCR, HKLM. A trailing slash can be used \n  /// to fetch the default value for that key.\n  /// \n  /// Returns false if the key was not matched.\n  /// </summary>\n  bool getWindowsRegistryValue(\n    const std::wstring_view& hive,\n    const std::wstring_view& location,\n    std::wstring& result);\n\n  bool getWindowsRegistryValue(\n    const std::wstring_view& hive,\n    const std::wstring_view& location,\n    unsigned long& result);\n\n  /// <summary>\n  /// Matches and expands registry keys in the given string. Registry\n  /// keys should be specified in the form \"<(HKXX)\\(Reg\\Key\\Value)>\" \n  /// where HKXX can be HKCU, HKCR, HKLM. Only string values can be\n  /// matched.\n  /// \n  /// A trailing slash can be used to fetch the default value for that\n  /// key.\n  /// \n  /// Behaves similarly to expandEnvironmentStrings in that unmatched\n  /// keys will be replaced with an empty string\n  /// </summary>\n  std::wstring expandWindowsRegistryStrings(const std::wstring& str);\n\n  namespace Helpers\n  {\n    std::pair<HANDLE, std::wstring> makeTempFile();\n  }\n}"
  },
  {
    "path": "src/xlOilHelpers/Exception.h",
    "content": "#pragma once\n\n#include <xloil/StringUtils.h>\n#include <stdexcept>\n\nnamespace xloil\n{\n  namespace Helpers\n  {\n    /// <summary>\n    /// Lightweight exception class for use in xloilHelpers\n    /// </summary>\n    class Exception : public std::runtime_error\n    {\n    public:\n      template<class... Args>\n      Exception(\n        const char* str, Args... args)\n        : Exception(formatStr(str, std::forward<Args>(args)...))\n      {}\n\n      template<class... Args>\n      Exception(\n        const wchar_t* str, Args... args)\n        : Exception(formatStr(str, std::forward<Args>(args)...))\n      {}\n\n      inline Exception(const std::wstring& msg)\n        : runtime_error(utf16ToUtf8(msg.c_str()))\n      {}\n\n      inline Exception(\n        const std::string& msg)\n        : runtime_error(msg.c_str())\n      {}\n    };\n\n    std::wstring writeWindowsError();\n  }\n}"
  },
  {
    "path": "src/xlOilHelpers/GuidUtils.cpp",
    "content": "#include \"GuidUtils.h\"\n#include \"Exception.h\"\n\n#include <xloil/WindowsSlim.h>\n#include <xloil/StringUtils.h>\n#include <string>\n#include <vector>\n#include <memory>\n#include <combaseapi.h> // StringFromGUID2\n#include <bcrypt.h>\n#include <wincrypt.h>\n\n#pragma comment(lib, \"bcrypt.lib\")\n//#pragma comment(lib, \"crypt32.lib\")\n\nusing std::string;\nusing std::wstring;\nusing std::make_shared;\nusing xloil::Helpers::Exception;\n\n#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001L)\n\nnamespace\n{\n  class HashAlgorithm\n  {\n    BCRYPT_ALG_HANDLE       hAlg = NULL;\n    BCRYPT_HASH_HANDLE      hHash = NULL;\n    PBYTE                   pbHashObject = NULL;\n    PBYTE                   pbHash = NULL;\n    DWORD                   cbHash;\n\n  public:\n    HashAlgorithm(const wchar_t* algorithm)\n    {\n      NTSTATUS status = STATUS_UNSUCCESSFUL;\n      DWORD cbData = 0, cbHashObject = 0;\n\n      //open an algorithm handle\n      if (!BCRYPT_SUCCESS(status = BCryptOpenAlgorithmProvider(\n        &hAlg,\n        algorithm,\n        NULL,\n        0)))\n      {\n        throw Exception(L\"Error 0x{x} returned by BCryptOpenAlgorithmProvider\", status);\n      }\n\n      //calculate the size of the buffer to hold the hash object\n      if (!BCRYPT_SUCCESS(status = BCryptGetProperty(\n        hAlg,\n        BCRYPT_OBJECT_LENGTH,\n        (PBYTE)&cbHashObject,\n        sizeof(DWORD),\n        &cbData,\n        0)))\n      {\n        throw Exception(L\"Error 0x{x} returned by BCryptGetProperty\", status);\n      }\n\n      //allocate the hash object on the heap\n      pbHashObject = new BYTE[cbHashObject];\n\n      //calculate the length of the hash\n      if (!BCRYPT_SUCCESS(status = BCryptGetProperty(\n        hAlg,\n        BCRYPT_HASH_LENGTH,\n        (PBYTE)&cbHash,\n        sizeof(DWORD),\n        &cbData,\n        0)))\n      {\n        throw Exception(L\"Error 0x{x} returned by BCryptGetProperty\", status);\n      }\n\n      //allocate the hash buffer on the heap\n      pbHash = new BYTE[cbHash];\n\n      //create a hash\n      if (!BCRYPT_SUCCESS(status = BCryptCreateHash(\n        hAlg,\n        &hHash,\n        pbHashObject,\n        cbHashObject,\n        NULL,\n        0,\n        0)))\n      {\n        throw Exception(L\"Error 0x{x} returned by BCryptCreateHash\", status);\n      }\n    }\n\n    void transformBlock(BYTE* data, DWORD dataBytes)\n    {\n      NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n      //hash some data\n      if (!BCRYPT_SUCCESS(status = BCryptHashData(\n        hHash,\n        data,\n        dataBytes,\n        0)))\n      {\n        throw Exception(L\"Error 0x{x} returned by BCryptHashData\", status);\n      }\n    }\n\n    auto computeHash()\n    {\n      NTSTATUS status = STATUS_UNSUCCESSFUL;\n\n      //close the hash\n      if (!BCRYPT_SUCCESS(status = BCryptFinishHash(\n        hHash,\n        pbHash,\n        cbHash,\n        0)))\n      {\n        throw Exception(L\"Error 0x{x} returned by BCryptFinishHash\", status);\n      }\n\n      return std::vector<BYTE>(pbHash, pbHash + cbHash);\n    }\n\n    ~HashAlgorithm()\n    {\n\n      if (hAlg)\n        BCryptCloseAlgorithmProvider(hAlg, 0);\n\n      if (hHash)\n        BCryptDestroyHash(hHash);\n\n      if (pbHashObject)\n        delete[] pbHashObject;\n\n      if (pbHash)\n        delete[] pbHash;\n    }\n  };\n\n  void SwapBytes(BYTE* guid, int left, int right)\n  {\n    auto temp = guid[left];\n    guid[left] = guid[right];\n    guid[right] = temp;\n  }\n\n  // Converts a GUID (expressed as a byte array) to/from network order (MSB-first).\n  void SwapByteOrder(BYTE* guid)\n  {\n    SwapBytes(guid, 0, 3);\n    SwapBytes(guid, 1, 2);\n    SwapBytes(guid, 4, 5);\n    SwapBytes(guid, 6, 7);\n  }\n\n\n  /// <summary>\n  /// Creates a name-based UUID using the algorithm from RFC 4122 4.3. (for SHA-1 hashing)\n  /// </summary>\n  /// <param name=\"namespaceId\">The ID of the namespace.</param>\n  /// <param name=\"name\">The name (within that namespace).</param>\n  /// <returns>A UUID derived from the namespace and name.</returns>\n  /// <remarks>See <a href=\"https://faithlife.codes/blog/2011/04/generating_a_deterministic_guid/\">Generating a deterministic GUID</a>.</remarks>\n  void Create(GUID& result, const GUID& namespaceId, const string& name)\n  {\n    static_assert(sizeof(GUID) == 16);\n\n    // convert the name to a sequence of octets (as defined by the standard or conventions of its namespace) (step 3)\n    // ASSUME: UTF-8 encoding is always appropriate\n    auto nameBytes = (BYTE*)name.data();\n\n    // convert the namespace UUID to network order (step 3)\n    BYTE namespaceBytes[sizeof(GUID)];\n    memcpy(namespaceBytes, (BYTE*)&namespaceId, sizeof(GUID));\n    SwapByteOrder(namespaceBytes);\n\n    // compute the hash of the name space ID concatenated with the name (step 4)\n    HashAlgorithm algorithm(BCRYPT_SHA1_ALGORITHM);\n    algorithm.transformBlock(namespaceBytes, sizeof(GUID));\n    algorithm.transformBlock(nameBytes, (DWORD)name.size());\n    auto hash = algorithm.computeHash();\n\n    // most bytes from the hash are copied straight to the bytes of the new GUID (steps 5-7, 9, 11-12)\n    auto newGuid = (BYTE*)&result;\n    memcpy_s(newGuid, sizeof(GUID), hash.data(), sizeof(GUID));\n\n    const auto version = 5;\n\n    // set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the appropriate 4-bit version number from Section 4.1.3 (step 8)\n    newGuid[6] = (BYTE)((newGuid[6] & 0x0F) | (version << 4));\n\n    // set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively (step 10)\n    newGuid[8] = (BYTE)((newGuid[8] & 0x3F) | 0x80);\n\n    // convert the resulting UUID to local byte order (step 13)\n    SwapByteOrder(newGuid);\n  }\n\n  const GUID theExcelDnaNamespaceGuid =\n    { 0x306D016E, 0xCCE8, 0x4861, { 0x9D, 0xA1, 0x51, 0xA2, 0x7C, 0xBE, 0x34, 0x1A} };\n}\nnamespace xloil\n{\n  // Return a stable Guid from the xll path - used for COM registration and helper functions\n  // Uses the .ToUpperInvariant() of the path name.\n  void stableGuidFromString(GUID& result, const GUID& id, const std::wstring& path)\n  {\n    wstring upper;\n    upper.resize(path.size());\n    LCMapStringW(LOCALE_INVARIANT, LCMAP_UPPERCASE, path.data(), (int)path.size(), upper.data(), (int)upper.size());\n    const string utf8 = xloil::utf16ToUtf8(upper);\n    return Create(result, id, utf8);\n  }\n\n  std::wstring guidToWString(const GUID& guid, GuidToString mode)\n  {\n    wchar_t result[39]; // 32 hex chars + 4 hyphens + two braces + null terminator\n    int ret = 0;\n\n    switch (mode)\n    {\n    case GuidToString::PUNCTUATED:\n      ret = StringFromGUID2(guid, result, _countof(result));\n      break;\n    case GuidToString::HEX:\n      ret = _snwprintf_s(\n        result, sizeof(result),\n        L\"%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x\",\n        guid.Data1,    guid.Data2,    guid.Data3,\n        guid.Data4[0], guid.Data4[1], guid.Data4[2],\n        guid.Data4[3], guid.Data4[4], guid.Data4[5],\n        guid.Data4[6], guid.Data4[7]);\n      break;\n    case GuidToString::BASE62:\n    {\n      auto written = 0u;\n      auto uintPtr = (const size_t*)&guid;\n      for (auto i = 0; i < sizeof(guid) / sizeof(*uintPtr); ++i)\n        written += unsignedToString<62>(uintPtr[i], result + written, _countof(result) - written);\n\n#ifdef _WIN64\n      static_assert(sizeof(guid) == 2 * sizeof(*uintPtr));\n#else\n      static_assert(sizeof(guid) == 4 * sizeof(*uintPtr));\n#endif\n\n      result[written] = 0; // null terminator\n      ret = written > 0;\n      break;\n    }\n    }\n\n    if (ret <= 0)\n      throw Exception(\"Failed to write GUID as string\");\n\n    return result;\n  }\n\n  bool createGuid(_GUID& guid)\n  {\n    return CoCreateGuid(&guid) == 0;\n  }\n}\n"
  },
  {
    "path": "src/xlOilHelpers/GuidUtils.h",
    "content": "#pragma once\n#include <string>\n#include <xloil/ExportMacro.h>\n#include <guiddef.h>\n\nnamespace xloil\n{\n  /// <summary>\n  /// Creates a name-based UUID using the algorithm from RFC 4122 4.3. (for SHA-1 hashing)\n  /// </summary>\n  /// <param name=\"namespaceId\">The ID of the namespace.</param>\n  /// <param name=\"name\">The name (within that namespace).</param>\n  /// <returns>A UUID derived from the namespace and name.</returns>\n  /// <remarks>See <a href=\"https://faithlife.codes/blog/2011/04/generating_a_deterministic_guid/\">\n  /// Generating a deterministic GUID</a>.\n  /// </remarks>\n  void stableGuidFromString(_GUID& result, const _GUID& id, const std::wstring& path);\n\n  enum class GuidToString\n  {\n    HEX,\n    PUNCTUATED,\n    BASE62\n  };\n  /// <summary>\n  /// Wrties the guid in a string of the form \n  /// \n  ///   * PUNCTUATED: '{V-W-X-Y-Z}' length 38 + null terminator\n  ///   * HEX : 'VWXYZ' with length 32 + null terminator\n  ///   * BASE62: [0-0a-zA-Z]* with length max 23 + null terminator\n  ///   \n  /// </summary>\n  std::wstring guidToWString(const _GUID& guid, GuidToString mode = GuidToString::PUNCTUATED);\n\n  bool createGuid(_GUID& guid);\n}"
  },
  {
    "path": "src/xlOilHelpers/Settings.cpp",
    "content": "﻿#include \"Settings.h\"\n#include \"Exception.h\"\n#include <xlOil/StringUtils.h>\n#include <xloilHelpers/Environment.h>\n\n#include <filesystem>\n#include <fstream>\n\n// We need access to a private ctor - yikes!\n#define TOML_ABI_NAMESPACES 0\n#define private public\n#include <toml++/toml.h>\n#undef private\n\nnamespace fs = std::filesystem;\nusing xloil::Helpers::Exception;\nusing std::vector;\nusing std::string;\nusing std::wstring;\nusing std::pair;\nusing std::make_pair;\nusing std::shared_ptr;\nusing std::make_shared;\n\nnamespace xloil\n{\n  namespace Settings\n  {\n    namespace\n    {\n      auto findStr(const toml::view_node& root, const char* tag, const string& default)\n      {\n        return root[tag].value_or(default);\n      }\n      auto findVecStr(const toml::view_node& root, const char* tag)\n      {\n        vector<wstring> result;\n        auto utf8 = root[tag].as_array();\n        if (utf8)\n          for (auto& x : *utf8)\n            result.push_back(utf8ToUtf16(x.value_or(\"\")));\n        return result;\n      }\n    }\n    vector<wstring> plugins(const toml::view_node& root)\n    {\n      return findVecStr(root, \"Plugins\");\n    }\n    std::wstring pluginSearchPattern(const toml::view_node& root)\n    {\n      return utf8ToUtf16(findStr(root, \"PluginSearchPattern\", \"\"));\n    }\n    std::wstring logFilePath(const toml::table& root)\n    {\n      auto found = findStr(root[XLOIL_SETTINGS_ADDIN_SECTION], \"LogFile\", \"\");\n      return !found.empty()\n        ? utf8ToUtf16(found)\n        : fs::path(utf8ToUtf16(*root.source().path)).replace_extension(\"log\").wstring();\n    }\n    std::string logLevel(const toml::table& root)\n    {\n      auto addinRoot = root[XLOIL_SETTINGS_ADDIN_SECTION];\n      return findStr(addinRoot, \"LogLevel\", \"warn\");\n    }\n    std::string logPopupLevel(const toml::table& root)\n    {\n      auto addinRoot = root[XLOIL_SETTINGS_ADDIN_SECTION];\n      return findStr(addinRoot, \"LogPopupLevel\", \"error\");\n    }\n    std::string logFlushLevel(const toml::table& root)\n    {\n      auto addinRoot = root[XLOIL_SETTINGS_ADDIN_SECTION];\n      return findStr(addinRoot, \"LogFlushLevel\", \"warning\");\n    }\n    std::pair<size_t, size_t> Settings::logRotation(const toml::table& root)\n    {\n      auto addinRoot = root[XLOIL_SETTINGS_ADDIN_SECTION];\n      // (size_t) cast needed for 32-bit as TOML lib is hard-coded to \n      // return int64 for all integer types\n      return std::make_pair(\n        (size_t)addinRoot[\"LogMaxSize\"].value_or(1024u),\n        (size_t)addinRoot[\"LogNumberOfFiles\"].value_or(2u));\n    }\n    std::vector<std::wstring> dateFormats(const toml::table& root)\n    {\n      auto addinRoot = root[XLOIL_SETTINGS_ADDIN_SECTION];\n      return findVecStr(addinRoot, \"DateFormats\");\n    }\n\n    namespace\n    {\n      // Settings in the enviroment block looks like key=val\n      // We interpret this as an environment variable to set\n      template<class TTable, class TResult>\n      void writeTableAsPairs(const TTable& table, TResult& container)\n      {\n        for (auto [key, val] : table)\n        {\n          container.emplace_back(make_pair(\n            utf8ToUtf16(key),\n            utf8ToUtf16(val.value_or(\"\"))));\n        }\n      }\n    }\n\n    std::vector<std::pair<std::wstring, std::wstring>> \n      environmentVariables(const toml::view_node& root)\n    {\n      vector<pair<wstring, wstring>> result;\n      auto environment = root[\"Environment\"];\n      if (environment.is_array())\n      {\n        for (auto& table : *environment.as_array())\n          if (table.is_table())\n            writeTableAsPairs(*table.as_table(), result);\n      }\n      else if (environment.is_table())\n      {\n        writeTableAsPairs(*environment.as_table(), result);\n      }\n      return result;\n    }\n\n    bool loadBeforeCore(const toml::table& root)\n    {\n      return root[XLOIL_SETTINGS_ADDIN_SECTION][\"LoadBeforeCore\"].value_or(false);\n    }\n\n    toml::node_view<const toml::node> findPluginSettings(\n      const toml::table* table, const char* name)\n    {\n      // Note: if you get a compile error here, make sure the ctor for node_view\n      // is public.  It's hidden in the original code, which means it can only\n      // be constructed from a table, not a table iterator. This is an inconvenience\n      // which I fixed!\n      if (table)\n        for (auto i = table->cbegin(); i != table->cend(); ++i)\n        {\n          if (_stricmp((*i).first.data(), name) == 0)\n            return toml::view_node(&(*i).second);\n        }\n   \n      return toml::view_node();\n    }\n  }\n  std::shared_ptr<const toml::table> findSettingsFile(const wchar_t* dllPath)\n  {\n    fs::path path;\n \n    const auto settingsFileName = \n      fs::path(dllPath).filename().replace_extension(XLOIL_SETTINGS_FILE_EXT);\n    \n    auto directoryOverride = getEnvironmentVar(\"XLOIL_SETTINGS_DIR\");\n    if (!directoryOverride.empty())\n      path = fs::path(directoryOverride) / settingsFileName;\n    else\n    {\n      // Look in the user's appdata\n      path = fs::path(getEnvironmentVar(L\"APPDATA\")) / L\"xlOil\" / settingsFileName;\n    }\n    \n    // If not found, check the same directory as the dll itself\n    std::error_code fsErr;\n    if (!fs::exists(path, fsErr))\n      path = fs::path(dllPath).remove_filename() / settingsFileName;\n\n    try\n    {\n      if (!fs::exists(path, fsErr))\n        return shared_ptr<const toml::table>();\n      \n      auto ifs = std::ifstream{ path.wstring() };\n\n      return make_shared<toml::table>(\n        toml::parse(ifs, utf16ToUtf8(path.wstring())));\n    }\n    catch (const toml::parse_error& e)\n    {\n      throw Exception(\"Error parsing settings file '%s' at line %d:\\n %s\",\n        path.string().c_str(), e.source().begin.line, e.what());\n    }\n  }\n}"
  },
  {
    "path": "src/xlOilHelpers/Settings.h",
    "content": "#pragma once\n#include <vector>\n#include <string>\n#include <memory>\n\nnamespace toml {\n    class table;\n    class node;\n    template <typename> class node_view;\n    using view_node = node_view<const node>;\n}\n\nnamespace xloil\n{\n  constexpr char* XLOIL_SETTINGS_FILE_EXT = \"ini\";\n  constexpr char* XLOIL_SETTINGS_ADDIN_SECTION = \"Addin\";\n\n  namespace Settings\n  {\n    std::wstring logFilePath(const toml::table& root);\n\n    std::string logLevel(const toml::table& root);\n\n    std::string logPopupLevel(const toml::table& root);\n\n    std::string logFlushLevel(const toml::table& root);\n\n    std::pair<size_t, size_t> logRotation(const toml::table& root);\n\n    std::vector<std::wstring> plugins(const toml::view_node& root);\n\n    std::wstring pluginSearchPattern(const toml::view_node& root);\n\n    std::vector<std::wstring> dateFormats(const toml::table& root);\n\n    std::vector<std::pair<std::wstring, std::wstring>>\n      environmentVariables(const toml::view_node& root);\n\n    bool loadBeforeCore(const toml::table& root);\n\n    /// <summary>\n    /// Lookup name in table in a case-insensitive way. TOML lookup is case \n    /// sensitive because the creator \"prefers it that way\". That's fine, but \n    /// Microsoft thinks differently and so since 'name' is a filename, case\n    /// sensitive lookup would be fairly astonishing.\n    /// </summary>\n    toml::node_view<const toml::node> findPluginSettings(\n      const toml::table* table, const char* name);\n  };\n\n  std::shared_ptr<const toml::table>\n    findSettingsFile(const wchar_t* dllPath);\n}"
  },
  {
    "path": "src/xlOilHelpers/Utils.h",
    "content": "#pragma once\n#include <list>\n\n\nnamespace xloil\n{\n  /// <summary>\n  /// Move elements from *from* list to *to* list if they match the predicate \n  /// </summary>\n  template<class T, class Pred>\n  void move_if(std::list<T>& from, std::list<T>& to, Pred predicate)\n  {\n    // Note the postfix i++ as the iterator passed to splice will be invalidated.\n    for (auto i = from.begin(); i != from.end(); ++i)\n    {\n      if (predicate(*i))\n      {\n        to.splice(to.end(), from, i++);\n        if (i == from.end())\n          break;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "src/xlOilHelpers/xlOilHelpers.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"Environment.cpp\" />\n    <ClCompile Include=\"GuidUtils.cpp\" />\n    <ClCompile Include=\"Settings.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"Environment.h\" />\n    <ClInclude Include=\"Exception.h\" />\n    <ClInclude Include=\"GuidUtils.h\" />\n    <ClInclude Include=\"Settings.h\" />\n    <ClInclude Include=\"Utils.h\" />\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>xlOilHelpers</RootNamespace>\n    <ProjectName>xlOilHelpers</ProjectName>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <UseDebugLibraries>true</UseDebugLibraries>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\BuildPaths.props\" />\n    <Import Project=\"..\\Common.props\" />\n  </ImportGroup>\n  <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <PreprocessorDefinitions>_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n</Project>"
  },
  {
    "path": "tests/AutoSheets/PythonTest.py",
    "content": "import xloil as xlo\nimport sys\nimport datetime as dt\nimport os \nimport numpy as np\n\nclass dummy:\n    def __init__(self,val):\n        self.val = val\n\n@xlo.func()\ndef list_of_stuff():\n    count= 200\n    return [dummy(1)]*count + [dummy(2)]*count\n\n@xlo.func()\ndef check_a_thing(thing:dummy):\n    return thing.val\n\n#\n# Functions are registered by decorating them with xloil.func.  The function\n# doc-string will be displayed in Excel's function wizard\n#\n@xlo.func\ndef pySum(x, y, z):\n    '''Adds up numbers'''\n    return x + y + z\n\n#\n# If argument types or function return types are specified using 'typing' \n# annotations, xloil # will attempt to convert Excel's value to the specified\n# type and  will throw if it can't. \n# \n# Argument defaults using the normal python syntax are respected.\n#\n@xlo.func\ndef pySumNums(x: float, y: float, a: int = 2, b: int = 3) -> float:\n\treturn x * a + y * b\n    \n#\n# The registered function name can be overriden as can the doc-string.\n# The 'group' argument specifes a category of functions in Excel's \n# function wizard\n#\n@xlo.func(\n    name='pyRoundTrip', \n    group='UselessFuncs', \n    help='returns its argument',\n    args={'x': 'the argument'}\n    )\ndef pyTest1(x):\n    '''\n    Long description, too big for function wizard, which is actually limited\n    to 255 chars, presumably because, despite it being quite central to Excel\n    the function wizard hasn't been improved in 20 years.... The icons on the\n    other hand...\n    '''\n    return x\n\n#\n# Ranges (e.g. A1:B2) passed as arguments are converted to numpy arrays\n# The default numpy dtype is object, but it's more performant to specify\n# a dtype if you can.  xlOil will raise an error if it cannot make the\n# conversion.\n#\n@xlo.func(args={'x': \"2-dim array to return\"})\ndef pyTestArr2d(x: xlo.Array(float)) -> xlo.Array(float):\n\treturn x\n\n#\n# By default, ranges are trimmed to the last non-empty row and column.\n# Non empty is any value which is not #N/A or a zero length string\n# or an empty cell.  This default is desiable as it allows input from\n# functions which return a variable length array (which Excel pads with \n# #N/A when writing to the sheet) or variable length user input.  This\n# behaviour can be disabled as shown below.\n#\n# Note you cannot use keyword args in [], see PEP472\n#\n@xlo.func\ndef pyTestArrNoTrim(x: xlo.Array(object, trim=False)) -> xlo.Array:\n\treturn x\n\n#\n# This just tests that xlo.Array with no args is valid syntax\n# (the default is a 2d trimmed array of object).\n# \n@xlo.func\ndef pyTestArrNoArgs(x: xlo.Array):\n\treturn x\n\n# \n# This func uses the explicit `args` specifier with xlo.Arg. This overrides any\n# auto detection of the argument type or default by xlOil.\n# \n@xlo.func(args=[ \n        xlo.Arg(\"multiple\", typeof=float, help=\"value to multiply array by\", default=1)\n    ])\ndef pyTestArr1d(x: xlo.Array(float, dims=1), multiple):\n\treturn x * multiple\n\n#\n# Uses FastArray which has much lower function call overheads at the expense\n# of flexibility: cache auto-expansion and array auto-trimming are not supported \n# and the function cannot be local.\n# The benefits of FastArray only become apparent when the input array is large.\n# \n@xlo.func(local=False, args={'x': \"2-dim array to return\"})\ndef pyTestFastArr(x: xlo.FastArray) -> xlo.FastArray:\n\treturn x\n    \n#\n# `list` (or tuple) annotations are understood by xlOil. This function just\n# tests that we can round-trip a list.\n#   \n@xlo.func\ndef pyTestList(x: list):\n    return x\n\n    \n#------------------\n# The Object Cache\n#------------------\n#\n# If you attempt to return a non-convertible object to Excel, xlOil\n# will store it in a cache an instead return a reference string based\n# on the currently calculating cell. \n# \n# To use this returned value in another function, do not specify an argument\n# type. xlOil will check if the provided argument is a reference to a cache \n# objects and, if so, fetch it and pass it to the function.\n#\n\nclass CustomObj:\n    def __init__(self):\n        self.greeting = 'Hello world'\n    \n@xlo.func\ndef pyTestCache(cachedObj=None):\n    \"\"\"\n    Returns a cache reference to a greeting object if no argument is provided.\n    If a greeting object is given, returns the greeting as text.\n    \"\"\"\n    if type(cachedObj) is CustomObj:\n        return cachedObj.greeting\n    return CustomObj()\n \n@xlo.func\ndef pyCacheKeys():\n    return xlo.cache.keys()\n\n@xlo.func\ndef pyTestToCache(x) -> xlo.SingleValue:\n    return x\n \n#------------------\n# Dates\n#------------------\n#\n# xlOil can convert Excel values to dates but:\n#   1) You must specify the argument type as date or datetime. Excel\n#      stores dates as numbers so xlOil cannot know when a date\n#      conversion is required (because it uses the XLL interface)\n#   2) Excel dates cannot contain timezone information\n#   3) Excel dates cannot be before 1 Jan 1900 or after December 31, 9999\n# We don't specify a datetime return type\n# \n@xlo.func\ndef pyTestDate(x: dt.datetime) -> dt.datetime:\n    return x + dt.timedelta(days=1)\n\n@xlo.func\ndef pyTestDateArray(y: xlo.Array(np.datetime64)) -> xlo.Array(np.datetime64):\n    return y + np.timedelta64(2,'D')\n \n@xlo.func\ndef pyTestDateArray2(y: xlo.Array(np.datetime64)) -> xlo.Array(np.datetime64):\n    return np.array(y + np.timedelta64(2,'D'), dtype=np.datetime64)\n    \n#---------------------------\n# Variable and Keyword args\n#---------------------------\n#\n# Keyword args are supported by passing a two-column array of (string, value)\n# This function also tests the dict return conversion (without specifying the\n# return as dict, the iterable converter would be used resulting in output of\n# only the keys)\n#\n# For variable args (i.e. *args) xlOil adds a large number of trailing optional \n# arguments.\n#\n# If both args and kwargs are specified, their order is reversed in the Excel  \n# function declaration.\n#\n@xlo.func\ndef pyTestKwargs(lookup: dict, **kwargs) -> dict:\n    lookup.update(kwargs)\n    return lookup\n\n@xlo.converter()\ndef arg_triple(x):\n    return 3 * x\n    \n@xlo.func(\n    args={'args': 'A variable argument list of numbers to sum'}\n    )\ndef pyTestVargs(*args: arg_triple) -> float:\n    return sum(args)\n\n@xlo.func\ndef pyTestVargsKwargs(*args, **kwargs) -> float:\n    return sum(args) + np.sum([float(x) for x in kwargs.values()])\n    \n#------------------------------\n# Macros and Excel.Application\n#------------------------------\n# 'Macros' in VBA are subroutines which do not return a value. These are \n# called 'commands' in the XLL interface and hence in xlOil.\n#\n# Unless declared *local*,  XLL commands are hidden and not displayed \n# in dialog boxes for running macros, although their names can be \n# entered anywhere a valid command name is required.\n#\n\n@xlo.func(command=True, local=False)\ndef pyRunTestsNonLocal(address):\n\n    xlo.Range(address).value = \"Ham\"\n      \n@xlo.func(command=True)\ndef pyPressRunTests():\n\n    with xlo.PauseExcel() as paused:\n    \n        r_test = xlo.Range(\"TestArea\")\n        r_test.clear()\n        \n        # Write a \"result\" to the top left of test area\n        r_res = r_test.cell(0, 0) \n        r_res.value = \"OK\"\n        \n        # Ranges can be accessed using an address or offset from an existing range\n        r_h1 = xlo.Range(\"H1\")\n        r_h1.value = \"Spam\"\n        \n        if r_test[0, 1] != 'Spam':\n            r_res.value = \"Fail 1\"\n        \n        # Like VBA's Application.Run or the COM xlo.app().Run, we can\n        # call user defined functions\n        xlo.run(\"pyRunTestsNonLocal\", \"H1\")\n\n    if r_h1.value != 'Ham':\n        r_res.value = \"Fail 2\"\n    \n    # Setting the formula property and calculating the worksheet\n    # should work as expected \n    r_test.cell(0, 2).formula = \"=H1\"\n   \n    ws = xlo.active_worksheet()\n    wb = xlo.active_workbook()\n    \n    ws.calculate()\n    \n    if r_test[0, 2] != xlo.Range(\"H1\").value:\n        r_res.value = \"Fail 3\"\n        \n    # There are several ways to select sub-ranges: \n    #   * by address with '[]'\n    #   * by python slicing with '[]' (zero-based)\n    #   * with the `range` method\n    #\n    wb[ws.name]['H1:K1'].set('Pythian')\n    \n    if r_h1.value != 'Pythian':\n        r_res.value = \"Fail 4\"\n        \n    arr1 = r_test[0, 1:4].value\n    arr2 = r_test.range(0, 1, num_rows=1, num_cols=3).value\n    if (arr1 != arr2).any():\n        r_res.value = \"Fail 5\"\n    \n    \n   \n    \n#---------------------------------\n# Calling Excel built-in functions\n#---------------------------------\n\n@xlo.func   \ndef pyTestExcelCall(func, arg1:xlo.AllowRange=None, arg2:xlo.AllowRange=None, arg3:xlo.AllowRange=None):\n    # We pop the trailing missing args so the called function \n    # receives the correct number of arguments. None is converted\n    # to Missing when calling Excel built-ins\n    args = [arg1, arg2, arg3]\n    while args[-1] is None:\n        args.pop()\n    return xlo.call(func, *args)\n    \n@xlo.func   \ndef pyTestAppRun(func, arg1:xlo.AllowRange=None, arg2:xlo.AllowRange=None, arg3:xlo.AllowRange=None):\n    return xlo.run(func, arg1, arg2, arg3)\n\n\n#------------------\n# Other handy bits\n#------------------\n#\n# If an iterable object is returned, xlOil attempts to convert it to an\n# array, with each element as a column. So a 1d iterator gives a 1d array\n# and a iterator of iterator gives a 2d array.\n# \n# If you want an iterable object to be placed in the cache use \n# `return xlo.cache(obj)`\n#\n@xlo.func\ndef pyTestIter(size:int, dims:int):\n    if dims == 1:\n        return [1] * size\n    elif dims == 2:\n        return [[1] * size] * size\n    else:\n        return []\n\n#\n#\n# \n\n@xlo.func\ndef pyTestWorkbooks():\n    return [xlo.workbooks.active.name] + [x.name for x in xlo.workbooks]\n\n#\n# Declaring a function as a macro allows use of the Excel.Application object\n# accessible via `xlo.app()`. The available methods and properties are described\n# in the microsoft documentation. COM support can be provided by 'comtypes',\n# a newer pure python package or 'win32com' a well-established more C++ based\n# library.\n#\n\n@xlo.func(macro=True)\ndef pyTestCom():\n    app = xlo.app()\n    return app.ProductCode\n\n#\n# The special xlo.Range annotation allows the function to receive range arguments\n# as an ExcelRange object. This allows extraction of part of the data without making a \n# copy of the entire range as an array.\n#\n@xlo.func(macro=True)\ndef pyTestRange(r: xlo.Range):\n    \n    # This gives the same value as the statement below\n    addy = r.cell(1, 1).address()\n\n    try:\n        range = r.to_com('comtypes')\n        \n        # This import comes *after* the to_com call above. Calling to_com(\"comtypes\") \n        # ensures that auto-generated 'comtypes.gen' package and the Excel module\n        # are created. You can do this manually with `comtypes.client.GetModule`\n        from comtypes.gen import Excel\n        \n        return range.Cells[2, 2].Address(False, False, Excel.xlA1, True)\n        \n    except ModuleNotFoundError:\n        range = r.to_com()\n        return range.Cells(2, 2).GetAddress(False, False, xlo.constants.xlA1, True)\n#  \n# We check we can retrieve the formula from a cell using both local and \n# non-local functions \n#\n@xlo.func(macro=True)\ndef pyTestRangeFormula(r: xlo.Range):\n    return r.formula\n\n@xlo.func(macro=True, local=False)\ndef pyTestRangeFormula2(r: xlo.Range):\n    return r.formula\n    \n@xlo.func(macro=True)\ndef pyTestRangeTypes(r: xlo.Range, x, y):\n    r2 = xlo.Range(r.address())\n    return [r[x,y], r2[x,y]]\n    \n#\n# Displays python's sys.XXX. Useful for debugging some module loads\n# \n@xlo.func(local=False)\ndef pysys(attr):\n    return getattr(sys, attr)\n    \n    \n#\n# Threads: we can declare threadsafe functions which will be executed on\n# Excel's calculation threads\n# \n\nimport ctypes\n\n@xlo.func(local=False, threaded=True)\ndef pyThreadTest(x: float, y: float, a: int, b: int, u:int, v:int):\n    # Do something numpy intensive to allow thread switching\n    np.sum(np.ones((a, b)) * x ** (np.ones((u, v)) / y))\n    \n    caller = xlo.Caller() # We can even do this from a threaded function!\n    \n    # Return the thread ID to prove the functions were executed on different threads\n    return ctypes.windll.kernel32.GetCurrentThreadId(None)\n    \n#--------------------------------\n# Custom argument type converters\n#---------------------------------\n#\n# The `converter` decorator tells xlOil that the following function or \n# class is a type converter. A type converter creates a python object\n# from a given bool, float, int, str, ExcelArray or ExcelRange.\n#\n# The converter can be applied to an argument using the usual annotation\n# syntax, or using the `args` argument to xlo.func().\n# \n@xlo.converter()\ndef arg_doubler(x):\n    if isinstance(x, xlo.ExcelArray):\n        x = x.to_numpy()\n    return 2 * x\n\n@xlo.func\ndef pyTestCustomConv(x: arg_doubler):\n    return x\n\n@xlo.converter(list)\ndef date_row(x):\n    if isinstance(x, float):\n        return [xlo.from_excel_date(x)]\n    elif isinstance(x, xlo.ExcelArray):\n        r = x.nrows\n        c = x.ncols\n        dates = []\n        for i in range(r):\n            for j in range(c):\n                dates.append(xlo.from_excel_date(x[i, j]))\n        return dates\n    return None\n\n@xlo.func\ndef pyTestDateConv(dates: date_row):\n    return [d + dt.timedelta(days=1) for d in dates]\n    \n#-------------------\n# Pandas Dataframes\n#-------------------\n#\n\ntry:\n    import pandas as pd\n    from xloil.pandas import PDFrame\n    \n    #\n    # xlo.PDFrame converts a block to a pandas DataFrame. Because it registers\n    # the type pd.DataFrame, we can just use that in typing annotations. The block \n    # passed should be formatted as a table with a single row of column headings.\n    # We explicitly send the return value to the cache otherwise it will be expanded\n    # to the sheet\n    #\n    @xlo.func(args={'df': \"Data to be read as a pandas dataframe\"})\n    def pyTestDFrame(df: pd.DataFrame) -> xlo.Cache:\n        return df\n\n    #\n    # Generally we want to override the `xlo.PDFrame`, defaults, so we need to use it\n    # explicitly in the annotation. Below, we set the dataframe index to a specified  \n    # column name and convert dates in a column headed 'Date'.  If you want the index\n    # column name to be dynamic, for example based on another function argument, you \n    # could call `DataFrame.set_index` in the function body instead  Note we can \n    # directly add an object to the cache instead of using the `-> xlo.Cache` annotation.\n    #\n    @xlo.func\n    def pyTestDFrameIndex(df: PDFrame(headings=True, index=\"Time\", dates=['Date'])):\n        return xlo.cache(df) \n\n    #\n    # This function tests that we can fetch data from the frames created by the\n    # previous functions\n    #\n    @xlo.func\n    def pyTestFrameFetch(df, index=None, col_name=None):\n        if index is not None:\n            if col_name is not None:\n                return df.loc[index, col_name]\n            else:\n                return df.loc[index].values\n        elif col_name is not None:\n            return df[col_name]\n        else:\n            return df\n    \n    #\n    # Specifying multiple index columns creates a DataFrame with a MultiIndex.\n    # Giving an int for *headings* means the first *N* rows are read as a *MultiIndex* \n    # heading. Also, note we can call the PDFrame converter in the function if \n    # we want to control the arguments passed to it - this isn't possible if it is\n    # used as a decorator.\n    #\n    @xlo.func\n    def pyTestDFrameMultiIndex(\n            df: PDFrame(headings=2, index=[('Clock','Date'), ('Category','Type')], dates=[('Clock','Date')]),\n            headings=False):\n        return PDFrame(headings=headings)(df)\n\n    #\n    # We can specify an explicit return type of pd.DataFrame, which is slightly \n    # more performant than having xlOil try all known converters\n    # \n    @xlo.func\n    def pyTestFrameWrite(df: pd.DataFrame) -> pd.DataFrame:\n        return df\n    \n    @xlo.func\n    def pyTestFrameDtypes(df: pd.DataFrame):\n        return [str(x) for x in df.dtypes]\n        \n\n    @xlo.func  \n    def pyTestDFrameNaNs() -> PDFrame():\n        \"\"\"\n        This functions checks NaNs and various mixed objects in dataframes \n        are rendered correctly\n        \"\"\"\n        return pd.DataFrame({\n            \"numbers\": [1, 2, np.nan, 3, 4, 5],\n            \"dates\": [pd.Timestamp(\"2023/08/01\"), np.nan, pd.Timestamp(\"2023/08/02\"), np.nan, pd.NaT, pd.Timestamp(\"2023/08/02\")],\n            \"objects\": [None, 42, pd.Timestamp(\"1969/01/01\"), \"Foo\", np.nan, type(42)]\n        })\n\n    @xlo.func\n    def pyTestTimestamp(date_: pd.Timestamp, timezone:str) -> pd.DataFrame:\n        ts = date_.tz_localize(tz=timezone)\n        return pd.Series({'date': ts}) \n\nexcept ImportError:\n    pass\n\n#-----------------\n# Event handling \n#-----------------\n#\n# We setup some simple event handlers and demonstrate some more\n# use of of the app() object and using Range. \n#\n# Currently event handlers are global, so for workbook local modules\n# such as this one, we compare the active workbook name to ours\n#\n@xlo.func\ndef getLinkedWbName():\n    return xlo.linked_workbook()\n    \n_workbook_name = os.path.basename(xlo.linked_workbook())\n\ndef event_writeTimeToA1():\n    if xlo.app().ActiveWorkbook.Name != _workbook_name:\n        return\n    \n    wb = xlo.active_workbook()\n    rng = wb[\"Test 1\"][\"A1\"]\n    \n    time = str(dt.datetime.now())\n\n    rng.value = f\"Calc finished at: {time}\"\n\n#\n# This handler is for the WorkbookBeforePrint event. If the `cancel` parameter\n# is set to True, the print is cancelled. Since python does not support changing\n# bool function arguments directly (i.e. reference parameters), we must use the\n# syntax `cancel.value = True`\n#\ndef event_stopPrinting(wbName, cancel):\n    if wbName != _workbook_name:\n        return\n    xlo.Range(\"B1\").value = \"Cancelled print for: \" + wbName\n    cancel.value = True\n\n#\n# Link the above handlers to events. To unlink them, use `-=`. Note that\n# xlOil only holds weak references to the event handler functions, so they must\n# be made module scope variables to stay alive, i.e. the following will not work:\n#\n#       xlo.event.AfterCalculate += lambda x: <do something>\n# \n# Rather write:\n# \n#       _handler = lambda x: <do something>\n#       xlo.event.AfterCalculate += _handler\n#\n# The advantage of the weak reference is that the handler is automatically unlinked\n# when the containing module is unloaded, so there is no need to explictly do `-=`\n# in the `_xloil_unload` function.\n#\n\nxlo.event.AfterCalculate += event_writeTimeToA1\nxlo.event.WorkbookBeforePrint += event_stopPrinting\n\n#\n# xlOil will attempt to call a function with this name when the module is unloaded,\n# for example, because the linked workbook is closed. xlOil explictly clears the \n# module's __dict__ before unload, so any globals, like _ribbon above will be \n# deleted.\n#\ndef _xloil_unload():\n    pass\n\n#-----------------------------------------\n# Debugging\n#-----------------------------------------\n\nimport xloil.debug\n#xloil.debug.exception_debug('pdb')\n\n@xlo.func\ndef pyTestDebug(x):\n    \"\"\" Running this function should trigger pdb \"\"\"\n    return (2 * x) ^ (x + 1)\n  \n@xlo.func(macro=True)\ndef pyWbPath():\n\n    \"\"\"Returns the full workbook path\"\"\"\n\n    caller = xlo.Caller()\n    \n    # Cautionary note: the following can return the wrong answer, but \n    # the same call via 'win32com' works correctly. Treat comtypes with\n    # caution\n    #full_path = xlo.app('comtypes').Workbooks(caller.workbook).FullName\n    full_path3 = xlo.workbooks[caller.workbook].path \n\n    return full_path3.replace(caller.workbook,\"\")\n\n#-----------------------------------------\n# On demand function registration\n#-----------------------------------------\nfuncs = []\nfor i in range(3):\n\n    class Closure:\n        val = i\n        def __call__(self):\n            return self.val\n    \n    funcs.append(\n        xlo.func(fn=Closure(), name=f\"pyTestDynamic{i}\", register=False)\n        )\n\nxlo.register_functions(funcs, sys.modules[__name__])\n\n\ndef click_handler(sheet_name, target, cancel):\n    ws = xlo.worksheets[sheet_name]\n    ws['A1'] = ws['A5']\n    ws['A1'] += target.address()\n\ndef what_changed(worksheet='not sheet', changed='not change'):\n    wb = xlo.active_workbook()\n    ws = wb[worksheet]\n    ws[\"Z1\"] = str(worksheet)\n    ws[\"Z2\"] = str(changed)\n    \nxlo.event.SheetBeforeDoubleClick += click_handler\nxlo.event.SheetChange += what_changed\n"
  },
  {
    "path": "tests/AutoSheets/TestModule.py",
    "content": "#import xloil as xlo\n\n\ndef pyTestLoadMod():\n    return \"Great Success!\"\n\n\nclass pyFooBar():\n    def __init__(self, x):\n        self.x = x\n        \n    def xplus(self, y, z):\n        return (self.x + y) * z\n        "
  },
  {
    "path": "tests/AutoSheets/TestUtils.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"cfe060b5\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"x=1\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"9dde0a8e\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"1\"\n      ]\n     },\n     \"execution_count\": 2,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"x\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"cf46827c\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import xloil\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"f073aebd\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"b3ae4660\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"c2d866df\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"3\"\n      ]\n     },\n     \"execution_count\": 4,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"xloil.importer._source_file.get(3)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"3be6f112\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'TestUtils.xlsx'\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"xloil.linked_workbook()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"8594e9b2\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"@xloil.func\\n\",\n    \"def foobar(x):\\n\",\n    \"    return f\\\"Hello {x}\\\"\\n\",\n    \"ws = xloil.active_workbook().worksheets.add()\\n\",\n    \"ws['A1'].formula = '=foobar(\\\"World\\\")'\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"5ac61d60\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"[FrameInfo(frame=<frame at 0x000001E3C0637360, file 'C:\\\\\\\\Users\\\\\\\\Steven\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\ipykernel_16196\\\\\\\\4083536302.py', line 2, code <cell line: 2>>, filename='C:\\\\\\\\Users\\\\\\\\Steven\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Temp\\\\\\\\ipykernel_16196\\\\\\\\4083536302.py', lineno=2, function='<cell line: 2>', code_context=['inspect.stack()\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BF20DCF0, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', line 3398, code run_code>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', lineno=3398, function='run_code', code_context=['                    exec(code_obj, self.user_global_ns, self.user_ns)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3C1D39130, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', line 3338, code run_ast_nodes>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', lineno=3338, function='run_ast_nodes', code_context=['                if await self.run_code(code, result, async_=asy):\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BEBDC060, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', line 3135, code run_cell_async>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', lineno=3135, function='run_cell_async', code_context=['                has_raised = await self.run_ast_nodes(code_ast.body, cell_name,\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BF2096F0, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\async_helpers.py', line 129, code _pseudo_sync_runner>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\async_helpers.py', lineno=129, function='_pseudo_sync_runner', code_context=['        coro.send(None)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BEBC9BE0, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', line 2936, code _run_cell>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', lineno=2936, function='_run_cell', code_context=['            return runner(coro)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BF20CB70, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', line 2881, code run_cell>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\IPython\\\\\\\\core\\\\\\\\interactiveshell.py', lineno=2881, function='run_cell', code_context=['            result = self._run_cell(\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001DBBC7F9700, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\ipykernel\\\\\\\\zmqshell.py', line 528, code run_cell>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\ipykernel\\\\\\\\zmqshell.py', lineno=528, function='run_cell', code_context=['        return super().run_cell(*args, **kwargs)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BE8BF910, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\ipykernel\\\\\\\\ipkernel.py', line 383, code do_execute>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\ipykernel\\\\\\\\ipkernel.py', lineno=383, function='do_execute', code_context=['                    res = shell.run_cell(\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001DBBC7F8400, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\Lib\\\\\\\\asyncio\\\\\\\\tasks.py', line 256, code __step>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\Lib\\\\\\\\asyncio\\\\\\\\tasks.py', lineno=256, function='__step', code_context=['                result = coro.send(None)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BEC39B40, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\nest_asyncio.py', line 195, code step>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\nest_asyncio.py', lineno=195, function='step', code_context=['            step_orig(task, exc)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BECEBFD0, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\Lib\\\\\\\\asyncio\\\\\\\\events.py', line 80, code _run>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\Lib\\\\\\\\asyncio\\\\\\\\events.py', lineno=80, function='_run', code_context=['            self._context.run(self._callback, *self._args)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BF209920, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\nest_asyncio.py', line 119, code _run_once>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\nest_asyncio.py', lineno=119, function='_run_once', code_context=['                handle._run()\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BEE5D0B0, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\nest_asyncio.py', line 83, code run_until_complete>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\nest_asyncio.py', lineno=83, function='run_until_complete', code_context=['                self._run_once()\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001E3BF20CDA0, file 'C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\jupyter_client\\\\\\\\utils.py', line 23, code wrapped>, filename='C:\\\\\\\\lib\\\\\\\\conda39\\\\\\\\lib\\\\\\\\site-packages\\\\\\\\jupyter_client\\\\\\\\utils.py', lineno=23, function='wrapped', code_context=['            return loop.run_until_complete(future)\\\\n'], index=0),\\n\",\n       \" FrameInfo(frame=<frame at 0x000001DBBC7F4640, file 'C:\\\\\\\\Users\\\\\\\\Steven\\\\\\\\dev\\\\\\\\xloil\\\\\\\\libs\\\\\\\\xlOil_Python\\\\\\\\Package\\\\\\\\xloil\\\\\\\\inprocess_kernel.py', line 68, code <lambda>>, filename='C:\\\\\\\\Users\\\\\\\\Steven\\\\\\\\dev\\\\\\\\xloil\\\\\\\\libs\\\\\\\\xlOil_Python\\\\\\\\Package\\\\\\\\xloil\\\\\\\\inprocess_kernel.py', lineno=68, function='<lambda>', code_context=['        run = lambda: real_do_execute(*args, **kwargs)\\\\n'], index=0)]\"\n      ]\n     },\n     \"execution_count\": 8,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"import inspect\\n\",\n    \"inspect.stack()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"id\": \"7fca6859\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import inspect\\n\",\n    \"inspect.getmodule(jpyTest.__wrapped__.__name__)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"id\": \"953b9971\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernel_info\": {\n   \"name\": \"xloil_kernel-19012\"\n  },\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.1\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "tests/CodePageConversion.cpp",
    "content": "﻿#include \"CppUnitTest.h\"\n#include <xlOil/StringUtils.h>\n#include <locale>\n#include <codecvt>\n\nusing std::string;\nusing std::wstring;\nusing std::codecvt_utf8;\nusing std::codecvt_utf16;\nusing std::u32string;\nusing xloil::utf16ToUtf8;\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nnamespace\n{\n  //string To_UTF8(const std::u32string &s)\n  //{\n  //  std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;\n  //  return conv.to_bytes(s);\n  //}\n\n  wstring To_UTF16(const string &s)\n  {\n    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> conv;\n    return conv.from_bytes(s);\n  }\n\n  wstring To_UTF16(const std::u32string &s)\n  {\n    std::wstring_convert<codecvt_utf16<int32_t, 0x10ffff, std::little_endian>, int32_t> conv;\n    auto p = reinterpret_cast<const int32_t *>(s.data());\n    string bytes = conv.to_bytes(p, p + s.length());\n    return wstring(reinterpret_cast<const wchar_t*>(bytes.c_str()), bytes.length() / sizeof(wchar_t));\n  }\n\n  //std::u32string To_UTF32(const string &s)\n  //{\n  //  std::wstring_convert<codecvt_utf8<char32_t>, char32_t> conv;\n  //  return conv.from_bytes(s);\n  //}\n\n  //u32string To_UTF32(const std::u16string &s)\n  //{\n  //  const char16_t *pData = s.c_str();\n  //  std::wstring_convert<codecvt_utf16<char32_t>, char32_t> conv;\n  //  return conv.from_bytes(reinterpret_cast<const char*>(pData), reinterpret_cast<const char*>(pData + s.length()));\n  //}\n\n  //u32string To_UTF32(const wstring &s)\n  //{\n  //  auto *pData = s.c_str();\n  //  std::wstring_convert<codecvt_utf16<char32_t>, char32_t> conv;\n  //  return conv.from_bytes(reinterpret_cast<const char*>(pData), reinterpret_cast<const char*>(pData + s.length()));\n  //}\n\n  // MSVC bug, see: https://stackoverflow.com/questions/32055357/visual-studio-c-2015-stdcodecvt-with-char16-t-or-char32-t\n\n#if _MSC_VER >= 1900\n\n  string utf16_to_utf8(std::u16string utf16_string)\n  {\n    std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> convert;\n    auto p = reinterpret_cast<const int16_t *>(utf16_string.data());\n    return convert.to_bytes(p, p + utf16_string.size());\n  }\n\n#else\n\n  std::string utf16_to_utf8(std::u16string utf16_string)\n  {\n    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert;\n    return convert.to_bytes(utf16_string);\n  }\n\n#endif\n\n}\nnamespace Tests\n{\n\tTEST_CLASS(StringEncoding)\n\t{\n\tpublic:\n\t\t\n\t\tTEST_METHOD(Utf16ToUtf32)\n\t\t{\n      auto utf16Str = wstring(L\"Hello \\u4f60\\u597d_z\\u00df\\u6c34\");\n      auto result = u32string(utf16Str.length() * 2, U'\\0');\n      auto nChars = xloil::ConvertUTF16ToUTF32()(\n        result.data(), result.length(), utf16Str.data(), utf16Str.data() + utf16Str.length());\n      result.resize(nChars);\n      auto resultUtf16 = To_UTF16(result);\n      Assert::AreEqual(utf16Str.c_str(), resultUtf16.c_str());\n\t\t}\n\n    TEST_METHOD(Utf32ToUtf16)\n    {\n      auto utf32Str = u32string(U\"\\U00004f60\\U0000597d_z\\U000000df\\U00006c34\\U0001f34c\");\n      auto result = wstring(utf32Str.length() * 2, L'\\0');\n      auto nChars = xloil::ConvertUTF32ToUTF16()(\n        result.data(), result.length(), utf32Str.data(), utf32Str.data() + utf32Str.length());\n      result.resize(nChars);\n      auto utf16Str = To_UTF16(utf32Str);\n      Assert::AreEqual(utf16Str.c_str(), result.c_str());\n    }\n\n    TEST_METHOD(Utf16ToUtf8)\n    {\n      {\n        auto source = L\"xlõiƚ\";\n        auto utf8 = utf16ToUtf8(source);\n        auto utf16 = To_UTF16(utf8);\n        Assert::AreEqual(source, utf16.c_str());\n      }\n    }\n\t};\n}\n"
  },
  {
    "path": "tests/Date.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/Date.h>\n#include <xloil/ExcelObj.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\n\nnamespace Tests\n{\n  TEST_CLASS(Date)\n  {\n  public:\n\n    TEST_METHOD(Test_StrToDate)\n    {\n      std::tm result;\n      bool ret;\n      ret = stringToDateTime(L\"2017-01-01\", result, L\"%Y-%m-%d\");\n      Assert::IsTrue(ret);\n\n      theDateTimeFormats().push_back(L\"%Y-%m-%d\");\n      theDateTimeFormats().push_back(L\"%Y%b%d\");\n\n      ret = stringToDateTime(L\"2010-02-03\", result);\n      Assert::IsTrue(ret);\n      Assert::AreEqual(result.tm_year + 1900, 2010);\n      Assert::AreEqual(result.tm_mon + 1, 2);\n      Assert::AreEqual(result.tm_mday, 3);\n\n      ret = stringToDateTime(L\"2017Feb01\", result);\n      Assert::IsTrue(ret);\n      Assert::AreEqual(result.tm_year + 1900, 2017);\n      Assert::AreEqual(result.tm_mon + 1, 2);\n      Assert::AreEqual(result.tm_mday, 1);\n    }\n\n    TEST_METHOD(Test_DateRoundTrip)\n    {\n      {\n        int input[] = { 2020, 2, 1, 11, 30, 4, 516 }, *d = std::end(input);\n        auto serial = excelSerialDateFromYMDHMS(*--d, *--d, *--d, *--d, *--d, *--d, *--d);\n        int output[_countof(input)];\n        d = std::end(output);\n        excelSerialDatetoYMDHMS(serial, *--d, *--d, *--d, *--d, *--d, *--d, *--d);\n        Assert::IsTrue(std::equal(input, std::end(input), output));\n      }\n    }\n\n    void checkTMValues(const std::tm& tm, int year, int month, int day)\n    {\n      Assert::AreEqual(tm.tm_year + 1900, year);\n      Assert::AreEqual(tm.tm_mon + 1, month);\n      Assert::AreEqual(tm.tm_mday, day);\n    }\n\n    void testVisitorRoundTrip(const wchar_t* date, int year, int month, int day)\n    {\n      ExcelObj dateStr(date);\n      ParseDateVisitor parseVisitor(L\"%Y-%m-%d\");\n      auto ret = dateStr.visit(parseVisitor);\n      Assert::IsTrue(ret);\n      checkTMValues(parseVisitor.result, year, month, day);\n\n      ExcelObj dateObj(\n        excelSerialDateFromTM(parseVisitor.result, parseVisitor.uSecs));\n\n      DateTimeVisitor dateVisitor;\n      ret = dateObj.visit(dateVisitor);\n      Assert::IsTrue(ret);\n      checkTMValues(dateVisitor.result, year, month, day);\n    }\n\n    TEST_METHOD(Test_DateVisitors)\n    {\n      testVisitorRoundTrip(L\"2017-01-01\", 2017, 1, 1);\n      testVisitorRoundTrip(L\"1914-02-28\", 1914, 2, 28);\n    }\n  };\n}"
  },
  {
    "path": "tests/Environment.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOilHelpers/Environment.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::string;\nnamespace Tests\n{\n  TEST_CLASS(Environment)\n  {\n  public:\n    TEST_METHOD(Test_expandWindowsRegistryStrings)\n    {\n      wstring test(L\"xls file: <HKCR\\\\.xls\\\\>, \"\n        \"username: <HKCU\\\\Software\\\\Microsoft\\\\Office\\\\Common\\\\UserInfo\\\\UserName>. Done.\");\n\n      auto result = expandWindowsRegistryStrings(test);\n      // TODO: how to make this into a test - i.e. what registry keys have known values?\n    }\n\n    TEST_METHOD(Test_expandEnvironmentStrings)\n    {\n      wstring test(L\"xls file: <HKCR\\\\.xls\\\\>, \"\n        \"username: <HKCU\\\\Software\\\\Microsoft\\\\Office\\\\Common\\\\UserInfo\\\\UserName>. Done.\");\n      {\n        auto result = getEnvironmentVar(\"TEMP\");\n        string expected;\n        size_t len = result.length() + 1;\n        expected.resize(len);\n        Assert::AreEqual(0, getenv_s(&len, expected.data(), len, \"TEMP\"));\n        Assert::AreEqual(len, result.length() + 1);\n        expected.pop_back(); // Remove null terminator\n        Assert::AreEqual(expected, result);\n      }\n      {\n        auto expected = getEnvironmentVar(L\"TEMP\");\n        auto result = expandEnvironmentStrings(L\"%TEMP%\");\n        Assert::AreEqual(expected, result);\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/ManualSheets/python/PySpeedTest.py",
    "content": "\nimport time\n\ntry:\n    import xloil as xlo\n\n    @xlo.func\n    def xoTime(x):\n        return time.clock()\nexcept:\n    pass\n\ntry:\n    import xlwings as xw\n    @xw.func\n    def xwTime(name):\n        return time.clock()\n\nexcept:\n    pass\n\n\n"
  },
  {
    "path": "tests/ManualSheets/python/PythonRTDTest.py",
    "content": "import xloil as xlo\nimport sys\nimport datetime as dt\nimport asyncio\nimport os \nimport ctypes\n\n@xlo.func(local=False, threaded=True)\nasync def pyRtdThreadedClock(secs):\n    while True:\n        yield dt.datetime.now().second + ctypes.windll.kernel32.GetCurrentThreadId(None)\n        await asyncio.sleep(secs)\n        \n\n@xlo.func(local=False, threaded=False)\nasync def pyRtdClock(secs):\n    while True:\n        yield dt.datetime.now().second\n        await asyncio.sleep(secs)\n        \n        \n@xlo.func(local=False, threaded=False)\nasync def pyRtdArrayGen(secs):\n    while True:\n        now = dt.datetime.now()\n        yield [now.hour, now.minute, now.second]\n        await asyncio.sleep(secs)\n        \n@xlo.func\nasync def pyRtdArray(values: xlo.Array(float,dims=1)):\n    return [str(x) for x in values.tolist()]\n    "
  },
  {
    "path": "tests/ManualSheets/python/PythonTestAsync.py",
    "content": "import xloil as xlo\nimport sys\nimport datetime as dt\nimport asyncio\nimport os \nimport numpy as np\n \n#------------------\n# Async functions\n#------------------\n#\n# Using asyncio's async keyword declares an async function in Excel.\n# This means control is passed back to Excel before the function \n# returns.  Python is single-threaded so no other python-based functions\n# can run whilst waiting for the async return. However, the await keyword \n# can pass control between running async functions.\n#\n# There are two flavours of async function: RTD and native. The XLL interface\n# contains async support but any interaction with Excel will cancel all native async \n# functions: they are only asynchronous with each other, not with the user interface.\n# This is fairly unexpected and generally undesirable, so xlOil has an implementation of \n# async which works in the expected way using RTD at the expense of more overhead.\n#\n@xlo.func\nasync def pyTestAsyncRtd(x, time:int):\n    await asyncio.sleep(time)\n    return x\n    \n#\n# Native async functions cannot be declared local as VBA does not support this. We do\n# not actually need to specify local=False, as xloil will automatically set this.\n# \n@xlo.func(rtd=False, local=False)\nasync def pyTestAsync(x, time:int):\n    await asyncio.sleep(time)\n    return x\n\n@xlo.func\nasync def pyTestAsyncGen(secs):\n    while True:\n        await asyncio.sleep(secs)\n        yield dt.datetime.now()\n\n@xlo.func(local=False, threaded=True)\nasync def pyTestAsyncThreaded(secs):\n    while True:\n        await asyncio.sleep(secs)\n        yield dt.datetime.now()\n        \n@xlo.func\nasync def pyRtdArray(values):\n    return np.sum(values)\n\n#\n# Retrieve the address of calling cell (assuming we are called from a sheet)\n# Note we don't need macro permissions to do this.\n#  \n@xlo.func\nasync def pyTestCaller():\n    return xlo.Caller().address()\n    \n#---------------------------------\n# Calling Excel built-in functions\n#---------------------------------\n#\n# This can be done asynchronously as Excel built-ins can only be called on the \n# main thread.\n#\n@xlo.func\nasync def pyTestExcelCallAsync(x, y, z):\n    return await xlo.call_async(\"sum\", x, y, z)\n\n@xlo.func   \ndef pyTestExcelCall(func, arg1:xlo.AllowRange=None, arg2:xlo.AllowRange=None, arg3:xlo.AllowRange=None):\n    # We pop the trailing missing args so the called function \n    # receives the correct number of arguments. None is converted\n    # to Missing when calling Excel built-ins\n    args = [arg1, arg2, arg3]\n    while args[-1] is None:\n        args.pop()\n    return xlo.call(func, *args)\n    \n@xlo.func   \ndef pyTestAppRun(func, arg1:xlo.AllowRange=None, arg2:xlo.AllowRange=None, arg3:xlo.AllowRange=None):\n    return xlo.run(func, arg1, arg2, arg3)\n    \n#---------------------------------\n# RTD functions and the RTD server\n#---------------------------------\n#\n# Registering an `async def` function has a certain overhead:\n# Excel will call your function multiple times to fetch the result\n# So xlOil must store and compare all the function arguments to figure\n# out if Excel wants the result of a previous calculation or to start\n# a new calculation with new arguments.\n# \n# If the RTD `topic`, i.e. the unique identifier, is easy to determine\n# we can take over responsibility for generating it ourselves.\n#  \n# First create a new RTD COM server so the `topic` strings don't collide\n_rtdServer = xlo.RtdServer()\n  \n@xlo.func\ndef pyTestRtdManual(secs):\n\n    # This coroutine will be run if  we don't already have a \n    # publisher for the specified number of seconds.\n    async def fetch() -> dt.datetime:\n        while True:\n            await asyncio.sleep(secs)\n            yield dt.datetime.now()\n        \n    return xlo.rtd.subscribe(_rtdServer, \"Time:\" + str(secs), fetch)\n\n#\n# Now try a slightly more practical usage of RTD async: fetching URLs.  \n# (We need the aiohttp package for this).  Here we use the RTD machinery\n# in full-manual mode, defining the publishing object explicitly. This\n# is not necessary, it's just illustrative.\n#\ntry:\n    import aiohttp\n    import ssl\n\n    # This is the implementation: it pulls the URL and returns the response as text\n    async def _getUrlImpl(url):\n        async with aiohttp.ClientSession() as session:\n            async with session.get(url, ssl=ssl.SSLContext()) as response:\n               return await response.text() \n        \n    \n    #\n    # We declare an async gen function which calls the implementation either once,\n    # or at regular intervals\n    #\n    @xlo.func(local=False, rtd=True)\n    async def pyGetUrl(url, seconds=0):\n        yield await _getUrlImpl(url)\n        while seconds > 0:\n            await asyncio.sleep(seconds)\n            yield await _getUrlImpl(url)\n             \n\n    #\n    # Below we show how to write the above function in \"long form\" with\n    # explicit connections to the RtdManager. In our implementation below\n    # we repeatedly poll the URL every 4 seconds, This is just an example \n    # to show how to use the full RTD functionality: in general it is \n    # better to let xlOil handle things and use an async generator.\n    # \n\n    # \n    # RTD servers use a publisher/subscriber model with the 'topic' as the\n    # key. The publisher below is linked to a single topic string, which is the \n    # url to be fetched. \n    # \n    # We have designed the publisher to do nothing on construction. When it detects\n    # a subscriber, it creates a publishing task on xlOil's asyncio loop (which runs\n    # in a background thread). When there are no more subscriber, it cancels this task.\n    # If the task was very slow to return, we could have opted to start it in the constructor  \n    # and kept it running permanently, regardless of subscribers.\n    # \n    class UrlGetter(xlo.RtdPublisher):\n\n        def __init__(self, url):\n            super().__init__()  # You *must* call this explicitly or the python binding library will crash\n            self._url = url\n            self._task = None\n           \n        def connect(self, num_subscribers):\n        \n            if self.done():\n            \n                async def run():\n                    try:\n                        while True:\n                            data = await _getUrlImpl(self._url);\n                            _rtdServer.publish(self._url, data)\n                            await asyncio.sleep(4)                     \n                    except Exception as e:\n                        _rtdServer.publish(self._url, e)\n                        \n                self._task = xlo.get_event_loop().create_task(run())\n                \n        def disconnect(self, num_subscribers):\n            if num_subscribers == 0:\n                self.stop()\n                return True # This publisher is no longer required: schedule it for destruction\n                \n        def stop(self):\n            if self._task is not None: \n                self._task.cancel()\n        \n        def done(self):\n            return self._task is None or self._task.done()\n            \n        def topic(self):\n            return self._url\n    \n    \n    @xlo.func(local=False)  \n    def pyGetUrlLive(url):\n        # We 'peek' into the RTD manager to see if there is already a publisher for \n        # our topic. If not we create one, then issue the subscribe request, which \n        # registers the calling cell with Excel as an RTD cell.\n        if _rtdServer.peek(url) is None:\n            publisher = UrlGetter(url)\n            _rtdServer.start(publisher)\n        return _rtdServer.subscribe(url)       \n    \nexcept ImportError:\n    @xlo.func(local=False)\n    def pyGetUrl(url):\n        return \"You need to install aiohttp\" \n"
  },
  {
    "path": "tests/ManualSheets/python/PythonTestUI.py",
    "content": "# If PIL is not first, gives a \"specified module cannot be found\" error - ?\ntry:\n    from PIL import Image\nexcept ImportError:\n    pass\n    \nimport xloil as xlo\nimport datetime as dt\nimport asyncio\nimport inspect\n\n#---------------------------------\n# GUI: Creating Custom Task Panes\n#---------------------------------\n#\n# We demonstrate how task panes can be created using Qt and Tk. We wrap the \n# Qt pane creation in a try/except in case qtpy is not installed.\n#\n\ntry:\n    # You must import `xloil.gui.qtpy` before `qtpy`, this allows xlOil to create\n    # a thread to manage the Qt GUI.  *All* interaction with the Qt GUI except emitting \n    # signals must be done on the GUI thread or Qt _will abort_.  Use `Qt_thread.submit(...)`\n    # to send jobs to Qt's thread.\n    import xloil.gui.qtpy\n    \n    from qtpy.QtWidgets import QLabel, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QProgressBar\n    from qtpy.QtCore import Signal, Qt\n    \n    class OurQtPane(QWidget):\n        \n        _progress = Signal(int)\n        \n        def set_progress(self, x: int = 0):\n            # Use a signal to send the progress: this is thread safe\n            self._progress.emit(x)\n            \n        def __init__(self):\n            super().__init__() # Must call this or Qt will crash\n            \n            progress_bar = QProgressBar(self)\n            progress_bar.setGeometry(200, 80, 250, 20)\n            self._progress.connect(progress_bar.setValue, Qt.QueuedConnection)\n        \n            label = QLabel(\"Hello from Qt\")\n            reset_button = QPushButton(text=\"Zero\", parent=self)\n            reset_button.clicked.connect(self.set_progress)\n            \n            layout = QVBoxLayout()\n            layout.addWidget(label)\n            layout.addWidget(progress_bar)\n            layout.addWidget(reset_button)      \n            \n            self.setLayout(layout)\n                \nexcept ImportError:\n    class OurQtPane:\n        ...\n   \n# Like Qt, xlOil's tkinter module must be imported before using the toolkit\n# to allow xlOil to create the *Tk_thread* and the tkinter root object. All\n# interactions with tkinter must take place via *Tk_thread*.\nfrom xloil.gui.tkinter import TkThreadTaskPane, Tk_thread\n\n# Unlike Qt, it's not (I think) common to derive the from a tkinter object.\n# Instead, we derive from `TkThreadTaskPane`, which derives from `CustomTaskPane`\n\nclass OurTkPane(TkThreadTaskPane):\n        \n    def __init__(self):\n        super().__init__() # Important!\n        \n        import tkinter as tk\n        \n        top_level = self.top_level\n\n        btn = tk.Button(top_level, text=\"This is a Button\", fg='blue')\n        btn.place(x=20, y=50)\n        \n        from tkinter import ttk\n        self._progress_bar = ttk.Progressbar(top_level, length=200, mode='determinate')\n        self._progress_bar.place(x=20, y=100)\n    \n    @Tk_thread\n    def set_progress(self, x: int):\n        self._progress_bar['value'] = x\n\n    # Define this method to capture the docking position change event\n    def on_docked(self):\n        xlo.log(f\"Tk frame docking position: {self.position:}\", level='info')\n\n\n# Create a wxPython task pane, but wrap in a try..except in case wx is not installed\ntry:\n    from xloil.gui.wx import wx_thread\n    import wx\n\n    class OurWxPane(wx.Frame):\n        def __init__(self):\n            # ensure the parent's __init__ is called\n            super().__init__(None, title='Hello')\n\n            # create a panel in the frame\n            pnl = wx.Panel(self)\n\n            # put some text with a larger bold font on it\n            st = wx.StaticText(pnl, label=\"Hello World!\")\n            font = st.GetFont()\n            font.PointSize += 10\n            font = font.Bold()\n            st.SetFont(font)\n\n            self._gauge = wx.Gauge(pnl)\n            \n            self._button = wx.Button(pnl,-1,\"Click Me\")\n            self._button.Bind(wx.EVT_BUTTON,self.OnClicked) \n            \n            # and create a sizer to manage the layout of child widgets\n            sizer = wx.BoxSizer(wx.VERTICAL)\n            sizer.Add(st, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25))\n            sizer.Add(self._gauge, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25))\n            sizer.Add(self._button, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25))\n            pnl.SetSizer(sizer)\n\n        @wx_thread\n        def set_progress(self, x: int):\n            self._gauge.SetValue(x)\n\n        def OnClicked(self, event): \n            btn = event.GetEventObject().GetLabel() \n            self._gauge.SetValue(0)\n          \nexcept ImportError:\n    class OurWxPane:\n        ...\n\n_PENDING_PANES = dict()\n\n_PANE_NAMES = { \n    'Tk': \"MyTkPane\", \n    'Qt': \"MyQtPane\",\n    'wx': \"MyWxPane\"\n}\n\n# We define a function to create a task pane using Tk or Qt. We first check \n# that the pane has not already been created, then construct a instance of the\n# pane class, then attach it to the ExcelGUI object created later.\n\nasync def make_task_pane(toolkit):\n\n    global _excelgui\n    \n    pane_name = _PANE_NAMES[toolkit]\n\n    key = (pane_name, xlo.app().windows.active.name)\n\n    pane = xlo.gui.find_task_pane(pane_name)\n    if pane is not None:\n        xlo.log(f\"Found pane: {key}\")\n        pane.visible = True\n        return\n\n    # Since we are using async, the open pane button may have been \n    # clicked more than once before the pane got a chance to create\n    pane_future = _PENDING_PANES.get(key, None)\n    if pane_future is not None:\n        return\n\n    # attach_pane can accept a CustomTaskPane instance, or a QWidget\n    # instance or an awaitable to one of those things. You can also\n    # pass a QWidget type which xlOil wrap in a QtThreadTaskPane and\n    # create in the correct thread.\n    #\n    # (We could just pass `OurTkPane` rather than using Tk_thread, this\n    # is just to demonstrate passing an awaitable)\n    if toolkit == 'Tk':\n        future = _excelgui.attach_pane_async(\n            name=pane_name,\n            pane=Tk_thread().submit_async(OurTkPane))\n    elif toolkit == 'Qt':\n        future = _excelgui.attach_pane_async(\n            name=pane_name, \n            pane=OurQtPane)\n    elif toolkit == 'wx':\n        future = _excelgui.attach_pane_async(\n            name=pane_name, \n            pane=OurWxPane)\n    else:\n        raise Exception()\n\n    _PENDING_PANES[key] = future\n        \n    pane = await future\n    \n    del _PENDING_PANES[key]\n\n    pane.visible = True\n\n    return pane\n     \n#----------------------\n# GUI: Creating Ribbons\n#----------------------\n#\n# xlOil is able to create a ribbon entry for a workbook which is automatically \n# removed when the workbook is closed and the associated workbook module is \n# unloaded.  To create the ribbon XML use an editor such as Office RibbonX Editor:\n# https://github.com/fernandreu/office-ribbonx-editor\n#\n# GUI callbacks declared async will be executed in the addin's \n# event loop. Other callbacks are executed in Excel's main thread.\n# Async callbacks cannot return values.\n# \n\ndef _get_icon_path():\n    import os\n    # Gets the path to an icon file to demonstrate PIL image handling\n    return os.path.join(os.path.dirname(xloil.linked_workbook()), 'icon.bmp')\n    \n\ndef button_image(ctrl):\n    # Ribbon callback to determine the button's icon (see ribbon xml)\n    im = Image.open(_get_icon_path())\n    return im\n\n# Maps button ids in the ribbon xml below to GUI toolkit names\n_BUTTON_MAP = { \n    \"buttonTk\": \"Tk\", \n    \"buttonQt\": \"Qt\",\n    \"buttonWx\": \"wx\"\n} \n\ndef get_button_label(ctrl, *args):\n    # Ribbon callback to determine button label text\n    return f\"Open {_BUTTON_MAP[ctrl.id]}\"\n\nasync def press_open_pane_button(ctrl):\n    \n    toolkit = _BUTTON_MAP[ctrl.id]\n    \n    xlo.log(f\"Open {toolkit} Pressed\")\n    \n    await make_task_pane(toolkit)\n\n    \n#\n# The combo box in the ribbon xml has the value 33, 66 or 99. We send \n# this as the progress % to the progress bar in our task panes (if they \n# have been created)\n# \ndef combo_change(ctrl, value):\n    \n    qt_pane = xlo.gui.find_task_pane(_PANE_NAMES['Qt'])\n    if qt_pane:\n        qt_pane.widget.set_progress(int(value))\n        \n    tk_pane = xlo.gui.find_task_pane(_PANE_NAMES['Tk'])\n    if tk_pane:\n        tk_pane.set_progress(int(value))\n\n    wx_pane = xlo.gui.find_task_pane(_PANE_NAMES['wx'])\n    if wx_pane:\n        wx_pane.frame.set_progress(int(value))\n\n    return \"NotSupposedToReturnHere\" # check this doesn't cause an error\n\nasync def press_open_console_button_tk(ctrl):\n\n    def sesame(root):\n        from xloil.gui.tkinter import TkConsole\n        import tkinter\n        import code\n\n        top_level = tkinter.Toplevel(root)\n        console = TkConsole(top_level, code.interact,\n            fg='white', bg='black', font='Consolas', insertbackground='red')\n        console.pack(expand=True, fill=tkinter.BOTH)\n        console.bind(\"<<CommandDone>>\", lambda e: top_level.destroy())\n\n        top_level.deiconify()\n\n    from xloil.gui.tkinter import Tk_thread\n    await Tk_thread().submit_async(sesame, Tk_thread().root)\n\nasync def press_open_console_button_qt(ctrl):\n\n    def sesame():\n        from xloil.gui.qt_console import create_qtconsole_inprocess\n        console = create_qtconsole_inprocess()\n        console.show()\n        return console\n\n    from xloil.gui.qtpy import Qt_thread\n    await Qt_thread().submit_async(sesame)\n\n#\n# We construct the ExcelGUI (actually a handle to a COM addin) using XML to describe \n# the ribbon and a map from callbacks referred to in the XML to actual python functions\n#\n_excelgui = xlo.ExcelGUI(ribbon=r'''\n   <customUI xmlns=\"http://schemas.microsoft.com/office/2009/07/customui\">\n       <ribbon>\n           <tabs>\n               <tab id=\"customTab\" label=\"xloPyTest\" insertAfterMso=\"TabHome\">\n                   <group idMso=\"GroupClipboard\" />\n                   <group idMso=\"GroupFont\" />\n                   <group id=\"customGroup\" label=\"MyButtons\">\n                       <button id=\"buttonTk\" getLabel=\"getButtonLabel\" getImage=\"buttonImg\" size=\"large\" onAction=\"pressOpenPane\" />\n                       <button id=\"buttonQt\" getLabel=\"getButtonLabel\" getImage=\"buttonImg\" size=\"large\" onAction=\"pressOpenPane\" />\n                       <button id=\"buttonWx\" getLabel=\"getButtonLabel\" getImage=\"buttonImg\" size=\"large\" onAction=\"pressOpenPane\" />\n                       <button id=\"tkConsole\" label=\"Tk Console\" size=\"large\" onAction=\"pressOpenConsoleTk\" />\n                       <button id=\"qtConsole\" label=\"Qt Console\" size=\"large\" onAction=\"pressOpenConsoleQt\" />\n                       <comboBox id=\"comboBox\" label=\"Combo Box\" onChange=\"comboChange\">\n                        <item id=\"item1\" label=\"33\" />\n                        <item id=\"item2\" label=\"66\" />\n                        <item id=\"item3\" label=\"99\" />\n                      </comboBox>\n                   </group>\n               </tab>\n           </tabs>\n       </ribbon>\n   </customUI>\n   ''', \n   funcmap={\n       'pressOpenPane': press_open_pane_button,\n       'pressOpenConsoleTk': press_open_console_button_tk,\n       'pressOpenConsoleQt': press_open_console_button_qt,\n       'comboChange': combo_change,\n       'getButtonLabel': get_button_label,\n       'buttonImg': button_image\n   })\n    \n#-----------------------------------------\n# Images: returning images from functions\n#-----------------------------------------\n\n# In case PIL is not installed, protect this section\ntry:\n\n    # This import defines a return converter which allows us to return a PIL image\n    import xloil.pillow\n    import os\n    from PIL import Image\n    \n    # The image return converter is registered, so we just need to return the PIL\n    # image from an xlo.func. Returning an image requires macro=True permissions\n    @xlo.func(macro=True)\n    def pyTestPic():\n        im = Image.open(_get_icon_path())\n        return im\n    \n    \n    # Normally we use a return converter as an annotation like `-> ReturnImage` but \n    # if we want to dynamically pass arguments to the converter we can call it \n    # directly as below\n    @xlo.func(macro=True)\n    def pyTestPicSized(width:float, height:float, fitCell: bool=False):\n        from PIL import Image\n        import os\n        im = Image.open(_get_icon_path())\n        if fitCell:\n            return xlo.pillow.ReturnImage(size=\"cell\")(im)\n        else:\n            return xlo.pillow.ReturnImage((width, height))(im)\n\nexcept ImportError:\n    pass\n\n#-----------------------------------------\n# Plots: returning matplotlib figures from functions\n#-----------------------------------------\n\n# In case matplotlib is not installed, protect this section\ntry:\n\n    # This import defines a return converter for a matplotlib figure\n    # It also imports matplotlib like this:\n    #\n    #   import matplotlib\n    #   matplotlib.use('Agg')\n    #   from matplotlib import pyplot\n    # \n    # The order is important: the matplotlib backend must be switched\n    # from the Qt default before pyplot is imported\n    #\n    \n    import xloil.matplotlib\n    from matplotlib import pyplot\n    \n    @xlo.func(macro=True, local=False)\n    def pyTestPlot(x, y, width:float=4, height:float=4, **kwargs):\n        fig = pyplot.figure()\n        fig.set_size_inches(width, height)\n        ax = fig.add_subplot(111)\n        ax.plot(x, y, **kwargs)\n        return fig\n        \nexcept ImportError:\n    pass\n\n"
  },
  {
    "path": "tests/ManualSheets/python/TestJupyterConnection.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#%load_ext autoreload\\n\",\n    \"#%autoreload 2\\n\",\n    \"%connect_info\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"@xloil.func\\n\",\n    \"def jptest(x):\\n\",\n    \"    return f\\\"Jupyter says {x}\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def func1(x):\\n\",\n    \"    return x\\n\",\n    \"def func2(x):\\n\",\n    \"    return [1,2,3,4,5]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"watch_var = np.array([6, 2, 3, 5])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"xl = xloil.app()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"xl.Version\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#xl.quit()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import sys\\n\",\n    \"import os\\n\",\n    \"soln_dir = os.path.join(os.getcwd(), r\\\"..\\\\..\\\\..\\\" \\\"\\\\\\\\\\\")\\n\",\n    \"os.environ['XLOIL_BIN_DIR'] = os.path.join(soln_dir, r\\\"build\\\\x64\\\\Debug\\\")\\n\",\n    \"sys.path.append(os.path.join(soln_dir, r\\\"libs\\\\xlOil_Python\\\\Package\\\"))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"xloil.func\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"xloil.app\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3 (ipykernel)\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.9.1\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 2\n}\n"
  },
  {
    "path": "tests/PString.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/PString.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\n\nnamespace Tests\n{\n  TEST_CLASS(PStringTests)\n  {\n  public:\n    TEST_METHOD(Test_Create)\n    {\n      {\n        PString str(L\"Foo\");\n        Assert::IsTrue(str == L\"Foo\");\n        str.resize(6);\n        str = L\"Foobar\";\n        Assert::IsTrue(str == L\"Foobar\");\n      }\n      {\n        PString str(wstring(L\"Foo\"));\n        Assert::IsTrue(str == L\"Foo\");\n      }\n      {\n        PString str(3);\n        str = wstring(L\"Foo\");\n        Assert::IsTrue(str == L\"Foo\");\n        // Check resize is automatic\n        str = L\"Foobar\";\n        Assert::IsTrue(str == L\"Foobar\");\n      }\n    }\n    TEST_METHOD(Test_Strtok)\n    {\n      PString address(L\"['My Book']'My Sheet'!A1\");\n      auto view = PStringRef(address).remove_const();\n\n      const auto delims = L\"[]'!\";\n      const auto wb = view.strtok(delims);\n      const auto ws = view.strtok(delims);\n      const auto cell = view.strtok(delims);\n\n      Assert::IsFalse(wb.empty());\n      Assert::IsTrue(wb.view() == L\"My Book\");\n\n      Assert::IsFalse(ws.empty());\n      Assert::IsTrue(ws.view() == L\"My Sheet\");\n\n      Assert::IsFalse(cell.empty());\n      Assert::IsTrue(cell.view() == L\"A1\");\n    }\n    TEST_METHOD(Test_Append)\n    {\n      {\n        PString str(L\"Foo\");\n        auto sum = str + L\"bar\";\n        Assert::IsTrue(sum == L\"Foobar\");\n      }\n      {\n        PString str(L\"Foo\");\n        auto sum = str + wstring(L\"bar\");\n        Assert::IsTrue(sum == L\"Foobar\");\n      }\n      {\n        PString str(L\"Foo\");\n        auto sum = str + PString(L\"bar\");\n        Assert::IsTrue(sum == L\"Foobar\");\n      }\n      {\n        PString str(L\"Foo\");\n        auto sum = wstring(L\"Bar\") + str;\n        Assert::IsTrue(sum == L\"BarFoo\");\n      }\n      {\n        PString str(L\"Foo\");\n        auto sum = L\"Bar\" + str;\n        Assert::IsTrue(sum == L\"BarFoo\");\n      }\n    }\n    TEST_METHOD(Test_Find)\n    {\n      {\n        PString str(L\"Foo\");\n        Assert::IsTrue(str.find('o') == 1);\n        Assert::IsTrue(str.find('X') == str.npos);\n        Assert::IsTrue(str.rfind('o') == 2);\n        Assert::IsTrue(str.rfind('X') == str.npos);\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/TestAddin/AutoBind.cpp",
    "content": "#include <xloil/AutoBind.h>\n\nnamespace AnotherCLib\n{\n  double AddNumbers(double x, double y, double z = 1)\n  {\n    return x + y + z;\n  }\n\n  std::vector<double> AddVectors(const std::vector<double>& x, const std::vector<double>& y)\n  {\n    std::vector<double> result;\n\n    for (auto i = 0; i < std::min(x.size(), y.size()); ++i)\n      result.push_back(x[i] + y[i]);\n    \n    return result;\n  }\n\n  std::wstring DoStringThing(const wchar_t* str)\n  {\n    return std::wstring(str);\n  }\n}\n\nusing namespace xloil::AutoBind;\n\nusing AnotherCLib::AddNumbers;\nXLO_BIND(AddNumbers, 3, XLO_DEFAULTS(None, None, 1.0))\n  .help(L\"Example auto bind\")\n  .arg(L\"x\", L\"first arg\")\n  .arg(L\"y\", L\"next arg\")\n  .arg(L\"z\", L\"last arg\");\n\nusing AnotherCLib::AddVectors;\nXLO_BIND(AddVectors, 2)\n  .help(L\"Example auto bind\")\n  .arg(L\"x\", L\"first arg\")\n  .arg(L\"y\", L\"next arg\");\n\nusing AnotherCLib::DoStringThing;\nXLO_BIND(DoStringThing, 1)\n  .help(L\"Example auto bind\")\n  .arg(L\"str\", L\"first arg\");\n"
  },
  {
    "path": "tests/TestAddin/CacheTest.cpp",
    "content": "#include <xloil/ExcelObjCache.h>\n#include <xloil/StaticRegister.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START(\n    testCacheOut(const ExcelObj& /*inArray*/)\n  )\n  {\n    auto key = makeCached<int>(7);\n    return returnValue(key);\n  }\n  XLO_FUNC_END(testCacheOut);\n}"
  },
  {
    "path": "tests/TestAddin/CacheTest2.cpp",
    "content": "#include <xloil/ExcelObjCache.h>\n#include <xloil/StaticRegister.h>\n\nnamespace xloil\n{\n  XLO_FUNC_START(\n    testCacheIn(const ExcelObj& cacheKey)\n  )\n  {\n    auto val = getCached<int>(cacheKey.cast<PStringRef>());\n    return returnValue(val ? *val : 0);\n  }\n  XLO_FUNC_END(testCacheIn);\n}"
  },
  {
    "path": "tests/TestAddin/CallbackTest.cpp",
    "content": "#include <xloil/ExcelTypeLib.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/Events.h>\n#include <xloil/ExcelRef.h>\n#include <xloil/Date.h>\n#include <xloil/ExcelThread.h>\n#include <xloil/AppObjects.h>\n\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  // Replicates the TODAY() function by changing the format of the calling\n  // cell to date\n  XLO_FUNC_START(testToday())\n  {\n    CallerInfo caller;\n    if (!caller.fullSheetName().empty())\n    {\n      auto handle = xloil::Event::SheetChange().bind(\n        [=](const wchar_t* wsName, const Range& /*target*/)\n        {\n          // Could check range here as well to avoid\n          if (wsName == caller.sheetName())\n            thisApp().com().Range[caller.address().c_str()]->NumberFormat = L\"dd-mm-yyyy\";\n        }\n      );\n      auto milliSecsDelay = 1000;\n      runExcelThread([=]() mutable\n      {\n        handle.reset(); // Removes the SheetChange handler\n      }, ExcelRunQueue::WINDOW, milliSecsDelay);\n    }\n    std::tm buf; \n    auto now = std::time(0);\n    localtime_s(&buf, &now);\n    return returnValue(buf);\n  }\n  XLO_FUNC_END(testToday);\n}"
  },
  {
    "path": "tests/TestAddin/ExoticArgTest.cpp",
    "content": "#define XLOIL_UNSAFE_INPLACE_RETURN\n\n#include <xloil/RtdServer.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/Async.h>\n#include <xloil/FPArray.h>\n#include <xloil/ExcelRef.h>\n\nusing std::shared_ptr;\n\nnamespace xloil\n{\n  XLO_ENTRY_POINT(void) testInPlace(\n    ExcelObj* retVal,\n    const ExcelObj* nRows,\n    const ExcelObj* nCols)\n  {\n    try\n    {\n      if (retVal->isType(ExcelType::Multi))\n      {\n        auto& arr = retVal->val.array;\n        arr.rows = std::min(nRows->get<int>(1), arr.rows);\n        arr.columns = std::min(nCols->get<int>(1), arr.columns);\n      }\n    }\n    catch (const std::exception& e)\n    {\n      *retVal = *returnValue(e);\n    }\n  }\n  XLO_STATIC_REGISTER(testInPlace).threadsafe();\n\n  XLO_ENTRY_POINT(void) testAsync(\n    const AsyncHandle& handle,\n    const ExcelObj& val\n  )\n  {\n    try\n    {\n      handle.returnValue(val);\n    }\n    catch (const std::exception& e)\n    {\n      handle.returnValue(e.what());\n    }\n  }\n  XLO_STATIC_REGISTER(testAsync);\n\n  XLO_FUNC_START( testFP(const FPArray& array))\n  {\n    ExcelArrayBuilder builder(array.rows, array.columns);\n    for (auto i = 0; i < array.rows; ++i)\n      for (auto j = 0; j < array.columns; ++j)\n        builder(j, i) = array(i, j);\n    return returnValue(builder.toExcelObj());\n  }\n  XLO_FUNC_END(testFP);\n\n  XLO_FUNC_START(testRangeAddy(const RangeArg& range))\n  {\n    return returnValue(range.address());\n  }\n  XLO_FUNC_END(testRangeAddy);\n\n  XLO_ENTRY_POINT(void) testTranspose(\n    FPArray& array\n  )\n  {\n    for (auto i = 0; i < array.rows; ++i)\n      for (auto j = i + 1; j < array.columns; ++j)\n        std::swap(array(j, i), array(i, j));\n  }\n  XLO_STATIC_REGISTER(testTranspose).threadsafe();\n\n  XLO_ENTRY_POINT(int) testCommand(\n    const ExcelObj*, const ExcelObj*\n  )\n  {\n    return 1;\n  }\n  XLO_STATIC_REGISTER(testCommand);\n}\n"
  },
  {
    "path": "tests/TestAddin/Main.cpp",
    "content": "#include <xloil/xloil.h>\n#include <xloilHelpers/Environment.h>\n#include <xloil/XllEntryPoint.h>\n#include <map>\nusing namespace xloil;\nusing std::wstring;\nusing std::shared_ptr;\n\nnamespace\n{\n  void ribbonHandler(const RibbonControl& ctrl, VARIANT* /*ret*/, \n                     int /*nArgs*/, tagVARIANT** /*args*/)\n  {\n    XLO_TRACE(L\"Ribbon action on {0}, {1}\", ctrl.Id, ctrl.Tag);\n  };\n}\n\nstruct MyAddin\n{\n  shared_ptr<IComAddin> theComAddin;\n  std::list<shared_ptr<RegisteredWorksheetFunc>> theFuncs;\n\n  MyAddin()\n  {\n    auto logger = loggerInitialise(\"warn\");\n    // It's not a great idea to put your log file in the same directory as the XLL\n    // because if the XLL has been added to Excel's `XLSTART` folder, Excel will\n    // attempt to open the log file when it is next started.\n    loggerAddRotatingFileSink(logger,\n      getEnvironmentVar(L\"APPDATA\") + L\"\\\\xlOil\\\\\" + XllInfo::xllName + L\".log\",\n      \"debug\",\n      1000);\n\n    theFuncs.push_back(RegisterLambda<>(\n      [](const ExcelObj& /*arg1*/, const ExcelObj& /*arg2*/)\n      {\n        return returnValue(7);\n      })\n      .name(L\"testDynamic\")\n      .arg(L\"Arg1\")\n      .registerFunc());\n    theFuncs.push_back(RegisterLambda<void>(\n      [](const FuncInfo& /*info*/, const ExcelObj& /*arg1*/, const AsyncHandle& handle)\n      {\n        handle.returnValue(8);\n      })\n      .name(L\"testDynamicAsync\")\n      .arg(L\"Arg1\")\n      .registerFunc());\n    theFuncs.push_back(RegisterLambda<int>(\n      [](const FuncInfo& /*info*/, const ExcelObj& /*arg1*/)\n      {\n        return 1;\n      })\n      .name(L\"testDynamicAsync\")\n      .arg(L\"Arg1\")\n      .command()\n      .registerFunc());\n\n    runComSetupOnXllOpen([this]()\n    {\n      theComAddin = makeComAddin(L\"TestXlOil\");\n\n      std::map<wstring, IComAddin::RibbonCallback> handlers;\n      handlers[L\"conBoldSub\"] = ribbonHandler;\n      handlers[L\"conItalicSub\"] = ribbonHandler;\n      handlers[L\"comboChange\"] = ribbonHandler;\n      auto mapper = [=](const wchar_t* name) mutable { return handlers[name]; };\n\n      theComAddin->connect(LR\"(\n      <customUI xmlns=\"http://schemas.microsoft.com/office/2009/07/customui\">\n\t      <ribbon>\n\t\t      <tabs>\n\t\t\t      <tab id=\"customTab\" label=\"xlOilTest\" insertAfterMso=\"TabHome\">\n\t\t\t\t      <group idMso=\"GroupClipboard\" />\n\t\t\t\t      <group idMso=\"GroupFont\" />\n\t\t\t\t      <group id=\"customGroup\" label=\"MyButtons\">\n\t\t\t\t\t      <button id=\"customButton1\" label=\"ConBold\" size=\"large\" onAction=\"conBoldSub\" imageMso=\"Bold\" />\n\t\t\t\t\t      <button id=\"customButton2\" label=\"ConItalic\" size=\"large\" onAction=\"conItalicSub\" imageMso=\"Italic\" />\n\t\t\t\t\t      <comboBox id=\"comboBox\" label=\"Combo Box\" onChange=\"comboChange\">\n                 <item id=\"item1\" label=\"Item 1\" />\n                 <item id=\"item2\" label=\"Item 2\" />\n                 <item id=\"item3\" label=\"Item 3\" />\n               </comboBox>\n\t\t\t\t      </group>\n\t\t\t      </tab>\n\t\t      </tabs>\n\t      </ribbon>\n      </customUI>\n      )\", mapper);\n\n      theComAddin->ribbonInvalidate();\n      theComAddin->ribbonActivate(L\"customTab\");\n\n      std::shared_ptr<ICustomTaskPane> taskPane(theComAddin->createTaskPane(L\"xloil\"));\n      taskPane->setVisible(true);\n    });\n  }\n\n  ~MyAddin()\n  {\n    theComAddin.reset();\n    theFuncs.clear();\n  }\n\n  static wstring addInManagerInfo()\n  {\n    return wstring(L\"xlOil Static Test\");\n  }\n};\n\nXLO_DECLARE_ADDIN(MyAddin);\n"
  },
  {
    "path": "tests/TestAddin/RtdServerTest.cpp",
    "content": "#include <xloil/RtdServer.h>\n#include <xloil/StaticRegister.h>\n#include <xloil/ExcelCall.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/Events.h>\n//#include \"Main.h\"\n\nusing std::shared_ptr;\n\nnamespace xloil \n{\n  namespace Test\n  {\n    struct Counter : public RtdAsyncTask\n    {\n      Counter(int iStep) : _iStep(iStep) {}\n\n      int _iStep;\n\n      std::future<void> operator()(RtdNotifier notify) override\n      {\n        return std::async([=, step = _iStep]()\n        {\n          int _count = 0;\n          while (!notify.cancelled())\n          {\n            notify.publish(ExcelObj(_count));\n            std::this_thread::sleep_for(std::chrono::seconds(2));\n            _count += step;\n          }\n        });\n      }\n\n      bool operator==(const IRtdAsyncTask& that_) const override\n      {\n        const auto* that = dynamic_cast<const Counter*>(&that_);\n        if (!that)\n          return false;\n        return _iStep == that->_iStep;\n      }\n    };\n\n    XLO_FUNC_START(\n      xloRtdCounter(const ExcelObj& step)\n    )\n    {\n      auto iStep = step.get<int>(1);\n      auto value = rtdAsync(\n        std::make_shared<Counter>(iStep));\n      return returnValue(value ? *value : CellError::NA);\n    }\n    XLO_FUNC_END(xloRtdCounter);\n\n\n    IRtdServer* getAnotherRtdServer()\n    {\n      static shared_ptr<IRtdServer> ptr = newRtdServer();\n      //static auto deleter = Event_Shutdown() += [&]() { ptr.reset(); };\n      return ptr.get();\n    }\n\n    XLO_FUNC_START(\n      xloRtdSet(const ExcelObj& tag, const ExcelObj& val)\n    )\n    {\n      auto topic = tag.toString();\n      auto* srv = getAnotherRtdServer();\n      if (!srv->peek(topic.c_str()))\n        srv->start(topic.c_str(),\n          [](RtdNotifier) { return std::future<void>(); });\n      srv->publish(topic.c_str(), ExcelObj(val));\n      return returnValue(tag);\n    }\n    XLO_FUNC_END(xloRtdSet);\n\n    XLO_FUNC_START(\n      xloRtdGet(const ExcelObj& tag)\n    )\n    {\n      auto value = getAnotherRtdServer()->subscribe(tag.toString().c_str());\n      return returnReference(value\n        ? *value\n        : Const::Error(CellError::NA));\n    }\n    XLO_FUNC_END(xloRtdGet);\n  }\n}"
  },
  {
    "path": "tests/TestAddin/TestAddin.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}</ProjectGuid>\n    <RootNamespace>TestAddin</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v143</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\">\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\..\\libs\\xlOilStaticLib.props\" />\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"..\\..\\src\\Release.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"..\\..\\src\\Debug.props\" />\n  </ImportGroup>\n  <PropertyGroup>\n    <TargetExt>.xll</TargetExt>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <Link>\n      <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PreBuildEvent>\n      <Command>powershell $(SolutionDir)tools\\WriteInclude.ps1 $(SolutionDir)include\\xloil $(SolutionDir)include\\xloil</Command>\n    </PreBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"AutoBind.cpp\" />\n    <ClCompile Include=\"CacheTest.cpp\" />\n    <ClCompile Include=\"CacheTest2.cpp\" />\n    <ClCompile Include=\"CallbackTest.cpp\">\n      <MultiProcessorCompilation>false</MultiProcessorCompilation>\n    </ClCompile>\n    <ClCompile Include=\"ExoticArgTest.cpp\" />\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"RtdServerTest.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\external\\asmjit.vcxproj\">\n      <Project>{164af267-092e-441d-8bf0-2acf18e9adfd}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\external\\rdcfswatcher.vcxproj\">\n      <Project>{94cb9502-b5a4-473d-8a2e-4a67950049b6}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil-COM\\xlOil-COM.vcxproj\">\n      <Project>{2c85c326-07ea-4d9c-91c2-f79baec64f70}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil-Dynamic\\xlOil-Dynamic.vcxproj\">\n      <Project>{1102f4da-8b5a-4b01-a8ba-432a4c14a1ab}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOil-XLL\\xlOil-XLL.vcxproj\">\n      <Project>{fd89f79e-fad6-4bdf-b8b3-2028e8482abf}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\xlOilHelpers\\xlOilHelpers.vcxproj\">\n      <Project>{f7aa4c6f-c223-4ed1-bbb3-836e7ec044f2}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "tests/TestAddin/TestAddin.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"Main.cpp\" />\n    <ClCompile Include=\"RtdServerTest.cpp\" />\n    <ClCompile Include=\"ExoticArgTest.cpp\" />\n    <ClCompile Include=\"CacheTest.cpp\" />\n    <ClCompile Include=\"CacheTest2.cpp\" />\n    <ClCompile Include=\"CallbackTest.cpp\" />\n    <ClCompile Include=\"AutoBind.cpp\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "tests/TestArrayBuilder.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/ArrayBuilder.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/ExcelObj.h>\n#include <vector>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::vector;\n\nnamespace Microsoft {\n  namespace VisualStudio {\n    namespace CppUnitTestFramework\n    {\n      template<> inline std::wstring ToString<xloil::ExcelObj>(const xloil::ExcelObj& x)\n      {\n        return x.toString();\n      }\n    }\n  }\n}\n\nnamespace Tests\n{\n  TEST_CLASS(ArrayBuilder)\n  {\n  public:\n\n    TEST_METHOD(ArrayBuild1)\n    {\n      ExcelArrayBuilder builder(3, 2, 10);\n      \n      wchar_t* row0[] = { L\"Hello\", L\"World\" };\n      double row1[] = { 10.0, 7.2 };\n      builder(0, 0) = row0[0];\n      builder(0, 1) = (const wchar_t*)row0[1];\n      builder(1, 0) = 10;\n      builder(1, 1) = 7.2;\n      builder(2, 0) = CellError::NA;\n      builder(2, 1) = CellError::NA;\n\n      auto arrayObj = builder.toExcelObj();\n\n      ExcelArray arr(arrayObj);\n\n      Assert::AreEqual<size_t>(arr.nRows(), 2);\n      Assert::AreEqual<size_t>(arr.nCols(), 2);\n      Assert::AreEqual(arr(0, 0).toString(), wstring(row0[0]));\n      Assert::AreEqual(arr(0, 1).toString(), wstring(row0[1]));\n      Assert::AreEqual(arr(1, 0).get<double>(), row1[0]);\n      Assert::AreEqual(arr(1, 1).get<double>(), row1[1]);\n    }\n\n    TEST_METHOD(ArrayBuilderIterator)\n    {\n      auto nRows = 6;\n      auto nCols = 3;\n\n      ExcelArrayBuilder builderRow(nRows, nCols, 10);\n\n      for (auto i = 0; i < nRows; ++i)\n      {\n        auto j = 0;\n        for (auto iter = builderRow.row_begin(i); iter != builderRow.row_end(i); ++iter, ++j)\n          *iter = i + j;\n      }\n\n      ExcelArrayBuilder builderCol(nRows, nCols, 10);\n\n      for (auto j = 0; j < nCols; ++j)\n      {\n        auto i = 0;\n        for (auto iter = builderCol.col_begin(j); iter != builderCol.col_end(j); ++iter, ++i)\n          *iter = i + j;\n      }\n\n      auto byRow = builderRow.toExcelObj();\n      auto byCol = builderCol.toExcelObj();\n\n      Assert::AreEqual(byRow, byCol);\n    }\n    TEST_METHOD(ArrayIteratorSyntax)\n    {\n      vector<double> data = { 1, 2, 3, 4, 5, 6 };\n      ExcelArrayBuilder builder(3, 2);\n      std::copy(data.begin(), data.end(), builder.begin());\n\n      auto arrayData = builder.toExcelObj();\n      ExcelArray array(arrayData);\n\n      for (auto i = 0u; i < data.size(); ++i)\n        Assert::AreEqual(array[i].get<double>(), data[i]);\n    }\n\n    TEST_METHOD(ArrayAccess)\n    {\n      ExcelArrayBuilder builder(6, 4);\n      builder.fillNA();\n\n      for (auto i = 0u; i < builder.nRows(); ++i)\n        for (auto j = 0u; j < builder.nCols(); ++j)\n          builder(i, j) = i * j;\n\n      auto arrayData = builder.toExcelObj();\n      ExcelArray array(arrayData);\n\n      Assert::AreEqual(array.nRows(), builder.nRows());\n      Assert::AreEqual(array.nCols(), builder.nCols());\n\n      for (auto n = 1u; n < array.nCols(); ++n)\n      {\n        auto sub = array.slice(0, 1, array.nRows(), n);\n\n        Assert::AreEqual(array.nRows(), sub.nRows());\n\n        // Check sub-array equals array using a whole-array index\n        auto k = 0u;\n        for (auto i = 0u; i < sub.nRows(); ++i)\n          for (auto j = 1u; j < n; ++j, ++k)\n            Assert::IsTrue(array(i, j) == sub(k));\n\n        // Check sub-array whole-index matches iterator\n        k = 0;\n        for (auto& val : sub)\n          Assert::IsTrue(val == sub(k++));\n      }\n    }\n\n    TEST_METHOD(ArrayIterators)\n    {\n      ExcelArrayBuilder builder(6, 4);\n      builder.fillNA();\n\n      for (auto i = 0u; i < builder.nRows(); ++i)\n        for (auto j = 0u; j < builder.nCols(); ++j)\n          builder(i, j) = i * j;\n\n      auto arrayData = builder.toExcelObj();\n      ExcelArray array(arrayData);\n\n      for (auto iCol = 0u; iCol < array.nCols(); ++iCol)\n      {\n        auto iRow = 0u;\n        for (auto p = array.col_begin(iCol); p != array.col_end(iCol); ++p, ++iRow)\n        {\n          Assert::AreEqual<int>(iCol * iRow, p->get<int>());\n        }\n      }\n    }\n\n    TEST_METHOD(SubArrayAccess)\n    {\n      constexpr auto R = 6, C = 4;\n      ExcelArrayBuilder builder(R, C);\n      builder.fillNA();\n\n      for (auto i = 0u; i < builder.nRows(); ++i)\n        for (auto j = 0u; j < builder.nCols(); ++j)\n          builder(i, j) = i * j;\n\n      auto arrayData = builder.toExcelObj();\n      ExcelArray array(arrayData);\n\n      for (auto n = -R + 1; n < R - 1; ++n)\n      {\n        auto sub = array.slice(n, 1, R, 2);\n        Assert::IsTrue(sub(0) == array(n < 0 ? R + n : n, 1));\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/TestCOM.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/AppObjects.h>\n#include <xloil/ExcelTypeLib.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::unique_ptr;\n\nnamespace Tests\n{\n  TEST_CLASS(TestCOM)\n  {\n  public:\n    TEST_METHOD(TestCOM1)\n    {\n      // Just a smoke test at the moment, but hey it's better than nowt\n      auto app = Application();\n      app.workbooks();\n      app.quit();\n    }\n  };\n}"
  },
  {
    "path": "tests/TestCache.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xloil/ExcelObjCache.h>\n#include <chrono>\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::make_unique;\nusing fmt::format;\nusing std::vector;\nusing std::unique_ptr;\n\nnamespace Tests\n{\n  TEST_CLASS(TestCache)\n  {\n  public:\n\n    TEST_METHOD(LookupCacheTest)\n    {\n      auto cache = ObjectCache<\n        std::unique_ptr<int>,\n        CacheUniquifier<std::unique_ptr<int>>>::create();\n      const int N = 100;\n\n      vector<ExcelObj> callers;\n      vector<ExcelObj> keys(N);\n      for (auto i = 0; i < N; ++i)\n        callers.emplace_back(ExcelObj(format(L\"Key_{0}\", i)));\n\n      for (auto i = 0; i < N; ++i)\n        keys[i] = cache->add(make_unique<int>(i), CallerInfo(callers[i]));\n\n      for (auto i = 0; i < N; ++i)\n        cache->add(make_unique<int>(i), CallerInfo(callers[i]));\n\n      for (auto i = 0; i < N; ++i)\n      {\n        auto* val = cache->fetch(keys[i].asStringView());\n        Assert::AreEqual<int>(i, **val);\n      }\n    }\n\n    TEST_METHOD(CallerAddressTypes)\n    {\n      auto F3 = ExcelObj(msxll::xlref12{ 2, 3, 5, 6 });\n\n      auto sheetName = wstring(L\"[Book]Sheet\");\n      auto caller = CallerInfo(F3, sheetName.c_str());\n\n      Assert::AreEqual(sheetName + L\"!R3C6:R4C7\", caller.address(AddressStyle::RC | AddressStyle::NOQUOTE));\n      Assert::AreEqual(sheetName + L\"!F3:G4\", caller.address(AddressStyle::A1 | AddressStyle::NOQUOTE));\n    }\n    TEST_METHOD(CacheSpeedTest1)\n    {\n      auto& cache = ObjectCacheFactory<std::unique_ptr<int>>::cache();\n      const int NumReps = 1;\n      const int N = 100;\n\n      vector<ExcelObj> callers;\n      vector<ExcelObj> keys(N);\n      for (auto i = 0; i < N; ++i)\n        callers.emplace_back(ExcelObj(format(L\"Key_{0}\", i)));\n      \n      auto t1 = std::chrono::high_resolution_clock::now();\n\n      for (auto i = 0; i < N; ++i)\n        keys[i] = cache.add(make_unique<int>(i), CallerInfo(callers[i]));\n\n      for (auto rep = 0; rep < NumReps; ++rep)\n        for (auto i = 0; i < N; ++i)\n          cache.add(make_unique<int>(i), CallerInfo(callers[i]));\n\n      auto t2 = std::chrono::high_resolution_clock::now();\n\n      for (auto rep = 0; rep < NumReps * 10; ++rep)\n        for (auto i = 0; i < N; ++i)\n        {\n          auto* val = cache.fetch(keys[i].cast<PStringRef>().view());\n#ifndef RUN_PERFORMANCE_TEST\n          Assert::AreEqual<int>(i, **val);\n#endif\n        }\n\n#ifndef RUN_PERFORMANCE_TEST\n      auto t3 = std::chrono::high_resolution_clock::now();\n      auto duration1 = std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();\n      auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>(t3 - t2).count();\n      Logger::WriteMessage(format(\"CacheSpeedTest1 - Time 1: {0},   Time 2: {1}\", duration1, duration2).c_str());\n#endif\n    }\n  };\n}"
  },
  {
    "path": "tests/TestExcelCall.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/ExcelCall.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::unique_ptr;\n\nnamespace Tests\n{\n  TEST_CLASS(TestExcelCall)\n  {\n  public:\n\n    TEST_METHOD(TestExcelCallNameLookup)\n    {\n      Assert::AreEqual(excelFuncNumber(\"onWindow\"), msxll::xlcOnWindow);\n      Assert::AreEqual(excelFuncNumber(\"foobar\"), -1);\n      Assert::AreEqual(excelFuncNumber(excelFuncName(msxll::xlcOnWindow)), msxll::xlcOnWindow);\n      Assert::AreEqual(excelFuncName(999), nullptr);\n      Assert::AreEqual(excelFuncNumber(\"n\"), msxll::xlfN);\n      Assert::AreEqual(excelFuncNumber(excelFuncName(msxll::xlfT)), msxll::xlfT);\n    }\n  };\n}"
  },
  {
    "path": "tests/TestExcelObj.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/ArrayBuilder.h>\n#include <xlOil/ExcelArray.h>\n#include <xlOil/ExcelObj.h>\n#include <xlOil/Date.h>\n\n#include <vector>\n\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::vector;\nusing std::hash;\n\nnamespace Tests\n{\n  TEST_CLASS(TestExcelObj)\n  {\n  public:\n\n    TEST_METHOD(TestComparison)\n    {\n      Assert::IsFalse(ExcelObj(L\"Hello\") < ExcelObj(L\"hello\"));\n      Assert::IsTrue(ExcelObj(1.5) < ExcelObj(2));\n      Assert::IsTrue(hash<ExcelObj>()(ExcelObj(1.5))\n        == hash<ExcelObj>()(ExcelObj(1.5)));\n\n      vector<double> smallerValues = { 1, 2, 3, 4 };\n      auto smaller1 = ExcelObj(smallerValues.begin(), smallerValues.end());\n      auto smaller2 = ExcelObj(smallerValues.begin(), smallerValues.end());\n\n      Assert::IsTrue(smaller1 == smaller2);\n\n      vector<double> largerValues = { 1, 2, 3, 5 };\n      Assert::AreEqual(-1, ExcelObj::compare(\n        smaller1,\n        ExcelObj(largerValues.begin(), largerValues.end()),\n        true, true));\n    }\n\n    TEST_METHOD(TestStrings)\n    {\n      {\n        Assert::IsTrue(ExcelObj(L\"Foo\") == L\"Foo\");\n        Assert::IsTrue(ExcelObj(L\"Foo\") == wstring(L\"Foo\"));\n        Assert::IsTrue(ExcelObj(\"Foo\") == L\"Foo\");\n        Assert::IsTrue(ExcelObj(\"Foo\") == wstring(L\"Foo\"));\n        Assert::IsTrue(ExcelObj(\"\") == L\"\");\n        Assert::IsFalse(ExcelObj(3) == L\"Foo\");\n      }\n    }\n\n    TEST_METHOD(TestArray)\n    {\n      ExcelObj obj = { 1, 2, 3, 4, 5 };\n      ExcelArray arr(obj);\n      Assert::IsTrue(arr(0) == 1);\n      Assert::IsTrue(arr(2) == 3);\n      Assert::IsTrue(arr(4) == 5);\n      vector<double> values;\n      std::transform(arr.begin(), arr.end(), std::back_inserter(values), ApplyVisitor{ conv::ToType<double>() });\n      Assert::IsTrue(values == vector<double>{ 1, 2, 3, 4, 5 });\n    }\n\n    TEST_METHOD(TestArraySlice)\n    {\n      ExcelObj obj = { { 1, 2, 3 }, { 4, 5, 6} };\n      ExcelArray arr(obj);\n\n      {\n        auto negativeSlice = arr.slice(0, -2);\n        Assert::AreEqual(arr(0, 1).get<int>(), negativeSlice(0, 0).get<int>());\n      }\n\n      {\n        auto slice2d = arr.slice(0, 1, 2, 3);\n        Assert::AreEqual(arr(0, 1).get<int>(), slice2d(0, 0).get<int>());\n        Assert::AreEqual(2u, slice2d.nRows());\n        Assert::AreEqual(2u, slice2d.nCols());\n      }\n\n      // Out-of-bounds slice\n      Assert::ExpectException<std::out_of_range>([&]() { arr.slice(3, 0, 5, 0); });\n    }\n    TEST_METHOD(TestCreateFromDate)\n    {\n      {\n        ExcelObj date(stringToDateTime(L\"2017-01-01\", L\"%Y-%m-%d\"));\n        auto tm = date.get<std::tm>();\n        Assert::AreEqual(2017, tm.tm_year + 1900);\n        Assert::AreEqual(1, tm.tm_mon + 1);\n        Assert::AreEqual(1, tm.tm_mday);\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/TestGuid.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xloil/WindowsSlim.h>\n#include <xloilHelpers/GuidUtils.h>\n#include <combaseapi.h> // StringFromGUID2\n\nusing namespace xloil;\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\nusing std::wstring;\n\nconst GUID theExcelDnaNamespaceGuid =\n  { 0x306D016E, 0xCCE8, 0x4861, { 0x9D, 0xA1, 0x51, 0xA2, 0x7C, 0xBE, 0x34, 0x1A} };\n\n\nnamespace Tests\n{\n  TEST_CLASS(TestGuidUtils)\n  {\n  public:\n\n    TEST_METHOD(TestExcelDnaGuid)\n    {\n      // The expected results are calculated by running the following code on dotnetfiddle.net \n      // https://github.com/Excel-DNA/ExcelDna/blob/661aba734f08b2537866632f2295a77062640672/Source/ExcelDna.Integration/GuidUtility.cs\n      // Plus:\n      //   static readonly Guid ExcelDnaGuid = new Guid(\"{306D016E-CCE8-4861-9DA1-51A27CBE341A}\");\n\t\t  //   GuidUtility.Create(ExcelDnaGuid, path.ToUpperInvariant());\n      // \n      wchar_t str[64];\n      GUID result;\n      {\n        stableGuidFromString(result, theExcelDnaNamespaceGuid, L\"\");\n        StringFromGUID2(result, str, _countof(str));\n        Assert::AreEqual(L\"{FB475EF6-2275-54B0-AF78-FE136DAF4ECA}\", str);\n      }\n      {\n        stableGuidFromString(result, theExcelDnaNamespaceGuid, L\"addin.xll\");\n        StringFromGUID2(result, str, _countof(str));\n        Assert::AreEqual(L\"{818CECFE-DB3F-51CF-92A3-22D1727F623D}\", str);\n      }\n      {\n        stableGuidFromString(result, theExcelDnaNamespaceGuid, L\"c:\\\\path\\\\addin.xll\");\n        StringFromGUID2(result, str, _countof(str));\n        Assert::AreEqual(L\"{C5C4A7E8-1D08-521B-A539-957E3E62568B}\", str);\n      }\n    }\n    TEST_METHOD(TestGuidToString)\n    {\n      const GUID testGuid =\n        { 0x306D016E, 0xCCE8, 0x4861, { 0x9D, 0xA1, 0x51, 0xA2, 0x7C, 0xBE, 0x34, 0x1A} };\n      {\n        auto result = guidToWString(testGuid, GuidToString::PUNCTUATED);\n        Assert::AreEqual<wstring>(L\"{306D016E-CCE8-4861-9DA1-51A27CBE341A}\", result);\n      }\n      {\n        auto result = guidToWString(testGuid, GuidToString::HEX);\n        Assert::AreEqual(L\"306D016ECCE848619DA151A27CBE341A\", result.c_str(), true);\n      }\n      {\n        auto result = guidToWString(testGuid, GuidToString::BASE62);\n#ifdef _WIN64\n        Assert::AreEqual<wstring>(L\"6DHqXiKeG5u2FUdHmh8HsL\", result);\n#else\n        Assert::AreEqual<wstring>(L\"syxOo1KBMqm2yIW0jTkmku\", result);\n#endif \n      }\n    }\n  };\n}\n"
  },
  {
    "path": "tests/TestRange.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/ExcelRef.h>\n#include <xlOil/ExcelObj.h>\n#include <chrono>\n#include <iostream>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::unique_ptr;\nusing std::to_string;\nusing std::vector;\n\nbool operator==(const msxll::XLREF12& l, const msxll::XLREF12& r)\n{\n  return memcmp(&l, &r, sizeof(l)) == 0;\n}\n\nnamespace Microsoft {\n  namespace VisualStudio {\n    namespace CppUnitTestFramework\n    {\n      template<> inline std::wstring ToString<msxll::XLREF12>(const msxll::XLREF12& r) \n      { \n        return fmt::format(L\"(row=[{},{}], col=[{},{}])\", r.rwFirst, r.rwLast, r.colFirst, r.colLast);\n      }\n    }\n  }\n}\n\nnamespace Tests\n{\n  TEST_CLASS(TestRange)\n  {\n  public:\n\n    TEST_METHOD(TestExcelRef)\n    {\n      msxll::IDSHEET sheet = nullptr;\n      auto rng = new XllRange(ExcelRef(sheet, 1, 1, 10, 10));\n\n      // We can only use local addresses as getting the sheet name requires an API call\n      {\n        auto subRange = unique_ptr<Range>(rng->range(1, 1, 2, 2));\n        auto address = subRange->address(AddressStyle::LOCAL);\n        Assert::AreEqual(L\"C3:D4\", address.c_str());\n      }\n      {\n        auto subRange = unique_ptr<Range>(rng->range(-1, -1, -1, -1));\n        auto address = subRange->address(AddressStyle::LOCAL);\n        Assert::AreEqual(L\"A1\", address.c_str());\n      }\n      {\n        auto subRange = unique_ptr<Range>(rng->range(2, 2));\n        auto address = subRange->address(AddressStyle::LOCAL);\n        Assert::AreEqual(L\"D4:K11\", address.c_str());\n      }\n      {\n        Assert::ExpectException<std::exception>([rng]() {\n          rng->range(-2, -1);\n        });\n      }\n    }\n\n    void xlRefRoundTrip(const msxll::XLREF12& ref, bool lowerCase = false, bool a1style = true)\n    {\n      wchar_t address[std::max(XL_FULL_ADDRESS_A1_MAX_LEN, XL_FULL_ADDRESS_RC_MAX_LEN)];\n      if (a1style)\n        xlrefToAddress(ref, address, _countof(address), std::wstring_view(), AddressStyle::A1);\n      else\n        xlrefToAddress(ref, address, _countof(address), std::wstring_view(), AddressStyle::A1);\n      if (lowerCase)\n        std::transform(address, address + _countof(address), address, towlower);\n      msxll::XLREF12 outRef;\n      addressToXlRef(address, outRef);\n      Assert::AreEqual(ref, outRef);\n    }\n\n    TEST_METHOD(TestAddressParseA1)\n    {\n      for (auto i = 1; i < XL_MAX_ROWS; i += 100)\n      {\n        xlRefRoundTrip(msxll::XLREF12{ 1, i, 1, 1 });\n      }\n      for (auto j = 1; j < XL_MAX_COLS; j += 100)\n      {\n        xlRefRoundTrip(msxll::XLREF12{ 1, 1, j, j });\n      }\n      for (auto j = 1; j < XL_MAX_COLS; j += 100)\n      {\n        xlRefRoundTrip(msxll::XLREF12{ 1, j, 1, j }, true);\n      }\n\n      msxll::XLREF12 outRef;\n\n      Assert::IsFalse(addressToXlRef(L\"100:AB\", outRef));\n      Assert::IsFalse(addressToXlRef(L\"BuzZ100\", outRef));\n      Assert::IsFalse(addressToXlRef(L\"A1-B2\", outRef));\n\n      Assert::IsTrue(addressToXlRef(L\"$A1\", outRef));\n      Assert::IsTrue(addressToXlRef(L\"$A1:B$1\", outRef));\n    }\n    TEST_METHOD(TestAddressParseRC)\n    {\n      for (auto i = 1; i < XL_MAX_ROWS; i += 100)\n      {\n        xlRefRoundTrip(msxll::XLREF12{ 1, i, 1, 1 }, false, false);\n      }\n      for (auto j = 1; j < XL_MAX_COLS; j += 100)\n      {\n        xlRefRoundTrip(msxll::XLREF12{ 1, 1, j, j }, false, false);\n      }\n      for (auto j = 1; j < XL_MAX_COLS; j += 100)\n      {\n        xlRefRoundTrip(msxll::XLREF12{ 1, j, 1, j }, true, false);\n      }\n\n      msxll::XLREF12 outRef;\n\n      Assert::IsFalse(addressToXlRef(L\"R1-C1\", outRef));\n\n      Assert::IsTrue(addressToXlRef(L\"$R1C1\", outRef));\n      Assert::IsTrue(addressToXlRef(L\"$R1C1:R2$C1\", outRef));\n    }\n    TEST_METHOD(TestAddressWriteA1)\n    {\n      uint8_t len;\n      char buf[4];\n      len = writeColumnName(1 - 1, buf);\n      buf[len] = '\\0';\n      Assert::AreEqual(\"A\", buf);\n      len = writeColumnName(27 - 1, buf);\n      buf[len] = '\\0';\n      Assert::AreEqual(\"AA\", buf);\n      len = writeColumnName(703 - 1, buf);\n      buf[len] = '\\0';\n      Assert::AreEqual(\"AAA\", buf);\n    }\n    TEST_METHOD(TestPerformanceAddressWriteA1)\n    {\n      using std::chrono::high_resolution_clock;\n      using std::chrono::duration_cast;\n      using std::chrono::duration;\n      using std::chrono::milliseconds;\n      using std::to_string;\n\n      constexpr size_t NRepeats = 1;\n      constexpr size_t N = 1000;\n      vector<unsigned> numbers(N, 0);\n\n      for (auto i = 0; i < N; ++i)\n      {\n        char s1[16], s2[16];\n        auto len = unsignedToString<10>(i, s1);\n        s1[len] = '\\0';\n        _itoa_s(i, s2, 10);\n        Assert::AreEqual(s1, s2, true);\n\n        len = unsignedToString<16>(i, s1);\n        s1[len] = '\\0';\n        _itoa_s(i, s2, 16);\n        Assert::AreEqual(s1, s2, true);\n      }\n\n      if constexpr (NRepeats > 1)\n      {\n        char buffer[16];\n\n        for (auto n : numbers)\n          _itoa_s(n, buffer, 10);\n\n        auto t1 = high_resolution_clock::now();\n\n        for (auto k = 0; k < NRepeats; ++k)\n          for (auto n : numbers)\n            unsignedToString<10>(n, buffer, _countof(buffer));\n\n        auto t2 = high_resolution_clock::now();\n\n        for (auto k = 0; k < NRepeats; ++k)\n          for (auto n : numbers)\n            _itoa_s(n, buffer, 10);\n\n        auto t3 = high_resolution_clock::now();\n\n        /* Getting number of milliseconds as a double. */\n        duration<double, std::milli> method1 = t2 - t1;\n        duration<double, std::milli> method2 = t3 - t2;\n\n        Logger::WriteMessage((\"unsignedToString: \" + to_string(method1.count()) + \"ms\\n\").c_str());\n        Logger::WriteMessage((\"_itoa_s: \" + to_string(method2.count()) + \"ms\\n\").c_str());\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/TestSimpleAllocator.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xloil-Dynamic/ExternalRegionAllocator.h>\n#include <vector>\n#include <list>\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::string;\nusing std::vector;\nusing std::list;\n\nnamespace Tests\n{\n  TEST_CLASS(TestSimpleAllocator)\n  {\n  public:\n    TEST_METHOD(AllocatorTest1)\n    {\n      //SYSTEM_INFO si;\n      //GetSystemInfo(&si);\n      //assert(si.dwAllocationGranularity == m_dwGranularity);\n      //_maxAddress = si.lpMaximumApplicationAddress;\n\n      SYSTEM_INFO si;\n      GetSystemInfo(&si);\n        \n      auto allocator = ExternalRegionAllocator(si.lpMinimumApplicationAddress);\n\n      vector<void*> ptrs;\n      for (auto sz = 16; sz < 1024; sz += 32)\n      {\n        ptrs.push_back(allocator.alloc(sz));\n      }\n      for (auto p : ptrs)\n        allocator.free(p);\n    }\n\n    TEST_METHOD(AllocatorTest2)\n    {\n      SYSTEM_INFO si;\n      GetSystemInfo(&si);\n\n      auto allocator = ExternalRegionAllocator(si.lpMinimumApplicationAddress);\n\n      const char* sample = \"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor\";\n      auto sampleLen = strlen(sample);\n      vector<char*> ptrs;\n      for (auto i = 1u; i < sampleLen; ++i)\n      {\n        auto str = (char*)allocator.alloc(i + 1);\n        strncpy_s(str, i + 1, sample, i);\n        ptrs.push_back(str);\n      }\n      for (auto i = 0u; i < ptrs.size(); i += 4)\n      {\n        allocator.free(ptrs[i]);\n        ptrs[i] = nullptr;\n      }\n      for (auto i = 1u; i < sampleLen; ++i)\n      {\n        auto str = (char*)allocator.alloc(i + 1);\n        strncpy_s(str, i + 1, sample, i);\n        ptrs.push_back(str);\n      }\n      for (auto str : ptrs)\n      {\n        if (str)\n          Assert::AreEqual(0, strncmp(str, sample, strlen(str)));\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/TestStringUtils.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xlOil/StringUtils.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::string;\n\nnamespace Tests\n{\n  TEST_CLASS(StringUtils)\n  {\n  public:\n    template<int Radix>\n    void parseRoundTrip(size_t value)\n    {\n      char buffer[65], buf_itoa[65];\n\n      auto len = unsignedToString<Radix>(value, buffer, sizeof(buffer));\n      auto parsed = (size_t)parseUnsigned<Radix>(buffer + 0, buffer + len);\n      _ui64toa_s(value, buf_itoa, _countof(buf_itoa), Radix);\n      buffer[len] = '\\0';\n      Assert::AreEqual(buf_itoa, buffer, true);\n      Assert::AreEqual(value, parsed);\n    }\n\n    TEST_METHOD(TestIntStringParse)\n    {\n      for (size_t i = 1; i < 32; ++i)\n      {\n        size_t value = 1ull << i;\n        parseRoundTrip<2>(value);\n        parseRoundTrip<7>(value);\n        parseRoundTrip<10>(value);\n        parseRoundTrip<16>(value);\n        parseRoundTrip<32>(value);\n      }\n      for (size_t i = 1; i < 2000; ++i)\n      {\n        parseRoundTrip<2>(i);\n        parseRoundTrip<7>(i);\n        parseRoundTrip<10>(i);\n        parseRoundTrip<16>(i);\n        parseRoundTrip<32>(i);\n      }\n    }\n  };\n}"
  },
  {
    "path": "tests/TestTempFile.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xloilHelpers/Environment.h>\n#include <xloil/WindowsSlim.h>\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::unique_ptr;\n\nnamespace Tests\n{\n  TEST_CLASS(TempFileTests)\n  {\n  public:\n    TEST_METHOD(TestTempFile1)\n    {\n      // TODO: TestTempFile1 is a little too rudimentary!\n      auto [handle, name] = Helpers::makeTempFile();\n      CloseHandle(handle);\n    }\n  };\n}"
  },
  {
    "path": "tests/TestThunker.cpp",
    "content": "#include \"CppUnitTest.h\"\n#include <xloil-Dynamic/Thunker.h>\n#include <xloil/Register.h>\n#include <xloil/ExcelObj.h>\n#include <xloil/WindowsSlim.h>\n\nusing namespace Microsoft::VisualStudio::CppUnitTestFramework;\n\nusing namespace xloil;\nusing std::wstring;\nusing std::unique_ptr;\n\nnamespace Tests\n{\n  ExcelObj* callback(void* data, const ExcelObj** p) noexcept\n  {\n    auto n = *(int*)data;\n    return (ExcelObj*)p[n];\n  }\n  void asyncCallback(void* data, const ExcelObj** p) noexcept\n  {\n    auto n = *(int*)data;\n    const ExcelObj* r = p[0];\n    *(ExcelObj*)r = *p[n + 1];\n  }\n  TEST_CLASS(ThunkerTests)\n  {\n  public:\n\n    TEST_METHOD(PatchThunk)\n    {\n      auto callback = (void*)(intptr_t)0xABBAABBA;\n      auto context = (void*)(intptr_t)0xABFAB;\n      char code[1024];\n\n      ThunkWriter writer(callback, context, 3, true);\n      \n      auto codeSize = writer.writeCode(code, _countof(code));\n\n      auto newContext = (void*)0xBABABA;\n      auto success = patchThunkData(code, codeSize, context, newContext);\n      Assert::IsTrue(success);\n    }\n\n#ifdef _WIN64\n    TEST_METHOD(TestHandRoll)\n    {\n      // The context selects the argument to return in the callbacks\n      int context = 0;\n      const auto pContext = (void*)&context;\n\n      constexpr auto bufSize = 256u;\n      char buffer1[bufSize]; // Used for asmjit compiled thunk\n      char buffer2[bufSize]; // Used for hand rolled thunk\n      \n      DWORD dummy;\n      Assert::IsTrue(VirtualProtect(buffer1, bufSize, PAGE_EXECUTE_READWRITE, &dummy));\n      Assert::IsTrue(VirtualProtect(buffer2, bufSize, PAGE_EXECUTE_READWRITE, &dummy));\n\n      ThunkWriter(callback, pContext, 2, false).writeCode(buffer1, bufSize);\n      ThunkWriter(callback, pContext, 2, false, ThunkWriter::SLOW_BUILD).writeCode(buffer2, bufSize);\n\n      ExcelObj arg1(7);\n      ExcelObj arg2(3);\n\n      {\n        context = 0;\n\n        typedef ExcelObj* (*TwoArgs)(ExcelObj*, ExcelObj*);\n        auto result1 = ((TwoArgs)(void*)buffer1)(&arg1, &arg2);\n        auto result2 = ((TwoArgs)(void*)buffer2)(&arg1, &arg2);\n\n        Assert::IsTrue(*result1 == arg1);\n        Assert::IsTrue(*result2 == arg1);\n      }\n\n      ThunkWriter(callback, pContext, 7, true).writeCode(buffer1, bufSize);\n      ThunkWriter(callback, pContext, 7, true, ThunkWriter::SLOW_BUILD).writeCode(buffer2, bufSize);\n\n      {\n        context = 5;\n\n        typedef ExcelObj* (*SevenArgs)(ExcelObj*, ExcelObj*, ExcelObj*, ExcelObj*, ExcelObj*, ExcelObj*, ExcelObj*);\n        auto result1 = ((SevenArgs)(void*)buffer1)(&arg1, &arg1, &arg1, &arg1, &arg1, &arg2, &arg1);\n        auto result2 = ((SevenArgs)(void*)buffer2)(&arg1, &arg1, &arg1, &arg1, &arg1, &arg2, &arg1);\n\n        Assert::IsTrue(*result1 == arg2);\n        Assert::IsTrue(*result2 == arg2);\n      }\n\n      ThunkWriter(asyncCallback, pContext, 3, false).writeCode(buffer1, bufSize);\n      ThunkWriter(asyncCallback, pContext, 3, false, ThunkWriter::SLOW_BUILD).writeCode(buffer2, bufSize);\n\n      {\n        context = 1;\n        ExcelObj asyncReturn;\n\n        typedef void (*ThreeArgsAsync)(ExcelObj*, ExcelObj*, ExcelObj*, ExcelObj*);\n\n        ((ThreeArgsAsync)(void*)buffer1)(&asyncReturn, &arg2, &arg1, &arg2);\n        Assert::IsTrue(asyncReturn == arg1);\n\n        ((ThreeArgsAsync)(void*)buffer2)(&asyncReturn, &arg2, &arg1, &arg2);\n        Assert::IsTrue(asyncReturn == arg1);\n      }\n    }\n#endif\n  };\n}"
  },
  {
    "path": "tests/Tests.vcxproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Tests</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n    <ProjectSubType>NativeUnitTestProject</ProjectSubType>\n    <ProjectName>UnitTests</ProjectName>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <PlatformToolset>v143</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\" Condition=\"'$(Configuration)'=='Release'\">\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"PropertySheets\">\n    <Import Project=\"..\\src\\BuildPaths.props\" />\n    <Import Project=\"..\\src\\Common.props\" />\n  </ImportGroup>\n  <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Debug'\">\n    <Import Project=\"..\\src\\Debug.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)'=='Release'\">\n    <Import Project=\"..\\src\\Release.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)'=='Debug'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)'=='Release'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$(VCInstallDir)UnitTest\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n      <AdditionalDependencies>xloil.lib;xlcall32.lib;asmjit.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n    <PostBuildEvent>\n      <Command>copy $(SolutionDir)external\\Excel2013SDK\\LIB\\x64\\XLCALL32.DLL $(OutDir)</Command>\n    </PostBuildEvent>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"TestArrayBuilder.cpp\" />\n    <ClCompile Include=\"Date.cpp\" />\n    <ClCompile Include=\"Environment.cpp\" />\n    <ClCompile Include=\"CodePageConversion.cpp\" />\n    <ClCompile Include=\"PString.cpp\" />\n    <ClCompile Include=\"TestCache.cpp\" />\n    <ClCompile Include=\"TestCOM.cpp\">\n      <MultiProcessorCompilation>false</MultiProcessorCompilation>\n    </ClCompile>\n    <ClCompile Include=\"TestExcelCall.cpp\" />\n    <ClCompile Include=\"TestExcelObj.cpp\" />\n    <ClCompile Include=\"TestGuid.cpp\" />\n    <ClCompile Include=\"TestRange.cpp\" />\n    <ClCompile Include=\"TestSimpleAllocator.cpp\" />\n    <ClCompile Include=\"TestStringUtils.cpp\" />\n    <ClCompile Include=\"TestTempFile.cpp\" />\n    <ClCompile Include=\"TestThunker.cpp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\src\\external\\spdlog.vcxproj\">\n      <Project>{c4da7637-9d07-4d52-8db2-82b73d95e1b8}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\src\\xlOil-Dynamic\\xlOil-Dynamic.vcxproj\">\n      <Project>{1102f4da-8b5a-4b01-a8ba-432a4c14a1ab}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\src\\xlOilHelpers\\xlOilHelpers.vcxproj\">\n      <Project>{f7aa4c6f-c223-4ed1-bbb3-836e7ec044f2}</Project>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\src\\xlOil\\xlOil.vcxproj\">\n      <Project>{df88a189-295a-4ac8-befc-d199155ec8cb}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "tests/Tests.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"CodePageConversion.cpp\" />\n    <ClCompile Include=\"TestArrayBuilder.cpp\" />\n    <ClCompile Include=\"Environment.cpp\" />\n    <ClCompile Include=\"Date.cpp\" />\n    <ClCompile Include=\"PString.cpp\" />\n    <ClCompile Include=\"TestExcelObj.cpp\" />\n    <ClCompile Include=\"TestThunker.cpp\" />\n    <ClCompile Include=\"TestRange.cpp\" />\n    <ClCompile Include=\"TestCache.cpp\" />\n    <ClCompile Include=\"TestSimpleAllocator.cpp\" />\n    <ClCompile Include=\"TestTempFile.cpp\" />\n    <ClCompile Include=\"TestExcelCall.cpp\" />\n    <ClCompile Include=\"TestStringUtils.cpp\" />\n    <ClCompile Include=\"TestGuid.cpp\" />\n    <ClCompile Include=\"TestCOM.cpp\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "tools/BuildRelease.cmd",
    "content": "set TOOLS_DIR=%~dp0\nset SOLN_DIR=%TOOLS_DIR%\\..\n\nset ARCH=%1\n\ncall \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\Tools\\vsdevcmd.bat\" -no_logo\n\npushd %SOLN_DIR%\n\nmsbuild xlOil.sln /p:Configuration=Release /p:Platform=%ARCH%\n\npopd"
  },
  {
    "path": "tools/DownloadDependencies.cmd",
    "content": "set SOLN_DIR=%~dp0\\..\n\npushd %SOLN_DIR%\\external\n\ngit clone --single-branch --depth=1 --branch=v6.1.0 https://github.com/GiovanniDicanio/WinReg winreg\ngit clone --single-branch --depth=1 --branch=v2.13-xloil https://github.com/cunnane/pybind11.git pybind11\ngit clone --single-branch --depth=1 --branch=v3.4.0 https://github.com/marzer/tomlplusplus.git tomlplusplus\ngit clone --single-branch --depth=1 --branch=v1.8.5 https://github.com/gabime/spdlog.git spdlog\ngit clone --single-branch --depth=1 --branch=v.0.0.2 https://github.com/vit-vit/CTPL.git ctpl\ngit clone --single-branch --depth=1 --branch=documentation-stubs https://github.com/cunnane/pybind11-stubgen.git pybind11-stubgen\nREM git clone --single-branch --depth=1 --branch=master https://github.com/tresorit/rdcfswatcherexample.git rdcfswatcher\n\nREM Cloning sqlite is about 100mb and it's much easier to work with the source amalgamation\ncurl.exe --output sqlite.zip --url https://www.sqlite.org/2022/sqlite-amalgamation-3390300.zip\ntar -xf sqlite.zip\nrename sqlite-amalgamation-3390300 sqlite\n\nREM asmjit doesn't appear to have versioning, so we keep with our copy of the source\ngit clone https://github.com/asmjit/asmjit.git asmjit\npushd asmjit\ngit reset --hard ac77dfcd7\npopd\n\npopd\n\necho.You need to unpack %SOLN_DIR%\\external\\python.7z"
  },
  {
    "path": "tools/WriteInclude.ps1",
    "content": "﻿\n$HeaderDir = $args[0]\n$TargetDir = $args[1]\n\n$xloilHeader = Join-Path $TargetDir \"xlOil.h\"\nNew-Item $xloilHeader -ErrorAction SilentlyContinue\nSet-Content -Path $xloilHeader -Value \"#pragma once\"\n\nGet-ChildItem -Path $HeaderDir -File -Filter *.h -Name | \n\twhere {$_ -NotMatch 'xlOil.h|XllEntryPoint.h|WindowsSlim.h|ExcelTypeLib.h'} |\n    Foreach-Object {\n        return \"#include `\"\" + $_ + \"`\"\"\n    } |\n    Out-File $xloilHeader -Append utf8"
  },
  {
    "path": "tools/WriteVersion.ps1",
    "content": "﻿$Match = Select-String -path \"include\\xloil\\Version.h\" -pattern \"_VERSION +(\\d*)\" -AllMatches | Foreach-Object {$_.Matches}\nSet-Content -Path 'Version.txt' -Value \"$($Match.Groups[1]).$($Match.Groups[3]).$($Match.Groups[5])\"\n"
  },
  {
    "path": "tools/stage.py",
    "content": "import os\nfrom pathlib import Path\nimport sys\nimport subprocess\nfrom glob import glob\nimport shutil as sh\nfrom argparse import ArgumentParser\nimport shutil\nimport pkg_resources\n\n\ndef merge_dict(x, y):\n    return {**x, **y}\n\nparser = ArgumentParser()\nparser.add_argument(\"--post-ver\")\nparser.add_argument(\"--no-build\", action='store_true')\ncmd_args,_ = parser.parse_known_args()\n\ntools_dir = Path(os.path.realpath(__file__)).parent\nsoln_dir = tools_dir.parent\ndoc_dir = soln_dir / \"docs\"\nbuild_dir = soln_dir / \"build\"\nstaging_dir = build_dir / \"staging\"\nplugin_dir = soln_dir / \"libs\"\ninclude_dir = soln_dir / \"include\"\n\narchitectures = [\"x64\", \"Win32\"]\n\npython_versions = [\"3.7\", \"3.8\", \"3.9\", \"3.10\", \"3.11\", \"3.12\", \"3.13\", \"3.14\"]\npython_package_dir = staging_dir / \"pypackage\"\n\nbuild_files = {}\nbuild_files['x64'] = {\n    'Core' : [\"xlOil.xll\", \"xlOil.dll\", \"xlOil.lib\"],\n    'xlOil_Python': [\"xlOil_Python.dll\"] + [f\"xlOil_Python{ver.replace('.','')}.pyd\" for ver in python_versions],\n    'xlOil_SQL': [\"xlOil_SQL.dll\"],\n    'xlOil_Utils': [\"xlOil_Utils.dll\"] \n}\nbuild_files['Win32'] = build_files['x64'].copy()\n\nlib_files = [\n     { \n        'from': '.',\n        'files': ['Version.txt'],\n        'to': '.'\n    },\n    { \n        'from': 'tools',\n        'files': ['xlOil_Install.ps1', 'xlOil_Remove.ps1', 'xlOil_NewAddin.ps1'],\n        'to': architectures\n    },\n    { \n        'from': 'config',\n        'files': ['xlOil.ini'],\n        'to': '.'\n    },\n    {\n        'from': 'libs/xlOil_Python',\n        'files': ['package', soln_dir / \"LICENSE\"],\n        'to': 'pypackage'\n    },\n    {\n        'from': '.',\n        'files': ['README.md'],\n        'to': 'pypackage'\n    },\n    {\n        'from': \"include\",\n        'files': '.',\n        'to': 'include'\n    },\n]\n\n\ndef copy_tree(src, dst):\n    shutil.copytree(str(src), str(dst), dirs_exist_ok=True)\n\ndef copy_file(src, dst):\n    shutil.copy2(str(src), str(dst))\n\ndef latest_file(dir):\n    list_of_files = glob(f'{dir}/*')\n    return max(list_of_files, key=os.path.getctime)\n\ndef check_package_requirements(filepath):\n    with Path(filepath).open() as file:\n        requirements = pkg_resources.parse_requirements(file)\n        for requirement in requirements:\n            requirement = str(requirement)\n            pkg_resources.require(requirement)\n                \n\ncheck_package_requirements(soln_dir / \"docs\" / \"requirements.txt\")\n\nprint(\"Soln dir: \", str(soln_dir))\n\n# Write the version file\nsubprocess.run(f\"powershell ./tools/WriteVersion.ps1\", cwd=soln_dir, check=True)\n\nif not 'no_build' in cmd_args or cmd_args.no_build is False:\n    # Build the library\n    for arch in architectures:\n        subprocess.run(f\"BuildRelease.cmd {arch}\", cwd=tools_dir, check=True)\n\n    # Write the combined include file\n    subprocess.run(f\"powershell ./WriteInclude.ps1 {include_dir / 'xloil'} {staging_dir / 'include' / 'xloil'}\", \n                   cwd=tools_dir, check=True)\n\n# Build the docs\n# TODO: check=True should throw if the process exit code is != 0. Doesn't work.\nsubprocess.run(f\"cmd /C make.cmd doxygen\", cwd=doc_dir, check=True)\nsubprocess.run(f\"cmd /C make.cmd -bin x64\\Release html\", cwd=doc_dir, check=True)\n\n#\n# Start of file copying\n#\n\n# Clean any previous python package\ntry: sh.rmtree(python_package_dir)\nexcept (FileNotFoundError, OSError): pass\n\n\nfor arch in architectures:\n    for files in build_files[arch].values():\n        for file in files:\n            try: os.makedirs(staging_dir / arch)\n            except FileExistsError: pass\n            copy_file(build_dir / arch / \"Release\" / file, staging_dir / arch)\n\n\nfor job in lib_files:\n    source = soln_dir / job['from']\n    print(source)\n    targets = job['to']\n    if not isinstance(job['to'], list):\n        targets = [targets]\n    for target in targets:\n        for f in job['files']:\n            print(\" \", f)\n            target_path = staging_dir / target\n            try: os.makedirs(target_path)\n            except FileExistsError: pass\n            if os.path.isabs(f):\n                copy_file(f, target_path)\n            elif os.path.isdir(source / f):\n                copy_tree(source / f, target_path)\n            else:\n                copy_file(source/ f, target_path)\n\ncopy_tree(build_dir / \"docs\" / \"html\", staging_dir / \"docs\")\n\n#\n# Create distributable archives\n#\nimport tarfile\n\nxloil_version =  (soln_dir / 'Version.txt').read_text().replace('\\n','')\n\nfor arch in architectures:\n    with tarfile.open(staging_dir / f\"xlOil-{xloil_version}-{arch}-bin.tar.bz2\", \"w:bz2\") as tar:\n        tar.add(staging_dir / arch, arcname=arch)\n\nwith tarfile.open(staging_dir / f\"xlOil-{xloil_version}-docs.tar.bz2\", \"w:bz2\") as tar:\n    tar.add(staging_dir / \"docs\", arcname='docs')\n\nwith tarfile.open(staging_dir / f\"xlOil-{xloil_version}-include.tar.bz2\", \"w:bz2\") as tar:\n    tar.add(staging_dir / \"include\", arcname='include')\n\n#\n# Build python wheels\n#\nfor arch in architectures:\n    platform_tags = { 'Win32': 'win32', 'x64': 'win_amd64'}\n    plat_name = platform_tags[arch]\n\n    our_pytag = f'cp{sys.version_info.major}{sys.version_info.minor}'\n\n    pypi_version = xloil_version\n    if 'post_ver' in cmd_args and cmd_args.post_ver is not None:\n        pypi_version += f'.post{cmd_args.post_ver}'\n       \n    for pyver in python_versions:\n        # It's important to run the setup using the targeted python version\n        # If you get errors building win32 on an x64 version of python,\n        # just comment out the assert in get_tag() in bdist_wheel.py.\n        # Guido probably wouldn't approve but it seems to work.\n        cmd = f\"py -{pyver} setup.py bdist_wheel --arch {arch} --pyver {pyver} --version {pypi_version} --plat-name {plat_name}\"\n        print(f\"Running: {cmd}.\")\n        subprocess.run(cmd, cwd=f\"{python_package_dir}\", check=True)\n\n#\n# Next steps\n#\nprint(\n     '\\n'\n     '\\nTo test the python package:'\n    f'\\n  > pip install {str(python_package_dir)}\\\\dist\\\\<wheel file>'\n     '\\n  > xloil install'\n     '\\n' r'  > python ..\\libs\\xlOil_Python\\Package\\test_PythonAutomation.py'\n     '\\n' r'  > python ..\\libs\\xlOil_Python\\Package\\test_SpreadsheetRunner.py'\n    '\\n'\n    '\\nTo upload the python package to PyPI:'\n    f'\\n  > cd {str(python_package_dir)}'\n     '\\n  > twine upload --repository-url https://test.pypi.org/legacy/ dist/*'\n     '\\nor'\n     '\\n  > twine upload --repository xlOil dist/*'\n     '\\nor'\n     '\\n  > twine upload dist/*'\n    )\n"
  },
  {
    "path": "tools/xlOil_Install.ps1",
    "content": "﻿\nfunction Remove-From-Resiliancy {\n    param ([string]$FileName, [string]$OfficeVersion)\n\n    # Source https://stackoverflow.com/questions/751048/how-to-programatically-re-enable-documents-in-the-ms-office-list-of-disabled-fil\n\n    #Converts the File Name string to UTF16 Hex\n    $FileName_UniHex=\"\"\n    [System.Text.Encoding]::ASCII.GetBytes($FileName.ToLower()) | %{$FileName_UniHex+=\"{0:X2}00\" -f $_}\n\n    #Tests to see if the Disabled items registry key exists\n    $RegKey=(gi \"HKCU:\\Software\\Microsoft\\Office\\${OfficeVersion}\\Excel\\Resiliency\\DisabledItems\\\" -ErrorAction SilentlyContinue)\n    if ($RegKey -eq $NULL) {exit}\n\n    #Cycles through all the properties and deletes it if it contains the file name.\n    foreach ($prop in $RegKey.Property) {\n        $Val=\"\"\n        ($RegKey|gp).$prop | %{$Val+=\"{0:X2}\" -f $_}\n        if ($Val.Contains($FileName_UniHex)) {\n            $RegKey|Remove-ItemProperty -name $prop\n        }\n    }\n}\n\nfunction Check-VBA-Access {\n\tparam ([string]$OfficeVersion)\n\n\t$UserKey=(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Office\\${OfficeVersion}\\Excel\\Security\" -ErrorAction SilentlyContinue)\n\t$MachineKey=(Get-ItemProperty -Path \"HKLM:\\Software\\Microsoft\\Office\\${OfficeVersion}\\Excel\\Security\" -ErrorAction SilentlyContinue)\n\n\tif (($MachineKey.AccessVBOM -eq 0) -or ($UserKey.AccessVBOM -eq 0)) \n\t{ \n\t\tWrite-Host (\n\t\t\t\"To ensure xlOil local functions work, allow access to the VBA Object Model in`n\" +\n\t\t\t\"Excel > File > Options > Trust Center > Trust Center Settings > Macro Settings`n\")\n\t}\n}\n\n#####################################################################################################\n#\n# Script Start\n#\n\n$ADDIN_NAME   = \"xlOil.xll\"\n$INIFILE_NAME = \"xlOil.ini\"\n\n$XloilAppData = Join-Path $env:APPDATA \"xlOil\"\n$AddinPath = Join-Path $PSScriptRoot $ADDIN_NAME\n\n#\n# Start Excel to get some environment settings (could probably get\n# them from the registry more quickly...)\n#\n$Excel = New-Object -Com Excel.Application\n$ExcelVersion = $Excel.Version\n$XlStartPath = $Excel.StartupPath\n$Excel.Quit()\n$Excel = $null\n\n# Just in case we got put in Excel's naughty corner for misbehaving addins\nRemove-From-Resiliancy $ADDIN_NAME $ExcelVersion\n\n# Check access to the VBA Object model (for local functions)\nCheck-VBA-Access $ExcelVersion\n\n# Ensure XLSTART dir really exists\nmkdir -Force $XlStartPath | Out-Null\n\n# Copy the XLL\n\nCopy-Item -path (Join-Path $PSScriptRoot $ADDIN_NAME) -Destination $XlStartPath\n\n# Copy the ini file to APPDATA, avoiding overwritting any existing ini\nmd $XloilAppData -ErrorAction Ignore\n$IniFile = (Join-Path $XloilAppData $INIFILE_NAME)\nif (!(Test-Path -Path $IniFile -PathType leaf)) {\n\t\n\tCopy-Item -path (Join-Path $PSScriptRoot $INIFILE_NAME) -Destination $IniFile\n\n} else {\n\n\tWrite-Host (\"Found existing settings file at `n\", $IniFile)\n\n}\n#\n# Set the PATH environment in the ini so we can find xlOil.dll\n#\n(Get-Content -Encoding UTF8 -Path $IniFile) `\n\t-replace \"^(\\s*XLOIL_PATH\\s*=).*\", \"`$1'''$PSScriptRoot'''\" |\n\tOut-File -Encoding UTF8 $IniFile \n\nWrite-Host \"Edited settings file \", $IniFile \n\nWrite-Host \"$ADDIN_NAME installed from $PSScriptRoot to $XlStartPath `n\"\n"
  },
  {
    "path": "tools/xlOil_NewAddin.ps1",
    "content": "\n$TargetPath=$args[0]\n\nif ($TargetPath -eq \"\") {\n    Write-Host \"Syntax: \", $PSCommandPath, \" <AddinName>.xll\"\n}\n\n$TargetIni = [io.path]::ChangeExtension($TargetPath, \"ini\")\n\nCopy-Item -Path (Join-Path $PSScriptRoot \"xlOil.xll\") -Destination $TargetPath \nCopy-Item -Path (Join-Path $PSScriptRoot \"xlOil.ini\") -Destination $TargetIni\n\nWrite-Host \"New addin created at: \", $TargetPath"
  },
  {
    "path": "tools/xlOil_RegistryClean.ps1",
    "content": "<#\n.SYNOPSIS\nRemoves all xlOil registry entries\n\n.DESCRIPTION\nxlOil should remove its registry entries on exit, however if Excel does not exit cleanly or other issues\ndisrupt the removal, some keys may remain. This script will not remove entries for any custom COM addins.\n#>\n\n$XloilClassIDs = (Get-ChildItem \"Registry::HKEY_CLASSES_ROOT\\CLSID\\*\\InprocServer32\") `\n    | Where-Object {$_.GetValue(\"\") -like \"*xlOil.dll\"} `\n    | ForEach-Object {$_.\"PSParentPath\"}\n$XloilClasses = (Get-ChildItem \"Registry::HKEY_CLASSES_ROOT\") `\n    | Where-Object {$_.Name -like \"*xlOil*\"} `\n    | ForEach-Object {$_.\"PSPath\"}\n$XloilAddins = (Get-ChildItem HKCU:\\Software\\Microsoft\\Office\\Excel\\AddIns) `\n    | Where-Object {$_.Name -like \"*xloil*\"} `\n    | ForEach-Object {$_.\"PSPath\"}\n$XloilAddinData = (Get-ChildItem HKCU:\\Software\\Microsoft\\Office\\Excel\\AddinsData) `\n    | Where-Object {$_.Name -like \"*xlOil*\"} `\n    | ForEach-Object {$_.\"PSPath\"}\n\n$xloilKeys = $XloilClassIDs + $XloilClasses + $XloilAddins + $XloilAddinData\n\n\nWrite-Host \"=== Found the following xloil keys:\"\n$xloilKeys -join \"`r`n\" | Out-String\n\n$confirmation = Read-Host \"=== Press Y to delete\"\nif ($confirmation -eq 'y') {\n    $xloilKeys | ForEach-Object {Remove-Item $_ -Recurse}\n}\n"
  },
  {
    "path": "tools/xlOil_Remove.ps1",
    "content": "﻿\nfunction Remove-Addin {\n    param ([string]$AddinPath, $Version)\n    $RegKey=(gi \"HKCU:\\Software\\Microsoft\\Office\\${Version}\\Excel\\Add-in Manager\" -ErrorAction SilentlyContinue)\n\n    if ($RegKey -eq $NULL) {exit}\n\n    # Cycles through all the properties and deletes it if it contains the file name.\n    foreach ($prop in $RegKey.Property) {\n        if ($prop.Contains($AddinPath)) {\n            $RegKey|Remove-ItemProperty -name $prop\n        }\n    }\n}\n\n#####################################################################################################\n#\n# Script Start\n#\n\n$ADDIN_NAME   = \"xlOil.xll\"\n$INIFILE_NAME = \"xlOil.ini\"\n\n$XloilAppData = Join-Path $env:APPDATA \"xlOil\"\n\n#\n# Start Excel to get some environment settings (could probably get\n# them from the registry more quickly...)\n#\n$Excel = New-Object -Com Excel.Application\n$ExcelVersion = $Excel.Version\n$XlStartPath = $Excel.StartupPath\n$Excel.Quit()\n$Excel = $null\n\n$AddinPath = Join-Path $XlStartPath $ADDIN_NAME\n\n# Ensure no xlOil addins are in the registry\nRemove-Addin $AddinPath $ExcelVersion\n\nRemove-Item –path $AddinPath \nWrite-Host (Join-Path $AddinPath $ADDIN_NAME), \"removed\"\nWrite-Host \"Left settings files in \", $XloilAppData \n"
  },
  {
    "path": "xlOil.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32819.101\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil\", \"src\\xlOil\\xlOil.vcxproj\", \"{DF88A189-295A-4AC8-BEFC-D199155EC8CB}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD} = {164AF267-092E-441D-8BF0-2ACF18E9ADFD}\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70} = {2C85C326-07EA-4D9C-91C2-F79BAEC64F70}\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6} = {94CB9502-B5A4-473D-8A2E-4A67950049B6}\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A} = {A310C8C5-CE14-4DD3-8A0D-61491741558A}\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8} = {C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2} = {F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF} = {FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"[Scripts]\", \"[Scripts]\", \"{67EB80BB-D718-428C-80BD-E409C27FAD25}\"\n\tProjectSection(SolutionItems) = preProject\n\t\ttools\\xlOil_Install.ps1 = tools\\xlOil_Install.ps1\n\t\ttools\\xlOil_NewAddin.ps1 = tools\\xlOil_NewAddin.ps1\n\t\ttools\\xlOil_RegistryClean.ps1 = tools\\xlOil_RegistryClean.ps1\n\t\ttools\\xlOil_Remove.ps1 = tools\\xlOil_Remove.ps1\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"External\", \"External\", \"{79C6BF29-1665-4E79-9D16-DA9B6E30F06F}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"UnitTests\", \"tests\\Tests.vcxproj\", \"{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOilHelpers\", \"src\\xlOilHelpers\\xlOilHelpers.vcxproj\", \"{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"libs\", \"libs\", \"{70522729-EFAA-4F6D-8C6D-752676BF6752}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python37\", \"libs\\xlOil_Python\\xlOil_Python37.vcxproj\", \"{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_SQL\", \"libs\\xlOil_SQL\\xlOil_SQL.vcxproj\", \"{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Utils\", \"libs\\xlOil_Utils\\xlOil_Utils.vcxproj\", \"{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"TestAddin\", \"tests\\TestAddin\\TestAddin.vcxproj\", \"{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2} = {F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python38\", \"libs\\xlOil_Python\\xlOil_Python38.vcxproj\", \"{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil-XLL\", \"src\\xlOil-XLL\\xlOil-XLL.vcxproj\", \"{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8} = {C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil-Funcs\", \"src\\xlOil-Funcs\\xlOil-Funcs.vcxproj\", \"{A310C8C5-CE14-4DD3-8A0D-61491741558A}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil-COM\", \"src\\xlOil-COM\\xlOil-COM.vcxproj\", \"{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8} = {C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil-Loader\", \"src\\xlOil-Loader\\xlOil-Loader.vcxproj\", \"{F7E97195-7624-4E54-AA15-A1F85C96C609}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil-Dynamic\", \"src\\xlOil-Dynamic\\xlOil-Dynamic.vcxproj\", \"{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python39\", \"libs\\xlOil_Python\\xlOil_Python39.vcxproj\", \"{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python310\", \"libs\\xlOil_Python\\xlOil_Python310.vcxproj\", \"{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB} = {DF88A189-295A-4AC8-BEFC-D199155EC8CB}\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python\", \"libs\\xlOil_Python\\Loader\\xlOil_Python.vcxproj\", \"{CE2AD1AD-E034-4C06-943F-8251C05AD37A}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB} = {1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70} = {2C85C326-07EA-4D9C-91C2-F79BAEC64F70}\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2} = {F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF} = {FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}\n\tEndProjectSection\nEndProject\nProject(\"{888888A0-9F3D-457C-B088-3A5042F75D52}\") = \"xlOil_Python_Package\", \"libs\\xlOil_Python\\package\\xlOil_Python_Package.pyproj\", \"{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"asmjit\", \"src\\external\\asmjit.vcxproj\", \"{164AF267-092E-441D-8BF0-2ACF18E9ADFD}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"rdcfswatcher\", \"src\\external\\rdcfswatcher.vcxproj\", \"{94CB9502-B5A4-473D-8A2E-4A67950049B6}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"spdlog\", \"src\\external\\spdlog.vcxproj\", \"{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python311\", \"libs\\xlOil_Python\\xlOil_Python311.vcxproj\", \"{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2} = {F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609} = {F7E97195-7624-4E54-AA15-A1F85C96C609}\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Docs\", \"Docs\", \"{4070F602-F283-47B1-802F-773D01991AE5}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tdocs\\source\\conf.py = docs\\source\\conf.py\n\t\tdocs\\make.cmd = docs\\make.cmd\n\t\tREADME.md = README.md\n\t\tdocs\\source\\xloil.doxyfile = docs\\source\\xloil.doxyfile\n\tEndProjectSection\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Build\", \"Build\", \"{B853DF1D-B9D1-43BC-A655-41224C5EAFCF}\"\n\tProjectSection(SolutionItems) = preProject\n\t\ttools\\BuildRelease.cmd = tools\\BuildRelease.cmd\n\t\ttools\\DownloadDependencies.cmd = tools\\DownloadDependencies.cmd\n\t\tlibs\\xlOil_Python\\Package\\setup.py = libs\\xlOil_Python\\Package\\setup.py\n\t\ttools\\stage.py = tools\\stage.py\n\t\ttools\\WriteInclude.ps1 = tools\\WriteInclude.ps1\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python312\", \"libs\\xlOil_Python\\xlOil_Python312.vcxproj\", \"{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python313\", \"libs\\xlOil_Python\\xlOil_Python313.vcxproj\", \"{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Config\", \"Config\", \"{CCCC356E-3DE3-47DD-97A5-195C67CB79F6}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tconfig\\xloil.ini = config\\xloil.ini\n\t\tconfig\\xloil_local.ini = config\\xloil_local.ini\n\t\tconfig\\xloil_local_32.ini = config\\xloil_local_32.ini\n\tEndProjectSection\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"xlOil_Python314\", \"libs\\xlOil_Python\\xlOil_Python314.vcxproj\", \"{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tDebugStatic|Any CPU = DebugStatic|Any CPU\n\t\tDebugStatic|Win32 = DebugStatic|Win32\n\t\tDebugStatic|x64 = DebugStatic|x64\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\t\tReleaseStatic|Any CPU = ReleaseStatic|Any CPU\n\t\tReleaseStatic|Win32 = ReleaseStatic|Win32\n\t\tReleaseStatic|x64 = ReleaseStatic|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Debug|x64.Build.0 = Debug|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Release|Win32.Build.0 = Release|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Release|x64.ActiveCfg = Release|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.Release|x64.Build.0 = Release|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{DF88A189-295A-4AC8-BEFC-D199155EC8CB}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Debug|x64.Build.0 = Debug|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Release|Win32.Build.0 = Release|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Release|x64.ActiveCfg = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.Release|x64.Build.0 = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{81DC823F-ADFC-4639-B960-E25A6FD6B7B9}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Debug|x64.Build.0 = Debug|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.DebugStatic|Win32.Build.0 = Debug|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.DebugStatic|x64.Build.0 = Debug|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Release|Win32.Build.0 = Release|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Release|x64.ActiveCfg = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.Release|x64.Build.0 = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.ReleaseStatic|Win32.Build.0 = Release|Win32\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{F7AA4C6F-C223-4ED1-BBB3-836E7EC044F2}.ReleaseStatic|x64.Build.0 = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Release|Win32.Build.0 = Release|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Release|x64.ActiveCfg = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.Release|x64.Build.0 = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Debug|x64.Build.0 = Debug|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Release|Win32.Build.0 = Release|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Release|x64.ActiveCfg = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.Release|x64.Build.0 = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Debug|x64.Build.0 = Debug|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Release|Win32.Build.0 = Release|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Release|x64.ActiveCfg = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.Release|x64.Build.0 = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Debug|x64.Build.0 = Debug|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.DebugStatic|Win32.Build.0 = Debug|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.DebugStatic|x64.Build.0 = Debug|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.Release|x64.ActiveCfg = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.ReleaseStatic|Win32.Build.0 = Release|Win32\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{83F9EA0F-5B8C-40C2-BC5F-4D15060C9A72}.ReleaseStatic|x64.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Release|Win32.Build.0 = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Release|x64.ActiveCfg = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.Release|x64.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Debug|x64.Build.0 = Debug|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.DebugStatic|Any CPU.ActiveCfg = DebugStatic|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.DebugStatic|Win32.ActiveCfg = DebugStatic|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.DebugStatic|Win32.Build.0 = DebugStatic|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.DebugStatic|x64.ActiveCfg = DebugStatic|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.DebugStatic|x64.Build.0 = DebugStatic|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Release|Win32.Build.0 = Release|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Release|x64.ActiveCfg = Release|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.Release|x64.Build.0 = Release|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.ReleaseStatic|Any CPU.ActiveCfg = ReleaseStatic|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.ReleaseStatic|Win32.ActiveCfg = ReleaseStatic|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.ReleaseStatic|Win32.Build.0 = ReleaseStatic|Win32\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64\n\t\t{FD89F79E-FAD6-4BDF-B8B3-2028E8482ABF}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Debug|x64.Build.0 = Debug|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.DebugStatic|Any CPU.ActiveCfg = DebugStatic|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.DebugStatic|Win32.ActiveCfg = DebugStatic|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.DebugStatic|Win32.Build.0 = DebugStatic|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.DebugStatic|x64.ActiveCfg = DebugStatic|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.DebugStatic|x64.Build.0 = DebugStatic|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Release|Win32.Build.0 = Release|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Release|x64.ActiveCfg = Release|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.Release|x64.Build.0 = Release|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.ReleaseStatic|Any CPU.ActiveCfg = ReleaseStatic|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.ReleaseStatic|Win32.ActiveCfg = ReleaseStatic|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.ReleaseStatic|Win32.Build.0 = ReleaseStatic|Win32\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64\n\t\t{A310C8C5-CE14-4DD3-8A0D-61491741558A}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Debug|x64.Build.0 = Debug|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.DebugStatic|Any CPU.ActiveCfg = DebugStatic|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.DebugStatic|Win32.ActiveCfg = DebugStatic|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.DebugStatic|Win32.Build.0 = DebugStatic|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.DebugStatic|x64.ActiveCfg = DebugStatic|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.DebugStatic|x64.Build.0 = DebugStatic|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Release|Win32.Build.0 = Release|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Release|x64.ActiveCfg = Release|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.Release|x64.Build.0 = Release|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.ReleaseStatic|Any CPU.ActiveCfg = ReleaseStatic|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.ReleaseStatic|Win32.ActiveCfg = ReleaseStatic|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.ReleaseStatic|Win32.Build.0 = ReleaseStatic|Win32\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64\n\t\t{2C85C326-07EA-4D9C-91C2-F79BAEC64F70}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Debug|x64.Build.0 = Debug|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Release|Win32.Build.0 = Release|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Release|x64.ActiveCfg = Release|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.Release|x64.Build.0 = Release|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{F7E97195-7624-4E54-AA15-A1F85C96C609}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Debug|x64.Build.0 = Debug|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.DebugStatic|Any CPU.ActiveCfg = DebugStatic|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.DebugStatic|Win32.ActiveCfg = DebugStatic|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.DebugStatic|Win32.Build.0 = DebugStatic|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.DebugStatic|x64.ActiveCfg = DebugStatic|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.DebugStatic|x64.Build.0 = DebugStatic|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Release|Win32.Build.0 = Release|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Release|x64.ActiveCfg = Release|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.Release|x64.Build.0 = Release|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.ReleaseStatic|Any CPU.ActiveCfg = ReleaseStatic|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.ReleaseStatic|Win32.ActiveCfg = ReleaseStatic|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.ReleaseStatic|Win32.Build.0 = ReleaseStatic|Win32\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.ReleaseStatic|x64.ActiveCfg = ReleaseStatic|x64\n\t\t{1102F4DA-8B5A-4B01-A8BA-432A4C14A1AB}.ReleaseStatic|x64.Build.0 = ReleaseStatic|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Release|Win32.Build.0 = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Release|x64.ActiveCfg = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.Release|x64.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.DebugStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.DebugStatic|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Release|Win32.Build.0 = Release|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Release|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.Release|x64.Build.0 = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Debug|x64.Build.0 = Debug|x64\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.DebugStatic|Any CPU.ActiveCfg = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.DebugStatic|Any CPU.Build.0 = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Release|Win32.Build.0 = Release|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Release|x64.ActiveCfg = Release|x64\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.Release|x64.Build.0 = Release|x64\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.ReleaseStatic|Any CPU.ActiveCfg = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.ReleaseStatic|Any CPU.Build.0 = Debug|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.DebugStatic|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.DebugStatic|Win32.ActiveCfg = Debug|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.DebugStatic|x64.ActiveCfg = Debug|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.ReleaseStatic|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.ReleaseStatic|Win32.ActiveCfg = Release|Any CPU\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046}.ReleaseStatic|x64.ActiveCfg = Release|Any CPU\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Debug|x64.Build.0 = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.DebugStatic|Win32.Build.0 = Debug|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.DebugStatic|x64.Build.0 = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Release|Win32.Build.0 = Release|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Release|x64.ActiveCfg = Release|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.Release|x64.Build.0 = Release|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.ReleaseStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.ReleaseStatic|Any CPU.Build.0 = Debug|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.ReleaseStatic|Win32.Build.0 = Release|Win32\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD}.ReleaseStatic|x64.Build.0 = Release|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Debug|x64.Build.0 = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.DebugStatic|Win32.Build.0 = Debug|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.DebugStatic|x64.Build.0 = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Release|Win32.Build.0 = Release|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Release|x64.ActiveCfg = Release|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.Release|x64.Build.0 = Release|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.ReleaseStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.ReleaseStatic|Any CPU.Build.0 = Debug|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.ReleaseStatic|Win32.Build.0 = Release|Win32\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6}.ReleaseStatic|x64.Build.0 = Release|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Debug|x64.Build.0 = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.DebugStatic|Win32.Build.0 = Debug|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.DebugStatic|x64.Build.0 = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Release|Win32.Build.0 = Release|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Release|x64.ActiveCfg = Release|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.Release|x64.Build.0 = Release|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.ReleaseStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.ReleaseStatic|Any CPU.Build.0 = Debug|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.ReleaseStatic|Win32.Build.0 = Release|Win32\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8}.ReleaseStatic|x64.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Debug|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Debug|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Debug|x64.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Release|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Release|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Release|Win32.Build.0 = Release|Win32\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Release|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.Release|x64.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Debug|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Debug|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Release|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Release|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Release|Win32.Build.0 = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Release|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.Release|x64.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Debug|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Debug|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Debug|x64.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Release|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Release|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Release|Win32.Build.0 = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Release|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.Release|x64.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Debug|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Debug|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.DebugStatic|Any CPU.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.DebugStatic|Any CPU.Build.0 = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.DebugStatic|Win32.ActiveCfg = Debug|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.DebugStatic|x64.ActiveCfg = Debug|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Release|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Release|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Release|Win32.Build.0 = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Release|x64.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.Release|x64.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.ReleaseStatic|Any CPU.ActiveCfg = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.ReleaseStatic|Any CPU.Build.0 = Release|x64\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.ReleaseStatic|Win32.ActiveCfg = Release|Win32\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F}.ReleaseStatic|x64.ActiveCfg = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{C825E9C6-17F8-4D47-954C-D4FC3BE35AE9} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{C1EDF1FF-7061-4A34-82A2-FF77ACB9C8F4} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{3A73598C-38CA-4ADB-B0BB-F634A1A97C56} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B9E7C07AC} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{A329C5CF-49AA-40AF-A8AF-EB7B4E7C07AC} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{0D856EA8-A96D-45AC-94AF-68AECF68ED6F} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{CE2AD1AD-E034-4C06-943F-8251C05AD37A} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{9BAD0DFB-5B9D-4CF0-8BD8-E812BB7C5046} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{164AF267-092E-441D-8BF0-2ACF18E9ADFD} = {79C6BF29-1665-4E79-9D16-DA9B6E30F06F}\n\t\t{94CB9502-B5A4-473D-8A2E-4A67950049B6} = {79C6BF29-1665-4E79-9D16-DA9B6E30F06F}\n\t\t{C4DA7637-9D07-4D52-8DB2-82B73D95E1B8} = {79C6BF29-1665-4E79-9D16-DA9B6E30F06F}\n\t\t{0D856EA8-A97D-45AC-94AF-68AECF67ED6F} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{4070F602-F283-47B1-802F-773D01991AE5} = {67EB80BB-D718-428C-80BD-E409C27FAD25}\n\t\t{B853DF1D-B9D1-43BC-A655-41224C5EAFCF} = {67EB80BB-D718-428C-80BD-E409C27FAD25}\n\t\t{0D856EA8-A97D-45AC-84AF-68AECF67ED6F} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{0D856EA8-A97D-45AC-84AF-68A1CF67ED6F} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\t\t{0D856EA8-A97D-45AC-84AF-A8A1CF67E36F} = {70522729-EFAA-4F6D-8C6D-752676BF6752}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {4C948047-E838-4EA3-AD64-392D149AD565}\n\tEndGlobalSection\nEndGlobal\n"
  }
]