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