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