--::::::::::::::::::::::::::::::::::-~-::::::::;;;;;;;;;;;;;;;;;!!!!!!!!!!!!!!!!
---::::::::::::::::::::::::::::::::-~^~---:::::;;;;;;;;;;;;;;;;;;!!!!!!!!!!!!!!!
---:::::::::::::::::::::::::::::::-~^^~----::::::;;;;;;;;;;;;;;;;;!!!!!!!!!!!!!!
----:::::::::::::::::::::::::::::-~~~^-:----::::::;;;;;;;;;;;;;;;;;;;;;!!!!!!!!!
----::--::::::::::::::::::::::::::!)!!>*)>+*-::::::::;;;;;;;;;;;;;;;;;;!!;;;!!!!
^~--:----::::-::::::::::::::::::>&$$$$$>)++)!+>!;::::::::;;;;;;;;;;;;;;;;;;;;;!!
~~~-------:-----:::::--:::::::*%$$$$$###$?+**?##&):::::::;;;;;;;;;;;;;;;;;;;;;;;
~~~--------------:-----:::::-!$$$#########$?)>?###>::::::;;;;;;;;;;;;;;;;;;;;;;;
---~-------------:-----::::-->############$$$?)$@##+:::;;;;;;;;;;;;;;;;;!;;;;;;;
--------------------------::-?###$&&$$$$$$$###%=###%::;;;;;;;;;;;;;;;;;;;;;;;;;;
-------:------::----------::->#$=+>?%$$$$$$$###%####;:;;;;;;;;;;;;;;;;;;;;;;;;;;
-------------::::-------:-:--*#+!;!)?&$$$#######$###*::;;;;;;;;;;;;;;;;;;;;;!!;;
:------------::::-------::---)%!::;*>=&$#######@###@+::;;;;;;;;;;;;;;;;;;;;!!!!;
--------------::-------------:+;:::!+?=%$#@@###@###@):::;;;;;;;;;;;;;;;;;;!!!!!!
--~------------:::-----------:*!;!)>=%&&&$$####@##@#;::::;;;;;;;;;;;;;;;;!!!!!!!
-~-------------::::::--------;=?)>%&%=%&&&&$#@####@%::::::::::;;;;;;;;;;;;!!!!!!
~-----:-::-------::::--------!%?++%$&%$&%%&$###&&$#*:::::::::;;;;;;;;;;;;;;;!!!!
-::----------:-----:::-------:++!!))>>???%&$##$$=&>-:::::::::;;;;;;;;;;;;;;;;;;!
-::::--------~-----:::--------;*!)*;::!+=%&$#$$$?%:-::::::::::;;;;;;;;;;;;;;;;!!
::::::------,^-^~--::---------;;*>+::;)?%&$$$$=%&*--::::::::::;;;;;;;;;;;;;;;;!!
::::::::::::,,.-****):--------;+???;!)?%&&$$$&!+=--:::::::::::;;;;;;;;;;;;;;;;!!
::;;+>>????>:'-&$&&&$*--------;))>+)+?=%&$$$#$+$)-::::::::::::;;;;;;;;;;;!!!!;;;
::++=&%%=??).,***!)+):--------*===%?==%&&$$$$&!>::::::::::::;;;;;;;;;;;;;!!!;;;;
:::;;::::::~.^..^~--::--------:))>==%&&&$$$$#=!!::::::::::::;;;;;;;;;;;;;!;;;;;;
::::::::::--.'''^-;;;:-::------)?%%%&&$$$####$*:::::::::::::;;;;;;;;;;;;!!!;;;;;
::::::::::--'`'^!)+>!:::::::::-:!*>%&$$######&!:::::::::::::;;;;;;;;;;;;!!!!;;;;
::::::::::::''.:*>>+)::::::::::-)?=%=&$####$#$>;:::::::::::::;;;;;;;;;;;!!!!;;;;
:::::::::::-,.,-!))*!!::::::::-:::::;?%&$$$$$$$+::::::::::;;;;;;;;;;;;;!!!!!;;;;
::::::::::::-~~~-:;!;!:::::::::::---!>?%&&&$$$$&:::::::::;;;;;;;;;;;;;;!!!!!!;!!
::::::::::::::~~~-:!!*!::::::::----;+>>==%&&$$$$>::::::::;;;;;;;;;;;;;;!!!!!!!!!
:::::::::::::::-^~-;!*):::::::-::!+>++>?==%&$$$$$?!::::::::;;;;;;;;;;;!!!!!!!!!!
::::::::::::::::-^^~~;*::::::;*)+>>+))>?===&&&&&&&&=+!;;;;::::;;;;;;;;!!!!!!!!!!
:::::::::::::::::~..^;+>??????>>>>>>>>?==?+%%&&&&%%%%%==??>+*;:;;;;;;!!!!!!!!!!!
:::::::::::::::::-.,^;+====%%>***)++++>=%?>>=%%%%%%%%=??===%%%+;;;;;;!!!!!!!!!!!
:::::::::::::::::-..,;+???=%&%+**!!***)>??>>?=?==%&&%>+>>>>?=&&>;;;;;!!!!!!!;!!!
:::::::::::::::::-.'.:+??==%%=?>>++))))+>>>>??===%&%=>+++++>?%&&;;;;;!!!!!!!!!!!
:::::::::::::::::-.'.-+?==%%==??????>>>>>>>>????==%%=?>>+))+?=&$);;;!!!!!!!!!!!!
:::::::::::::::::-''.-+?=%%%==?????????>>>>>>>???===%==?>+)+>=&$>;;;!!!!!!!!!!!!
:::::::::::::::::~''.-+=%&%====????==???>>>>>>>???==%%%%=>++>=%$?;;;!!!!!!!!!!!!
::::::::::::::-^,.''.-+=&#&====????====??++++>>>??==%&&&&=+)+?%$=;;;!!!!!!!!!!!!
::::::::::::-,'.,.''.-)>?%*;;;)>???=====?+)))+>>??=%&$$$#%>)+?%$%;;;!!!!!!!!!!!!
;;;;;::;:::~.'.,,'''.:)>?=+:;^^,-)?===%%=+**))+>??>+>>?=&&>++?%&%;;;!!;!!!!!!!!!
;;;;;;:;:-,''..,,'''.-)>?==!:^^..,->=%%%%+***)++!--:))>>?&=++?%&&;;!!!!!!!!!!!!!
;;;;;;;:,.''.....'''.:)>?=%*-^,.,,.^*%&&&>****!~~::-!*>>?&?-~~:*>!!!!!!!!!!!!!!!
;;;;;;;^..''.....''',:)>?=&):~,^~~.,,;%$&?)*!-~~-:;*;*>>?%:...,-:!***!!!!!!!!!!!
;;;;;;;-,''....''''',:)?==&?*:^-~-,^,,-=$%>!~~--~~!***>>=%;,..,~~:!)+++)!!!!!!!*
;;;;;;;;^'''...''''.,:)=###?;::---~;^^^~+?!~---~;!!)+)+>&?-..,^~-:!)+>?=?*!!!!!*
;;;;;;;;~.''..'''''.,:)?$##%!-::----~~~^~~~~~~~~;**)++>>&+-,,^~-:!*)+>?=%=)!!!!*
;;;;;;;;-.''..~~'''.^:)>$$#&+!!;;~~;;;-~~~~--;!!--*)+)+?$)-^.,~:;!*+>>?=%%=*!!!!
;;;;;;;;-..^;+%;''..^:*+$$#$?)!;;:;*::*::::;;*!;*;*)+++%%):^..,~:!)+>??=%%=*!!**
;;;;;;;;:~)==?+,''.,^:*+$$$$%+**!;!*!!!!!;;:!**!)))+++>$?!^..'..^:*+>?==%%>!!!**
;;;;;;;;;)>*);;.'..,~;*)&$=$&>)+)*!;:;;;*;:!))))))++++=&)~...''..~;)>?=%%%)!!***
;;;;;;;;!))^-~!....,~;*)%$>&&%?+)**:::-:*!;!))))))+++?&?:,.......,:*+?=%%?*!****
;;;;;;;;;);~-!+,..,^-;*)+?+=&%>+)**-:;:!!!!!*)))*+++>%%>)))**;:;!)+++>=%%+!*****
;;;;;;;;;;;;!*!,..,^-;*)++*>%%?>)*;-*--:;;;*!!*+)+>+=&&###&==%&$####$%==%>!*****
;;;;;;;;;;;;;;;,,.,^-!*)+)!+%=?+!;;;::::::!!!!*)*++>%%*>=&=>>>?%&$#$&$&==?******
;;;;;;;;;;;;;;;^,.,^:!*!)*!)==?)*;;;:----:::;;!)+++?%>!!!!!~-*?=&$#$&&%?=?******
;!;;;;;;;;;;;;:~.,,~:!*!)+!*==?>)!;;-~~--:::**!)+>>=%*!!;-...,-?&$&+)+>=?+******
!!!!!!!;;;;;;^.'.,^~:!!*>>)!=??>+*;;:-:--;:!;!*)+>?%+;-^.....,^->$=*************
!!!!!!!;!;;;;;;;::~~:!*)+++*===++*;-~~---;;;!!*)>>)!,......,^^^~!>>********)**))
!!!!!!!!!!!!;;;;;;;;;:--!*))?=?>)*:-~~-~:;:::;:~,........,,,,----))********)))))
;!!!!!!!!!!!!!!;;;;;;;^.^:!*)+>>+*:~^^~~^^^^...........,,,,,^,-:;*********))))))
!!!!!!!!!!!!!!!!;;;;;::.',-;:;;-:~,...'....',.......,,,,^^^~~~-;*)******))))))))
!!!!!!!!!!!!!!;;:-~^^~-:.',--~~^^,,.,............,,,^^~~--::;;!!*)*****)))))))))
!!!!!!!!!!!!;;;~^,^~-:;!;.',^^^^^.,.........,,,,^^~~-:;!**************))))))))))
!!!!!!!!!!!;!:~^,,^:;!***;,'.,,,^.,.....,,,^^~~-::;!!)>=%%=>)****)))))))))))))))