##   ## ########     ####   #### ## #  ##     #     ####    # ##  ## ##    
##   ## ###### #   ###### ###### ## #  ##    ##    ######  ## ### ## ##    
##   ## ### #  #     ####   ####  # #  ##     ##   ##  ## ###  #  ## ##    
## #### ### #  # ###### ######    #    ##     ##    ##    ##      ## ##    
## #### ### #  #   ####   ####         ##   ## ##     ##  ##      ## ##    
##   ## ### #  # ###### ######       ####   ## ##  ##  ## ###  #  ## ##    
##   ## ## # # # ####   ####     ########  ## #### ######  ## ### ## ##    
##   ##  # # # # ##     ##       ########  ##   ##  ####    # ##  ## ##