-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------==+++++***********************+++*++++++==--------------------------------------------------------
-----------------------------------------------------------------=*#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#*+----------------------------------------------------
--------------------------------------------------------------=#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+-------------------------------------------------
------------------------------------------------------------+#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+-----------------------------------------------
-----------------------------------------------------------*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*----------------------------------------------
----------------------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#---------------------------------------------
---------------------------------------------------------+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+--------------------------------------------
---------------------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#--------------------------------------------
---------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------......:::::::::::::::::::::::::::::::::::::::::::::::::::::#%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------                                                           #%%%%%%%%%%%%--------------------------------------------
--------------------------------------------------------------------------------------------------------------#%%%%%%%%%%%%--------------------------------------------
---------------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#%%%%%%%%%%%%--------------------------------------------
------------------------------:.                   ..                                                         *%%%%%%%%%%%%--------------------------------------------
------------------------------:                                                                               *%%%%%%%%%%%%--------------------------------------------
-------------------------------===============================================================================#%%%%%%%%%%%%--------------------------------------------
------------------------------=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#%%%%%%%%%%%%--------------------------------------------
------------------------------:                                                                               *%%%%%%%%%%%%--------------------------------------------
------------------------------:                                                                               *%%%%%%%%%%%%--------------------------------------------
------------------------------::::::::::::::::::::::-=+***####################################################%%%%%%%%%%%%%--------------------------------------------
-------------------------------------------------+*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
-----------------------------------------------*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
---------------------------------------------+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
--------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
-------------------------------------------#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%--------------------------------------------
-----------------------------------=+++++++++++++++++++++++++++#%%%%%%%%%%##################+++++######################%%%%:::::::::::::-------------------------------
-----------------------------------*%%%%%%*....................+%%%%%%%%%%+****************+.::::**********************#%%%:............-------------------------------
-----------------------------------*%%%%%%*....................*%%%%%%%%%%+****************+:::::**********************#%%%.............-------------------------------
-----------------------------------*%%%%%%*....................*%%%%%%%%%%+****************+.::::**********************#%%%.............-------------------------------
-----------------------------------*%%%%%%*.....-==============*%%%%%%%%%%+**-----=########*-----*******-------*#######%%%%========.....-------------------------------
-----------------------------------*%%%%%%*.....*%%%%%%%%%%%%%%%%%%%%%%%%%***      -%%%%%%%%+**********+       .#%%%%%%%%%%%%%%%%%%.....-------------------------------
-----------------------------------*%%%%%%*:::::*%%%%%%%%%%%%%%%%%%%%%%%%%***       :#%%%%%%+**********+        .*%%%%%%%%%%%%%%%%%:::::-------------------------------
-----------------------------------*%%%%%%#-----#%%%%%%%%%%%%%%%%%%%%%%%%%***        .*%%%%%+**********+          =%%%%%%%%%%%%%%%%------------------------------------
-----------------------------------*%%%%%%#-----*%%%%%%%%%%%%%%%%%%%%%%%%%***          ----=+**********+           :---#%%%%%%%%%%%------------------------------------
-----------------------------------*%%%%%%#--------------------*%%%%%%%%%%***               ***********+               *%%%--------------------------------------------
-----------------------------------*%%%%%%#--------------------*%%%%%%%%%%***               ***********+               *%%%--------------------------------------------
-----------------------------------*%%%%%%%#####################*************+++++++++++++++************++++++*########%#+=--------------------------------------------
-----------------------------------*%%%%%%%%%%%%%%%%%%%%%%%%%%%#**********************************************#%%%%%%%%%#----------------------------------------------
---------------------------------------------------------%%%%%%#********************-........................:*%%#-----------------------------------------------------
---------------------------------------------------------%%%%%%#********************-........................:#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%#********************:....:=====...-=====:..:::#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%*---------=*****-----:...:-*****.::-+****:..:::#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%*.........-*****:........:-*****.::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------%%%%%%*.........-*****:........:-*****.::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------#%%%%%*::-----::=+++++:........:-*****.::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.............:-*****:::-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:..............-****+...-+****:.::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......------..::::::...::::::..::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.....:+****+....................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......=*****:...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......:*****-...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:......:+****=...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:::.....=****+...................:::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:::.....-*****:....................:#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.......:*****=.....................#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:........-****+=:...................#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:.........-*****++==================#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:..........:+***********************#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:............:-=+*******************#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%:................:::::::::::::::::::#%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%************************************%%%*-----------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+-------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#+---------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%##############################**+=-----------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+++*************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+**************++----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%****************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+*****+++*******+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------
---------------------------------------------------------------=%%%%%%%%%%+***************+----------------------------------------------------------------------------