┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─┌─┐─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┌─┐─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─│ │─┼┌─┐─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─│ │─┼┌─┐┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─│ │─┼└─┘─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─│ │┌─┼─┘┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─│ └──┐┌─┐┌────┐┌────┐┌────┐┌─┐┌─┐┼─┌────┐┌────┐│ ││ └─┐┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─│ ┌┐ ││ ││ ┌┐ ││ ┌┐ ││ ┌──┘│ ││ │┼─│ ┌┐ ││ ┌┐ ││ ││ ┌─┘┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─│ └┘ ││ ││ ││ ││ └┘ └┐│ │─┼─│ └┘ │┼─│ └┘ ││ └┘ ││ ││ │┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─└────┘└─┘└─┘└─┘└─────┘└─┘─┼└──┐ │┼─└──┐ │└────┘└─┘└─┘┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄┌──┘ │▀▄┌──┘ │▀▄▀┌─┐▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄┼─┼─
┼─┼─▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄└────┘▀▄└────┘▀▄▀│ │▀▄▀▄▀▄▀▄▀▄▀▄▀▄┌─┐▄▀▄▀▄▀▄┼─┼─
┼─┼─▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀▄▀│ │▀▄▀▄▀▄▀▄▀▄▀▄▀▄└─┘▄▀▄▀▄▀▄┼─┼─
┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼┌────┐┌────┐┌────┐ ┌────┐┌──┘ │┼─┌────┐┌────┐┌─┐┌─┐ ┌─┐┼─┼─
┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼│ ┌┐ ││ ┌──┘│ ┌┐ │ │ ┌┐ ││ ┌┐ │┼─│ ┌┐ ││ ┌──┘│ │└─┼─┼─┘┼─┼─
┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼│ └┘ ││ │┼─┼│ └┘ └┐│ ││ ││ └┘ │┼─│ └┘ ││ │─┼─│ │┌─┼─┼─┐┼─┼─
┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼└──┐ │└─┘┼─└─────┘└─┘└─┘└────┘┼─│ ┌──┘└─┘─┼└─┘└─┘ └─┘┼─┼─
┼─┼─╒════════════════┌──┘ │ ══════════════════════════│ │ ═════════════════╕┼─┼─
┼─┼─June 18 '21 ►►►└────┘►►►►►►►►►►►►►►►►►►►►►►►►►►►└─┘►►►► Sept. 17 '21 ┼─┼─
┼─┼─│ ──────────────────────────────────────────────────────────────────── │┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─                       A N N O U N C E M E N T                        ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ [ WELCOME ]─────────────────────────────────────────────────────//── ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ Strange files are serious business...                                ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Zero Trust.                                                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Advanced Heuristics.                                                 ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Anomaly Detection.                                                   ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Anything that could potentially execute code: personally deleted by  ┼─┼─
┼─┼─ the CISO herself...                                                  ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ What if instead of hiding a file within a file, we made the file     ┼─┼─
┼─┼─ become whatever the observer was looking for?                        ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Last year, we challenged you to create the smallest binary that      ┼─┼─
┼─┼─ could be exec'd the same backwards as forwards: a Binary Palindrome. ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ This year, we challenge you to create the smallest executable binary ┼─┼─
┼─┼─ that is more than one file at once: a Binary Polyglot.               ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ This challenge has many different ┌────────────────────────────────┐ ┼─┼─
┼─┼─ and interesting ways to approach. Polyglot files are files that  ┼─┼─
┼─┼─ A total abandonment of your pre-  are considered valid in mult-  ┼─┼─
┼─┼─ concieved notions about your fav- iple formats. This could be a  ┼─┼─
┼─┼─ orite file formats is necessary.  GIF that is also a PDF. Or a   ┼─┼─
┼─┼─                                   NES ROM that's also a ZIP file ┼─┼─
┼─┼─ Because things are slowly coming  that's also an HTML page.      ┼─┼─
┼─┼─ back to normal around the world,                                 ┼─┼─
┼─┼─ the BGGP will be three months,    A binary polyglot is a binary  ┼─┼─
┼─┼─ instead of two months like last   program that is also valid as  ┼─┼─
┼─┼─ year, to encourage people to take another file type.             ┼─┼─
┼─┼─ their time and do non-computer    └────────────────────────────────┘ ┼─┼─
┼─┼─ things too.                                                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ We encourage people who haven't done anything like this before to    ┼─┼─
┼─┼─ work on this as well. You can work alone or with others to take      ┼─┼─
┼─┼─ on this task. As much as this is a "competition", anything that      ┼─┼─
┼─┼─ comes out of this challenge will be interesting no matter what!      ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ For more information about polyglot files in general, check out      ┼─┼─
┼─┼─ the RESOURCES section before proceeding!                             ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ [ GUIDELINES ]──────────────────────────────────────────────────//── ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ Here are the guidelines for this challenge:                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ ► The host file must be a binary executable.                         ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   This is any binary executable that stores either machine code      ┼─┼─
┼─┼─   (such as ELF, PE etc.) or bytecode (wasm, pyc, etc.)               ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ ► Overlap with at least one additional file of any type to create    ┼─┼─
┼─┼─   a polyglot.                                                        ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ ► The host binary must return or print the number 2 when executed.   ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ [ Scoring ]                                                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ There will be two scoring categories for this challenge, each one    ┼─┼─
┼─┼─ with it's own set of considerations. Participants can aim for one    ┼─┼─
┼─┼─ or the other, or both.                                               ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Category 1 is the simplest: The smallest binary polyglot that meets  ┼─┼─
┼─┼─ the above criteria.                                                  ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Category 2 uses a point system, with scores based on:                ┼─┼─
┼─┼─  - Number of overlapping bytes                                       ┼─┼─
┼─┼─  - Number of bytes in the executable code section of the host file   ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ ► 1 point per byte from a guest file overlapping with the host file  ┼─┼─
┼─┼─ ► 2 points per byte from the guest file overlapping with the         ┼─┼─
┼─┼─   executable code section of the host file.                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Each additional file is scored individually, adding to the total     ┼─┼─
┼─┼─ number of points.                                                    ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ These points are then divided by the total number of bytes in the    ┼─┼─
┼─┼─ host file, giving the final score. See the EXAMPLE section for       ┼─┼─
┼─┼─ more details.                                                        ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ [ Other Rules ]                                                      ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ ► The host binary must be able to execute as submitted.              ┼─┼─
┼─┼─ ► Guest files must be parsable as the given file type on at least    ┼─┼─
┼─┼─   one program that was published before the start of the contest.    ┼─┼─
┼─┼─ ► File size should not exceed 4096 bytes (4KB)                       ┼─┼─
┼─┼─ ► The size of the executable section will only be counted as what is ┼─┼─
┼─┼─   defined by the binary itself, or by the last executed instruction  ┼─┼─
┼─┼─   for files with ambiguous code sections.                            ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ [ EXAMPLE ]─────────────────────────────────────────────────────//── ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ It helps to look at a visual representation to understand how each   ┼─┼─
┼─┼─ file overlaps. The following is an example of how a Category 2       ┼─┼─
┼─┼─ submission would be scored with two guest files.                     ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─┌────────┬────────┬───────┬─────────┬─────────┬──────────────────┐  ┼─┼─
┼─┼─ START   END     SIZE   FILE OL  EXEC OL  Description      ┼─┼─
┼─┼─├────────┼────────┼───────┼─────────┼─────────┼──────────────────┤  ┼─┼─
┼─┼─ 0x0000  0x0200  0x200     -       -      Host Binary      ┼─┼─
┼─┼─ 0x0080  0x0150  0xD0      -       -      Executable Code  ┼─┼─
┼─┼─ 0x0100  0x0180  0x80    0x80     0x50    File1            ┼─┼─
┼─┼─ 0x0130  0x01D0  0xA0    0xA0     0x20    File2            ┼─┼─
┼─┼─└────────┴────────┴───────┴─────────┴─────────┴──────────────────┘  ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ host.bin                                                             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─  0000:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0010:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0020:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0030:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0040:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0050:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0060:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  0070:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─         ┌───────────────────────────────────────┬─── Code @ 0x80     ┼─┼─
┼─┼─  0080:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  0090:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  00a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  00b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  00c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  00d0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  00e0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  00f0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─        ┌─────────────────────────────────────────┬── File1 @ 0x100   ┼─┼─
┼─┼─  0100: 0000 0000 0000 0000 0000 0000 0000 0000 ................  ┼─┼─
┼─┼─  0110: 0000 0000 0000 0000 0000 0000 0000 0000 ................  ┼─┼─
┼─┼─  0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................  ┼─┼─
┼─┼─       ┌───────────────────────────────────────────┬─ File2 @ 0x130   ┼─┼─
┼─┼─  0130:0000 0000 0000 0000 0000 0000 0000 0000................  ┼─┼─
┼─┼─  0140:0000 0000 0000 0000 0000 0000 0000 0000................  ┼─┼─
┼─┼─       └───────────────────────────────────────┘┼─┼─
┼─┼─  0150: 0000 0000 0000 0000 0000 0000 0000 0000 ................  ┼─┼─
┼─┼─  0160: 0000 0000 0000 0000 0000 0000 0000 0000 ................  ┼─┼─
┼─┼─  0170: 0000 0000 0000 0000 0000 0000 0000 0000 ................  ┼─┼─
┼─┼─       └─────────────────────────────────────────┘┼─┼─
┼─┼─  0180:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  0190:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  01a0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  01b0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─  01c0:  0000 0000 0000 0000 0000 0000 0000 0000  ................  ┼─┼─
┼─┼─       └───────────────────────────────────────────┘                  ┼─┼─
┼─┼─  01d0:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  01e0:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─  01f0:   0000 0000 0000 0000 0000 0000 0000 0000   ................  ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ The scoring would break down like so:                                ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   File1:                                                             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─     0x80 (128.) bytes of File1 overlap the host file                 ┼─┼─
┼─┼─     0x50 (80.) of those overlap the binary code section              ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   File1 Points:                                                      ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─     128 + (80*2) = 288                                               ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ If this was the only file overlapped, the score would be             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   288 / 512 = 0.5625                                                 ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ For additional files, we score the same way and add to the total.    ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   File2:                                                             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─     0xA0 (160.) bytes overlap                                        ┼─┼─
┼─┼─     0x20 (32.) are in the binary code section                        ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   File2 Points:                                                      ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─     160 + (32*2) = 224                                               ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Add to the File1 points:                                             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   224 + 288 = 512                                                    ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Divide by the total number of bytes for the final score:             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   512 / 512 = 1.0                                                    ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ [ TIPS ]────────────────────────────────────────────────────────//── ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ 1. There's a lot of research that has been done into polyglot files  ┼─┼─
┼─┼─    to explore. Take time to read through some literature (as shared  ┼─┼─
┼─┼─    below) and play around with weird files to get in the mood!       ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ 2. If this is your first time playing with polyglot files: pick a    ┼─┼─
┼─┼─    few file formats you want to explore and stick with them until    ┼─┼─
┼─┼─    you feel comfortable. Even if you don't end up making the small-  ┼─┼─
┼─┼─    est binary polyglot, you'll learn an awful lot about files and    ┼─┼─
┼─┼─    parsers that will stay with you forever.                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ 3. The Binary Golf Association recommends that you set up a VM or    ┼─┼─
┼─┼─    other dedicated workspace for playing with polyglot executables.  ┼─┼─
┼─┼─    Be prepared to break certain programs that try to parse your      ┼─┼─
┼─┼─    files, and possibly corrupt your data. Also, Windows will some-   ┼─┼─
┼─┼─    times just delete your work because it thinks it's malicious.     ┼─┼─
┼─┼─    An Ubuntu Linux VM is the safest bet, and has many readily avail- ┼─┼─
┼─┼─    able tools!                                                       ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ 4. Two of the most common tools for creating polyglots are hex       ┼─┼─
┼─┼─    editors and assemblers. Anything that allows you to define and    ┼─┼─
┼─┼─    control individual bytes will work. You could even write a script ┼─┼─
┼─┼─    to generate files for you by writing raw bytes, it's up to you :} ┼─┼─
┼─┼─    P.S. `nasm -f bin` > all                                          ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ 5. It's really helpful to record your progress in a dedicated notes  ┼─┼─
┼─┼─    file. Turn these notes into a writeup for extra brownie points    ┼─┼─
┼─┼─    and show others what you found!                                   ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ [ RESOURCES ]───────────────────────────────────────────────────//── ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ This is one of the best papers regarding the theory and practice of  ┼─┼─
┼─┼─ polyglot files, and we suggest you start here:                       ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─   PoC||GTFO 7:6 (pg. 18)                                             ┼─┼─
┼─┼─   Abusing file formats; or, Corkami, the Novella - Ange Albertini    ┼─┼─
┼─┼─   https://www.alchemistowl.org/pocorgtfo/pocorgtfo07.pdf             ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ [ Videos ]                                                           ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─  https://youtu.be/VVdmmN0su6E What is a File Format? - LiveOverflow  ┼─┼─
┼─┼─  https://youtu.be/hdCs6bPM4is Funky File Formats - Ange Albertini    ┼─┼─
┼─┼─  https://youtu.be/VLmrsfSE-tA Adventures in Binary Golf - netspooky  ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ [ Repos ]                                                            ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─  https://github.com/corkami/pocs Many interesting file PoCs          ┼─┼─
┼─┼─  https://github.com/corkami/mitra Polyglot Generator                 ┼─┼─
┼─┼─  https://github.com/Polydet/polyglot-database Polyglot file PoCs     ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ Don't forget to check out the BGGP Repo to see last years entries!   ┼─┼─
┼─┼─ https://github.com/netspooky/BGGP The BGGP Repo                      ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ [ SUBMISSIONS ]─────────────────────────────────────────────────//── ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ When submitting your entry, please include the following:            ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ - A text file containing a hex dump of your file using xxd, hexdump  ┼─┼─
┼─┼─   or other similar tool.                                             ┼─┼─
┼─┼─ - A second text file containing the SHA256 hash of the binary file   ┼─┼─
┼─┼─   (not the hex dump), and a list of files in your polyglot and what  ┼─┼─
┼─┼─   programs to use to open them.                                      ┼─┼─
┼─┼─ - If you want to include the source code and/or a write up, please   ┼─┼─
┼─┼─   feel free!                                                         ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ We'd prefer if you put your whole entry into a Github repository, as ┼─┼─
┼─┼─ it will be easier to track, thank you!                               ┼─┼─
┼─┼─                                                                      ┼─┼─
┼─┼─ You can DM your submissions to @netspooky on Twitter or send an      ┼─┼─
┼─┼─ email to bggp@thugcrowd.com                                          ┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─│ ──────────────────────────────────────────────────────────────────── │┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ Good luck! We look forward to seeing what you come up with.          │┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─ The BGA would like to thank ThugCrowd, tmp.0ut, and everyone doing   │┼─┼─
┼─┼─ cursed things with files and/or computers. We love you!              │┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─│                                                                      │┼─┼─
┼─┼─╘══════════════════════════════════════════════════════════════════════╛┼─┼─
┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─