Amolo ☽

─────────[ ★ $Docker for Bug Bounty$ ★ ]─────────

Author: @ferreiraklet

─────────[ ★ Beginning ★ ]─────────



                ;'-. 
    `;-._       )  '---.._
      >  `-.__.-'          `'.__
     /_.-'-._         _,   ^ ---)
jgs  `       `'------/_.'----```
                     `


               ★★★★★★
┌───────────────Summary────────────────┐
│                                      │
│  1. A little about D0cker            │
│     - What to use it for?            │
│  2. H4nds 0n (creating a d0cker) ->  │
│      - C0nfig files?                 │
│      - D0ckerfile and docker-compose │
│      - Running our Docker            │
│                                      │
└──────────────────────────────────────┘


──[ A little about D0cker ]──

What is docker?

Well, for those who have never had contact with Docker, here is a brief summary:

Docker is an open source platform designed to facilitate the development, deployment and execution of applications using containers. A container is an isolated and self-sufficient unit that encapsulates the entire environment necessary for an application to work, including the code, libraries, dependencies and configurations. That is, the container or machine created can be used with a set of pre-defined configurations, thus enabling the use of codes, scripts, and even install_tools (which I will discuss here), to speed up the process of "fixing" the machine.

In addition to Docker, this paper will use Docker Compose

-> Docker Compose is a tool that allows you to define and manage multi-container applications in a Docker environment.

It uses YAML configuration files to describe the services, networks and volumes necessary for the application to work.

Therefore, we will make the process of generating a container a little easier for us, using docker-compose.

Why use it?

Docker has a wide range of uses in many areas, and its main benefits are related to its ability to work with predefined configurations. One of the most amazing aspects is the ability to start a container that automatically installs all the desired dependencies and configurations, in a flexible and dynamic way.

Let's consider a hypothetical scenario in which you acquire a new VPS and need to quickly reproduce your environment for bug bounty and/or pentest. Instead of having to manually prepare the entire environment and copy it,
Docker allows you to start a container that automatically installs all the dependencies, organizes the directories according to your preferences, and includes the tools you use.

This approach has many benefits, such as saving time and ensuring that the environment will be configured consistently, regardless of the machine it is running on. Additionally, this solution offers portability, since containers can be easily shared and run on different platforms. With Docker, you can create custom images that encapsulate the entire environment you need to do your work, from libraries and dependencies to specific scripts and tools. This gives you the flexibility to configure and customize your work environment in an efficient and reproducible way. In short, Docker allows you to create containers that provide predefined configurations, allowing you to quickly launch custom work environments with all the dependencies and tools you want. This approach offers convenience, portability, and consistency in the configuration of your development or production environment.


──[ H4nds 0n ]──

First, make sure you have docker and docker-compose installed on your system
sudo apt install docker docker-compose

Before running the container, we will create (or move) tool configuration files in that same directory.

!papers@ferreira ~/docker-para-bug-bounty$ ls

.tmux.conf
.zshrc
Dockerfile
config.sh
docker-compose.yaml
install_hacktools.sh
provider-config.yaml
zsh_instalation.sh

Um pouco sobre esses arquivos ==>

!papers@ferreira ~/docker-para-bug-bounty$ cat .tmux.conf # -> Here I leave a file to set some personalized things in tmux like color and mouse scroll, which I like to change.
######################
### DESIGN CHANGES ###
######################

# loud or quiet?
set -g visual-activity off
set -g visual-bell off
set -g visual-silence off
setw -g monitor-activity off
set -g bell-action none
set-option -g default-shell /bin/zsh
#  modes
setw -g clock-mode-colour colour5
setw -g mode-style 'fg=colour1 bg=colour18 bold'

# panes
set -g pane-border-style 'fg=colour19 bg=colour0'
set -g pane-active-border-style 'bg=colour0 fg=colour9'

# statusbar
set -g status-position bottom
set -g status-justify left
set -g status-style 'bg=colour18 fg=colour137 dim'
set -g status-left ''
set -g status-right '#[fg=colour233,bg=colour19] %d/%m #[fg=colour233,bg=colour8] %H:%M:%S '
set -g status-right-length 50
set -g status-left-length 20

