From bc6873f555a0e4e4a38f53c6ffcc79b6127fcd55 Mon Sep 17 00:00:00 2001
From: Juanma Garcia <60962101+jmgarciadev@users.noreply.github.com>
Date: Mon, 9 Oct 2023 21:01:11 +0200
Subject: [PATCH] Initial structure
---
.gitignore | 5 +
README.md | 41 +
agent/README.md | 80 +
agent/ajax-based/link-utils.ajax.js | 228 +
agent/ajax-based/main.ajax.js | 64 +
agent/ajax-based/pivot-utils.ajax.js | 161 +
agent/ajax-based/prefix-main.ajax.txt | 14 +
agent/combinejs-ajax-based.sh | 2 +
agent/combinejs-iframe-based.sh | 2 +
agent/common/credits.txt | 9 +
agent/common/form-utils.js | 245 +
agent/common/input-utils.js | 572 +
agent/common/link-utils.js | 46 +
agent/common/pivot-utils.part1.js | 37 +
agent/common/pivot-utils.part2.js | 242 +
agent/common/settings-utils.js | 49 +
agent/common/spider-utils.js | 133 +
agent/common/sufix-main.txt | 39 +
agent/common/vars.js | 8 +
agent/iframe-based/core.iframe.js | 207 +
agent/iframe-based/link-utils.iframe.js | 225 +
agent/iframe-based/main.iframe.js | 36 +
agent/iframe-based/pivot-utils.iframe.js | 136 +
agent/iframe-based/prefix-main.iframe.txt | 16 +
agent/images/Waterfall.jpg | Bin 0 -> 23276 bytes
agent/images/banner1.jpg | Bin 0 -> 21699 bytes
agent/images/demo-dvwa.gif | Bin 0 -> 2944169 bytes
agent/images/logo1.jpg | Bin 0 -> 18915 bytes
agent/tests/form-1.html | 76 +
agent/tests/form-injection-payload1.html | 186 +
agent/tests/iframe-src-form-1.html | 1 +
agent/tests/out.js | 38 +
agent/tests/package-lock.json | 846 +
agent/tests/test.js | 1 +
agent/tests/test1.html | 18 +
agent/tests/test2.html | 18 +
agent/tests/test3.html | 10 +
agent/tests/test4.html | 44 +
agent/tests/test5.js | 184 +
.../common/input-utils.js-tests.html | 639 +
agent/unit-tests/iframe-inject.html | 681 +
agent/unit-tests/pivot-utils.iframe.js.html | 21 +
.../unit-tests/redundant-url-test-single.html | 204 +
agent/unit-tests/redundant-url-tests.html | 235 +
api/.gitignore | 2 +
api/Dockerfile | 8 +
api/builder/__init__.py | 0
api/builder/constructor.py | 206 +
api/core/__init__.py | 0
api/core/connector.py | 311 +
api/main.py | 279 +
api/requirements.txt | 6 +
dashboard/.dockerignore | 2 +
dashboard/.env | 4 +
dashboard/.gitignore | 3 +
dashboard/Dockerfile | 20 +
dashboard/docker/nginx.conf | 28 +
dashboard/index.html | 15 +
dashboard/logo.png | Bin 0 -> 3486 bytes
dashboard/package.json | 58 +
dashboard/src/App.jsx | 38 +
dashboard/src/_nav.jsx | 19 +
dashboard/src/actionTypes/home.jsx | 8 +
dashboard/src/actionTypes/patterns.jsx | 11 +
.../src/assets/css/argon-dashboard-react.css | 13206 +++++++++++++
.../assets/css/argon-dashboard-react.css.map | 203 +
.../assets/css/argon-dashboard-react.min.css | 16474 ++++++++++++++++
dashboard/src/assets/css/nucleo.css | 572 +
dashboard/src/assets/fonts/nucleo-icons.eot | Bin 0 -> 18516 bytes
dashboard/src/assets/fonts/nucleo-icons.svg | 312 +
dashboard/src/assets/fonts/nucleo-icons.ttf | Bin 0 -> 18292 bytes
dashboard/src/assets/fonts/nucleo-icons.woff | Bin 0 -> 10220 bytes
dashboard/src/assets/fonts/nucleo-icons.woff2 | Bin 0 -> 8580 bytes
.../src/assets/fonts/nucleo/nucleo-icons.eot | Bin 0 -> 18516 bytes
.../src/assets/fonts/nucleo/nucleo-icons.svg | 312 +
.../src/assets/fonts/nucleo/nucleo-icons.ttf | Bin 0 -> 18292 bytes
.../src/assets/fonts/nucleo/nucleo-icons.woff | Bin 0 -> 10220 bytes
.../assets/fonts/nucleo/nucleo-icons.woff2 | Bin 0 -> 8580 bytes
dashboard/src/assets/logo.png | Bin 0 -> 45938 bytes
dashboard/src/assets/logo2.png | Bin 0 -> 2927 bytes
dashboard/src/assets/logo3.png | Bin 0 -> 51412 bytes
dashboard/src/assets/logo_short.png | Bin 0 -> 3486 bytes
.../src/assets/scss/bootstrap/_alert.scss | 51 +
.../src/assets/scss/bootstrap/_badge.scss | 47 +
.../assets/scss/bootstrap/_breadcrumb.scss | 41 +
.../assets/scss/bootstrap/_button-group.scss | 172 +
.../src/assets/scss/bootstrap/_buttons.scss | 143 +
.../src/assets/scss/bootstrap/_card.scss | 301 +
.../src/assets/scss/bootstrap/_carousel.scss | 236 +
.../src/assets/scss/bootstrap/_close.scss | 35 +
.../src/assets/scss/bootstrap/_code.scss | 48 +
.../assets/scss/bootstrap/_custom-forms.scss | 433 +
.../src/assets/scss/bootstrap/_dropdown.scss | 166 +
.../src/assets/scss/bootstrap/_forms.scss | 333 +
.../src/assets/scss/bootstrap/_functions.scss | 86 +
.../src/assets/scss/bootstrap/_grid.scss | 52 +
.../src/assets/scss/bootstrap/_images.scss | 42 +
.../assets/scss/bootstrap/_input-group.scss | 173 +
.../src/assets/scss/bootstrap/_jumbotron.scss | 16 +
.../assets/scss/bootstrap/_list-group.scss | 115 +
.../src/assets/scss/bootstrap/_media.scss | 8 +
.../src/assets/scss/bootstrap/_mixins.scss | 41 +
.../src/assets/scss/bootstrap/_modal.scss | 180 +
dashboard/src/assets/scss/bootstrap/_nav.scss | 118 +
.../src/assets/scss/bootstrap/_navbar.scss | 299 +
.../assets/scss/bootstrap/_pagination.scss | 78 +
.../src/assets/scss/bootstrap/_popover.scss | 183 +
.../src/assets/scss/bootstrap/_print.scss | 141 +
.../src/assets/scss/bootstrap/_progress.scss | 34 +
.../src/assets/scss/bootstrap/_reboot.scss | 483 +
.../src/assets/scss/bootstrap/_root.scss | 19 +
.../src/assets/scss/bootstrap/_tables.scss | 187 +
.../src/assets/scss/bootstrap/_tooltip.scss | 115 +
.../assets/scss/bootstrap/_transitions.scss | 22 +
.../src/assets/scss/bootstrap/_type.scss | 125 +
.../src/assets/scss/bootstrap/_utilities.scss | 15 +
.../src/assets/scss/bootstrap/_variables.scss | 952 +
.../assets/scss/bootstrap/mixins/_alert.scss | 13 +
.../bootstrap/mixins/_background-variant.scss | 21 +
.../assets/scss/bootstrap/mixins/_badge.scss | 12 +
.../scss/bootstrap/mixins/_border-radius.scss | 35 +
.../scss/bootstrap/mixins/_box-shadow.scss | 5 +
.../scss/bootstrap/mixins/_breakpoints.scss | 123 +
.../scss/bootstrap/mixins/_buttons.scss | 109 +
.../assets/scss/bootstrap/mixins/_caret.scss | 66 +
.../scss/bootstrap/mixins/_clearfix.scss | 7 +
.../assets/scss/bootstrap/mixins/_float.scss | 11 +
.../assets/scss/bootstrap/mixins/_forms.scss | 147 +
.../scss/bootstrap/mixins/_gradients.scss | 45 +
.../bootstrap/mixins/_grid-framework.scss | 67 +
.../assets/scss/bootstrap/mixins/_grid.scss | 52 +
.../assets/scss/bootstrap/mixins/_hover.scss | 37 +
.../assets/scss/bootstrap/mixins/_image.scss | 36 +
.../scss/bootstrap/mixins/_list-group.scss | 21 +
.../assets/scss/bootstrap/mixins/_lists.scss | 7 +
.../scss/bootstrap/mixins/_nav-divider.scss | 10 +
.../scss/bootstrap/mixins/_pagination.scss | 22 +
.../scss/bootstrap/mixins/_reset-text.scss | 17 +
.../assets/scss/bootstrap/mixins/_resize.scss | 6 +
.../scss/bootstrap/mixins/_screen-reader.scss | 33 +
.../assets/scss/bootstrap/mixins/_size.scss | 6 +
.../scss/bootstrap/mixins/_table-row.scss | 30 +
.../scss/bootstrap/mixins/_text-emphasis.scss | 14 +
.../scss/bootstrap/mixins/_text-hide.scss | 13 +
.../scss/bootstrap/mixins/_text-truncate.scss | 8 +
.../scss/bootstrap/mixins/_transition.scss | 13 +
.../scss/bootstrap/mixins/_visibility.scss | 7 +
.../scss/bootstrap/utilities/_align.scss | 8 +
.../scss/bootstrap/utilities/_background.scss | 19 +
.../scss/bootstrap/utilities/_borders.scss | 59 +
.../scss/bootstrap/utilities/_clearfix.scss | 3 +
.../scss/bootstrap/utilities/_display.scss | 38 +
.../scss/bootstrap/utilities/_embed.scss | 52 +
.../scss/bootstrap/utilities/_flex.scss | 51 +
.../scss/bootstrap/utilities/_float.scss | 9 +
.../scss/bootstrap/utilities/_position.scss | 37 +
.../bootstrap/utilities/_screenreaders.scss | 11 +
.../scss/bootstrap/utilities/_shadows.scss | 6 +
.../scss/bootstrap/utilities/_sizing.scss | 12 +
.../scss/bootstrap/utilities/_spacing.scss | 51 +
.../scss/bootstrap/utilities/_text.scss | 58 +
.../scss/bootstrap/utilities/_visibility.scss | 11 +
.../scss/core/alerts/_alert-dismissible.scss | 39 +
.../src/assets/scss/core/alerts/_alert.scss | 46 +
.../scss/core/avatars/_avatar-group.scss | 22 +
.../src/assets/scss/core/avatars/_avatar.scss | 42 +
.../scss/core/badges/_badge-circle.scss | 17 +
.../assets/scss/core/badges/_badge-dot.scss | 42 +
.../src/assets/scss/core/badges/_badge.scss | 55 +
.../scss/core/buttons/_button-brand.scss | 12 +
.../scss/core/buttons/_button-icon.scss | 92 +
.../src/assets/scss/core/buttons/_button.scss | 91 +
.../scss/core/cards/_card-animations.scss | 10 +
.../scss/core/cards/_card-blockquote.scss | 17 +
.../assets/scss/core/cards/_card-profile.scss | 49 +
.../assets/scss/core/cards/_card-stats.scss | 16 +
.../src/assets/scss/core/cards/_card.scss | 8 +
.../src/assets/scss/core/charts/_chart.scss | 69 +
.../src/assets/scss/core/close/_close.scss | 34 +
.../core/custom-forms/_custom-checkbox.scss | 37 +
.../core/custom-forms/_custom-control.scss | 51 +
.../scss/core/custom-forms/_custom-form.scss | 37 +
.../scss/core/custom-forms/_custom-radio.scss | 37 +
.../core/custom-forms/_custom-toggle.scss | 66 +
.../assets/scss/core/dropdowns/_dropdown.scss | 79 +
.../src/assets/scss/core/footers/_footer.scss | 98 +
.../scss/core/forms/_form-validation.scss | 71 +
.../src/assets/scss/core/forms/_form.scss | 78 +
.../assets/scss/core/forms/_input-group.scss | 70 +
.../src/assets/scss/core/headers/_header.scss | 7 +
.../assets/scss/core/icons/_icon-shape.scss | 42 +
.../src/assets/scss/core/icons/_icon.scss | 49 +
.../scss/core/list-groups/_list-group.scss | 46 +
dashboard/src/assets/scss/core/maps/_map.scss | 10 +
.../src/assets/scss/core/masks/_mask.scss | 12 +
.../src/assets/scss/core/mixins/_alert.scss | 13 +
.../scss/core/mixins/_background-variant.scss | 30 +
.../src/assets/scss/core/mixins/_badge.scss | 12 +
.../src/assets/scss/core/mixins/_buttons.scss | 105 +
.../src/assets/scss/core/mixins/_forms.scss | 128 +
.../src/assets/scss/core/mixins/_icon.scss | 4 +
.../src/assets/scss/core/mixins/_modals.scss | 23 +
.../src/assets/scss/core/mixins/_popover.scss | 36 +
.../src/assets/scss/core/modals/_modal.scss | 25 +
.../scss/core/navbars/_navbar-collapse.scss | 125 +
.../scss/core/navbars/_navbar-dropdown.scss | 101 +
.../scss/core/navbars/_navbar-search.scss | 69 +
.../scss/core/navbars/_navbar-vertical.scss | 286 +
.../src/assets/scss/core/navbars/_navbar.scss | 153 +
.../src/assets/scss/core/navs/_nav-pills.scss | 66 +
dashboard/src/assets/scss/core/navs/_nav.scss | 33 +
.../scss/core/paginations/_pagination.scss | 48 +
.../assets/scss/core/popovers/_popover.scss | 21 +
.../scss/core/progresses/_progress.scss | 79 +
.../scss/core/separators/_separator.scss | 54 +
.../src/assets/scss/core/tables/_table.scss | 118 +
.../src/assets/scss/core/type/_article.scss | 22 +
.../src/assets/scss/core/type/_display.scss | 14 +
.../src/assets/scss/core/type/_heading.scss | 52 +
.../src/assets/scss/core/type/_type.scss | 27 +
.../scss/core/utilities/_backgrounds.scss | 51 +
.../assets/scss/core/utilities/_blurable.scss | 37 +
.../assets/scss/core/utilities/_floating.scss | 64 +
.../assets/scss/core/utilities/_helper.scss | 18 +
.../assets/scss/core/utilities/_image.scss | 9 +
.../assets/scss/core/utilities/_opacity.scss | 35 +
.../assets/scss/core/utilities/_overflow.scss | 11 +
.../assets/scss/core/utilities/_position.scss | 25 +
.../assets/scss/core/utilities/_shadows.scss | 28 +
.../assets/scss/core/utilities/_sizing.scss | 7 +
.../assets/scss/core/utilities/_spacing.scss | 107 +
.../src/assets/scss/core/utilities/_text.scss | 49 +
.../scss/core/utilities/_transform.scss | 13 +
.../core/vendors/_bootstrap-datepicker.scss | 279 +
.../assets/scss/core/vendors/_headroom.scss | 25 +
.../assets/scss/core/vendors/_nouislider.scss | 413 +
.../assets/scss/core/vendors/_scrollbar.scss | 35 +
dashboard/src/assets/scss/custom/_alert.scss | 6 +
dashboard/src/assets/scss/custom/_avatar.scss | 6 +
dashboard/src/assets/scss/custom/_badge.scss | 7 +
.../src/assets/scss/custom/_buttons.scss | 7 +
dashboard/src/assets/scss/custom/_card.scss | 9 +
dashboard/src/assets/scss/custom/_chart.scss | 5 +
dashboard/src/assets/scss/custom/_close.scss | 5 +
.../src/assets/scss/custom/_components.scss | 31 +
.../src/assets/scss/custom/_content.scss | 47 +
.../src/assets/scss/custom/_custom-forms.scss | 9 +
.../src/assets/scss/custom/_dropdown.scss | 5 +
dashboard/src/assets/scss/custom/_footer.scss | 5 +
dashboard/src/assets/scss/custom/_forms.scss | 7 +
.../src/assets/scss/custom/_functions.scss | 33 +
dashboard/src/assets/scss/custom/_header.scss | 5 +
dashboard/src/assets/scss/custom/_icons.scss | 6 +
.../src/assets/scss/custom/_input-group.scss | 5 +
.../src/assets/scss/custom/_list-group.scss | 5 +
dashboard/src/assets/scss/custom/_map.scss | 5 +
dashboard/src/assets/scss/custom/_mask.scss | 5 +
dashboard/src/assets/scss/custom/_mixins.scss | 19 +
dashboard/src/assets/scss/custom/_modal.scss | 5 +
dashboard/src/assets/scss/custom/_nav.scss | 7 +
dashboard/src/assets/scss/custom/_navbar.scss | 9 +
.../src/assets/scss/custom/_pagination.scss | 5 +
.../src/assets/scss/custom/_popover.scss | 6 +
.../src/assets/scss/custom/_progress.scss | 5 +
dashboard/src/assets/scss/custom/_reboot.scss | 13 +
.../src/assets/scss/custom/_section.scss | 139 +
.../src/assets/scss/custom/_separator.scss | 5 +
dashboard/src/assets/scss/custom/_tables.scss | 5 +
dashboard/src/assets/scss/custom/_type.scss | 8 +
.../src/assets/scss/custom/_utilities.scss | 16 +
.../src/assets/scss/custom/_variables.scss | 1009 +
.../src/assets/scss/custom/_vendors.scss | 9 +
.../src/assets/scss/dashboard-react.scss | 45 +
dashboard/src/assets/scss/react/_buttons.scss | 8 +
dashboard/src/assets/scss/react/_mixins.scss | 3 +
.../assets/scss/react/_navbar-dropdown.scss | 9 +
dashboard/src/assets/scss/react/_navbar.scss | 6 +
dashboard/src/assets/scss/react/_tables.scss | 9 +
.../react/plugins/_plugin-react-datetime.scss | 414 +
.../assets/scss/react/react-differences.scss | 10 +
dashboard/src/components/DefaultRoute.jsx | 31 +
dashboard/src/components/Dropzone/actions.jsx | 12 +
dashboard/src/components/Dropzone/index.jsx | 72 +
.../src/components/Footers/AdminFooter.jsx | 31 +
.../src/components/Footers/AuthFooter.jsx | 36 +
.../src/components/Navbars/AdminNavbar.jsx | 70 +
dashboard/src/components/Sidebar/Sidebar.jsx | 175 +
dashboard/src/components/index.jsx | 3 +
dashboard/src/constants/index.jsx | 1 +
.../DefaultLayout/DefaultLayout.jsx | 67 +
.../src/containers/DefaultLayout/index.jsx | 3 +
dashboard/src/containers/index.jsx | 3 +
dashboard/src/index.jsx | 5 +
dashboard/src/layouts/Admin.jsx | 69 +
dashboard/src/react-app-env.d.ts | 1 +
dashboard/src/reducers/homeReducer.jsx | 81 +
dashboard/src/reducers/index.jsx | 18 +
dashboard/src/reducers/patternsReducer.jsx | 94 +
dashboard/src/requesters/axios.jsx | 9 +
dashboard/src/routes.jsx | 11 +
dashboard/src/store.jsx | 28 +
dashboard/src/views/Forms/actions.jsx | 76 +
dashboard/src/views/Forms/index.jsx | 148 +
dashboard/src/views/Forms/modalEdit/index.jsx | 165 +
.../Forms/modalEdit/originalInputsForm.jsx | 80 +
.../src/views/Forms/modalEdit/styles.css | 39 +
.../src/views/Forms/modalSecrets/index.jsx | 113 +
dashboard/src/views/Home/actions.jsx | 43 +
dashboard/src/views/Home/index.jsx | 100 +
dashboard/src/views/Patterns/actions.jsx | 175 +
dashboard/src/views/Patterns/index.jsx | 134 +
.../src/views/Patterns/modalAdd/index.jsx | 80 +
.../src/views/Patterns/modalEdit/index.jsx | 90 +
.../views/Patterns/modalSettings/index.jsx | 138 +
dashboard/tsconfig.json | 21 +
dashboard/vite-env.d.ts | 1 +
dashboard/vite.config.js | 8 +
data/dump/Formshaker.dump | Bin 0 -> 5956 bytes
data/mongorestore.sh | 5 +
docker-compose-development.yml | 39 +
docker-compose.yml | 30 +
321 files changed, 53387 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
create mode 100644 agent/README.md
create mode 100644 agent/ajax-based/link-utils.ajax.js
create mode 100644 agent/ajax-based/main.ajax.js
create mode 100644 agent/ajax-based/pivot-utils.ajax.js
create mode 100644 agent/ajax-based/prefix-main.ajax.txt
create mode 100644 agent/combinejs-ajax-based.sh
create mode 100644 agent/combinejs-iframe-based.sh
create mode 100644 agent/common/credits.txt
create mode 100644 agent/common/form-utils.js
create mode 100644 agent/common/input-utils.js
create mode 100644 agent/common/link-utils.js
create mode 100644 agent/common/pivot-utils.part1.js
create mode 100644 agent/common/pivot-utils.part2.js
create mode 100644 agent/common/settings-utils.js
create mode 100644 agent/common/spider-utils.js
create mode 100644 agent/common/sufix-main.txt
create mode 100644 agent/common/vars.js
create mode 100644 agent/iframe-based/core.iframe.js
create mode 100644 agent/iframe-based/link-utils.iframe.js
create mode 100644 agent/iframe-based/main.iframe.js
create mode 100644 agent/iframe-based/pivot-utils.iframe.js
create mode 100644 agent/iframe-based/prefix-main.iframe.txt
create mode 100644 agent/images/Waterfall.jpg
create mode 100644 agent/images/banner1.jpg
create mode 100644 agent/images/demo-dvwa.gif
create mode 100644 agent/images/logo1.jpg
create mode 100644 agent/tests/form-1.html
create mode 100644 agent/tests/form-injection-payload1.html
create mode 100644 agent/tests/iframe-src-form-1.html
create mode 100644 agent/tests/out.js
create mode 100644 agent/tests/package-lock.json
create mode 100644 agent/tests/test.js
create mode 100644 agent/tests/test1.html
create mode 100644 agent/tests/test2.html
create mode 100644 agent/tests/test3.html
create mode 100644 agent/tests/test4.html
create mode 100644 agent/tests/test5.js
create mode 100644 agent/unit-tests/common/input-utils.js-tests.html
create mode 100644 agent/unit-tests/iframe-inject.html
create mode 100644 agent/unit-tests/pivot-utils.iframe.js.html
create mode 100644 agent/unit-tests/redundant-url-test-single.html
create mode 100644 agent/unit-tests/redundant-url-tests.html
create mode 100644 api/.gitignore
create mode 100644 api/Dockerfile
create mode 100644 api/builder/__init__.py
create mode 100644 api/builder/constructor.py
create mode 100644 api/core/__init__.py
create mode 100644 api/core/connector.py
create mode 100755 api/main.py
create mode 100644 api/requirements.txt
create mode 100644 dashboard/.dockerignore
create mode 100644 dashboard/.env
create mode 100644 dashboard/.gitignore
create mode 100644 dashboard/Dockerfile
create mode 100644 dashboard/docker/nginx.conf
create mode 100644 dashboard/index.html
create mode 100644 dashboard/logo.png
create mode 100644 dashboard/package.json
create mode 100644 dashboard/src/App.jsx
create mode 100644 dashboard/src/_nav.jsx
create mode 100644 dashboard/src/actionTypes/home.jsx
create mode 100644 dashboard/src/actionTypes/patterns.jsx
create mode 100644 dashboard/src/assets/css/argon-dashboard-react.css
create mode 100644 dashboard/src/assets/css/argon-dashboard-react.css.map
create mode 100644 dashboard/src/assets/css/argon-dashboard-react.min.css
create mode 100644 dashboard/src/assets/css/nucleo.css
create mode 100644 dashboard/src/assets/fonts/nucleo-icons.eot
create mode 100644 dashboard/src/assets/fonts/nucleo-icons.svg
create mode 100644 dashboard/src/assets/fonts/nucleo-icons.ttf
create mode 100644 dashboard/src/assets/fonts/nucleo-icons.woff
create mode 100644 dashboard/src/assets/fonts/nucleo-icons.woff2
create mode 100644 dashboard/src/assets/fonts/nucleo/nucleo-icons.eot
create mode 100644 dashboard/src/assets/fonts/nucleo/nucleo-icons.svg
create mode 100644 dashboard/src/assets/fonts/nucleo/nucleo-icons.ttf
create mode 100644 dashboard/src/assets/fonts/nucleo/nucleo-icons.woff
create mode 100644 dashboard/src/assets/fonts/nucleo/nucleo-icons.woff2
create mode 100644 dashboard/src/assets/logo.png
create mode 100644 dashboard/src/assets/logo2.png
create mode 100644 dashboard/src/assets/logo3.png
create mode 100644 dashboard/src/assets/logo_short.png
create mode 100644 dashboard/src/assets/scss/bootstrap/_alert.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_badge.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_breadcrumb.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_button-group.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_buttons.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_card.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_carousel.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_close.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_code.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_custom-forms.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_dropdown.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_forms.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_functions.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_grid.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_images.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_input-group.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_jumbotron.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_list-group.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_media.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_mixins.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_modal.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_nav.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_navbar.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_pagination.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_popover.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_print.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_progress.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_reboot.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_root.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_tables.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_tooltip.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_transitions.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_type.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_utilities.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/_variables.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_alert.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_background-variant.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_badge.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_border-radius.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_box-shadow.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_breakpoints.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_buttons.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_caret.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_clearfix.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_float.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_forms.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_gradients.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_grid-framework.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_grid.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_hover.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_image.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_list-group.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_lists.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_nav-divider.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_pagination.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_reset-text.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_resize.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_screen-reader.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_size.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_table-row.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_text-emphasis.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_text-hide.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_text-truncate.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_transition.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/mixins/_visibility.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_align.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_background.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_borders.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_clearfix.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_display.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_embed.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_flex.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_float.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_position.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_screenreaders.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_shadows.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_sizing.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_spacing.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_text.scss
create mode 100644 dashboard/src/assets/scss/bootstrap/utilities/_visibility.scss
create mode 100644 dashboard/src/assets/scss/core/alerts/_alert-dismissible.scss
create mode 100644 dashboard/src/assets/scss/core/alerts/_alert.scss
create mode 100644 dashboard/src/assets/scss/core/avatars/_avatar-group.scss
create mode 100644 dashboard/src/assets/scss/core/avatars/_avatar.scss
create mode 100644 dashboard/src/assets/scss/core/badges/_badge-circle.scss
create mode 100644 dashboard/src/assets/scss/core/badges/_badge-dot.scss
create mode 100644 dashboard/src/assets/scss/core/badges/_badge.scss
create mode 100644 dashboard/src/assets/scss/core/buttons/_button-brand.scss
create mode 100644 dashboard/src/assets/scss/core/buttons/_button-icon.scss
create mode 100644 dashboard/src/assets/scss/core/buttons/_button.scss
create mode 100644 dashboard/src/assets/scss/core/cards/_card-animations.scss
create mode 100644 dashboard/src/assets/scss/core/cards/_card-blockquote.scss
create mode 100644 dashboard/src/assets/scss/core/cards/_card-profile.scss
create mode 100644 dashboard/src/assets/scss/core/cards/_card-stats.scss
create mode 100644 dashboard/src/assets/scss/core/cards/_card.scss
create mode 100644 dashboard/src/assets/scss/core/charts/_chart.scss
create mode 100644 dashboard/src/assets/scss/core/close/_close.scss
create mode 100644 dashboard/src/assets/scss/core/custom-forms/_custom-checkbox.scss
create mode 100644 dashboard/src/assets/scss/core/custom-forms/_custom-control.scss
create mode 100644 dashboard/src/assets/scss/core/custom-forms/_custom-form.scss
create mode 100644 dashboard/src/assets/scss/core/custom-forms/_custom-radio.scss
create mode 100644 dashboard/src/assets/scss/core/custom-forms/_custom-toggle.scss
create mode 100644 dashboard/src/assets/scss/core/dropdowns/_dropdown.scss
create mode 100644 dashboard/src/assets/scss/core/footers/_footer.scss
create mode 100644 dashboard/src/assets/scss/core/forms/_form-validation.scss
create mode 100644 dashboard/src/assets/scss/core/forms/_form.scss
create mode 100644 dashboard/src/assets/scss/core/forms/_input-group.scss
create mode 100644 dashboard/src/assets/scss/core/headers/_header.scss
create mode 100644 dashboard/src/assets/scss/core/icons/_icon-shape.scss
create mode 100644 dashboard/src/assets/scss/core/icons/_icon.scss
create mode 100644 dashboard/src/assets/scss/core/list-groups/_list-group.scss
create mode 100644 dashboard/src/assets/scss/core/maps/_map.scss
create mode 100644 dashboard/src/assets/scss/core/masks/_mask.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_alert.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_background-variant.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_badge.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_buttons.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_forms.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_icon.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_modals.scss
create mode 100644 dashboard/src/assets/scss/core/mixins/_popover.scss
create mode 100644 dashboard/src/assets/scss/core/modals/_modal.scss
create mode 100644 dashboard/src/assets/scss/core/navbars/_navbar-collapse.scss
create mode 100644 dashboard/src/assets/scss/core/navbars/_navbar-dropdown.scss
create mode 100644 dashboard/src/assets/scss/core/navbars/_navbar-search.scss
create mode 100644 dashboard/src/assets/scss/core/navbars/_navbar-vertical.scss
create mode 100644 dashboard/src/assets/scss/core/navbars/_navbar.scss
create mode 100644 dashboard/src/assets/scss/core/navs/_nav-pills.scss
create mode 100644 dashboard/src/assets/scss/core/navs/_nav.scss
create mode 100644 dashboard/src/assets/scss/core/paginations/_pagination.scss
create mode 100644 dashboard/src/assets/scss/core/popovers/_popover.scss
create mode 100644 dashboard/src/assets/scss/core/progresses/_progress.scss
create mode 100644 dashboard/src/assets/scss/core/separators/_separator.scss
create mode 100644 dashboard/src/assets/scss/core/tables/_table.scss
create mode 100644 dashboard/src/assets/scss/core/type/_article.scss
create mode 100644 dashboard/src/assets/scss/core/type/_display.scss
create mode 100644 dashboard/src/assets/scss/core/type/_heading.scss
create mode 100644 dashboard/src/assets/scss/core/type/_type.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_backgrounds.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_blurable.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_floating.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_helper.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_image.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_opacity.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_overflow.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_position.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_shadows.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_sizing.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_spacing.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_text.scss
create mode 100644 dashboard/src/assets/scss/core/utilities/_transform.scss
create mode 100644 dashboard/src/assets/scss/core/vendors/_bootstrap-datepicker.scss
create mode 100644 dashboard/src/assets/scss/core/vendors/_headroom.scss
create mode 100644 dashboard/src/assets/scss/core/vendors/_nouislider.scss
create mode 100644 dashboard/src/assets/scss/core/vendors/_scrollbar.scss
create mode 100644 dashboard/src/assets/scss/custom/_alert.scss
create mode 100644 dashboard/src/assets/scss/custom/_avatar.scss
create mode 100644 dashboard/src/assets/scss/custom/_badge.scss
create mode 100644 dashboard/src/assets/scss/custom/_buttons.scss
create mode 100644 dashboard/src/assets/scss/custom/_card.scss
create mode 100644 dashboard/src/assets/scss/custom/_chart.scss
create mode 100644 dashboard/src/assets/scss/custom/_close.scss
create mode 100644 dashboard/src/assets/scss/custom/_components.scss
create mode 100644 dashboard/src/assets/scss/custom/_content.scss
create mode 100644 dashboard/src/assets/scss/custom/_custom-forms.scss
create mode 100644 dashboard/src/assets/scss/custom/_dropdown.scss
create mode 100644 dashboard/src/assets/scss/custom/_footer.scss
create mode 100644 dashboard/src/assets/scss/custom/_forms.scss
create mode 100644 dashboard/src/assets/scss/custom/_functions.scss
create mode 100644 dashboard/src/assets/scss/custom/_header.scss
create mode 100644 dashboard/src/assets/scss/custom/_icons.scss
create mode 100644 dashboard/src/assets/scss/custom/_input-group.scss
create mode 100644 dashboard/src/assets/scss/custom/_list-group.scss
create mode 100644 dashboard/src/assets/scss/custom/_map.scss
create mode 100644 dashboard/src/assets/scss/custom/_mask.scss
create mode 100644 dashboard/src/assets/scss/custom/_mixins.scss
create mode 100644 dashboard/src/assets/scss/custom/_modal.scss
create mode 100644 dashboard/src/assets/scss/custom/_nav.scss
create mode 100644 dashboard/src/assets/scss/custom/_navbar.scss
create mode 100644 dashboard/src/assets/scss/custom/_pagination.scss
create mode 100644 dashboard/src/assets/scss/custom/_popover.scss
create mode 100644 dashboard/src/assets/scss/custom/_progress.scss
create mode 100644 dashboard/src/assets/scss/custom/_reboot.scss
create mode 100644 dashboard/src/assets/scss/custom/_section.scss
create mode 100644 dashboard/src/assets/scss/custom/_separator.scss
create mode 100644 dashboard/src/assets/scss/custom/_tables.scss
create mode 100644 dashboard/src/assets/scss/custom/_type.scss
create mode 100644 dashboard/src/assets/scss/custom/_utilities.scss
create mode 100644 dashboard/src/assets/scss/custom/_variables.scss
create mode 100644 dashboard/src/assets/scss/custom/_vendors.scss
create mode 100644 dashboard/src/assets/scss/dashboard-react.scss
create mode 100644 dashboard/src/assets/scss/react/_buttons.scss
create mode 100644 dashboard/src/assets/scss/react/_mixins.scss
create mode 100644 dashboard/src/assets/scss/react/_navbar-dropdown.scss
create mode 100644 dashboard/src/assets/scss/react/_navbar.scss
create mode 100644 dashboard/src/assets/scss/react/_tables.scss
create mode 100644 dashboard/src/assets/scss/react/plugins/_plugin-react-datetime.scss
create mode 100644 dashboard/src/assets/scss/react/react-differences.scss
create mode 100644 dashboard/src/components/DefaultRoute.jsx
create mode 100644 dashboard/src/components/Dropzone/actions.jsx
create mode 100644 dashboard/src/components/Dropzone/index.jsx
create mode 100644 dashboard/src/components/Footers/AdminFooter.jsx
create mode 100644 dashboard/src/components/Footers/AuthFooter.jsx
create mode 100644 dashboard/src/components/Navbars/AdminNavbar.jsx
create mode 100644 dashboard/src/components/Sidebar/Sidebar.jsx
create mode 100644 dashboard/src/components/index.jsx
create mode 100644 dashboard/src/constants/index.jsx
create mode 100644 dashboard/src/containers/DefaultLayout/DefaultLayout.jsx
create mode 100644 dashboard/src/containers/DefaultLayout/index.jsx
create mode 100644 dashboard/src/containers/index.jsx
create mode 100644 dashboard/src/index.jsx
create mode 100644 dashboard/src/layouts/Admin.jsx
create mode 100644 dashboard/src/react-app-env.d.ts
create mode 100644 dashboard/src/reducers/homeReducer.jsx
create mode 100644 dashboard/src/reducers/index.jsx
create mode 100644 dashboard/src/reducers/patternsReducer.jsx
create mode 100644 dashboard/src/requesters/axios.jsx
create mode 100644 dashboard/src/routes.jsx
create mode 100644 dashboard/src/store.jsx
create mode 100644 dashboard/src/views/Forms/actions.jsx
create mode 100644 dashboard/src/views/Forms/index.jsx
create mode 100644 dashboard/src/views/Forms/modalEdit/index.jsx
create mode 100644 dashboard/src/views/Forms/modalEdit/originalInputsForm.jsx
create mode 100644 dashboard/src/views/Forms/modalEdit/styles.css
create mode 100644 dashboard/src/views/Forms/modalSecrets/index.jsx
create mode 100644 dashboard/src/views/Home/actions.jsx
create mode 100644 dashboard/src/views/Home/index.jsx
create mode 100644 dashboard/src/views/Patterns/actions.jsx
create mode 100644 dashboard/src/views/Patterns/index.jsx
create mode 100644 dashboard/src/views/Patterns/modalAdd/index.jsx
create mode 100644 dashboard/src/views/Patterns/modalEdit/index.jsx
create mode 100644 dashboard/src/views/Patterns/modalSettings/index.jsx
create mode 100644 dashboard/tsconfig.json
create mode 100644 dashboard/vite-env.d.ts
create mode 100644 dashboard/vite.config.js
create mode 100644 data/dump/Formshaker.dump
create mode 100755 data/mongorestore.sh
create mode 100644 docker-compose-development.yml
create mode 100644 docker-compose.yml
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..73af234
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+data/var_*
+malicious.ajax.min.js
+malicious.iframe.min.js
+agent/agent.js
+lDemo.png
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..97169bc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,41 @@
+
+![DVWA](https://github.com/michyweb/formshaker/blob/main/agent/images/logo1.jpg?raw=true)
+
+# Formshaker
+
+**Formshaker is a tool created to enhance the capabilities of an attacker while exploiting XSS vulnerabilities.**
+
+Formshaker is a JS lib that runs in browsers and acts as a proxy, establishing a bridge between websites functionality and attackers. Its purpose is to maximize the attacker capabilities when exploiting XSS. Formshaker is a project that we initiated in 2018. It consists of a web application and a JS agent. The JS agent operates in two modes: C&C dependent and standalone. From a technical standpoint, the tool’s purpose is to crawl a website, collect its HTML forms, and provide an attacker with visibility into the forms available on the website where the JS agent is active. This allows the attacker, through the C&C, to view, modify, and submit the forms via the JS agent within the context of the victim’s session. On the other hand, the standalone version of the tool is self-contained. It includes all the necessary information within the JS code to populate form inputs and make decisions to automatically submit forms with preconfigured data. It’s important to note that this mode operates independently and does not interact with the C&C. An intriguing scenario occurs when you, as an attacker, inject the JS agent into the victim’s browser, particularly if that person possesses admin privileges. In such a case, the JS agent would identify the user creation form, fill its inputs with predetermined values (such as the attacker’s email and password), and proceed to create a user.
+
+
+
+**Formshaker does not work with SPA (Single-page based websites) as those made with React.js and Vue.js**
+
+
+## Demo:
+
+Here's an example of Formshaker in action:
+![DVWA](https://github.com/michyweb/formshaker/blob/main/agent/images/demo-dvwa.gif?raw=true)
+
+On the left is the vulnerable web, in this case DVWA and on the right the Formshaker control panel. These are the steps that were followed in the demo:
+* Run a listener on the TCP 5001.
+* I inject the JS Formshaker library into a section vulnerable to Reflected XSS.
+* Formshaker invisibly starts spidering the entire website looking for forms and sending them to the control panel.
+* From the control panel I select the form vulnerable to command injection and set the payload for the reverse shell, finally I inject that form.
+* The JS Formshaker library gets the updated form and submited it.
+* The listener receives the connection from the reverse shell.
+
+In summary, the demo shows how through an XSS injection it is possible to control the website forms, in addition, an RCE is exploited in the web portal by injecting a form that, when submited, it executes a reverse shell. As you can see, this is achieved by updating the inputs of a form from the Formshaker control panel and subsequently submitting it.
+
+## Presented in:
+- Hacktivity - 05 Oct 2023: https://hacktivity.com/events/formshaker/
+
+## Special thanks to:
+- Pablo Alvarez Fernando for the logo and images
+- Leonardo Dutra for the original code of the crawler
+- Creativetimofficial for the dashboard template (https://github.com/creativetimofficial/argon-dashboard)
+
+## Disclaimer:
+
+All information and software available on this site are for educational purposes only. Use these at your own discretion, the site owners cannot be held responsible for any damages caused. The views expressed on this site are our own and do not necessarily reflect those of our employers.
+Usage of all tools on this site for attacking targets without prior mutual consent is illegal. It is the end user’s responsibility to obey all applicable local, state and federal laws. We assume no liability and are not responsible for any misuse or damage caused by this site.
\ No newline at end of file
diff --git a/agent/README.md b/agent/README.md
new file mode 100644
index 0000000..b60ee9d
--- /dev/null
+++ b/agent/README.md
@@ -0,0 +1,80 @@
+# Dev Notes
+
+## Description:
+
+The scope of Formshaker is determined by the context of the affected user and by the functionality of the web page where the injected library runs. Formshaker takes advantage of running in the user's context and the visibility of the functionalities offered by the target website. Since the JS library is running on the victim's browser, it can retrieve the anti-CSRF tokens to submit the forms and bypass those form protected against CSRF attacks. These features make Formshaker a very useful tool when exploiting XSS vulnerabilities.
+It can be highlighted the two main tasks that Formshaker performs simultaneously:
+* Webscraping, crawling, form harvesting and form submmition.
+* A loop asking for new forms to be injected.
+
+Currently for the crawling, form harvesting, and form injection process there are two modes available:
+* Iframe mode.
+* AJAX mode.
+
+The discovery process with AJAX mode accomplishes with the same-origin policy (SOP) imposed by the browser. In both modes, the js agent runs on the same origin and operate under the security context of the affected user. Thus, Formshaker has the ability to make HTTP calls and access the HTTP responses of different parts on the same website.
+On the other hand, the discovering process through Iframes is slower and heavier and yet it is useful where authentication is performed through basic authentication or in those cases where the forms rendering is dynamic.
+Depending on the circunstances and characteristics of the target webpage, one mode could be more suitable than the other. We haven't looked into the feasibility of automating the process that determines which mode is more appropiate during the execution, however both modes works simultaneously by default.
+
+## Process, step to step:
+
+1. Create a session ID to identify the user and a execution ID to keep track of the executions.
+1. Mutex test: Avoid running two formshaker instance.
+2. Settings retrieval (loop): two possible alternatives; it reaches the remote endpoint, so it has internet connectivity, and therefore, it uses the remote settings. Alternatively, it times out, so it uses the hardcoded settings.
+3. [to be done]: Any form discovered over the spidering process will be marked as juicy and automatically injected, then...*1. there is a switch to enable this behavior by default.
+4. Fetch modified forms (loop): this is another repetitive task that keeps running in the background to retrieve the forms that has been marked to be injected from the formshaker dashboard.
+ * When the Formshaker API dispatches a form, this immediately passes the form to the injection form functionality which will set up a request and send it.
+ * *1 Each time a form is marked to be "injected", FormShaker will send two forms (requests). The emptied inputs' values and the default ones will remain in the first request. The second form will have all the parameters (input's values) filled with an alternative value. This is done by using an algorithm that sets the most suitable values according to the input's characteristics and the settings configured.
+5. The spidering process is carried out using two alternative methods; the chosen method could be more suitable depending on the website characteristics.
+ * This process includes some validations to avoid visiting two similar URLs, it is a custom algorithm, and therefore, you should expect some inconsistencies.
+ * Any harvested forms are sent to the formshaker web app.
+ * The spidering process ends when the number of pages has reached the limit or there aren't anymore links to visit.
+
+Finally, it is worth mentioning that you can debug the URLs and forms found at the end of the spidering execution. Run the library and once finished type this: debug1()
+
+## Build:
+
+The folder 'common' contains scripts used by both modes:
+* form-utils.js
+* spider-utils.js
+* input-utils.js
+* link-utils.js
+* pivot-utils.js
+* prefix-main.js
+* sufix-main.js
+
+The folder 'ajax-based' contains exclusive functionalities for this mode:
+* link-utils.ajax.js
+* main.ajax.js
+* pivot-utils.ajax.js
+
+The folder 'iframe-based' contains exclusive functionalities for this mode:
+* core.iframe.js
+* link-utils.iframe.js
+* main.iframe.js
+* pivot-utils.iframe.js
+
+The folder 'unit-tests' includes unit tests on "each" component.
+
+To build the JS library you have to run one of the two scripts, depending on the chosen mode:
+
+```
+./combinejs-iframe-based.sh
+./combinejs-ajax-based.sh
+```
+
+Additionally, you can obfuscate the code by using https://github.com/javascript-obfuscator/javascript-obfuscator:
+```
+ npx javascript-obfuscator malicious.ajax.min.js --output test.js
+```
+
+
+## Extra:
+
+Speed tests outcome:
+* 10 iframes / 40 link limit = Execution time: 15:04:10.885
+* 6 iframes / 40 link limit = Execution time: 15:06:56.062
+
+https://developers.google.com/web/tools/chrome-devtools/network/reference?utm_source=devtools#timing-explanation
+**There are already six TCP connections open for this origin, which is the limit. Applies to HTTP/1.0 and HTTP/1.1 only.**
+
+![Waterfall](https://github.com/gofillo/formshaker-jslib/blob/main/images/Waterfall.jpg?raw=true)
diff --git a/agent/ajax-based/link-utils.ajax.js b/agent/ajax-based/link-utils.ajax.js
new file mode 100644
index 0000000..1f33c6c
--- /dev/null
+++ b/agent/ajax-based/link-utils.ajax.js
@@ -0,0 +1,228 @@
+
+// ------------------------------------[+] link-utils.ajax.js [+]---------------------
+
+
+var linkHolder = {}; // objeto usado como hash de links
+var SCPReferenciado = [];
+var visitedDomains = [];
+var success = found = executionTime = 0;
+var currentDomain = null;
+var stopped = false;
+var test = "";
+
+
+function getLocationInfo(uri) {
+ var a = document.createElement('a');
+ a.href = uri;
+ return a;
+}
+
+
+function getUnvisitedURI() {
+ for (var i = 0, l = visitedDomains.length, visitedDomain; i < l; ++i) {
+ visitedDomain = visitedDomains[i];
+ for (var link in linkHolder) {
+
+ if (~link.indexOf(visitedDomain) && linkHolder[link].status === '_') {
+ return link;
+ }
+ }
+ }
+
+ if (currentDomain) {
+ for (var link in linkHolder) {
+
+ if (~link.indexOf(currentDomain) && linkHolder[link].status === '_') return link;
+ }
+ visitedDomains.push(currentDomain);
+ }
+
+ for (var link in linkHolder) {
+ if (linkHolder[link].status === '_') {
+
+ currentDomain = getLocationInfo(link).hostname;
+ return link;
+ }
+ }
+
+ return null;
+}
+
+
+function LinkInfo(origin) { this.origin = origin; };
+LinkInfo.prototype = {
+ status: '_',
+ origin: ''
+};
+
+
+function pushLinks(links, origin) {
+ if (links) {
+ var i = links.length;
+ var link;
+ while (i--) {
+
+ if (linkHolder[links[i]]) continue;
+ if (origin === undefined)
+ linkHolder[links[i]] = new LinkInfo(links[i]);
+ else
+ linkHolder[links[i]] = new LinkInfo(origin);
+ ++found;
+ }
+ }
+}
+
+
+function getExecutionTime() {
+ return new Date(Date.now() - executionTime).toISOString().match(/([^T]*)Z$/)[1];
+}
+
+
+function toLink(href) {
+ return '' + href + '';
+}
+
+
+function getstatus() {
+
+ var visited = [];
+ var broken = [];
+ var unvisited = [];
+ var redirected = [];
+
+ for (var link in linkHolder) {
+ switch (linkHolder[link].status) {
+ case '_':
+ type = unvisited;
+ break;
+ case 'V':
+ type = visited;
+ break;
+ case 'X':
+ type = broken;
+ break;
+ case 'R':
+ type = redirected;
+ break;
+ }
+ type.push(linkHolder[link].status + ' ' + toLink(link) + ' ' + toLink(linkHolder[link].origin) + '');
+ }
+
+ console.log([
+ 'Execution time: ' + getExecutionTime(),
+ found + ' found',
+ unvisited.length + ' unvisited',
+ visited.length + ' visited',
+ redirected.length + ' redirected',
+ broken.length + ' broken'
+ ].join('\n'));
+
+ return {
+ broken: broken,
+ visited: visited,
+ unvisited: unvisited,
+ redirected: redirected
+ };
+}
+
+
+function showLinks() {
+
+ var encodedForms = JSON.stringify(forms).replace(/[\u00A0-\u9999<>\&]/g, function (i) {
+ return '' + i.charCodeAt(0) + ';';
+ });
+ var data = getstatus();
+ var br = '
';
+ var logInfo = [
+
+ 'Execution time: ' + getExecutionTime(),
+ found + ' found',
+ data.unvisited.length + ' unvisited',
+ data.visited.length + ' visited',
+ data.redirected.length + ' redirected',
+ data.broken.length + ' broken',
+ br,
+
+ '### BROKEN: ' + data.broken.length,
+ data.broken.sort().join(br),
+ br,
+
+ '### REDIRECTED: ' + data.redirected.length,
+ data.redirected.sort().join(br),
+ br,
+
+ '### REDUNDANT: ' + redundantURLs.length,
+ redundantURLs.sort().join(br),
+ br,
+
+ '### VISITED: ' + data.visited.length,
+ data.visited.sort().join(br),
+ br,
+
+ '### UNVISITED: ' + data.unvisited.length,
+ data.unvisited.sort().join(br),
+
+ br + br + '### FORMS: ' + forms.length,
+ br + encodedForms + br
+ ];
+
+ var popup = open(null, '_blank');
+ if (popup) {
+ popup.document.write(
+ '
f2)jNFMD&JUyy&yG4a;7f(LWb8bkR`*A~UuR2t|id)qW$VAWNk zSaq@w6M?=>o`eY)PSPM9B-+N-<%4()Iv11nhbR1xPu^!Qu;lfGIx>jBR$;_+3Te`+ zhE_LB!5Ta7-4lO@6+pJ$LLd*DhZS!~YtOqo|8CJmp>Q;QWj5qh8WfTg9tBS *UVM7_!_{tR#aI99 @KV+h =MpwuU%sZ1Vbgsl5^9`Sn@DmK8_Y=Z{ry;VwWbWwD!F*^^bf{erZfAT%lZI z*z#1s3)sWXl6ZJ$mNudn!i;qpovgqa-`d%*BY}DNNfgU_^?jj2DP3*|3x}|a%8$^U zx03AM%*B;d+Z{c}^{S2O@R<$A)O#D6+4-|mrClfOAn`77-XSkexes-VdTX?%e>{Q9 ztf)evs|h (>U{%Q0&s!JR FzBzZmvZ(;9Lt3Q!zv!f}xa9qDuq@ zQXPt6-HI5UIeMQ80u{(=J~!0TFKcbeae81cn=^-}Z7cIM7TXq7yn!V61Nr!f!(>5K z$bi*@(>rVL)<@=yAc9{$CS$pFg4N{;lKu9m^^NGy7%spfp!NH>?n@)cXiFu$&hN!0 zg3jpgS}xM%=Mscni%WKpLSxOC>FcNp4&;9q?k+=bia(&`)Gq_Pr_Y{Z7_&p`;oLhm zTv=`ATOu~xqjedfM&_Zc DAXQ+sk;{+=K)wBPloy zb)S9UE@)=q4zcMjkJYTdgHs5*S+}3u>_+akd_cVH3N~ikWWibGgs( zg#wSM){#5T ILcrynRj~D3RB?5O42A~mrgksYy zu{wBlBCwx39mGm?L;zzraOwkoYyZItgXydKwchs-RYahNvllwR4|S76wQ3SnV<9*y zFjGoAjucEcy_Vyfp`A6zQQvtW{eilhgj%tyws;vP(rY?x0mvdX#h+Jjg{B6>A6+R# zv^_dW|L9dwID>2cxtupEQAYE1-)(D#w Gs-9X #!nJuM*AWr+tqW}i08v0{Z z{d;V~*CXdQ35um#RwnEwIv}kGd2R@@9e)nx7;~W~h(H?=P{Hz`jWyA1qd{UwLd}Pn z=4)dDiq>NqQs-2ay4(irM?!kk3XUeLX6~hHD@~DTzpuC6giJ -;s48?zKdZH1gsghMhf*J4%^qgQcYkN`JU= z4BF~I_)U%xM+3Tmgd`*d5eURRhfeGof?&DCKxW)fQisLCwDDxvpETU0`~?F!IFV-&v8U8E>5J zcc~K+r f=>8>zmkZe?5I@#V0bW-5ek#-)f7jAmgIG#H9+llMjD;{qv8k`G-SwSwqHYx(P z-251+vwR&nr>2D!N;=KU=TVkeWn@~YkYJa`Wagg3=#JQ~VdsOjyM3J>*?Dj{%h} z^1sB{<#g;2f%khr>*^OkE0MrT6$1MZh9r>F&icSHupHqTNCd1*wK^Z9BuHTRh;c@| zAR{{wsM%zRr)GtfoWVHbF*#tYJZq_=t2&hg+d>2`A#QnGB#?q)8=ig$_8>P1)8eF1 z*!6-St3lG!In(O^hEmd^xCF$o24OEK Xu9 z%<9R*U)Ay@6zPnyy=-pnNflA>xvGy6b{O%1-rZ@~Axx*q#AhR&Je>}5TjmvZUmEBa ziQ>{~tz5aU{l3gBE+^k0ulT*}{lCdrtqR0nFk~cdi$tkjhJ7`v)p#?aaLDjSnKi05 zXciRD%A<`XL0?owpNwOF+VCOEu2nNCYG3Y5-{m9LOlP_R*aCDo+x+&$I5V3Ri{@me z^1M@}$9BM9X*1AlKwelNUreWpB$`i(_U7d_pQiKT;Z#c~h%j8pHz_6PF*|j&n{3Kl zEEyYnL`3Bkgy0O~MMYr&$t@Gc <1bt&2%tyz^W07menB$A+S0H3qUY+9tgrP1~BWI znai;M>@619L~(OJrDopXCbibC%P(9R$?jyDuB@>Z ^@ai(%q7V#$xt>y#OJ7bZ8=Fq%6UO$|$i6_n7# zNQzkTc{)jN7DF9VO}U>oE1`<^Q-sW2XUO0xi+qVRH9uUn2_RRIi#|g!NxqL!;U)6s zkavAw@`g^|I0iFBYA6z(B$>2*45@7}i7SB%-e>e$jn`HLwg0Uc?N !?qHb}bm#8j5ZfcQRxy=t?iu!(@Hw2%7jbP%I<=Dua4DAT zirV?~F?*Oj|5ekh-~)2uC0*+`IUneXh<7_UtQeJ@CbMs+gF~DYnV6T*+n7w_sjU8q zX}!Fz&(xQZz@zVzV9RmqA6*e!ZGS6YuU?FmMTS36yP_YTYE9+H?M-emw>*$uP~pe| zrsR~TZet>4rqiM(pr2~Gy!g;fdA($ATb`U7QQ$Rm+(fGuq&G8k`4|}n87Ewy5f~=I zwOPaG^-HrnQPeBU1MG~^t6iLXHVN6UQ^eytqXl)9+4{L(td9N5wZ27ox`rb4|82JC zTL|P=lltFlf)rIN LT|CoQ$7RyjE^w!FHLf^BRv`(l)%W ztopEpNhnA(s8cf*U#Q^<8IBtpo2nWBv)b){xquAZZ>ohvJ%_5&$a4!z!)gDJuu zef{{E3txyz3dS3MR=C5y#51Rk&MU7n1{Wcm65HB^R=+5lQ3mwCo3t;><4G55z{^R$ z0a!B;T+>PSMFrY$rKDt0QM3GSh9!%a%|Uc{2LG*8r8n(@^wM&NbuinvIBg)ecDd}} z)-`(eHueTauC$2b$ !J(=El*GM3%O zc)d9t7MAc-Rq@iJ%+vNNiT tb^uFm9;7!i1}i}}Q<@+Idiq~f7b$VruAs Xb{$vgPMswNZY4 zy?S|8k~e>#@PzfC>pH8tTO`Xa#Os8^vI^idZ{O-)d-e<>9vXMI=h4uB^Lj6CM#_NK zM&qS!d@q|th9~XF;Z#>gPd&WKIk;=R{A^596x2acbK(jv;r%Q(w_|wf*$W%=jX$JP zL)A52&Gdut6LD(w7=I3au1u8vA~EVO`bd=pi3(}|XZ=fBlIarvo%UC1X8)RQzF(=% zi?V;$3^I8U(}|;?VC(y`-EVaP>0W?&*BpYf+2Dw5YGV9!`l5RF`g0k)>bqUvKdKPB zVJ7|T*=A29?Lvt_!#PPRp`l$S*I1m|^VZoHK(4F}K#!xXyQQk__tD*9Gz2l|z2O>3 zKT{I7gR3?R$W9#|9_RTYwq_}~{A?VwUkX%l^NTmwv8eXRCNcU;^v&OzsKr4Xq>x>s z)@)vrwvxVHEYkhqQC|IsEx!ICbiJT}%i~AD7-HEI`NCfL_`QB4mm3_Y-HwKE3cPnB z`Q$H@ t1lU^j~z|Qva^;srnBRd59TI4J?#YgkXlco zsa9JggGH{L8AkqO1w@1%jR|!gwikr*_6oqB&A{P;$emOBRtC={@RPRai{~rs-;?I8 zRkipt5pT(4z=8%yx!Re#;0^yak-=&(bQ;={=LchjHGL^T{ce&<;m?S{^+;YULk5{L zWZ1?Zw~1?IvEzl;iCu9*U)$orFON9EHeSAZxAQ)gS$K}whZGmkG^qj2!gm7z;<>z_>Ae~tcKd~da; VOedU+QCgXCyN^~r#IXY;H0S*DD+_>sbl*|%t0t3iX; z!d<4*M>*9Mi>4)sz&4NtKg5k*d{}-+ME!4m`fJ+Lzbile+02@|7ANIZ`9ZCy*&WCo zN*;81?k!(;zHnowmsYYg8B38X kTP!n?E-4cGWU(%>!)=bKcqV$=y zO4utWW7nOf+ba&L>UJb71Z>A)NY<3ckXw0TG)|;E7aH3eYUR`pD)4r#jKTMHtW6gm z|KtT7Z{D(w1Tb8Te1AJCVkOaD8BD(O`$_@cXJxtGA2_FlsQ8rtBnlRYm$#1@4X@Bt zuPN;%o$uVAMLW@o#Ln0Es!}Sf-1y_^PDTzNvtr(}nWLO!Ci $Xx+?~J3hh;}qX%b(2W5;=)sy6X5TO `C#GMKGJSBRFr;@ zjDew<>S?6R@7&OiLbIvMpn$cff>2xw3RqhlDjiI(&c*5$PUwuP6Ow}?t _J->>XPe98!Twc@&KLbKzUKRz_8 zf!%v05G0p$BKSJ#&SDew%~RW+46oQzJ89V}ZXI30ew54nUL3ql+aq4wf)OS8{xo0X zL|!wqxp})n*%()iNT$j4*+_3m_6515MiiGy>|thHq~)Ey
VhnYbzQSh6YJiDYf{6$*un*nLDGW%z{5Wk-SuK9}pMIx_RXj!zDCr)DD z2(YcX4jNs1B20CF!mry@&nv|EisnX#LC>1xBVun`yI)CDZ8=#jy@fj}Hhb3iNlZV} zD?Sz7uqRtN{hOOHiZ -87~-Xmo<}BwxXW$V~(6Jv4ya;X`C+T+S&8UzW8t2;i )=p}{)EhE@$f)Pk}XTc_Ohq(Gq?d&2j+`?aSJ)b9ejLzsfe*2^+;NM^_e)Zgmt z4g>XIw#Wv|uIq!>{hV0Vu_YOU!tCL ->TH8W%UOD9new#=^z#Pp~D;_(H(8_VTfL-RbS_{zlaV zHkFtr>s#zf8rO{INs2dH8zTd1Erepruf?%8jo17RBb@5Qdp28PhnBXa5_MGIo6_uAdTkx9 z24e`unV_M12|CmV?kF}ZkC)uuSX3=Mss~!Q4u#bq%%PyDD!L`LGh^mvz;L+AvbO2p z?DZGE2jSb<>+;tg{281e8H8jZLq@>wEhNcsv^v|{^r`c}V~Op2Ry(d7->I_6T~Ovl zvAhkrn #x4L!%0 U5kH7=s29;Hr)60U)*VE`%^A zfYqH!CVaA-{s=9B3!5=R>|rC%i9o;=ydVzL?RtpeCgQu5Sr3s7>&(4Hjn=^~thgc} z1n>tnx%nJ(vpVR+r7Ku S=57Vx=LYW;{?wjiJC4vdhR&;Lpl5ccB!(SxSq#)O-;riA1_v%ZXgZ~GbUY?hK z#LNj6MH!@wmE`HZ-@*9t|Mg5P+t7B?Srg7I?~@g&yS76sL8G8qvXFm-`I0DvXL%=e znsu~jP03Z+vD@z0axhYP+hxPXGnEgvtXJIvZ*2|`^vZwEY_5JE8*R|o_xNCz!eo85 oH2{#Y3v2 J+O0#KPimIU5=`SCrV?BJ2f%Gd=Kufz literal 0 HcmV?d00001 diff --git a/agent/images/banner1.jpg b/agent/images/banner1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0f8f038a52a66ab1a5315a30cc4a2abdcd533bc GIT binary patch literal 21699 zcmdqJ2{@E*`#(HF3K>GAn2I7x$`T?|gd}^CCG(XKLMqv3B$2%cQJIkJCR?&(vPaps zti#y%8Os>vo|*URx4qB*`9AOa{@(v_ysO+t9k=_M`#P`dyw3CU`JAViznK#--fO!0 zx-b?N7T90l4~#hi(}uC`+4JWce6fLV_I>Q^Y;5eD92|T1adUEWb8&KU9pE|0dw_?J zhl`8%5HBCUfS{ltH(W^gkbv+(0YQO3AHu>4#;~#PXJ_9paDeN8!2jtl=64w1KG@D4 z9#)nUuswV%tb8oYMi>GHV_^rg{WIbJ_+r@u=D3$*-+oRm@IW~)Y!3@7>mD}NKeGl; z2Z5i%*!b8F9zS<^FTbfh#|bY1g{QC5_lav2*9n?+lOz=HJPg^-c}Ph3u*k_%l2WIo zm6Xq`sH$DizM`Y6cUAwI`3;Mkmba{|9qu|hIp1?}ee~G-iI1 dyDEc++B_<&t|*w|RvIR4nhvd0HptbA -LK)nvn$WJnZH?B%w5UlKjWCf3xhrXIRMplx6>A*#BzRFpQg( z1#BKG9}Eejn`cBy!Tw)xu{PEoLk}UiYK5tIQ&Q&(<+u5_?do1RN2>4tXdxRp#hrI~ z=how*0EXCpk|iUIivS6ZV#vy*@Rc9c7}q#a_^!)6jJm2!z1w8*;qg<6F1?XA4GXb) zix`V(hS0PxRB<3G|H8Ze (q|Bu1dn%rb`%G4T{OWN`7Pi`^trlH23GR-C>VxhUyXytM{ z1KKGjthEBV$b@~qf%!F9XgSvXHusuhKv@d(KE;0WS&L bKbTW3vRRIGj3o z>;3^rGtUf&aHVEEyvFhzu`^N(P7=dRij#HY(rZ=rt*tpk{Gi-aLk8o1BBBsqwwn-< zX6@YmKYdYG?`ZwLcfU)tHttMd^Azs5@wSey#73*PV!Kj|Y>|&r{5hvP{_)1 fH?x{EE^#jUiH4D_9DlJjhTAj1ag7fmn| zS{Lz!&e}8##GiDjkm#19w@ompJcc$+K*jf2rc$2?28kmonXnW}F)93nX<1&sCuGWm zO~Z%cco+j%4#@Oa>`&s}xFZ#pgT$@oMz-r@`pW3ndM!(1SL+v#j9Be83-Dum(a?8R zRhcSt8~zM^!WTQaLaHGR;B)Tz9Okxep3H (t-AGlOS zGI2QQQv&4R7W9kWlYv*) W?(mF+@QEB*zWuA zNsHOGU5|AWwCk^q6i?5Hl jy(I z4P7-ZOqdq>854#9TT09W3kHW0J@;dN3xI{(k(m;qayOi9GHo*AeILJx#Q7qhl^kt3 zUQaB(Wg#6OGg4FDPjMbbkv8Q;FkRRWOc yz%nDjp5VbokuAvXf^!(x zDa_my1TSX7OnjXg!Bg8mq0Tb=KR xWvRt}vFC&!B z!C)9OVNI4zWv2A}KZhcY1mEHa!_4y_1M$CT2LCiQJ?J7=Gj>yQ9=W}aVMy1?WyG!6 zdO{E;7?Y!+$b?<;qRlY=#nQ$PGB|^#)K>3AQ?<2NMo*v6uYQN|uRWbFf`LNi@Jo42 z*f~R|uOr}qGT43we|3~(wES5t^j5cy;I1EZO2AYHhSoxlwpUYf$lXksM;B)Lo#4dQ zt~z;}!ai7gF3^??kCxN0%61vpecRaTu3Q$qP$E1v{p?wrGa07|47T-s%LsoD9ERm2 z6D9)92_`v6Tjr|vc7NIR*+Q1CpHZ9qb;>-nVW25X)jZU?tjzVaGHF{=Jfn8>Z=;cu zgJR$~rO$yF^Iad)T!}9M%f3cN%?4n}yuJ>MXF?2CB;yJ-Hj?&;A?ii++!cF_h1imz zKLF!@oC)$jhaJJ92lMV#tIgcv1tHu)lzJrQocK6ekEzC8-W1e1n}}WmW8M(5ZI! zG~!9=627!c8nNX=gA2mGUrj?Ds|?nWk&j%v8l8kA``%BTZp|K3J0B7$Gld-4pnORF z?ypbvnT*2A*!6uF%N^4qT+Axv5jVS_@l10PGtQ K!uE@g%J_b&n?GOgW0CL|AMU>#6H&jT9vfy{L|C)@UTS!< zu~W9F=i0K>`&QY;b^VL&3XxEYP*i?&Zl~$)nHP-tNrvcm(m0>}1Jl73eaI|m1WNk( z!Bi)pq7L)Bg@|m93JB62G&bb8^k(mE%bTZ^UK#to+_QSF>uDJi=KncMH_Pv#S N=P2l~|C_}44 z9zXF0!y{4QSVESJl$&d5+vs$cezuw+D7hiHRFELjzhgNb*OBL&-e7_~k$ =Nci> zn1ocE$CcKe0C`;jy8U73r}rd+&&oH`$!6K|Tu|f_u}A}jbGs#jKgOj Pi8( z-YFk-JZw+qH49BlbzR7$1W^3w=`|N=T2u|!R8yK*u6wz%=qbIuHdgzXu$Gq-D}j$f zRF6GfET@K(Jc+B7B)yg-F{!RB`lh5~Q~o)=F|Dfve%ev* -~w7qSiIu|6Gr1!VMMsnuKf#iVuhn68XNb~7%bq~ zw;T)*Y(AE5_(w|Nes-=-6?db#q03~kWY1g|O?L8`+-%!3^PaM0Q4#4c??&h6@# <_q^yzaO znvTR~71mf>XzZZ_=I=5CzWLdp(y56|7&ncq$B3wiV!}u|-b`5YLJ7o5eb4PUO?^cC z-R&nkEZW7&gdHDT`6gJg`^^AkoUa>r;yDM9MGqpV{K&oKL0o1eddtw3;e{o`ug!t^ zKSWMJZ&+`*Z9i)iJKUpT^{F*`$^Uj5&f!?Y2 lwb6S$7`^8OHFkW z+d=J*HZO Tf#Za-c`mEDz|G?h+$l6jScM4 zS<9~a!)Ksw&x~&ghMV0uMdF1%5 6kW7RBSto%(=KvgZHY2 z$j^*gFBPH3=w4ObkG7|Z(qb;ABHb7;$gY$+MJm-LTa |LlYY-WnJv-{U4Tj$rUl;$w@LPYLYu9lNndYBI-)!4UV76EB+WA`=_=DtI_xb|1 zw)9AP!gq^*Jj$a=W7yXaq@OoxZ308UCSRd8Y`8Hv!C^RQQ;(vsBX>2gQJe8rOqfgD z@6{1X9N8$b(3qI=_|WGPnsAsppDN}(_R00AxNp$`mazbK7CdIccBKZ9R4EkWB5HqJ z8`+zzm}?|t+>S}1JJj3yH0;>vh1C(sN6U{D3`&fZdwL&=>&%nc6k>=v0Pxza3m8Qm za8&Xla&q7ThA!ZSg#_f8FfkmGc0?4yMgnhN!VphBsGzeWp*>*833QMt>I0s%B#LB2 zDt9tCf!oCaaK=;I3%no`FyD!E40Q|f`}f*3WVsU#T`4*Q5D6F=d;`E$ P#I%t5x|3}01pbISklw`y_0viL+=u{uZ!2zEDk}HCI@T(0Y z1j}GCXTn|~HFI!XD5`fX08u(3bKr;q9N+Q>+uT|JP}j5wLo&fb{&CCqeb&)3Py^$H zB^Ra(jQlQ*S(lva7u-&cL{6lf*Ayjn;PP;dM m;x*B#uX!}D8xqhyJ~9e(ac-dvI&6LA%d$$#Y*O!JOkTB$FHY?(ixZ8qFAH`*lT z^{sxc_te*cx$d9NkG89TZwwi4T>ry+{`amK^yxsY&r}Q2wjJ3iYr}fsNxMq&yThoD zUe6XgEcB`^i9XSRR=K`wP1d*<-VyE1*}1kCf2}_mZBb<{i4A@N bu3c3w+}8_-niKf4bgojb@h*mS;%&{5emj? z(uF*m#&+ffOzmhiL5MGW%Cgzu)|P4@0Y0Cjd}Px;@vR%nQOTjVIjebF8=LpqzFqAJ zTc$r#{3Ye6dg1G`cG>AqgdO?wn|97!gyOhmgFBC_5n_Q?dXrWIf=d_tMSEsdyVgsM zvey(JSioTqFH3T5`{(Fzevp0|%yIdWurTYMB)ob3q|3xY-s8diRScUmbUB77d$-uP z6%%&xMD@v?Z{y2g1(!AN%lxWULwBYfr0z^M_d=JQiWm9Bx#X -0|y_B404>sL>%0{@C0?5eA;0%rV7LZx}Fvjm6cRBkp@LTDQ^g zAb7{pB>suP;ni%8`O6$H-6C-V@R9t98^}ZGgSJaIP39WWhhq&!oGf-e1#`FW-)f6# zpnrq~O`#IDc9I;Q`AV;HP5R@OelVsdYERl4C${iilx`SH-B_*pSiV&?FGxv-_&uj= zsF-FS0#7*r_r%+Ud#ii5#l)+1egfY`D??MZ-nb|?R2@UIhGZPMiQ#owHrqC+j$G$| z7x-f`ShGb~v$>Mw8~z+8lAk@(NBJ5hnT>VyCJ7!YvDO4!o6dwi@1|AiI8!mU<>d3v zJ}n)RpS5y5)O{P! aU#*EeWi=~46; z%=B*v -HzOmFG$47UE=@8s?1`)Dz$j1BqBN20pinI3~&MabsH%gnJ@ zm}sk@f{RY&eNQcA$(y{H
j$t@^PNrgky0P_{ELgnjpz&|V1WMk`_vi`JieiY2UmR>J9kboWPp}t zNMJH~sXu;z6tU{UO_-dY~WZ~zijd3L5;|8Yf($g28Q%w57k{rWc@=kTHdmi&ON zUhl!or;TGKx{=iWz;2o+rnQH<#;CTzEJ!F%Chn|Co^LkCsp|Tl8u*D%r-#Q={Th6K z;kY6S!#y5l?^o%(XcOtV;)B$}PcEby)A>g_ArVOc7y<81`3T(VVh!-U3=BCB+R6a= z>x&n@lPbS{5l0OR1gYy%ClkgBtdT%J$29aRVRt1fuv8^uhBDxyihzD)1o$ywr(p zVX?CWlvY*393-^E0cmT3O!mQ<3401YApUPJ$9+ONqhg;hVP%rRj%1xLuTDiB^(nCm zO0{Zie0{@xBqX+a*P$GJW^hpj;zuzIXO|ca706v_5sE@V3x8x|z=e{k()qY{DtNiV z^{7+3<9ni_cZj%l$;@w??wO0jQW>>B7_NWT`p< }lmF z)tkc(JVGfBmZOJyY6xZ9aaJ8yt7H5&d38DF*?kMq#<2-W(wUfFAZye2PWqo~n7$?L z1xUIHZPXm|!g9d};+L%VTEOfJyo@Wm>{0H1t6|pXo_&lK!&stxClghO{VZ`0TQd0k zTJYgd-{iJvwwXIDc11dZvbPCW2-A4;iJDuD*W%z0^<4U*QCV5?9a6huAX#;FPW{ni zVBlgY(Jg8Iu_!8RpBQ#oEDR54DEMC1U?n>=F+?M{pX_?%dwK3jtG)Vi$C+&S3I8B} z9Zs1IQ^yQvwipPr7!0d@UmbYBzng%PX*_EbD%r0dw8UVctv&ml(xTKjncN^9NKkDB zggi^J9t3u(_U?CjI6Vr|mW;qSA@|s}4aIX=$;N#SaXA4%Nnpm{7t3}e$@uVLyi<_W zxgR#P?|9?0*jd9MIaI-4A7`F_BCO+nFkza$8PWHgzYcp1SzsBj>;DebgR=e}@hUe^ z+tO*++~o&w==E >xTS<3i(Grrho@zInQwzBb-L znROqA=x5NIX8cbRzT@iRRsc-jp@Sj>zL23bq%2eU@?*03)$qKs(6~8kCal1K5rjsP zc;M7$3QKWJSR003Ni&}UXpI2Z6drC>c~N8Y$?8YsEo(j1q!}{(cfuKrtmT}_iVN+o z9TX@txxzUfgs4kekGTGbSF+Y?+uCG5XJ*bNV~u#DJy5%j->qN7+B0WTZHqAjbMqQ1 zlg(BQTT{{R-n$kLmEXmBi+XRkk7T_8lvjSam8P %)NI4srJL{2$OB3C*-=fMN$&(lFaw2~x2?8-e#LJ*sWC1} z5-XpIqH>!r^%R!Jk~@boBp<~&zkJ1n-G91 Jt1GEIG%2^+3h zAM;bM?XPxz)8g@@$ZPQ4Ca%L3V7mQQOqeo~F^Qr1*f -0 z5UzTi)2v{dnggO~1YCSAPbveihm7oei}&mlTtXk9a?#U2xQT>?W9a$rh~cu4?22TU zgN{DOIXGCODY$k#^`3kra?>mj1%lZKj-iH12UeTGcT|wHXyAJD3YIg8fqVVTyqbm; z+^%5kd~HJNi3&XaeVLLgC-e2cB|oZV!ootRnE;4OHUTa5VikzTiED^rc+;9FwUiP| znoTLB4mMhMyp>gPGPtO1k>+b#So2(8?;+1VHm^R*R^?6OWq=zb^(NzXCxMFevBWYZ zq|lU@D=A4nQ|mnHrF%Oh`;|jB=Q%^O_o t3ZsW?WR3TF4@ z5~&&gsP+`5RfUYAhj@UUG8mkU2{h&ld`w5oV@!Qj7%MSMm;mxL`>kHUV2-;pVYe-J zB5^mB!1>!}gBi47+^N;^z+Cw`>AZGZz!X)2m<39Y01F89|D5}Fo5<#r10;A80pU7+ zW K4p+1qXU)zOKt3fK2!|aH}{q4rGhO^^# zIHaR_gaOj&1UK{p*XKz+g@@j@57NUuFq=1&wf|;802M(p)~0ey3~4A&(!Ob}H?5A7 zT66V}{QTB`BRb<)Gw+kF*>8b3*+% `3JRdJ(7?)AsfH)BwmgQFPI4f#FaDk3!y zQ^E;n$E`J!)miFmuHTK*Tt11R5o?d)ekw|PB%S$)3ZU;|$05P!SoQD+-ghV=QCs1_ zEsx>);M7yN$i2lRF`B;5uPR-fl55Je&IyS~%pn(~G=#_HA}7+AFyX(bUgSta4zsU^ zc8w!X7+malkpH;gIvd^RLeO2oFXp#Rnwow(XA=NU+|bZ&n@c5a`I=e2S2vU=tpUXG z1)cpzyLN%j|Ix1hT!Pd(nz`>wUmWEH^=S^r2Cr+$a3;^?TV9;6R$erragZN1*M;Of zX@n=fP2qF?@-(vq;Om+4-aRKSsYAadyS2sosp(!`a$}99zgA>>&iTBGH8`gxfwdiM z@jBpm&(vmZSH6#tKnjq>YRV|aZ{Pob4f4y{wnqAi3Ro0M8dMH!8C<;3A+9_#-RjBh z)<5=JI ikXn#6@m12Mt~SnMVU+>E?zb|ZM9UngO+KG6{{P}4a+yP?edTx z3&?gtyLF>J`k+V#Yi#8O^&?Hgkk3isE9(V3k-sNOLfN9XV9~pg5QF-BLe60_JbDYo z?e>KUbL!h%h&F>ydiCEn_I5n}bn`^zxm(=22Tog9D-wQutvF3o>qtVGt%p<_Dy@v6 zya`|4cRVSpQJ*ZdX&P>-O-x^?u&&K|;3bT23}@bn*s&u$tuOg5fceN{lxqTvM(G z(oeU2YiMco#*q72dJFq4pPOvCqID;}I{f@q`9(7iUw-4$yu_Td+X_0l!eBMXg`~&W z|BYzOd)sCa$yYSkP<5-}{h1D(q;*sJfc@*}fSEYcrvv!QH9`~b;gf{0 4alV%7a~h@mt#|Y#bBjDDoSQF-Ph~f}S8ozA O#jkv-G!`D5qhH+tsGR^NY}kXX$4Uq!+N9|5m?o z065 UN(QDW}Ch?9k-0-L{7hF!oJ2s8G?V$ zO&$GzznA +kPY$RMLxz%zM6U^qQ;x(Xdkj~ao-k>AOf|6 zr3yy3m-xb)dIB$ZxeHT$Y~GabUct+~pE{bP8F3uY8IPlmI)O<6&mKiK*12bHu41&Q zrj0M_`_uFz5)<{>;biZ)c8S5%AS?3L1vQbwg54>iMl+78$6`Z8+yzN h68az2;1@hyJyiyRl5z*@=lD6;#L*mF)|+mxYon4-Vh{ zPP|%l>|wm__i2UC)4TzZG=~WcB=FX(%U!Mv`(pQQ)ihslRG|y)=8{-R^HnQ2?NaVk zrkLAG3AD%~opgGr2tSKCLk b(M*{Y3z5)UOj%T zYm2VqInae7gH%&&Y3}o!tf6{KDDFyLRa&-7#=^GB_O{88m5pvsyVrwB@fcXElf!qI zWjmf11C&=zjpObo=C_m6&fsCs!;LEL5ywUzm#_ VMIs7WPXarl%Ox-x=SBroP{n*JG!lZ25A}2c@y|ajFG=F^B`*lCI z?Myq~MqV+KUW##9qoUH}!;QMFuR=#M)wwQyit<8sz>KrfT8`OQ^fU(Q(5Rl{Q$Y zp`&**vmg6A#m*|M_48wrs_HQB&D(@0&`AIDAaFj}wy27daSVC5pj}<{71CEBmN$VV zw?Cf{6sz`2h 4co_Gc~Sr3Ywmbs*dF6+^kga* z$ $k9qiY!NpWN+|?Cl;o|-=eX5$%6g*@=uW1D` pi}!?q|fU>{Cy1$BT34pBBB$c64y! zebDwFFhu{PB8%aK^nHGe?jHEnz9r{sJPSzk9@J{&u57|t%ER4qz08rpiq4HKqzD-q zimud|dn3hI=h}`4%E6T{iQ&h<+H5z0eS3^K4P?Pfh&O N^jo1jKw;f*?B zIf(iDy_rfZZN}J~HV9(z^xHbjQ}lhAH7xa{Gt>vrJ18csj0GM*1%jL-gPhF { *Aupn#q+vzUsJ631zO6R*Un5sqTxEh4^fh=s4gv}V z$gSDGk=wO@=e8?I_qCl1C{ZSC(9M%B5muvsmuVWvDONt1K*gdIX-nY`mj%{s1+ui{ zs%|ja7&_Bn_M|S90Dk`CA8Nu;fr1`>^Pya$wv$;Kv1OJaWn-uoJBfa!rKsFPZt7!p z#Cv!59NxzrJ ^ zl>@bhMkVY^)+R?59 P OVpJj8d0)ke zz47*4vhB@<3hdPb9^c(kXs^; D1p&v($}p-h-h zHbZa+F&D>+`7w8x2}8MJ7Vd+^UeaLYZ%*UsK_BzAG$*ZAx>ls#%;dVPVK~T<&QZ!5 z0>8tuf{H u 1)Mei{cO_dH@wJfHe`FM0-L;p$oIuG#f5t@ z8u;ZY{zW~Er3LvOJL^rosTJdF!svqKz~Glht!_T vVPr^C#9y=~h)L2u43@81@IjHvwN < zweQC$j^-nRG?@wP;RPgbjbs)zPOHkMUB>jebBO66N8ab=x4IFAMJKn#b+VoYBXl z)pvG4>k(u@ V$}v4#BRi(u&22vLP*>ubSlLT+N(fmeJ*F~$bJ_iuMX2TK{Q z7 {0Xkm=a&sD9`-cgfWr%88{R`f)rNZF642H}xVO~)v z`rd0$39e&H08;2J0^@yOE#a(0fD}a_RXRBfb@-{?B*p>^SI)$<*Z8 zAc7#~$1@O)?eZ`SvUFE)1h$?*G&NiVcHI!N1f5!M@$`dRR0mWg;hz+=TFDo+7tnE= z$ebF0Q=T+~E=9!akOCJbY@HWS-=ch|$?_iyPN)+V$P7nP>2}edQa60V1b8_NilTo} z3esAld?5e&{Co805kvRzt5zT}>x6$5oCKjiZV|hA02F^fQ9+Q_suP%X|M|^a>9n3f z_Z7k{=F&{9oUweJNnOFg 72CKdWG5hlV%5nk E4)RbbPOIkShJr6OSGG(75IzohYVW~i9s7We!yv| zht`1ALJa3Yy+)7I(SA4OK}`FT-?2x1fxsLyA*y+4w=+U{%oYcghBmn$-h~PX37p&5 za7?Lj1M+#Hz_=JG49mW3Te#J8 Q%mG>`?9X+>^3dloDXYm?M~-7x(}ST!Ybg !AQ;^0dvLwB&yP_Swq*B z*PK08TTZ5)lwiCjEC;}M$iU<9G7Q0okvDZ{`rD_OFo)lm&X@}N4vLh|TPIp$e {4g?0iUAq^dcrTXB!Jon7z%C!yMxghYIIy~-Tg0Kos^|F=NpSwh3=b4 zA(dhu>iRA9RKlr%p+CiLiUYyTng)t0gSFkZCH3~Rqgh6Bc!_{b)n}^py)h!fZJ$G* zT>BVr7ojfx9Y6Vuu@};z^?08UuNIyB;6RV5dsbbD6MxcH#6GdiG2Zj()}u>Xb)! zZWaA*c|$+ d&vS5#| zlTdWcfe(RN-Aq_XjsC~sC2P+&r9r7HDxbDGj)-MSZWIYI4jWIx>HO_npt1G2|2M(t zoSvLD)lYP|9z4b2^Jj{$|3+xQX{FlfP7p-G%&FR-th}KGL}+^(F@7pLY3X~_v`A+- zgvfFcDPT!bufDbC$J5vOu%J3|auFjkF+5Yqn;mn-&0OVIUR`f)#M`LuY&E69v~(Q- z%gfU*?S|@dtvX%24|ckH9nq0BQYeZ(dxOSn=!bz6u=Vg=$y5Y`m2=Bq=5$ZC`BWr2 zXSKnB?5i{&Qji|BbGM%{>! ?%B zdKn>kn2Co#0{|!XBU$TTl+gb`+5g9`T6-!0#_Y$ae5Cvqk uSnAaXkI $CQ+hpgZ>`nCqMf9 WdaQz>7M4^zo^Al{8Y*$kR$Uwq-s{Zc!P?fF%wz`*p^^6l~XSHnrU1=L= |Bbbq$`rv`0N*1SyDGULonrWO_(9d?%_b8 zDLJkBHpQeK4+)h+2YDtx1ZH1Uk>Xb8yM*X*#9Y8sR6uDeO;{R_0Vw+vq8HJCobd-* zkrO85Lm}rW!#yJn{ EfhPD@ zG-5XWnJj+ue&TK&5h-wQ9NshCw?(&W(C&4hZKo!-+0^4LAHtv|5|*-$o?qrUB&kg; zCEENDG8^ s$Mj`y~k&oAQy zftWAj{rj0POK$C%n4sXf+}73)@OiCHN(EIs2gN1h8CAPKY5IL$6mA%5=@O+PpZh0< zrMu+~HTXF`IxzFGO-v@rkG17Q+Vfiv^uFR|(BB#;f6+f{9z(Y=WGnEb@oeRR;Pu=- z4K?r6=Y3wy%^oodtUTAFbC{z@_eL;APry=~luQf@CudIL!)x3pTOm5ay38iW$06`8 ziClZ(!r8m_zjJW_;D^KqT2K>7HWV*x6ZU|&@Z +c|UiVn2QK(9L4{PLaf|ZghbW`vZWe%Hrw`r5~}cHOaFN{kqWN zMLcrFo_bhjr;$9^1Q!l8>BE<4polT3#=#T`gS_$92j&-({nYh7e=oWdjLebe3N$A9 z#9kFULiPwJ?(t(a=u5Bcq?4MfTp5;f9@)i}k;Gvaxz!VYk$>_FKDO@)QQKQfq5~md zB1cn^YD_d#Y(VgD1>g=*If<89U4>SAQ44;m2lpGd%ep~VhmHmHoGTAT-e39`=iQAm zKCpOX>6V9kRxEM+?m<1J>xV_J{`gCejrUP1bQP@9PfY6w0Du&kAy5&frNU;wYZH*` z{^LTRGYOpzO17P-n#BK&SWr4k-ka Rx3k#9D0jlI8`n(xE30#@$jGg^v%a zW*$&(>RVSK{#tHX)c*iq6d~C4dVIR|q0ikZ@#~FPZztrX19muozbCM$&phvGXXp8R zaZNAlas!R~jyJ}0>x(7u^ZXUMc}5R@Y-!taru9ByWP`z}=0H p@=8*>NmKW9>TRUC2iA-i7& zV-OTuMb?%ZrZ}Gdss<3|2YS%sQQS8?q7b8jIEa>^f}gy|8VqzJUes<(EeK^W7 ijN5~a2XY}5o3(s)j&liT6Qf?y1H#P(ej#g=acRgMQF zLf~KnC9iiHG*(YkbfYC)NPakO$@?Pjw8K()(MvokdI{01X1ZFzL2s?_qy!hlrXZ*+ ze+RTyq}#I!od^|xxoEotdFJTeE&m!hd-h54^9JtSyB3IpzNJ@49&dJ&Uns{QwR;o7 zs{4xK$4~B7zvP%hB_fLvE2bHYRy@fV#O}1MJGFyFHK+i$43{&%ReVl${F*8L6I$ka zVMj~mHnyh_E$}0Of#jf;2n{dXn45KIbhGO8!(-)UnEnRDSPaKeseg|x3-Iq4!9XGM zwIf3{M~Ll0O%HzmD7O8XL1=pNvY0Kn{Rr=V*wn&p3$zoa4i3~oECkf6&skVTWIX=* z{6FIT|CxWY?xfH<&2sfq~SxyhZNj^`%DZ(2~83gC2+(F_0+LVKQ6tjC~CsArOb3 zBZ*uz76+9^%*ttgbC*4Df4D!%ewmAXqlI>ORTuP~-o^0?Nitvi-Oz~OM9a7l_%}s0 z-SxhsPgV!e@}nNh(Np|nJQ7c}jOjg*jp>~o={rE+_qA*qo_p&3)7`BhwTbdPe?+v4 z;4%nj>&7~p?E{AcZrk;^li#J(Ww`mhOTNp-fs$d+vVUc&`_)qpvfw(r2~ItUs6!xp ze_kW=BxV~=OtCLp3hmm(W4h!gE!m0Z5L@cOBX1&u_wVS>)^bq+TV=;kyC>Ky%E&jY zQH^pJH1@h{$(M|~i-vZ?Dz|+{X@m1V%bnmcS*ig|ckxgvUnRB r1 zM1RNUWPX~nB`2V&@Bl2|L4+XoKRyzqc$NAn9n~tro?tpqkWpLnW-7_W(M;D^-O_cJ z1(il1T@lsXuPGU5SbKNxtf<(q0D98y;VtwjB`AMuJy=tLUI?N~D*k|`0u^piO)?Hs zBJB0040F6S{@VS)z#yO!CZVlybr0`c%*0-^%dN0n=v3-qxmn*V-Pjv<3IJG+-6uYP z&vRus<6R6?%Lv1Y#H_3;SrZ#7&LUFDG&rv!J{Y$7{R6yjjd~(GcGVmI6s 17TZEADl|)9IK_+ n*W|WfsYanMlT$g31HUS7fR_X6m9oM|%*_rTvEkVVm{7DyW?BueyzZ zpbj+5(4;RJ!-(hOT#=*P`w|)`Pciam@RAHkOr2A$oNt0jipJsedAkEW+X$(4F4Wi* zJ^P_JGSp$w4FI0W1#B516~#EDWUt?uOn>%iA^_7;i?N2$dFi0YKaq?%z&Pc5#Im1p z#1}nMmv*7-`KsLUp72D+z_$JCVl3;&J+w;L>%`TLS`zs)b(dqatc*B6*KzdJl1TE< zA%iKO@G~dGj(sK(qTCf}otmwM&f@gs=OMYf>ARMVno 1&5fy%w) zi(=I6hBFc_qGLhM#CsYdDK?~Ps#}BNWei#U# 6|kf+)EB9Ao>n@2yzy(PPzz#f4A+k+h@8}CNotFi5vr8R1v9Kb0Uw_j|Z z`GupFR-fCAccc7d><1ba8?Bh0x_L{(WlG&wo*{|St|v?QD_vI$Q|xNH-0 zM^3!bRHph(#tombfeX33MDQ;T5D5*|O}&nC9-5vCg68$D((h!pcCNv<-Z3UjI8qor z*u#YwXTsCkv*fKdJ;jAX*D0T`qOFSFy_ksJZn!qjb77CME5k#>lK9@TMeJ06pmvd+ ze$J9e*01DbAG3F5CDn(VkY>iB`4meAmk!aT3_Fz2FnnFob+Pv3Qzx~hqYsQ|n6=O0 z3|3Usuq|bvD)HlBQuBI`+N;?L%ioTdzL)H+8+rBW-BG7tq$6hHEy!X7Zr>x5;}K+e z;@)ugBHv!?=kf(|%EF M8nKzCK0)K_c?H-WjGvv~iaFdX&wmxri zBleAW4_?+DZ1L1^-9a5hoo=j>NnRB3!JenzVL@?ONCqMWPUrJOl5!AG_@zTg(2@UH zKCBGON`OFrQf5Q?*g{8%+wR5CJL)bUoH#ukq94Q-So)f *&) z 5?8)Na?GR+U*CS %@QAx)$z{C>)^l>o!QVbRT^vxa3~`u$&M}D!zQIzFbpX@Mp+ic0FFKIZ z?%QD0v(i QGaw|&0V=)i{tm7(X(E#i}fO| z(L+AK#p!8CM;r|Ov&yJ2+n2L>wS!=hq*l~EGcu|a8);!=lg+l-wI1+%Iu52K9R1iZ*h8@D(uVV2|Q zEzW*bgICXW2R?;_4&o<_n{qwm?<=`sSr*sho97zLUZl&7oL?0=cJY-7ZLrw~OR|C= zaX}(#E*Jb>I6q9NU-)DbAP*m7VQ+l0@KRDg_@raPn!;zt!|@McUg*c}SpP0^Z~% zYy~;PpOv3t{nZPZXf`@XGTt7vx8KC%2(Xag&3LM~XXDzQp)prGw!z2Xx3&(Mgn-`y zk-G2MwpE|0s5=ecy|;h4hFHtqr$ifrn^%^6t4M1wDNRXF9e;f8CwJt7wl=?;Y`mAJ z`A|Kexzx=wq?V_9x?kBi5`EC%hS~2g{S%dmB*oC!Q_hc;Kcqq&^t@Ub7YtCF@5PBy zr*ul)M8$9QaepbkntnUe;?{sJYo@B<^b=XXi}zS5l8pVHG<`Q@83&L-FJ?!|A2A`z zKbPN|qP$sHWt0E#>4zlkG4i+li-F%7;| XAP75I{UD`r#h1H1@15l&b~2HpTr#4(u> z6OX?wvkp*Q5U62oHyP9RT4CmgWVU*OITm6- z2_cs~L78jw3rJ-Gz{7#nKj2evdf) !R9 zglXQHh~`J-ry=Ms&@8@gMg}s*p?3VK0>TG!T#CmHsI6yxkP)~JBvpd25;K7h`BE!E zeKgf>1n0T6xV@CSFx)gWa$oXXftiltX0%|eLcwo4;e(pCjIxnHJ<|Kt*H!QFkxEvZ z1Gks_#L~I6Ec;aNJCHxX;p7&GKa=7^o~eoOCiNQje6n93z2|xInQo9)V_W!qn_fAZ z12Q3PC5NI @Gwp;tbjh+&TyPn+qN9D{53TE87m@dzLrh)sj*vA$ z1%D)PS%B`EI8M8G`)UzY81&$T)p}$=N!&L&F=94f)3yUek8m6Bau+4D7qjIX`e?Hb zj{;a> Q4hQLy)3l z6=*et{Ppl#A1~Qa-W!!H<)N=6QeP~d;uw=hy JWV!efv8##PdGTQOwc@NBQ7I%YA zcgmtfzQYK(%=!x@*>>jfWEhv8+ZGU2!JB#&Ma4&Q)$%cJy`4Kc(z-A%4%U9iN481; znh4=H
)xBHRka;8NM` zshiRw%qT!1C*PPYYTjn3L+aFwPx{mwTz&T}sP~hmYdvaMst?Uy;-&DuSPF( a_l!tE8XC*{@#xBK5Z!&e+?N~boY<`u9ZI{_9MKSW ze-Uk9nZ_a1Z$N4+@0Z{*CkbrwrH|qs_QdH#_D?#r_*%x-Ic5%6pF|~+fID^OZb~CY z?*`@+(}l+Im^!{j+6J@H(3BIp;#=bQ=mFP9u6W(k-#960n7HXmev3Vjmlr9`Tt 3q0M+mWL7u^BhndNQIb ZVKHj)A1ajf?y0{l? zuTB{LI&iodlDsTwigv(>j*nQQ2TBX)$SP}vwiAe+t?H>?sf20Md8B{Y>953XG1iem zki;`VBlwW`tQCwdyvAQ)TXy=9!oXPiXvO)uDReOw{*vSoOfWTN%oG`j7YQQxYt{m% zIg&;PtWifYvl%t)ZmenfY^{AS5ORL)WW3)Ai>XP}g}J !Y(S z6sOXWD?$0T9r77w-%4{%Q??Wl3Y57rww)uo2cKNyHJEiPxVi}37fE*K+Q4&_*Qs>M zyzs@rQcUaJpGHz*f`W9B4GkG^@`o}dj;lbA!3MPAkB_t;#biMTY6UJEG?Vd0QpCBU z*BoUUy SHFHWZW&5TpL3>n-;Kw0l2*i0O1 ;7}5zF_tz7=qMD^ZhMGP^ zn@!Z42w_T|l3>S +4>tc!v>cv>a6D7hrcHlRql4>7S#)Ps1n zsjR?8z@flRiVg4`fz) AURd)|;W`}xf|^OIzZ)EmtUh_F z7q>}-)NaiYx|r$YhOL~Md80HKgNPy8wHuO{KPK#7SXDkac=fDCw)C|45k2!I;<^H2 zL}^AMs#jDB8$ec~+BVCYm?!f?8Ibvt&cOKmuzj_e*Qwta`#yIg4I3QFlfoB?$`LmH zA9K0!uoV`vn!sx=#9 MN%YBVKUwd z{2|jssFmE*GM@Q(+HcC=Ha5pTWTZf)oaVRetJetFeQ}doCPFF`{(>>SS@#%Z0kS%c zw0&aa{0assKwKHA+`{v{)h0GqM)fADi(jqwe9vG)rtnf?XQ`ZsY4RP}J$e`)7@(Q! ziul%TW{^7UTpU|}`R8Wc%0rc!7ZdXk^JHm6HiPd9 RttiKM 4aBrQF@6C|3H)B3HtR!9%qAjRY#oBl$fF6WVxTLeLY!a8 zNYsP}EjV` !B`S}0p6c<~C34^VOOf_(b=v>g J8U5G0zX9<&=|unl literal 0 HcmV?d00001 diff --git a/agent/images/demo-dvwa.gif b/agent/images/demo-dvwa.gif new file mode 100644 index 0000000000000000000000000000000000000000..e23dbeb033a73c9521841542766ea440018a62e9 GIT binary patch literal 2944169 zcmd42S5OmN_=lN7LJJUj=%M!zddGxbq=+a;4ZTT`CQVETO+iFKnjj#kh=>6J>4qxO zq<0k&kg9YdCGPj%zI(TK`^ eRw7Ft;!^KP1Z&V@TTrK) F!;8Tzo=A zR77A Th#1rKe}5y}jmb4T)6uwyyR4hvw$i){g&!&d#oZ!NKu~ ziMfTzt;N}+`T3vUm%e{rT3-ISy1Kfyw)X3PSX
o>i`uk#g@AS_;Wp|&lw@=wW_ J_`i96O!*&A{+^xuJ^eqW{Qdj?kn+EC^1pKYzj1VQa&U06w|DaA z&&k#nW&Iardy8_kclwuddU|^Hf8+fB!Nvaz>i@qH{>Nx#WOvm7Yh$E@LW6<-1w!~Q z4Gk^85+L_K;rO4J0O+UyX*&L<#NJdQ9lMNkKdG!c6)tLCWLo>YHyxoIVAt=_OMZwn zxX-V-iv>erT$RqBZN&%j(4GTDX6!Eq3#FZEdJ4h`;KvvugMfK` ~AfkjbhBP$piro9mcHV(NQAwW>R_!eA%^Gp|bMF0zZJlv55z35a^@ zmK-E+n5BKv>GC{QIpb|5u$!hi;-{nOnL9E0A^YX)v%B^?&<~tY_9%>cVp6xmRrVd> zp47k@u4OG!Y1si5t{-jM^L9Z^e_974=JmB)Bu!8klLfbpkJ(GBc5CIjrK8!)GvwdD zJKWxS@@J`=nlALOxFPG{SIIl0gykjr6$XP22W&^j#TljdUFel-U7w$6?TIbnX}I!j z2`IDD`9zr7`VtXtEcGLa CmY$=LFA)wV^Bnzab6<3sd0gKet{u2NF*U@?q2wlm&?hFb;eyjJkGfV&a4hu z*tCGXMyKF!1>9hLxr)3;;X !ebT>*BBrG!W1|`NxI-n2$l!1WOXPZ~ zavJVeS(?OY9-T65bG )J8p?kndCV`lYNYa^qELip*wZMXsX^ iX$`t+!2Un|>)Sx1_G$@F~0Ii+esrXXoL5D@Lle{DrBVYrIR(PtWAn z2rn=KX}E&1*U##_WA4g$!-YYgr!2?hx`ZfHWw(^bBI7_Jz*R=G48jgiOTjG4q|xpU z=p7`nRhxn-hHH yI`|0= z&J?3oZNTggy1&-_dmmY=U)@kJIw&v`r_jfHMy`$dRg14{mASj?(=97ERQue 9 zqxj@7EcSHOH~8-UsH=XK+U28JFUk4!Hxj_;iI+D&?5J6ycwTNThEHHlzDECgdqVvd zf3kD(J@%kQ*x_S>)XgHr5sexb(ON{%q>fDRwvAjsX?cBS8KnX<;}bX9C_bFrxw-^_ z&iF+J1=kSArnZQ%p!T`$r&{so&KOaPctIA!ligR$B02uy?LterPh;dNvxtFObYrAE zxe1%|k1A~&2A}j-P^^J+Zq5>eUp`x%B^=ekB)|BLw8ek+_%}TtxNwJjK-+YJR6Lqy zJojyvNh`TvkQ^m2pGqdBKiR?4UB*q0WW%A ^3>z?Z#wFksgZ|vJNhea0W!F9M4)Klt5 z7}q1=(};nG?4RfQbJQ@HAGaQjYxh6Zzo%DFka78K=Z$Bk^vb6jrIy*S7vfK#udEX= zSt*O(X>WfXbdCB%nB9WW+*a?z=vLif5-wAE^qLEeA5wQ&f1v*@67DOQRM?Tx566X; zz|8{+#O!`>|98_0ZkEw1*YcS6-D8X7^#c)W?=c!QfEAP6q4w1N&c%8p7%^g#3Sg?l z(3;!0`2S#{v#jL0*^rDH>IZV}cIjs$@ZzznvdN-@?0?wHCoEB7PZr4BtenQ|^1pA$ z^S(ADIS>??jX>|s=+ gTb; zgCzYdY2YbYhJrNEoHlQuHHml_I$;4SuV9Q{LScRw<3mpYQTr;`Dj6D@)pEj!9#TAa zht+bHb%EjX8fcBqBmr$9 K&3Eml@Im++#{;n>`i^^gF}nS(-FbWl-UoI0!`lYc zQSj;u??9dP`5CxvXDU8CiRnit&$Fm3p6arESS|JC?dPAf ;_Fzt z3b~8DW
u$_bbdx*eL;ky01e zn~nYK0Jv^2UV2&P>9%N0-jr_5(vU1Xlj`y2{ww@7w%67pg7mus{VW=fXr930afJX&bLjk24PYzZCb{+BSW=Pp&I`P+#$<+W}YgV*G}ab@1uoE8pB{VXrUX)kI52t{vlkq!yM#(F~kBR&~cA-@ U+{`$vjA^7ZRJ|8m ky5G&w4W hdh}ov?VjgG~m3xyt()z8PxS^}qIL+h!Fm5Ru zPLH7OR$8S&-~0m4(Ep$}nAKmtM1nYrios^WO{<%g1BYi$r@0D%yiI0}I8m=zc6#C} zi+&Q?VRx6Lehx;EqGvP&_aDEz$JKc87(EJDm`eEE@b>9W9v$ICr`e39109!>)=8Up z|Kf+)9g6HW=5#jo0-i$6y4XHYKDK1Xo_taOPIY%2t-J#M{q%73sP*5)?!%AgzpVeA zF8rfXzI>#feECQH^6?^-7EiSYF&sm2HlRap_x7;xl=AR|va8{p?m|F$P7_taEs+;k zO?jU%ZlGtDyJ*^#FgVZ?DGZd{2RL>Sm~RoZpYSUCUg_8uPCKwOO|e6|1A97^v`9cB zb#691u$h(1{M9woD5!fvM+T5|#YDm31y}{c@7d_^(AYv34Srza$0;n%3 #-`OPV%BWOT%V2xI=RN$_5$0jEAU7%BXf=$BxL@2%Y62w{E_^3@ z#u1SNK75X)>H#3pAK fIKf`{Njp>Csk4q2*os_BinHij6QcM|3`_5lpFam=0IcTJGJ35fnE#1{aa zI)IQIGCt*J49;dqiqcdepw;>JMjfu{Wu@!jVy{W4p+bFR0R9Y$G$FVc!(HeHZ^zl& zY%-6qDW>4G%CwIr?0PupzfO>^4N&TqwbULk#0CTlb#Wqt9kVjNq_8oSf=f+l_;Epc zp%9-XFe5$G4-Q@T3bH3>IPZcOVjx;b?w?}Ze|rG>SvDVxX%w(v92sDUhsf7c0fV&c z`JVu6I3Ua)YKX_LrP=r(fz!Ux8gp56e$l!B=!UA9R7|#Jb9RaeP Er&LRTCj~OWgRD44vvDqUVSRhhT0#XQ!=@1BZzut5|-RMvCbDvP8jA zE~Tz~v11Oo{XAZXDld{lPaXat2mD6_1bW1$k;|vHuN&8?Bu56FDk;h1R1@N=aes4TW^usD+!0#(BTW5i@KY-p$E4EUAkEL!rp#bwJ5H|^$ zKsfr*FOXa)#32;k->-1kS&SxwL*V8v0I2d3$S|~&);%3`%HK!_YMzZyAvspRl5DAj zf0==6;mdeqp@(CT+J2D164YT-p<}gF*|A)`rL^V*$Yx%~WnStn0tHTh4Uym`Gn$Iq zu}gj`y+7d_`RTt9tjd76_cLtVh9x5g`X>ch%C*2?Bv`5pEHn3zo<0j?mgR~Bi !pdgb+O0OxZ>~jQAdTNGN(Z zuXu3WD#$Mj3v)-5Z+KeNxtBF_l;67|sIDd$>U9NZ4JUaeU8$|WigGRhSOEop=4u7c zYLN>9tmry1?X& BvIW(mV+tq^<}K%AW(5fmgz?AU~uU5&&&b4m{;CSB955x0VEOmeMQM zGtcvh?UsmOGU$Fh2&c^?9l 9zV+J4<6icLA>&_F|?a6V7`8a>xEU?)lrckTM zTA&{W%t{7&YSrmH1+tPL+L*dr?Pe`>-7mvBHzbWH<6}{6tCF)yiO+G&IOvyYfDZ{Y z;*E160j03O;8BniYcne*KrHaigR>@9crypSC9n04=vI>wpgGt^+!qZNv&hJ0Op*z0 z7PAl<)ou^BpqZdDwr9k(Pqad4qi~L;?Mr+e%i0|)P91A;9qUg!Hd{Nk7dn2Qb?h#* z(?LGw%6<&Nd@KsYhZ~2w;yYFcLJ2V%cUch@M^`}Z9(0q4?SOo2SpmNjt2;-S=nNTw zv_<>?Dk-tCVrqHPYb(Ktwm&r7$4K<`Kotj0wpK50ZQhDK01E)fwkt2J-L2x>t#+Ap zG_Y G0{p29MDmk6oyujHSvT*q#LOA!Qaz(lDI@ z1s&7PTVtD}EpSV4->eu0AUGJ{@4gtLtlgln3%tp19<0-QExy+*9{$tI*A3twoF0pU zf1ujlw|V31_`8W6UE8f2fAdlXy9yi%BY}KEKlsUT15VnWYd7m+>TpY7)?H8t99qf` z1>XCd>jcuZ3Gi8JuF$C)Q)?+3{LBh?EOjehf%Uc0=;M(i2zMyZU>Bm$2`b?q2-(f@ zDQtbR^|?%LfEV4s2X8Y#*Y(Q{i35gomFmtTn)OFPGqUZ=PVGORwyzAfAD=;;@E_OW zN7jo*HrqzF7e@{QKmL*%sp0$Lh5?CMfZS|Gew}@U<%ctyvZiaI*fYqq5x4ZZ$e+fI zSe#jTMr~QsY %tDkw-m#T&kElF8s8c zYjSYFOTm4#j=2mJh!-H<>;cB!8~3tAVH)YjV#MIiN|-7KIm@xA`ljT`#>Q9`WRF3X zKjR+cq5!V63$2F4-r5!n+3mY=0hA<7VRdN?E @DL*i$2{alv%UTM=WexLVXsWhn zoA?F`_<(t^$L~!BrG&wm8E93-Y*;90CgX#i6f@BNvOKOzr2?_!_24E`el{c(E ~` zoxuRNQa+c9DQ9_0<-ld;1UTHaeunsEXW~;RBkNjP=B6K3l7n5D{QX)!_Bj*^$Yf^< zg-lkq6%K)kF0+MCKc@|U=EOlS2RCQRgZ<&Wte80qt2&3QxzaatBv{Lxh?gTXAoo&G z`OaY0{k5v6kL2s;-wuQGlpcl4g9yBB(|kZ{!BtV&m(->B;an$)45s$Q>UKBHIuD+X z-a8$i1iof`ThFAfX9;dR4(^yJzLHqLs`Z2bzGB2!EG0KvLvI1pV0#xxFycUy*yH6y z{P;KogoQc332`7K&yl`K-y0LQni4RlOaXekG;;^wqj9h%8SDXAl8AfgQ5q>U8mqJf zTJwWDplQ0sV(MN5>UV> %t54E;J3fJ0rX>V |9xP68NFSXD-pP)8zl@H1kt|NkF?f_;P@=G8JBx2Y>5})p1Ymr~#9y zN!_m7x^nES8g(i-s0VIURGS93>zgD1e2<{=W){z~lEIegKpEUhrsX~DU9^YI+(`vU z8wV9%8W2;UDH~hWg+nC)RgM{J64Gl@*m)Ry+2mmhvkk~=0N~>|Xc)@&Km%;40FK1c z;FduAXz-UouzTqf>5u#J|MpHIKzcTnvx8uzP!NA8h@iJV^CmWTAvUd}BVBJJ_Tx$X z_mhNwCqJDwfJHT2S8S6t!#HL)o_!lV P>NQmQtD%PAf}JfBxvI{s+*4?ODUmtX+EBQm}9=$d{B!R|~Qy-P6KVeBgjO z!FNsL;a$;>3}t(J5}*zk8V9Nlje98c=9|d}I_H8_AO}3u>Ad0NF|eZvu2%~2$jZ=1 z@{0j3HaO9ggyplEsgSnwVYf-TN1r6S!Oc>C0xueah6Q3RXGjWX0O6GZE&*lO2##Ee zCDJkp==F#C^mo&W)D+QY8)V$4RqpbOA-za7K Go`0(G#M=U=fF0iS4~rY1Y^DcPe1rqGik?7B}!fPtL8(6v31< z&50MiU}lF=Xa6+Y7uGO+a@Z4WtuQ06p5M^yUtBV6doq*I%Uce&y46FtE~W6_*!LQE zBJb8$bmPEhq*(VZ6)JFgD;>avE*i K&$@5UHw1n8hA&GbCNqm%F2$53 z`ZEax3zjZCeipmPHS{r6 z=%d!HpW8d%KRx{39Z0=!3mL@_VOH hrVqFj;#AC#ySSYI~VjV`Yq?7>==0UTje(a4f2)n(#s;`X>!fs#u+= zDEqRaSub1b&2;&kBqej{R~2>UvhRAvmB%j|SgKB|Eh(rS6%IZ~Os+`BYfaSgO&CE- z7A)ITR^LzoMA&9_D3~$&DKnNquIZ|Q?uFQ-&USsc@)-RI7_AC}8InLcoG QS^~*KUA|+gj@~_lX#JN2bWVS$O~ys?w^v?o{HjJ~f&@* 7oz6i zo?09>II(?L*D%xLH3DXmqqA ($*rN_ZNc^w|2-o z?-L?3?;Q?3$ij;cu5o{Q)!pJRU8|Y0@g7ybln5HJyC!nctEk`+GwG44ER;eSatd Z+MMJ3upK$m%kMjccx*K+UHDsNr- zps{vP!;Fu%O4cJzo*{4VZmw0@>(Cl2HTUVD)uJEDOjj7Jne%iC!Im5&CEpoO1MJeL z<(pyzUbTe{DttQEyDztk4*#+ ZJ<9*?G8qVa$yYZ!`f-AZGd#j!nUGL%reMda8hVt;`UhI`2y zJ6X8D8>j7(iyBLJqxt#H^eR{>_fdu##*=rd$ylv%>_JG9C;zI3iPrR3=ItI&!J~d- zF{`nMcWJzkkQiz1mQjc-!b_y}eInQFmjniBFEMdVGxO`?kMnxGBvhNttfG{%^&V$R z8flu_=8osQGW3?Y)@**gas0` Hh3oNn-p5H#Ax^61We={2 z{7-UTjPRJtJ|iiQ9(n=fUuaqeT%RbM>G4r(XtoTFnt1xX+8b~kkLAjFUxdQ=YPsx! zqB;Q3KS{nitD4ra(-Y55dVKYcnynL#CrbX&NL@;vyPU{1SxVbbL}!O4dW+=b%jS2| zYmoRtuTMVb?)5WPZMl*eHCZkoKCCh9Zx#9SeerLYpZT>G+uX*<7YaMSFalav3#TVv z7A9h$AzGKY$N=|CkN}%xExYGjQ |Ux(y|zvcuzR6(t?K$zm3?p3)of|2 zu*~|3bsg!;y;|4na;K_go@`i6wOns(oO&CQ9O%5NWiM?`t`XjmG5g3%oqm5j_3kc2 z&SJvczKd&`lxlR-gR|A4uW_n|jl5<0rFkX_I$f97d(($@!C@q7`h5u`$j?aIaolIU z_R*7V` 7e~^ace-o_(4KyH+P>Bk$&}?Yzu2^Q^9&iHk&X zT2q^8wxA)<8Nw4;?PgkLdV`}HT3voe&9r`pghcmhyYA=CwEZ#)iJfY7J#L(7|C1aN zzpCwaIz7{I@->*Qf-$l1_ {oY+Z=jr8eIydr_4BzT6yx*hA`iL%_ zR5CGMut`np_*UUm+nPDB;4@#;{?k<*U#*$Bk=w_iMGs-#L~|Z83V?FB!RW_5c`%T- z6Q;+$ VhClVaQ;E+@rb1QSkl2~0nnkF{ zj-&RFgp-Bu|5E >` $DY3k<2bEie%arQD8$N7dzh-S#!nj{n5- z4L+OtQ3wg7zm7@d&05;ok|xJShlX~1bf;rXz1i*7PDt}C0?^>2e`w 683Mr-WU<5}6KUU)Q4bW4mF|%Q;qfyRw@@Nq2QrECJZ{_nQ^Ik>$2+3k zrL_9%K&E9`k-cy2nhV06uz>##%`UO1Hd%jbHlXQX|3N{y>b-D&YtPK_?ccwD_y )H>_BfO8|dDh7@@2lZ4NGa3KSj%xxd#T*$~SHbrb>EdO)Lmdi(pr zcK>p%-&r5Nd3JIQ6@8Bbqv`Yn5gpJCAn~WR@;dO;iG|c!!xur6g@Xv8V1dIATcX;+ z(S$u)eF__hXT3%uqDwqOL3)MSA={(Bw+uw((~B&DL~w+YmPA?jyGAD#u1bRHDUlDy zdYpA>ZMKzowTY$l5;r>t%9^O&)O|Ml@v{h_hY gq!IOLhP9#V*AA-&&g!LHjgqcL=m~1@< zqW=qReGMlS0b;}H%S61B975&1K}j3-6FDyJflLW@t@!F1p?s5{gI(!8rh=m&ArcCK zOq8wEJ1zvGmJ(xN3I|TiYal4EBLhCdC3FyQFI4pup1rEG! !!Ey*7FH)Tgp6G_}+IoI@uo}g+ZcOFD z5d`TBvYrBit`a|U5C 9H z76O-&-u MR gyt;O^7OHp1o_h!4HOG9IH7^ZSa{);J`I`qP@x V6}g)hO;z@Yc$I_eE{}-0D-36$_tr&>`c57vU~qmztihV<${J2YN;f}2_62aF2Zajyq#yv4M}oTeL0kKb`*mH%N~Zkcrdy692eA{BfeF@9 ztMs0cOO~yI$nNcB0#;X{q>v!E1Y(`DBI1qrSD00_MAcddykxUAKkF3@aK}R8yaSo2 z3^r>10x*!4WgLweS5roV<)qXrht#0ehP<;NWd|_YRK2>Vxo3!8o@8SJ1N*k#^INE6 zfn3Q2DJzO9$J-9FXk6ipoc4`m=jw%X%YXR|Agbqg&y|kxt}+W%qtIx(ot8v}b(HYb z<)3o4w_#xG>JDKWunL-(QeE=~O?>QUB9cEW6ZGjRHLGz`i#WD&KctwmJK|IP*BUW# ztBDB0U1Y!JlGT 4!)Kw$xp6#slw#av1o zS=hl*x@b|C9}_Gp1Vx20*DHxR?DicD^sYXDHA15 zq5?)z#34DLf}jbQ*xs3UTPL7M;4o((3J*cAC+@wic`#ga6!iTBV&a7u;oG*omjguJ z>1VZ>qpVs<(>TGF34Ik 6JL~R}q!=)V(Ii{PUFw`r`l8_?*;MbX>9pkn-|r6s{6It1G}d*XJVxR6N@Cx6 zr$W+q;h)TGXyV6WI~5P=XKo6<( 0hjBKPP%X+!O9{ zec0%yN+W!veHl^za8&;5_z_`Z^*Zg9uR`sp8C|Pcrg61vz_<&m?@VThP~zrKm+_UJ ztO%gWuBEUyPzCXQZFT7vQ?sD=$|l?R))DHj0I)Y1@`_(=%NA(1fchIW?&bm%pd`ms z0R0ydZ;;&ghik4&B-%GxafaHes}jG9&5f*#0FJ$%>yAh^Sm9x2Kls+RZGnrHYj@su zRKDnX@pY+8buH!y2!BT4$+hxrTtf>a3NDQV2m*hA`$O7lf}ZvB_Wg)lQ|DbuG- }dGPstY&pXp=`hPQGRgjKRmS}!E_j?TS)84Fa4@PU zqNbD@{UWtJRj1b<_`v;xt~ke!9W_n&y?DS0@A_@y5<2Xu_w6fr+jEfv{HLhzdPj{f zKf$1*=7TO+BpL{!VI)zS(fuehW{344(-P{218Uw AW$P~CPTnC#(VBr@5&PaT%N!%H^~Yi vqV7S{7^O4$I;G_j E(6ekU>XOMvhsi*UDpLBa3p zcFUhl-v4^*6AEpYk&(C{4$$aiu#DH-&!nx*$AKY&-!&n_Su0y(c7&o;9JvFx%72sj zgNab(IGz38mQqJDjXN6R9^Q!Jw*Ixby)D44%C#QM%VCGo89x{YDs8*RP-_A#sb(qz ziR(<@Tn@iP)H=u9&d*R2?(9LPzd_me7k?b@FUth4a2+UqU|P+DuXQ}+oSkf|XL5}v zT3pNAXf#o#IAnQmbZv)R*4vGOfx}k1!V2$gp7u9Q81vcyIi+?~dK1w(gk~^!F}ZSc zK2a8cQhgAzHJ)hnXGOH{*NE6vAwa!gsKaG0;+}Zo{+gFiR&wbM;YKKsO@nCEKCTJ> zcr|a8l@#fa7b#SFG!g-so&;*pb+gr=#-7Xw;N5w3_I$pDvS-erFZwiJY}uCpJE(+P zn}j~+`5<*Op><%|_L8qJkP|b|R89~;MvcAgxTXH%TDE><>T&2Hkd3 KN{;*~xTM_q!}qGTbjn z;HH2S@m4&eiTSf2DX}J+Zje+GP#z7owhL7#JrFMSim^Oh rg=x?A-eNmGu4v`*o!^NbuHsV}^N0+n+wlH))70viPq z1#rNwf1lnxiGRb{&v@Q9#?n3h>Yl&d#fIIlJ2Q8#wEjX$nE9W(KOPF-a-^&PfIMi? z$7{^QMyBq_ze;Y4DSa%bhs$KJXZ!Q@hcna}hQE(a5;C9l^1wFEcL|oOt;*5V;3E{0 zLti9gRutB%``~WO9fiN&FV4QG$G-fx7xs((((pJmjYky9Ca0m_lbXc9t#q?#l-Qld z$Y|=NvBK0REQc7U%dQpaPeOc8%8>ful@5@-PV(CrhYaPTTu0-9KP5(rv~KTjZyZRD zmg=Xn$p;)t**<48R|?uZl%A}#eP#PL;7De=+VMl!4t4WLc9!Jv>9PD-1O$P0zC*!8 zM<&D3AtN_g>qKPeh_NPQ$j?3|L~9%^JL)C{z1#zilnUOaD6aHBmb_YX^RLp{P@#JG z@9n?JexFqgAF7#_tGL6Xu_Pb)Cn8rxM88jR>i38m%Uw@yV--27NXn6Q>Bymf|8lru zAWu2u_qpcbbBkfycfl80$J_HC!vFlf(5CDze@LYZ>QMf9usQQS =UrR8bL49gd{Sd)W1fvnrjFrb2>%~r|<+c38&IO@fAuF zzONy2PrNW% 6bTrt-ae{#(+Mm+aMK(lzBOYC3qeE0jB5(VCc{ywQbs|_MggIfMd6x|xo zlq|mA&|e07H5O`rTb rYPH&*KTJ((7%@&{U{QWcNPwKmHAtNywdm$(;7 zzbcMBm97*H4p=VEP5kAX*~=p-_2O;IsZ4e4fR^mrhWS|8nr2?_fE&mR-T?29AZ@wY zUf#HB*RD(lnRnmH%y9&0U6pLZfbebk#<_r2`43-X&*Yna+}B1muNKCkS~jX$QLQ^I zXQ;Nlf%Kq;qv?6M8-kSkavv{F&lJc&;;abOkfN2&mO1)+cHErl{iJ@_v3dMN8>dse zVjoXno8l*dxO2t+KUO+n;d)|zq3=Y}N~_88t>;QZilTgpbTwt?U*F^Vdb-R}Lm05r z&EjK_1uDxqsNYPsU1h>j`$A>%%9l8mDdPhEufsP2+f`>=;x1HY-P4EdMzmT+yUdko zzJeEm-tTn7jO>GCE#+`zGAL%NUH$u=vkUbl0;8VBk7T|Cjpci?9U4C$Xj3&-9$DyV zu0C-}i1`M?kwKQ>any;a(FeL(8!w(FXl=fJqZd1;P+OV^!@gft+tDSrCyteLJF0_) z(vZr#os5^_y+m%30l!$cI^x&Ayroig4#zAm=^jlvDO}lty#ds3>rJ|zJ(H9B9$?8G zfzdhLc=L`5 UL*2knI2_0dEtCd}xb);leyfDmDs+(t= zl%m!q%p6|XEwE2Y)$?-Sx=w2U{Z<}de*pX~Mv*FP!U37$ML3dw^(4sSP0Wk kffOea3APTO Mi$v#rw^Vu(j4$vV5!nbwPA#P7Avysj>V>PqReS1ECF_(AT|zx0hJf4OH{|6C^; z#zeWt+l4r|vUfQP-a#69^jHPv22a$PFtZkJyQ(>)LKe9}zAO$iDm48pVHI9AQM{j{ zuc=Is22vo3cwuT$qZ3f`_9!?U^@ jc|^`y7JR2MoISPFO5HIr5bJ&bW3HhJSNSE$j&$PBo3OKLDY4NLCsWFh!tvd4xBU zX;hX7@TA=@1k!&Er&$7qZv5+?l)Tn&kayTvG_PRJN%bQyGpC=jZmi_UcUwPxx$iFI zXRra^QN5=a-S~{AqHV8L YtU3Uat^!!^j~xbdo}z=Rh-!29(^Z*tzq62$_-O zY?!O(x`NBzm+LCtzgoRqtj8Gj>c};~UUtNYZMC7+XaM%?)S-BB?KO=0R_ndYqBz@a zv@9BhO(~rrv2~Uu#RPko^1FO?CeTeC5n$JMK>{jy3i_o$Mjtc{4~zzd<5DhYk6%+{ zPomKW$i{t@HDhbSyrt(%L`=d{IANWzgeU`q;phUo4dd-r+UdA)KIrl7gyC;wgogu? zc<0&65+xkaBqrjr(Upb?n4mr)4W9#g8d0Uaw__6~=l=LQ0wynD&d4?jDnRW+l&NS8 zD|HWYBbDMMOI0NiGSMcl7=ha{_c%~ zTnWQQFA=*i1xmKLD6guU`DXw2TWIzO5npxT(JY4FL`!cwB<~Jt4DvkQZ9m|$LxOnt zbLjNpSY8L@71q%u#-O($?kfX4=QZSF$Sndhf7SP{QucS}_4{->uHLyIhlz*#hju)R ztmur>Pa3!W4!WZ_gke7<^jv=t-EpDiat9JhK?Jr$RD|Loe?*6%+IV)&;fwN`*-u AFSxGf|ucIv}=AeJ{|F6(yWs z#vEpk&A_=sBP?z(y5}b&%nzcJdoG&VpY-xnUrq|k`N x}i!eHL^5dsa+e-BDSuR3yE#Lb@DxH3i6O$g3nRE=g z$>2NdjY^XpTi3%1C5P8or7r#VL*N}FrC@Ev6 H!=>06L{3dowT|pJ*XS4j=k0PPWsYS(ZXM?$uH>m$E0idO?bi6LlXaNGZI#ZmtDu?C+D>cFElaHpv+vO z=?Mp~@x~c=4mKK2k9kgJLoVi|SSA{l_-lF_3v|x*7KeD|ZN9D5>`S#t%qnFk)k#fr z-)fui`keq?3IG9f!ye(e(g5`R`aB8P%+F*l7|`j3fQdlLC;1zq%sryKDG6pdx2}{# zxO~TXO>&;wxBGKYT-eGpzCYZ+*9#;!ye?^gBo8u8n+oK<<}?DW1DK?)j*0`Q5EoW4 z%sWUgG}n%<3lD&nqnSk&189NIpsWHo1RAN#Hbp%_Ua>YUg; DLeK7_7`P99e;t;L&&dachsSq!$0weV(q8%(>6U=-}F}*k`!LC%~I7 zAi=>zPBh*n^HpQ8M)?DH0t iNySc0<^s_YX`?D(1x;yRD3Ssv_= z-NSGBuJEd5p|hJJV&KQL)*}HM%9MKha^manc58;F#gmCVMxgWVOLRc$oCtMw83i&@ zcs!}VCF<1p!l^_2nud#wxYMMWfQlfs_x *Ps|XANlL 4^< zVaH_7$%;MB6xgBtzPsd!|0{P>$riIo&iGeB;wci1GqC7o+Z3T!n&NTGJ)B7dW{2{j zGLh?4!?R8@Ck_}l3}C@^a-L_XLz96HotHQ| RX{l?PO7=ln<;uN5em|#n(L9Xt?8Vq_g!fh`BD}3Er6i zpG>@umd{SRU%NX{C=|$Wx`JCF`}IGMX2QZnq;E^VW_sRd40R7?HN4p|H$UYXlrj?( zRuUXskq!K{Lto@H-1Yk&27!FlDQtH(j42%>3rX1RDHg_3kT$XIdESDTZiso%b#iJ5 z9k_Icyp)u>?-qB;6$Dwg8~OEm>Xr4VvkCmVee<%7TsDI4D~wLyh9iMZPRd$k-Nsa^ zGNr0g$t8W&OkMmbqH;RmL3W_OROZI4)jB@4ksp_W4VjXuz u z5|>^B^DnxM#{g78c+vw`pFGPOKELT}waRL_dSK_oBi0Sq__FrTP9OUCT0TEzDK&o5 z0^roEc-jfL8Q{;UR1)06qmw92I_J~h%cg6?^HqBNdE$@#3_zrj8QOrxA|CqKMUk4+ z2oavJA5+C5eR_mz7E2rSyoUH>kFqZ3MDJ3o(O)4(h@dBvdCi4adgfn1i{H3cu{i_Z z@d!+3R1J2>4W(T7Z*W!bbf_9|2%O4)BhmXQSj4maSAhg1Ezz%r`K4>b6H5thNiIWN zX(^A?cpS4KcM>*N_z~ 2^hoYt$L*IGdYXAaub)W?p pIt<>Dw97Z)tM477NJ^vqW7D#L8=nqkN) zf2xeao8ep!e-}@n!WZdI1P73vuad2wyeIPRj?5oN{db&hid=Wc)OxLkyYj)$+1_~k znNp ETbdxF|V7iOvZ6fPa zFw(ws!;!Y81?I9QNnGcjXsg4n9p>`H^O%*6$lA}@QvlrgKwf+&JPUJmH;ig98YU-6 zBmcBl_Ub34aEQ`in9|i``7 ejYY18pfM-g6xJOq7%=h*p)S}dKqO)+0)SBJ2|D23I>!? zoIAOetn+n^ly93FDfg%tL|kja^DSO~wz9vmt;8B_#8L{3e*HksTE!HhY~XiD>lI;m z7jK^4Ym}XA@kQl&)1iv>d%Mtjle+*eKkTz5T6J~94c7PiO$E$`Mst-IVZuSxI0D0X zPpkF)H82axh*2S^fk0tH{~f$!ee||8+(re$)Yb_TGi1pJmcYxI