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 ⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⡿⣸⣔⣿⣿⡄⣿⠀⠀ ⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣧⣼⣿⣿⣿⣿⡏⠀⠀ ⠐⠶⠶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠇⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⢠⢤⢤⠤⡤⡤⠄⢠⣤⡄⠠⠄⡤⣤⣤⡠⠄