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