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