setw -g window-status-current-style 'fg=colour1 bg=colour19 bold'
setw -g window-status-current-format ' #I#[fg=colour249]:#[fg=colour255]#W#[fg=colour249]#F '

setw -g window-status-style 'fg=colour9 bg=colour18'
setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F '

setw -g window-status-bell-style 'fg=colour255 bg=colour1 bold'
setw -g mouse on
# messages
set -g message-style 'fg=colour232 bg=colour16 bold'



!papers@ferreira ~/docker-para-bug-bounty$ cat .zshrc # -> I highly recommend that you create an rc for bug bounty/pentest, with aliases and custom functions of your choice, you don't need to use zsh, you can use bash, it's up to you.
export ZSH="$HOME/.oh-my-zsh"
source ~/tools/pdiscovery-bot/func.sh 2>/dev/null
ZSH_THEME="spaceship"
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:/usr/local/go/bin:$PATH:$HOME/.local/bin
export PATH="$PATH:$HOME/.axiom/interact"
alias d='docker-compose'
alias faraday='faraday-cli tool report -w asm --plugin-id nuclei'
alias t='tmux new -s'
alias ccat='pygmentize -g'
alias awk1="awk '{print $1}'"
export GO111MODULE=on
alias www='python3 -m http.server '
alias py='python3 '
alias c='clear'
alias urldecode='python3 -c "import sys, urllib.parse as ul; \
  print(ul.unquote_plus(sys.argv[1]))"'
alias urlencode='python3 -c "import sys, urllib.parse as ul; \
  print(ul.quote_plus(sys.argv[1]))"'
export WEBPASTE_TOKEN=iloveweb
cert(){
  curl -s "https://crt.sh/?q=%.$1&output=json" | jq -r '.[].name_value' | sed 's/\*\.//g' | anew $2
 }
export GOROOT=/usr/local/go
export GOPATH=~/go
export PATH=~/go/bin:/bin:~/go/bin:/usr/local/go/bin:~/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:~/.local/bin:~/.axiom/interact:~/.local/bin:~/.axiom/interact
source ~/tools/pdiscovery-bot/func.sh 2>/dev/null
alias go='/usr/local/go/bin/go'
alias scon='/usr/bin/scon'
plugins=(git)
source $ZSH/oh-my-zsh.sh
alias gf='~/go/bin/gf'
alias vim="nvim"
alias v="nvim"
eval $(dircolors ~/.dircolors)

!papers@ferreira ~/docker-para-bug-bounty$ cat config.sh # -> A file that moves these other files, such as .tmux.conf, to their proper locations.
#!/bin/bash

apt-get install gcc libpcap-dev zsh python3 python3-pip -y
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
export ZSH_CUSTOM=/root/.oh-my-zsh/custom
curl -OL https://golang.org/dl/go1.19.linux-amd64.tar.gz ; sudo tar -C /usr/local -xvf go1.19.linux-amd64.tar.gz ; cp /usr/local/go/bin/go /usr/bin
wget https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz ; tar xzvf nvim-linux64.tar.gz ; mv ./nvim-linux64/bin/nvim /usr/bin ; bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/installer/install.sh)
git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt" --depth=1 ; ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"
mv .zshrc ~/.zshrc
mv config.yaml ~/.config/nuclei/
mv provider-config.yaml ~/.config/notify/
mv .tmux.conf ~/.tmux.conf ; tmux source ~/.tmux.conf
wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O ~/.dircolors
echo 'eval $(dircolors ~/.dircolors)' >> ~/.zshrc
source ~/.zshrc

!papers@ferreira ~/docker-para-bug-bounty$ cat Dockerfile # -> This is where the magic happens, I'll talk more about that later.
...

!papers@ferreira ~/docker-para-bug-bounty$ cat docker-compose.yaml # -> Another file where the magic happens, I will talk more about it later.
...

!papers@ferreira ~/docker-para-bug-bounty$ cat install_hacktools.sh # -> Responsible for installing the tools I use. (too big to put here)
...

!papers@ferreira ~/docker-para-bug-bounty$ cat provider-config.yaml # -> It is the notify configuration file, which is used to notify my slack (you can use telegram), tool output or scans.
slack:
  - id: "slack"
    slack_channel: "example"
    slack_username: "example_user"
    slack_format: "{{data}}"
    slack_webhook_url: "https://hooks.slack.com/services/x/y"

