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