!papers@ferreira ~/docker-para-bug-bounty$ cat zsh_instalation.sh # -> Since I like zsh, I created a small script to install it.
#!/bin/bash
bash -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

<==


About Dockerfile and docker-compose.yaml

!papers@ferreira ~/docker-para-bug-bounty$ cat Dockerfile

===>

FROM python:3.10.4-slim-buster
COPY --from=golang:1.18.2-bullseye /usr/local/go/ /usr/local/go/
WORKDIR /root

ENV PATH="/usr/local/go/bin:${PATH}"
ENV GOPATH /go
ENV PATH $GOPATH/bin:$PATH

RUN apt-get update
RUN apt-get -qq -y install vim tmux make gcc zsh
RUN apt-get -qq -y install curl unzip tar wget libpcap-dev
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
RUN mkdir /root/tools
RUN mkdir /root/setup
RUN echo "source ~/tools/pdiscovery-bot/func.sh" >> ~/.bashrc

COPY install_hacktools.sh /root/setup/install_hacktools.sh
COPY install.sh /root/setup/install.sh
COPY scon /usr/bin/scon
COPY pdiscovery-bot /root/tools/pdiscovery-bot
COPY config.sh /root/setup/config.sh
COPY provider-config.yaml /root/setup/provider-config.yaml
COPY config.yaml /root/setup/config.yaml
COPY .zshrc /root/setup/.zshrc
COPY .tmux.conf /root/setup/.tmux.conf
COPY zsh_instalation.sh /root/setup/zsh_instalation.sh

RUN chmod +x /root/setup/install* /root/setup/config.sh
RUN chmod +x /usr/bin/scon
RUN bash /root/setup/install.sh
RUN bash /root/setup/install_hacktools.sh

<===

1. I am using the python:3.10.4-slim-buster image
2. I have my container based on the /root/tools and /root/setup directories
	-> /root/tools -> here are the tools that need to have a directory, Ex: git_dumper
3. The contents of the current directory will be copied into the container and their respective places,
	-> Note, "COPY scon /usr/bin/scon" => I am sending my .sh that performs subdomain recon to /usr/bin
	-> Note, "COPY pdiscovery-bot /root/tools/pdiscovery-bot" => I am sending my bot to the tools folder
	-> and I am sending the rest such as config.sh, provider-config.yaml, etc, to /root/setup.
4. Finally, I will run chmod +x on the files where I install tools and on config.sh


!papers@ferreira ~/docker-para-bug-bounty$ cat docker-compose.yaml

version: '3.1'

services:
  app:
    image: ubuntu
    container_name: james_app
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    stdin_open: true
    tty: true


Notes:
 - Image = ubuntu
 - Container name = james_app
 - Will build the container in the current directory and using the dockerfile


Running docker

Inside the directory, run

!papers@ferreira ~/docker-para-bug-bounty$ docker-compose up -d # -> Please note that it may take a while

!papers@ferreira ~/docker-para-bug-bounty$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED       STATUS       PORTS     NAMES
1e1feaf22096   ubuntu    "python3"   1 days ago   Up 1 days             james_app

To enter docker ->

!papers@ferreira ~/docker-para-bug-bounty$ docker exec -it james_app bash
root@1e1feaf22096:~# ls
hacking setup tools dotfiles

GG! Docker assembled with tools and ready for battle.

──[ End ]──


Dear reader, may you have gained an idea of ​​how you can structure your docker for bug bounty, as well as how it can be useful
We're together!!!

Do you think it's over? Here's a gift:

IyEvdXNyL2Jpbi9lbnYgYmFzaAoKREVCVUdfU1REPSImPi9kZXYvbnVsbCIKREVCVUdfRVJST1I9IjI+L2Rldi9udWxsIgoKIyBURVJNIENPTE9SUwpiYmx1ZT0nXDAzM1sxOzM0bScKCnByaW50ZiAiJHtiYmx1ZX0gUnVubmluZzogSW5zdGFsbGluZyBHb2xhbmcgdG9vbHMgKCR7I2dvdG9vbHNbQF19KSR7cmVzZXR9XG5cbiIKCmdvIGVudiAtdyBHTzExMU1PRFVMRT1hdXRvCgplY2hvICJJbnN0YWxsIGZmZiIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9mZmZAbGF0ZXN0CmVjaG8gImluc3RhbGwgc29uYXJieXRlIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vY2hhbm55ZWluMTMzNy9zb25hcmJ5dGVAbGF0ZXN0CmVjaG8gIkluc3RhbGwgaGFrcmF3bGVyIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vaGFrbHVrZS9oYWtyYXdsZXJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgdG9qc29uIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL2hhY2tzL3RvanNvbkBsYXRlc3QKZWNobyAiSW5zdGFsbCBnb3dpdG5lc3MiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9zZW5zZXBvc3QvZ293aXRuZXNzQGxhdGVzdAplY2hvICJJbnN0YWxsIHJ1c2giCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9zaGVud2VpMzU2L3J1c2hAbGF0ZXN0CmVjaG8gIkluc3RhbGwgbmFhYnUiCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L25hYWJ1L3YyL2NtZC9uYWFidUBsYXRlc3QKZWNobyAiSW5zdGFsbCBoYWtjaGVja3VybCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2hha2x1a2UvaGFrY2hlY2t1cmxAbGF0ZXN0CmVjaG8gIkluc3RhbGwgc2h1ZmZsZWRucyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Byb2plY3RkaXNjb3Zlcnkvc2h1ZmZsZWRucy9jbWQvc2h1ZmZsZWRuc0BsYXRlc3QKZWNobyAiSW5zdGFsbCByZXNjb3BlIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vcm9vdDRsb290L3Jlc2NvcGVAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZ3JvbiIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9ncm9uQGxhdGVzdAplY2hvICJJbnN0YWxsIGh0bWwtdG9vbCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9oYWNrcy9odG1sLXRvb2xAbGF0ZXN0CmVjaG8gIkluc3RhbGwgQ2hhb3MiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L2NoYW9zLWNsaWVudC9jbWQvY2hhb3NAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZ2YiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS90b21ub21ub20vZ2ZAbGF0ZXN0CmVjaG8gIkluc3RhbGwgcXNyZXBsYWNlIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL3FzcmVwbGFjZUBsYXRlc3QKZWNobyAiSW5zdGFsbCBBbWFzcyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL09XQVNQL0FtYXNzL3YzLy4uLkBsYXRlc3QKZWNobyAiSW5zdGFsbCBmZnVmIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZmZ1Zi9mZnVmQGxhdGVzdAplY2hvICJJbnN0YWxsIGFzc2V0ZmluZGVyIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL2Fzc2V0ZmluZGVyQGxhdGVzdAplY2hvICJJbnN0YWxsIGdpdGh1Yi1zdWJkb21haW5zIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZ3dlbjAwMS9naXRodWItc3ViZG9tYWluc0BsYXRlc3QKZWNobyAiSW5zdGFsbCBjZi1jaGVjayIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2R3aXNpc3dhbnQwL2NmLWNoZWNrQGxhdGVzdAplY2hvICJJbnN0YWxsIHdheWJhY2t1cmxzIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL2hhY2tzL3dheWJhY2t1cmxzQGxhdGVzdAplY2hvICJJbnN0YWxsIG51Y2xlaSIKZ28gaW5zdGFsbCAtdiBnaXRodWIuY29tL3Byb2plY3RkaXNjb3ZlcnkvbnVjbGVpL3YyL2NtZC9udWNsZWlAbGF0ZXN0CmVjaG8gIkluc3RhbGwgYW5ldyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9hbmV3QGxhdGVzdAplY2hvICJJbnN0YWxsIG5vdGlmeSIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Byb2plY3RkaXNjb3Zlcnkvbm90aWZ5L2NtZC9ub3RpZnlAbGF0ZXN0CmVjaG8gIkluc3RhbGwgbWlsZGV3IgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZGFlaGVlL21pbGRldy9jbWQvbWlsZGV3QGxhdGVzdAplY2hvICJJbnN0YWxsIGRpcmRhciIKZ28gaW5zdGFsbCBnaXRodWIuY29tL200ZG0wZS9kaXJkYXJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgdW5mdXJsIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL3VuZnVybEBsYXRlc3QKZWNobyAiSW5zdGFsbCBodHRweCIKZ28gaW5zdGFsbCAtdiBnaXRodWIuY29tL3Byb2plY3RkaXNjb3ZlcnkvaHR0cHgvY21kL2h0dHB4QGxhdGVzdAplY2hvICJJbnN0YWxsIGdpdGh1Yi1lbmRwb2ludHMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9nd2VuMDAxL2dpdGh1Yi1lbmRwb2ludHNAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZG5zeCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Byb2plY3RkaXNjb3ZlcnkvZG5zeC9jbWQvZG5zeEBsYXRlc3QKZWNobyAiSW5zdGFsbCBzdWJmaW5kZXIiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L3N1YmZpbmRlci92Mi9jbWQvc3ViZmluZGVyQGxhdGVzdAplY2hvICJJbnN0YWxsIGdhdXBsdXMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9sYy9nYXUvdjIvY21kL2dhdUBsYXRlc3QKZ28gaW5zdGFsbCBnaXRodWIuY29tL2JwMGxyL2dhdXBsdXNAbGF0ZXN0CmVjaG8gIkluc3RhbGwgc3VianMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9sYy9zdWJqc0BsYXRlc3QKZWNobyAiSW5zdGFsbCBHeHNzIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vS2F0aGFuUDE5L0d4c3NAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZ29zcGlkZXIiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9qYWVsZXMtcHJvamVjdC9nb3NwaWRlckBsYXRlc3QKZWNobyAiSW5zdGFsbCBjcm9iYXQiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9jZ2JvYWwvc29uYXJzZWFyY2gvY3JvYmF0QGxhdGVzdAplY2hvICJJbnN0YWxsIGNybGZ1enoiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kd2lzaXN3YW50MC9jcmxmdXp6L2NtZC9jcmxmdXp6QGxhdGVzdAplY2hvICJJbnN0YWxsIGRhbGZveCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2hhaHd1bC9kYWxmb3gvdjJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgcHVyZWRucyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2QzbW9uZGV2L3B1cmVkbnMvdjJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgcmVzb2x2ZURvbWFpbnMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9Kb3N1ZTg3L3Jlc29sdmVEb21haW5zQGxhdGVzdAplY2hvICJJbnN0YWxsIGludGVyYWN0c2gtY2xpZW50IgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vcHJvamVjdGRpc2NvdmVyeS9pbnRlcmFjdHNoL2NtZC9pbnRlcmFjdHNoLWNsaWVudEBsYXRlc3QKZWNobyAiSW5zdGFsbCBnb3RhdG9yIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vSm9zdWU4Ny9nb3RhdG9yQGxhdGVzdApnbyBpbnN0YWxsIC12IGdpdGh1Yi5jb20vcHJvamVjdGRpc2NvdmVyeS9uYWFidS92Mi9jbWQvbmFhYnVAbGF0ZXN0CmVjaG8gIkluc3RhbGwga3hzcyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9oYWNrcy9reHNzQGxhdGVzdAplY2hvICJJbnN0YWxsIEdldEpzIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vMDAzcmFuZG9tL2dldEpTQGxhdGVzdAplY2hvICJJbnN0YWxsIEdvb3AiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kZWxldGVzY2FwZS9nb29wQGxhdGVzdAplY2hvICJJbnN0YWxsIE1lZyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9tZWdAbGF0ZXN0CmVjaG8gIkluc3RhbGwgRnJlcSIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Rha3NoYWwvZnJlcUBsYXRlc3QKZWNobyAiSW5zdGFsbCBTZGxvb2t1cCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2ozc3NpZS9zZGxvb2t1cEBsYXRlc3QKZWNobyAiSW5zdGFsbCBTaWd1cmxmaW5kZXIiCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9zaWduZWRzZWN1cml0eS9zaWd1cmxmaW5kM3IvY21kL3NpZ3VybGZpbmQzckBsYXRlc3QKZWNobyAiSW5zdGFsbCBDaHJvbWVkcCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2Nocm9tZWRwL2Nocm9tZWRwQGxhdGVzdAplY2hvICJJbnN0YWxsIEFpcml4c3MiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9mZXJyZWlyYWtsZXQvYWlyaXhzc0BsYXRlc3QKZWNobyAiSW5zdGFsbCBOaWxvIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZmVycmVpcmFrbGV0L25pbG9AbGF0ZXN0CmVjaG8gIkluc3RhbGwgaGFpcDJob3N0IgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vaGFrbHVrZS9oYWtpcDJob3N0QGxhdGVzdAplY2hvICJJbnN0YWxsIHNjb3BlaW4iCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9mZXJyZWlyYWtsZXQvc2NvcGVpbkBsYXRlc3QKCmRlY2xhcmUgLUEgcmVwb3MKcmVwb3NbImdmIl09InRvbW5vbW5vbS9nZiIKcmVwb3NbIkdmLVBhdHRlcm5zIl09IjFuZGlhbmwzM3QvR2YtUGF0dGVybnMiCnJlcG9zWyJMaW5rRmluZGVyIl09ImRhcmstd2FybG9yZDE0L0xpbmtGaW5kZXIiCnJlcG9zWyJJbnRlcmxhY2UiXT0iY29kaW5nby9JbnRlcmxhY2UiCnJlcG9zWyJKU1NjYW5uZXIiXT0iMHgyNDB4MjNlbHUvSlNTY2FubmVyIgpyZXBvc1siR2l0VG9vbHMiXT0iaW50ZXJuZXR3YWNoZS9HaXRUb29scyIKcmVwb3NbIlNlY3JldEZpbmRlciJdPSJtNGxsMGsvU2VjcmV0RmluZGVyIgpyZXBvc1siTTRsbDBrIl09Im00bGwway9CQlR6IgpyZXBvc1siR2l0LUR1bXBlciJdPSJhcnRoYXVkL2dpdC1kdW1wZXIiCnJlcG9zWyJDT1JTdGVzdCJdPSJSVUItTkRTL0NPUlN0ZXN0IgpyZXBvc1siS25vY2siXT0iZ3VlbGZvd2ViL2tub2NrIgpyZXBvc1siUGhvdG9uIl09InMwbWQzdi9QaG90b24iCnJlcG9zWyJTdWRvbXkiXT0ic2NyZWV0c2VjL1N1ZG9teSIKcmVwb3NbIkROU3ZhbGlkYXRvciJdPSJ2b3J0ZXhhdS9kbnN2YWxpZGF0b3IiCnJlcG9zWyJNYXNzZG5zIl09ImJsZWNoc2NobWlkdC9tYXNzZG5zIgpyZXBvc1siRGlyc2VhcmNoIl09Im1hdXJvc29yaWEvZGlyc2VhcmNoIgpyZXBvc1siS25veG5sIl09InhubC1oNGNrM3Iva25veG5sIgpyZXBvc1sieG5MaW5rRmluZGVyIl09InhubC1oNGNrM3IveG5MaW5rRmluZGVyIgpyZXBvc1siTVN3ZWxsRE9UUyJdPSJtc3dlbGwvZG90ZmlsZXMiCnJlcG9zWyJXYXltb3JlIl09InhubC1oNGNrM3Ivd2F5bW9yZSIKCmRpcj0iJEhPTUUvdG9vbHMiCgpta2RpciAtcCB+Ly5nZgpta2RpciAtcCB+L3Rvb2xzLwpta2RpciAtcCB+L3Rvb2xzL3dvcmRsaXN0cy8KbWtkaXIgLXAgfi8uY29uZmlnL25vdGlmeS8KbWtkaXIgLXAgfi8uY29uZmlnL2FtYXNzLwpta2RpciAtcCB+Ly5jb25maWcvbnVjbGVpLwoKZWNobyBld29nSUNBZ0ltWnNZV2R6SWpvZ0lpMXBSWFlpTEFvZ0lDQWdJQ0p3WVhSMFpYSnVjeUk2SUZzS0lpNG9hbkJuZkdwd1pXZDhaMmxtZkdOemMzeDBhV1o4ZEdsbVpueHdibWQ4ZEhSbWZIZHZabVo4YVdOdmJueHdaR1o4YzNabmZIUjRkSHhxYzN4M1pXSndmR0Y0WkNraUNsMEtmUW89IHwgYmFzZTY0IC1kID4+IH4vLmdmL2JsYWNrbGlzdC5qc29uCgpwaXAzIGluc3RhbGwgdXJvCnBpcDMgaW5zdGFsbCBiaGVkYWsKCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9lZG9hcmRvdHR0L2NhcmlkZGkvY21kL2NhcmlkZGlAbGF0ZXN0CmdvIGluc3RhbGwgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L2thdGFuYS9jbWQva2F0YW5hQGxhdGVzdApnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2Fib3VsM2xhL1N1Ymxpc3Qzci5naXQgfi90b29scy9TdWJsaXN0M3IKcGlwMyBpbnN0YWxsIC1yIH4vdG9vbHMvU3VibGlzdDNyL3JlcXVpcmVtZW50cy50eHQKZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9nd2VuMDAxL2dpdGh1Yi1zZWFyY2guZ2l0IH4vdG9vbHMvZ2l0aHViLXNlYXJjaApnbyBpbnN0YWxsIC12IGdpdGh1Yi5jb20vcHJvamVjdGRpc2NvdmVyeS9uYWFidS92Mi9jbWQvbmFhYnVAbGF0ZXN0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvWFNTLU9GSkFBQUgudHh0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYW5pZWxtaWVzc2xlci9TZWNMaXN0cy9tYXN0ZXIvRnV6emluZy9YU1MvWFNTLU9GSkFBQUgudHh0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvcGFyYW1zLnR4dCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vczBtZDN2L0FyanVuL21hc3Rlci9hcmp1bi9kYi9wYXJhbXMudHh0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvcmFmdC1sYXJnZS1kaXJlY3Rvcmllcy1sb3dlcmNhc2UudHh0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYW5pZWxtaWVzc2xlci9TZWNMaXN0cy9tYXN0ZXIvRGlzY292ZXJ5L1dlYi1Db250ZW50L3JhZnQtbGFyZ2UtZGlyZWN0b3JpZXMtbG93ZXJjYXNlLnR4dApldmFsIHdnZXQgLW5jIC1PIH4vLmdmL3BvdGVudGlhbC5qc29uIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kZXZhbnNoYmF0aGFtL1BhcmFtU3BpZGVyL21hc3Rlci9nZl9wcm9maWxlcy9wb3RlbnRpYWwuanNvbiAkREVCVUdfU1RECmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvaHR0cGFyY2hpdmVfYXBpcm91dGVzXzIwMjJfMDNfMjgudHh0IGh0dHBzOi8vd29yZGxpc3RzLWNkbi5hc3NldG5vdGUuaW8vZGF0YS9hdXRvbWF0ZWQvaHR0cGFyY2hpdmVfYXBpcm91dGVzXzIwMjJfMDNfMjgudHh0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvcmFmdC1sYXJnZS1maWxlcy50eHQgaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbG1pZXNzbGVyL1NlY0xpc3RzL2Jsb2IvbWFzdGVyL0Rpc2NvdmVyeS9XZWItQ29udGVudC9yYWZ0LWxhcmdlLWZpbGVzLnR4dApldmFsIHdnZXQgLW5jIC1PIH4vdG9vbHMvd29yZGxpc3RzL3JhZnQtbGFyZ2Utd29yZHMtbG93ZXJjYXNlLnR4dCBodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsbWllc3NsZXIvU2VjTGlzdHMvYmxvYi9tYXN0ZXIvRGlzY292ZXJ5L1dlYi1Db250ZW50L3JhZnQtbGFyZ2Utd29yZHMtbG93ZXJjYXNlLnR4dApwcmludGYgIiR7YmJsdWV9XG4gUnVubmluZzogSW5zdGFsbGluZyByZXBvc2l0b3JpZXMgKCR7I3JlcG9zW0BdfSkke3Jlc2V0fVxuXG4iCgpjZCAiJGRpciIgfHwgewogICAgZWNobyAiRmFpbGVkIHRvIGNkIHRvICRkaXIgaW4gJHtGVU5DTkFNRVswXX0gQCBsaW5lICR7TElORU5PfSIKICAgIGV4aXQgMQp9CgojIFN0YW5kYXJkIHJlcG9zIGluc3RhbGxhdGlvbgpyZXBvc19zdGVwPTAKZm9yIHJlcG8gaW4gIiR7IXJlcG9zW0BdfSI7IGRvCiAgICByZXBvc19zdGVwPSQoKHJlcG9zX3N0ZXAgKyAxKSkKICAgIGV2YWwgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zWyRyZXBvXX0gJGRpci8kcmVwbyAkREVCVUdfU1RECiAgICBldmFsIGNkICRkaXIvJHJlcG8gJERFQlVHX1NURAogICAgZXZhbCBnaXQgcHVsbCAkREVCVUdfU1RECiAgICBleGl0X3N0YXR1cz0kPwogICAgaWYgWyAkZXhpdF9zdGF0dXMgLWVxIDAgXTsgdGhlbgogICAgICAgIHByaW50ZiAiJHt5ZWxsb3d9ICRyZXBvIGluc3RhbGxlZCAoJHtyZXBvc19zdGVwfS8keyNyZXBvc1tAXX0pJHtyZXNldH1cbiIKICAgIGVsc2UKICAgICAgICBwcmludGYgIiR7cmVkfSBVbmFibGUgdG8gaW5zdGFsbCAkcmVwbywgdHJ5IG1hbnVhbGx5ICgke3JlcG9zX3N0ZXB9LyR7I3JlcG9zW0BdfSkke3Jlc2V0fVxuIgogICAgZmkKICAgIGlmIFsgLXMgInJlcXVpcmVtZW50cy50eHQiIF07IHRoZW4KICAgICAgICBldmFsICRTVURPIHBpcDMgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0ICRERUJVR19TVEQKICAgIGZpCiAgICBpZiBbIC1zICJzZXR1cC5weSIgXTsgdGhlbgogICAgICAgIGV2YWwgJFNVRE8gcHl0aG9uMyBzZXR1cC5weSBpbnN0YWxsICRERUJVR19TVEQKICAgIGZpCiAgICBpZiBbIC1zICJNYWtlZmlsZSIgXTsgdGhlbgogICAgICAgIGV2YWwgJFNVRE8gbWFrZSAkREVCVUdfU1RECiAgICAgICAgZXZhbCAkU1VETyBtYWtlIGluc3RhbGwgJERFQlVHX1NURAogICAgZmkKICAgIGlmIFsgImdmIiA9ICIkcmVwbyIgXTsgdGhlbgogICAgICAgIGV2YWwgY3AgLXIgZXhhbXBsZXMvKi5qc29uIH4vLmdmICRERUJVR19FUlJPUgogICAgZWxpZiBbICJHZi1QYXR0ZXJucyIgPSAiJHJlcG8iIF07IHRoZW4KICAgICAgICBldmFsIG12ICouanNvbiB+Ly5nZiAkREVCVUdfRVJST1IKICAgIGZpCiAgICBjZCAiJGRpciIgfHwgewogICAgICAgIGVjaG8gIkZhaWxlZCB0byBjZCB0byAkZGlyIGluICR7RlVOQ05BTUVbMF19IEAgbGluZSAke0xJTkVOT30iCiAgICAgICAgZXhpdCAxCiAgICB9CmRvbmUKCmVjaG8gIkFkZCBteSBnZiB0ZW1wbGF0ZXMiCmNwIC1yICRIT01FL3Rvb2xzL01Td2VsbERPVFMvY29uZmlnL2hvbWUvLmdmLyouanNvbiAkSE9NRS8uZ2Yv

END


⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⣶⣾⣿⣿⣿⣿⣿⡏⡆⠀
⠀⠀⠀⠀⠀⠀⠀⣠⣾⠿⠛⠋⠉⠉⠉⠈⠉⠛⠛⢳⡇⠀
⠀⠀⠀⠀⠀⢀⠞⠋⠀⠀⣷⣤⣀⣀⣀⠀⠀⠀⠀⠸⡇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣢⠄⠀⠀⡇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⡀⠀⠀⡇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡇⠀⣀⣇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣧⣴⣾⣻⡆
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣸⣿⡇
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣭⣾⣿⣿⣿⠉⣛⢿⠿⠁
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣷⣶⣿⣻⣿⣆⠙⣿⠀⠀     "H4ck f0r l1v1ng" - ferreira
⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⡿⣸⣔⣿⣿⡄⣿⠀⠀
⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣧⣼⣿⣿⣿⣿⡏⠀⠀
⠐⠶⠶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠇⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢠⢤⢤⠤⡤⡤⠄⢠⣤⡄⠠⠄⡤⣤⣤⡠⠄