├── README.md ├── default.html ├── docs ├── CNAME ├── Gemfile ├── Gemfile.lock ├── README.md ├── _config.yml ├── _data │ └── navigation.yml ├── _pages │ ├── 404.md │ ├── about.md │ ├── category-archive.md │ ├── diagon.md │ ├── guides.md │ ├── overview.md │ ├── tag-archive.md │ └── year-archive.md ├── _posts │ └── 2019-09-09-getting-started.md ├── _site │ ├── 404.html │ ├── README.md │ ├── _posts │ │ └── 2019-09-09-getting-started │ │ │ └── index.html │ ├── about │ │ └── index.html │ ├── assets │ │ ├── css │ │ │ └── main.css │ │ ├── images │ │ │ ├── bio-photo.jpg │ │ │ ├── demo.gif │ │ │ ├── demo2.png │ │ │ ├── demo3.png │ │ │ ├── demo4.png │ │ │ ├── header.png │ │ │ ├── logo.png │ │ │ ├── splash.jpg │ │ │ ├── term.jpg │ │ │ └── term.png │ │ ├── js │ │ │ ├── _main.js │ │ │ ├── lunr │ │ │ │ ├── lunr-en.js │ │ │ │ ├── lunr-gr.js │ │ │ │ ├── lunr-store.js │ │ │ │ ├── lunr.js │ │ │ │ └── lunr.min.js │ │ │ ├── main.min.js │ │ │ ├── plugins │ │ │ │ ├── gumshoe.js │ │ │ │ ├── jquery.ba-throttle-debounce.js │ │ │ │ ├── jquery.fitvids.js │ │ │ │ ├── jquery.greedy-navigation.js │ │ │ │ ├── jquery.magnific-popup.js │ │ │ │ └── smooth-scroll.js │ │ │ └── vendor │ │ │ │ └── jquery │ │ │ │ └── jquery-3.4.1.js │ │ └── logo.png │ ├── blog │ │ └── getting-started │ │ │ └── index.html │ ├── categories │ │ └── index.html │ ├── diagon │ │ └── index.html │ ├── feed.xml │ ├── guides │ │ └── index.html │ ├── hills.png │ ├── index.html │ ├── overview │ │ └── index.html │ ├── posts │ │ └── index.html │ ├── robots.txt │ ├── screenshot.gif │ ├── sitemap.xml │ ├── tags │ │ └── index.html │ ├── tmp.md │ └── tmp │ │ └── index.html ├── assets │ ├── images │ │ ├── bio-photo.jpg │ │ ├── demo.gif │ │ ├── demo2.png │ │ ├── demo3.png │ │ ├── demo4.png │ │ ├── header.png │ │ ├── logo.png │ │ ├── splash.jpg │ │ ├── term.jpg │ │ └── term.png │ └── logo.png ├── hills.png ├── index.html ├── index.md ├── screenshot.gif └── tmp.md ├── hills.png ├── logo.png └── screenshot.gif /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Prismatica (In Development) 4 | 5 | ![Platform](https://img.shields.io/badge/Platform-WIndows%20%7C%20Linux%20%7C%20OSX-green.svg) 6 | ![License](https://img.shields.io/badge/License-MIT-green.svg) 7 | ![Version](https://img.shields.io/badge/Version-0.01-green.svg) 8 | ![Code](https://img.shields.io/badge/Code-Python%20%7C%20Javascript%20%7C%20ReactJS%20%7C%20MySQL%20%7C%20Electron%20%7C%20JSON-blue.svg) 9 | 10 | Prismatica is a modular C2 Interface hooked into the Diagon Command and Control Toolkit. There are multiple tools and components of the Prismatica Marketplace. All Prism Apps are built around the Emergence Fabric. To get started begin with [Emergence](https://github.com/Project-Prismatica/Emergence) 11 | 12 | ## Prismatica Application Marketplace 13 | 14 | - [Diagon](https://github.com/Project-Prismatica/Diagon) A Command and Control Toolkit 15 | - [Emergence](https://github.com/Project-Prismatica/Diagon) A Command and Control Toolkit 16 | - [Oculus](https://github.com/Project-Prismatica/Diagon) A Command and Control Toolkit 17 | - [Prism Launcher]() The package manager for Prism Apps (Releasing at WWHF) 18 | - [Prism Project Manager]() Project management, findigns, and reporting tool (Releasing at WWHF) 19 | - [Acheron](https://github.com/Acheron-VAF/Acheron) Acheron is a RESTful vulnerability assessment and management framework built around search and dedicated to terminal extensibility. 20 | - [Tiberium](https://github.com/0sm0s1z/Tiberium/releases) A Command and Control scanning tool 21 | 22 | 23 | 24 | ![alt tag](docs/screenshot.gif) 25 | -------------------------------------------------------------------------------- /default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 13 | 14 | {% seo %} 15 | 16 | 17 | 18 |
19 |
20 | 21 |
22 | 23 |

{{ page.title | default: site.title | default: site.github.repository_name }}

24 |

{{ page.description | default: site.description | default: site.github.project_tagline }}

25 |
26 |
27 | Download .exe 28 | {% if site.show_downloads %} 29 | Download .zip 30 | Download .tar.gz 31 | {% endif %} 32 | {% if site.github.is_project_page %} 33 | View on GitHub 34 | {% else %} 35 | View on GitHub 36 | {% endif %} 37 |
38 |
39 |
40 | {{ content }} 41 |
42 | 43 | 49 | 50 |
51 |
52 | 53 | {% if site.google_analytics %} 54 | 62 | {% endif %} 63 | 64 | 65 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | prismatica.io -------------------------------------------------------------------------------- /docs/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "github-pages", group: :jekyll_plugins 4 | 5 | gem "tzinfo-data" 6 | gem "wdm", "~> 0.1.0" if Gem.win_platform? 7 | 8 | # If you have any plugins, put them here! 9 | group :jekyll_plugins do 10 | gem "jekyll-paginate" 11 | gem "jekyll-sitemap" 12 | gem "jekyll-gist" 13 | gem "jekyll-feed" 14 | gem "jemoji" 15 | gem "jekyll-include-cache" 16 | gem "jekyll-algolia" 17 | end 18 | -------------------------------------------------------------------------------- /docs/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | activesupport (4.2.11.1) 5 | i18n (~> 0.7) 6 | minitest (~> 5.1) 7 | thread_safe (~> 0.3, >= 0.3.4) 8 | tzinfo (~> 1.1) 9 | addressable (2.7.0) 10 | public_suffix (>= 2.0.2, < 5.0) 11 | algolia_html_extractor (2.6.2) 12 | json (~> 2.0) 13 | nokogiri (~> 1.10.4) 14 | algoliasearch (1.26.1) 15 | httpclient (~> 2.8, >= 2.8.3) 16 | json (>= 1.5.1) 17 | coffee-script (2.4.1) 18 | coffee-script-source 19 | execjs 20 | coffee-script-source (1.11.1) 21 | colorator (1.1.0) 22 | commonmarker (0.17.13) 23 | ruby-enum (~> 0.5) 24 | concurrent-ruby (1.1.5) 25 | dnsruby (1.61.3) 26 | addressable (~> 2.5) 27 | em-websocket (0.5.1) 28 | eventmachine (>= 0.12.9) 29 | http_parser.rb (~> 0.6.0) 30 | ethon (0.12.0) 31 | ffi (>= 1.3.0) 32 | eventmachine (1.2.7) 33 | execjs (2.7.0) 34 | faraday (0.15.4) 35 | multipart-post (>= 1.2, < 3) 36 | ffi (1.11.1) 37 | filesize (0.2.0) 38 | forwardable-extended (2.6.0) 39 | gemoji (3.0.1) 40 | github-pages (198) 41 | activesupport (= 4.2.11.1) 42 | github-pages-health-check (= 1.16.1) 43 | jekyll (= 3.8.5) 44 | jekyll-avatar (= 0.6.0) 45 | jekyll-coffeescript (= 1.1.1) 46 | jekyll-commonmark-ghpages (= 0.1.5) 47 | jekyll-default-layout (= 0.1.4) 48 | jekyll-feed (= 0.11.0) 49 | jekyll-gist (= 1.5.0) 50 | jekyll-github-metadata (= 2.12.1) 51 | jekyll-mentions (= 1.4.1) 52 | jekyll-optional-front-matter (= 0.3.0) 53 | jekyll-paginate (= 1.1.0) 54 | jekyll-readme-index (= 0.2.0) 55 | jekyll-redirect-from (= 0.14.0) 56 | jekyll-relative-links (= 0.6.0) 57 | jekyll-remote-theme (= 0.3.1) 58 | jekyll-sass-converter (= 1.5.2) 59 | jekyll-seo-tag (= 2.5.0) 60 | jekyll-sitemap (= 1.2.0) 61 | jekyll-swiss (= 0.4.0) 62 | jekyll-theme-architect (= 0.1.1) 63 | jekyll-theme-cayman (= 0.1.1) 64 | jekyll-theme-dinky (= 0.1.1) 65 | jekyll-theme-hacker (= 0.1.1) 66 | jekyll-theme-leap-day (= 0.1.1) 67 | jekyll-theme-merlot (= 0.1.1) 68 | jekyll-theme-midnight (= 0.1.1) 69 | jekyll-theme-minimal (= 0.1.1) 70 | jekyll-theme-modernist (= 0.1.1) 71 | jekyll-theme-primer (= 0.5.3) 72 | jekyll-theme-slate (= 0.1.1) 73 | jekyll-theme-tactile (= 0.1.1) 74 | jekyll-theme-time-machine (= 0.1.1) 75 | jekyll-titles-from-headings (= 0.5.1) 76 | jemoji (= 0.10.2) 77 | kramdown (= 1.17.0) 78 | liquid (= 4.0.0) 79 | listen (= 3.1.5) 80 | mercenary (~> 0.3) 81 | minima (= 2.5.0) 82 | nokogiri (>= 1.8.5, < 2.0) 83 | rouge (= 2.2.1) 84 | terminal-table (~> 1.4) 85 | github-pages-health-check (1.16.1) 86 | addressable (~> 2.3) 87 | dnsruby (~> 1.60) 88 | octokit (~> 4.0) 89 | public_suffix (~> 3.0) 90 | typhoeus (~> 1.3) 91 | html-pipeline (2.12.0) 92 | activesupport (>= 2) 93 | nokogiri (>= 1.4) 94 | http_parser.rb (0.6.0) 95 | httpclient (2.8.3) 96 | i18n (0.9.5) 97 | concurrent-ruby (~> 1.0) 98 | jekyll (3.8.5) 99 | addressable (~> 2.4) 100 | colorator (~> 1.0) 101 | em-websocket (~> 0.5) 102 | i18n (~> 0.7) 103 | jekyll-sass-converter (~> 1.0) 104 | jekyll-watch (~> 2.0) 105 | kramdown (~> 1.14) 106 | liquid (~> 4.0) 107 | mercenary (~> 0.3.3) 108 | pathutil (~> 0.9) 109 | rouge (>= 1.7, < 4) 110 | safe_yaml (~> 1.0) 111 | jekyll-algolia (1.4.11) 112 | algolia_html_extractor (~> 2.6) 113 | algoliasearch (~> 1.25) 114 | filesize (~> 0.1) 115 | jekyll (~> 3.0) 116 | json (~> 2.0) 117 | nokogiri (~> 1.6) 118 | progressbar (~> 1.9) 119 | verbal_expressions (~> 0.1.5) 120 | jekyll-avatar (0.6.0) 121 | jekyll (~> 3.0) 122 | jekyll-coffeescript (1.1.1) 123 | coffee-script (~> 2.2) 124 | coffee-script-source (~> 1.11.1) 125 | jekyll-commonmark (1.3.1) 126 | commonmarker (~> 0.14) 127 | jekyll (>= 3.7, < 5.0) 128 | jekyll-commonmark-ghpages (0.1.5) 129 | commonmarker (~> 0.17.6) 130 | jekyll-commonmark (~> 1) 131 | rouge (~> 2) 132 | jekyll-default-layout (0.1.4) 133 | jekyll (~> 3.0) 134 | jekyll-feed (0.11.0) 135 | jekyll (~> 3.3) 136 | jekyll-gist (1.5.0) 137 | octokit (~> 4.2) 138 | jekyll-github-metadata (2.12.1) 139 | jekyll (~> 3.4) 140 | octokit (~> 4.0, != 4.4.0) 141 | jekyll-include-cache (0.2.0) 142 | jekyll (>= 3.7, < 5.0) 143 | jekyll-mentions (1.4.1) 144 | html-pipeline (~> 2.3) 145 | jekyll (~> 3.0) 146 | jekyll-optional-front-matter (0.3.0) 147 | jekyll (~> 3.0) 148 | jekyll-paginate (1.1.0) 149 | jekyll-readme-index (0.2.0) 150 | jekyll (~> 3.0) 151 | jekyll-redirect-from (0.14.0) 152 | jekyll (~> 3.3) 153 | jekyll-relative-links (0.6.0) 154 | jekyll (~> 3.3) 155 | jekyll-remote-theme (0.3.1) 156 | jekyll (~> 3.5) 157 | rubyzip (>= 1.2.1, < 3.0) 158 | jekyll-sass-converter (1.5.2) 159 | sass (~> 3.4) 160 | jekyll-seo-tag (2.5.0) 161 | jekyll (~> 3.3) 162 | jekyll-sitemap (1.2.0) 163 | jekyll (~> 3.3) 164 | jekyll-swiss (0.4.0) 165 | jekyll-theme-architect (0.1.1) 166 | jekyll (~> 3.5) 167 | jekyll-seo-tag (~> 2.0) 168 | jekyll-theme-cayman (0.1.1) 169 | jekyll (~> 3.5) 170 | jekyll-seo-tag (~> 2.0) 171 | jekyll-theme-dinky (0.1.1) 172 | jekyll (~> 3.5) 173 | jekyll-seo-tag (~> 2.0) 174 | jekyll-theme-hacker (0.1.1) 175 | jekyll (~> 3.5) 176 | jekyll-seo-tag (~> 2.0) 177 | jekyll-theme-leap-day (0.1.1) 178 | jekyll (~> 3.5) 179 | jekyll-seo-tag (~> 2.0) 180 | jekyll-theme-merlot (0.1.1) 181 | jekyll (~> 3.5) 182 | jekyll-seo-tag (~> 2.0) 183 | jekyll-theme-midnight (0.1.1) 184 | jekyll (~> 3.5) 185 | jekyll-seo-tag (~> 2.0) 186 | jekyll-theme-minimal (0.1.1) 187 | jekyll (~> 3.5) 188 | jekyll-seo-tag (~> 2.0) 189 | jekyll-theme-modernist (0.1.1) 190 | jekyll (~> 3.5) 191 | jekyll-seo-tag (~> 2.0) 192 | jekyll-theme-primer (0.5.3) 193 | jekyll (~> 3.5) 194 | jekyll-github-metadata (~> 2.9) 195 | jekyll-seo-tag (~> 2.0) 196 | jekyll-theme-slate (0.1.1) 197 | jekyll (~> 3.5) 198 | jekyll-seo-tag (~> 2.0) 199 | jekyll-theme-tactile (0.1.1) 200 | jekyll (~> 3.5) 201 | jekyll-seo-tag (~> 2.0) 202 | jekyll-theme-time-machine (0.1.1) 203 | jekyll (~> 3.5) 204 | jekyll-seo-tag (~> 2.0) 205 | jekyll-titles-from-headings (0.5.1) 206 | jekyll (~> 3.3) 207 | jekyll-watch (2.2.1) 208 | listen (~> 3.0) 209 | jemoji (0.10.2) 210 | gemoji (~> 3.0) 211 | html-pipeline (~> 2.2) 212 | jekyll (~> 3.0) 213 | json (2.2.0) 214 | kramdown (1.17.0) 215 | liquid (4.0.0) 216 | listen (3.1.5) 217 | rb-fsevent (~> 0.9, >= 0.9.4) 218 | rb-inotify (~> 0.9, >= 0.9.7) 219 | ruby_dep (~> 1.2) 220 | mercenary (0.3.6) 221 | mini_portile2 (2.4.0) 222 | minima (2.5.0) 223 | jekyll (~> 3.5) 224 | jekyll-feed (~> 0.9) 225 | jekyll-seo-tag (~> 2.1) 226 | minitest (5.11.3) 227 | multipart-post (2.1.1) 228 | nokogiri (1.10.4) 229 | mini_portile2 (~> 2.4.0) 230 | octokit (4.14.0) 231 | sawyer (~> 0.8.0, >= 0.5.3) 232 | pathutil (0.16.2) 233 | forwardable-extended (~> 2.6) 234 | progressbar (1.10.1) 235 | public_suffix (3.1.1) 236 | rb-fsevent (0.10.3) 237 | rb-inotify (0.10.0) 238 | ffi (~> 1.0) 239 | rouge (2.2.1) 240 | ruby-enum (0.7.2) 241 | i18n 242 | ruby_dep (1.5.0) 243 | rubyzip (1.2.4) 244 | safe_yaml (1.0.5) 245 | sass (3.7.4) 246 | sass-listen (~> 4.0.0) 247 | sass-listen (4.0.0) 248 | rb-fsevent (~> 0.9, >= 0.9.4) 249 | rb-inotify (~> 0.9, >= 0.9.7) 250 | sawyer (0.8.2) 251 | addressable (>= 2.3.5) 252 | faraday (> 0.8, < 2.0) 253 | terminal-table (1.8.0) 254 | unicode-display_width (~> 1.1, >= 1.1.1) 255 | thread_safe (0.3.6) 256 | typhoeus (1.3.1) 257 | ethon (>= 0.9.0) 258 | tzinfo (1.2.5) 259 | thread_safe (~> 0.1) 260 | tzinfo-data (1.2019.2) 261 | tzinfo (>= 1.0.0) 262 | unicode-display_width (1.6.0) 263 | verbal_expressions (0.1.5) 264 | 265 | PLATFORMS 266 | ruby 267 | 268 | DEPENDENCIES 269 | github-pages 270 | jekyll-algolia 271 | jekyll-feed 272 | jekyll-gist 273 | jekyll-include-cache 274 | jekyll-paginate 275 | jekyll-sitemap 276 | jemoji 277 | tzinfo-data 278 | 279 | BUNDLED WITH 280 | 2.0.2 281 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Minimal Mistakes remote theme starter 2 | 3 | Fork this repo for the quickest method of getting started with the [Minimal Mistakes Jekyll theme](https://github.com/mmistakes/minimal-mistakes). 4 | 5 | Contains basic configuration to get you a site with: 6 | 7 | - Sample posts. 8 | - Sample top navigation. 9 | - Sample author sidebar with social links. 10 | - Sample footer links. 11 | - Paginated home page. 12 | - Archive pages for posts grouped by year, category, and tag. 13 | - Sample about page. 14 | - Sample 404 page. 15 | - Site wide search. 16 | 17 | Replace sample content with your own and [configure as necessary](https://mmistakes.github.io/minimal-mistakes/docs/configuration/). 18 | 19 | --- 20 | 21 | ## Troubleshooting 22 | 23 | If you have a question about using Jekyll, start a discussion on the [Jekyll Forum](https://talk.jekyllrb.com/) or [StackOverflow](https://stackoverflow.com/questions/tagged/jekyll). Other resources: 24 | 25 | - [Ruby 101](https://jekyllrb.com/docs/ruby-101/) 26 | - [Setting up a Jekyll site with GitHub Pages](https://jekyllrb.com/docs/github-pages/) 27 | - [Configuring GitHub Metadata](https://github.com/jekyll/github-metadata/blob/master/docs/configuration.md#configuration) to work properly when developing locally and avoid `No GitHub API authentication could be found. Some fields may be missing or have incorrect data.` warnings. 28 | -------------------------------------------------------------------------------- /docs/_config.yml: -------------------------------------------------------------------------------- 1 | # Welcome to Jekyll! 2 | # 3 | # This config file is meant for settings that affect your whole blog, values 4 | # which you are expected to set up once and rarely edit after that. If you find 5 | # yourself editing this file very often, consider using Jekyll's data files 6 | # feature for the data you need to update frequently. 7 | # 8 | # For technical reasons, this file is *NOT* reloaded automatically when you use 9 | # 'bundle exec jekyll serve'. If you change this file, please restart the server process. 10 | 11 | # Site settings 12 | # These are used to personalize your new site. If you look in the HTML files, 13 | # you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. 14 | # You can create any custom variable you would like, and they will be accessible 15 | # in the templates via {{ site.myvariable }}. 16 | title: Prismatica 17 | email: support@opensecurity.io 18 | description: >- # this means to ignore newlines until "baseurl:" 19 | Write an awesome description for your new site here. You can edit this 20 | line in _config.yml. It will appear in your document head meta (for 21 | Google search results) and in your feed.xml site description. 22 | twitter_username: _opensecurity_ 23 | github_username: 0sm0s1z 24 | minimal_mistakes_skin: default 25 | search: true 26 | logo: "/assets/images/logo.png" 27 | 28 | # Build settings 29 | markdown: kramdown 30 | remote_theme: mmistakes/minimal-mistakes 31 | # Outputting 32 | permalink: /:categories/:title/ 33 | paginate: 5 # amount of posts to show 34 | paginate_path: /page:num/ 35 | timezone: # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 36 | 37 | include: 38 | - _pages 39 | - _posts 40 | 41 | # Exclude from processing. 42 | # The following items will not be processed, by default. Create a custom list 43 | # to override the default setting. 44 | # exclude: 45 | # - Gemfile 46 | # - Gemfile.lock 47 | # - node_modules 48 | # - vendor/bundle/ 49 | # - vendor/cache/ 50 | # - vendor/gems/ 51 | # - vendor/ruby/ 52 | 53 | # Plugins (previously gems:) 54 | plugins: 55 | - jekyll-paginate 56 | - jekyll-sitemap 57 | - jekyll-gist 58 | - jekyll-feed 59 | - jemoji 60 | - jekyll-include-cache 61 | 62 | 63 | footer: 64 | links: 65 | - label: "Twitter" 66 | icon: "fab fa-fw fa-twitter-square" 67 | url: "https://twitter.com/_opensecurity_" 68 | - label: "GitHub" 69 | icon: "fab fa-fw fa-github" 70 | url: "https://github.com/0sm0s1z" 71 | 72 | defaults: 73 | # _posts 74 | - scope: 75 | path: "" 76 | type: pages 77 | values: 78 | layout: single 79 | author_profile: false 80 | # _pages 81 | - scope: 82 | path: _pages 83 | type: pages 84 | values: 85 | layout: single 86 | author_profile: false 87 | 88 | category_archive: 89 | type: liquid 90 | path: /categories/ 91 | tag_archive: 92 | type: liquid 93 | path: /tags/ 94 | -------------------------------------------------------------------------------- /docs/_data/navigation.yml: -------------------------------------------------------------------------------- 1 | main: 2 | - title: "Getting Started" 3 | url: /guides/ 4 | # - title: "Demo" 5 | # url: /posts/ 6 | - title: "API Documentation" 7 | url: https://documenter.getpostman.com/view/1609493/7TT8UqJ?version=latest 8 | - title: "Development" 9 | url: https://github.com/Project-Prismatica/Diagon/projects/1 10 | - title: "About" 11 | url: https://www.opensecurity.io/team 12 | -------------------------------------------------------------------------------- /docs/_pages/404.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Page Not Found" 3 | excerpt: "Page not found. Your pixels are in another canvas." 4 | sitemap: false 5 | permalink: /404.html 6 | --- 7 | 8 | Sorry, but the page you were trying to view does not exist --- perhaps you can try searching for it below. 9 | 10 | 14 | 16 | -------------------------------------------------------------------------------- /docs/_pages/about.md: -------------------------------------------------------------------------------- 1 | --- 2 | permalink: /about/ 3 | title: "About" 4 | --- 5 | 6 | Tempor velit sint sunt ipsum tempor enim ad qui ullamco. Est dolore anim ad velit duis dolore minim sunt aliquip amet commodo labore. Ut eu pariatur aute ea aute excepteur laborum. Esse ea esse excepteur minim mollit qui cillum excepteur ex dolore magna. Labore deserunt fugiat incididunt incididunt sint ea. Consequat dolore aute laboris quis proident quis non et est consectetur ex eiusmod sit culpa. 7 | 8 | Cupidatat ea do et in excepteur in. Ad nostrud ut est esse eu duis ea sunt eiusmod. Aliquip tempor veniam sint elit fugiat. Velit incididunt laboris amet incididunt labore dolore irure velit excepteur commodo deserunt laborum. Consectetur eu fugiat veniam veniam Lorem labore magna eiusmod. Ea occaecat reprehenderit pariatur consectetur minim labore ut aliquip. -------------------------------------------------------------------------------- /docs/_pages/category-archive.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Posts by Category" 3 | layout: categories 4 | permalink: /categories/ 5 | author_profile: true 6 | --- 7 | -------------------------------------------------------------------------------- /docs/_pages/diagon.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Prismatica Core C2 Components" 3 | sitemap: false 4 | layout: posts 5 | classes: wide 6 | permalink: /diagon/ 7 | feature_row: 8 | - image_path: /assets/images/logo.png 9 | alt: "placeholder image 1" 10 | title: "C2 Architecture" 11 | excerpt: "Learn more about C2 architecture and concepts" 12 | url: "/overview/" 13 | btn_label: "Read More" 14 | btn_class: "btn--primary" 15 | - image_path: /assets/images/term.png 16 | alt: "placeholder image 2" 17 | title: "Prismatica API" 18 | excerpt: "Project Prismatica is built around the concept of Emergence. Explore the Emergence API!" 19 | url: "https://documenter.getpostman.com/view/1609493/7TT8UqJ?version=latest" 20 | btn_label: "Read More" 21 | btn_class: "btn--primary" 22 | - image_path: /assets/images/logo.png 23 | title: "UI and Implants" 24 | excerpt: "Everything you wanted to know about Gryffindor and Diagon" 25 | url: "/diagon/" 26 | btn_label: "Read More" 27 | btn_class: "btn--primary" 28 | --- 29 | 30 | Diagon is the default C2 toolset of Prismatica Project. The primary implant for Diagon is Gryffindor a JavaScript-based implant that leverages Windows Scripting Host (WSH) for execution. Gryffindor also has the capability to load and execute arbitrary .NET assemblies through the DotNetToJScript project. 31 | 32 | ![Screenshot](/assets/images/demo3.png) 33 | 34 | ## Base Gryffindor Commands 35 | 36 | Gryffindor includes custom WSH, COM, and .NET post-exploitation capabilities however the implant also supports the ability to `InvokeAssembly` for futher post exploitation capability. Gryffindor includes two core .NET assembly frameworks actualized through DotNetToJScript: 37 | 38 | - Mimikatz 39 | - SharpSploit 40 | 41 | ``` 42 | =========================== 43 | Gryffindor Commands: 44 | =========================== 45 | help - Show this information 46 | cat - Show file contents 47 | type - Show file contents 48 | cd - Change directory 49 | ls - Show directory contents 50 | dir - Show directory contents 51 | die - Exit session 52 | kill - Exit session 53 | set - Modify payload settings 54 | - interval 55 | - sleep 56 | - jitter 57 | show - Display payload information 58 | - settings 59 | upload - Upload a file to the target system 60 | download - Download a remote file from the target system 61 | spawn - Instantiate a new session on the target system 62 | - Example Usage: spawn 63 | WMIExecute - Instantiate a new session on the target system 64 | - Example Usage: WMIExecute 65 | hashdump - Use Mimikatz to dump SAM hashes 66 | InvokeAssembly - Run an payload from within a loaded .NET assembly (Defaults:SharpSploit) 67 | - Example Usage: InvokeAssembly -Entry SharpSploit.Execution.Shell -Module ShellExecute -Args ('calc.exe','','','') 68 | LoadAssembly - Load an arbitrary .NET assembly payload 69 | type - 70 | Other commands sent to Gryffindor are executed in the Windows cmd.exe shell. 71 | =========================== 72 | ``` 73 | 74 | ## Starting a Listener 75 | Before establishing remote access to a target system it is important to instantiate a listener for the implant to connect into. Click on the *headphones* icon to access the listeners panel. Next, click start listener to instantiate a basic http listener in Oculus. 76 | 77 | ![Screenshot](/assets/images/listeners.png) 78 | 79 | As seen above Diagon provides a direct staging command; however, standalone .js payloads can be generated as seen below. 80 | 81 | ## Generating a Payload 82 | Click on the *factory* icon to open the backdoor factory modal window. Generated payloads will appear in the current user's home/.prismatica directory on both Windows and Linux operating systems. 83 | 84 | ![Screenshot](/assets/images/demo3.png) 85 | 86 |
87 | 88 | 89 | {% include feature_row %} 90 | -------------------------------------------------------------------------------- /docs/_pages/guides.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Getting Started" 3 | sitemap: false 4 | layout: single 5 | classes: wide 6 | permalink: /guides/ 7 | header: 8 | image: /assets/images/header.png 9 | feature_row: 10 | - image_path: /assets/images/logo.png 11 | alt: "placeholder image 1" 12 | title: "C2 Architecture" 13 | excerpt: "Learn more about C2 architecture and concepts" 14 | url: "/overview/" 15 | btn_label: "Read More" 16 | btn_class: "btn--primary" 17 | - image_path: /assets/images/term.png 18 | alt: "placeholder image 2" 19 | title: "Prismatica API" 20 | excerpt: "Project Prismatica is built around the concept of Emergence. Explore the Emergence API!" 21 | url: "https://documenter.getpostman.com/view/1609493/7TT8UqJ?version=latest" 22 | btn_label: "Read More" 23 | btn_class: "btn--primary" 24 | - image_path: /assets/images/logo.png 25 | title: "UI and Implants" 26 | excerpt: "Everything you wanted to know about Gryffindor and Diagon" 27 | url: "/diagon/" 28 | btn_label: "Read More" 29 | btn_class: "btn--primary" 30 | --- 31 | 32 | Prismatica is more than just another C2 tool it is meant to be an ecosystem. The project is focused around agnostic integration of information security toolsets to allow rapid prototyping, scripting, and automation of operator objectives. This goal grows out of the concept of Emergence where the collective intelligence of all tools and systems should be greater than the sum of their parts. 33 | 34 | What does that mean exactly? Prismatica is dedicated to having your cake and eating it too. Prism applications can all be cross integrated and if a newer better way of performing an action is developed it can be integrated with the framework to automatically yield all of the capabilities of other apps within the ecosystem. 35 | 36 | - Overview 37 | - Using Prismatica 38 | - Prism Implants 39 | - Pismatica Marketplace 40 | - Concepts and Terminology 41 | - Emergence API 42 | 43 | # Getting Started 44 | To get started with Prismatica you will need to spin up an Emergence server to bind all subcomponents together across a shared data model. Emergence servers can be spun up quickly using Docker. Alternately, it can be executed manually using the `npm install` and `npm start` commands. To run Emergence within a Docker container the `docker` and `docker-compose` commands must be installed. Installing Docker: 45 | 46 | **On Windows:** [Get Docker](https://docs.docker.com/docker-for-windows/install/) 47 | 48 | **On Linux:** 49 | ``` 50 | apt install docker.io 51 | apt install docker-compose 52 | ``` 53 | 54 | **Run Emergence:** 55 | ``` 56 | git clone https://github.com/Project-Prismatica/Emergence.git 57 | cd Emergence 58 | docker-compose up 59 | ``` 60 | 61 | Now that Emergence is running you are ready to start up Prism Apps! Diagon and Oculus are a good place to start. 62 | 63 | **Installing Diagon:** 64 | 65 | Diagon can be downloaded at the following link: [Diagon](https://github.com/Project-Prismatica/Diagon/releases) 66 | 67 | ![Screenshot](/assets/images/demo.gif) 68 | 69 | You will need to configure the Diagon settings with the IP address of the system where Emergence is running. Then to setup listeners you will need to run Oculus. 70 | 71 | **Installing Oculus:** 72 | 73 | ``` 74 | git clone https://github.com/Project-Prismatica/Oculus.git 75 | cd Oculus 76 | python oculus.py 77 | ``` 78 | 79 | Now you're all ready to rock and roll! Happy Hacking! 80 | 81 | ## Prismatica Application Marketplace 82 | 83 | - [Diagon](https://github.com/Project-Prismatica/Diagon) The Diagon Attack Framework is a Prismatica application containing the Ravenclaw, Gryffindor, and Slytherin remote access tools (RATs). 84 | - [Emergence](https://github.com/Project-Prismatica/Emergence) The Emergence fabric is an interface where interaction and integration of disparate information security subsystems gain combined intelligence. 85 | - [Oculus](https://github.com/Project-Prismatica/Oculus) Oculus is a malleable python-based C2 system allowing for instantiation of listeners for the purpose of communication with remote access tools (RATs). 86 | - [Prism Launcher]() The package manager for Prism Apps (Releasing at WWHF) 87 | - [Prism Project Manager]() Project management, findigns, and reporting tool (Releasing at WWHF) 88 | - [Acheron](https://github.com/Acheron-VAF/Acheron) Acheron is a RESTful vulnerability assessment and management framework built around search and dedicated to terminal extensibility. 89 | - [Tiberium](https://github.com/0sm0s1z/Tiberium/releases) A Command and Control scanning tool 90 | 91 | 92 | ## Simple Python Beacon 93 | 94 | ```py 95 | import requests 96 | url = 'http://localhost:80/' 97 | payload = "{\n\t\"type\": \"b\",\n\t\"agentid\": \"24464303\"\n}" 98 | headers = {} 99 | response = requests.request('POST', url, headers = headers, data = payload, allow_redirects=False, timeout=undefined, allow_redirects=false) 100 | print(response.text) 101 | ``` 102 | 103 |
104 | 105 | 106 | {% include feature_row %} 107 | -------------------------------------------------------------------------------- /docs/_pages/overview.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "C2 Architecture" 3 | sitemap: false 4 | layout: single 5 | classes: wide 6 | permalink: /overview/ 7 | feature_row: 8 | - image_path: /assets/images/logo.png 9 | alt: "placeholder image 1" 10 | title: "C2 Architecture" 11 | excerpt: "Learn more about C2 architecture and concepts" 12 | url: "/overview/" 13 | btn_label: "Read More" 14 | btn_class: "btn--primary" 15 | - image_path: /assets/images/term.png 16 | alt: "placeholder image 2" 17 | title: "Prismatica API" 18 | excerpt: "Project Prismatica is built around the concept of Emergence. Explore the Emergence API!" 19 | url: "https://documenter.getpostman.com/view/1609493/7TT8UqJ?version=latest" 20 | btn_label: "Read More" 21 | btn_class: "btn--primary" 22 | - image_path: /assets/images/logo.png 23 | title: "UI and Implants" 24 | excerpt: "Everything you wanted to know about Gryffindor and Diagon" 25 | url: "/diagon/" 26 | btn_label: "Read More" 27 | btn_class: "btn--primary" 28 | --- 29 | 30 | It is the golden age of C2! As a result of the major strides that have been recently accomplished by the information security community there are now more implant frameworks than ever! One downside of this incredible opportunity is the drift in terminology. This page discusses C2 concepts as they relate to the Prismatica Project. 31 | 32 | - **Payload:** A self-encapsulated action that can be executed on a target in order to accomplish an exploitative objective. This could be used to establish an agent. 33 | - **Agent:** A mechanism that provides interactive remote access to a target system. The default implant for Prismatica is Gryffindor. 34 | - **Implant:** A mechanism that provides interactive remote access to a target system. The default implant for Prismatica is Gryffindor. 35 | - **Transport:** A method or channel to enable communication between the C2 server and implant. 36 | - **Listener:** A server that resides between the Emergence API and active implants. 37 | - **Interface:** The control component providing operators with interactive access to the C2 system. The default interface for Prismatica is Diagon. 38 | - **PostEx Language:** A language library supported by a given implant for modular post-exploitation tooling. i.e. SharpSploit (.NET), Impacket (Python) 39 | 40 |
41 | 42 | {% include feature_row %} 43 | -------------------------------------------------------------------------------- /docs/_pages/tag-archive.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Posts by Tag" 3 | permalink: /tags/ 4 | layout: tags 5 | author_profile: true 6 | --- 7 | -------------------------------------------------------------------------------- /docs/_pages/year-archive.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Posts by Year" 3 | permalink: /posts/ 4 | layout: posts 5 | author_profile: true 6 | --- 7 | -------------------------------------------------------------------------------- /docs/_posts/2019-09-09-getting-started.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Installing Prismatica" 3 | categories: 4 | - Blog 5 | tags: 6 | - Post Formats 7 | - readability 8 | - standard 9 | --- 10 | 11 | The Prismatica project is dedicated to having your cake and eating it too. 12 | 13 | ## Getting Started 14 | 15 | To get started with Prismatica you will need to spin up an Emergence server to bind 16 | -------------------------------------------------------------------------------- /docs/_site/404.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Page Not Found - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 69 | 70 | 71 | 72 | 73 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 107 | 108 | 111 | 112 | 113 | 114 |
115 |
116 |
117 | 150 |
151 |
152 |
153 | 154 | 155 |
156 | 157 | 158 | 159 | 160 |
161 | 162 | 163 |
164 | 165 | 166 | 167 | 168 | 169 |
170 | 171 |
172 |

Page Not Found 173 |

174 | 175 |
176 | 177 | 178 |
179 | 180 |

Sorry, but the page you were trying to view does not exist — perhaps you can try searching for it below.

181 | 182 | 186 | 187 | 189 | 190 | 191 | 192 |
193 | 194 |
195 | 196 | 197 | 198 | 199 | 200 |
201 | 202 | 203 | 204 | 205 |
206 | 207 | 208 |
209 | 210 | 211 | 212 |
213 | 214 |
215 | 216 | 217 |
218 |
219 | 222 | 223 |
224 |
225 | 226 |
227 | 228 | 229 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | -------------------------------------------------------------------------------- /docs/_site/README.md: -------------------------------------------------------------------------------- 1 | # Minimal Mistakes remote theme starter 2 | 3 | Fork this repo for the quickest method of getting started with the [Minimal Mistakes Jekyll theme](https://github.com/mmistakes/minimal-mistakes). 4 | 5 | Contains basic configuration to get you a site with: 6 | 7 | - Sample posts. 8 | - Sample top navigation. 9 | - Sample author sidebar with social links. 10 | - Sample footer links. 11 | - Paginated home page. 12 | - Archive pages for posts grouped by year, category, and tag. 13 | - Sample about page. 14 | - Sample 404 page. 15 | - Site wide search. 16 | 17 | Replace sample content with your own and [configure as necessary](https://mmistakes.github.io/minimal-mistakes/docs/configuration/). 18 | 19 | --- 20 | 21 | ## Troubleshooting 22 | 23 | If you have a question about using Jekyll, start a discussion on the [Jekyll Forum](https://talk.jekyllrb.com/) or [StackOverflow](https://stackoverflow.com/questions/tagged/jekyll). Other resources: 24 | 25 | - [Ruby 101](https://jekyllrb.com/docs/ruby-101/) 26 | - [Setting up a Jekyll site with GitHub Pages](https://jekyllrb.com/docs/github-pages/) 27 | - [Configuring GitHub Metadata](https://github.com/jekyll/github-metadata/blob/master/docs/configuration.md#configuration) to work properly when developing locally and avoid `No GitHub API authentication could be found. Some fields may be missing or have incorrect data.` warnings. 28 | -------------------------------------------------------------------------------- /docs/_site/_posts/2019-09-09-getting-started/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Installing Prismatica - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 161 |
162 | 163 | 164 | 165 | 166 | 167 |
168 | 169 |
170 |

Installing Prismatica 171 |

172 | 173 |
174 | 175 | 176 |
177 | 178 |

The Prismatica project is dedicated to having your cake and eating it too.

179 | 180 |

Getting Started

181 | 182 |

To get started with Prismatica you will need to spin up an Emergence server to bind

183 | 184 | 185 |
186 | 187 |
188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 |

198 | Tags: 199 | 200 | 201 | 202 | 203 | , 204 | 205 | 206 | 207 | , 208 | 209 | 210 | 211 | 212 | 213 | 214 |

215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 |

227 | Categories: 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 |

236 | 237 | 238 | 239 |
240 | 241 | 242 | 243 | 244 |
245 | 246 | 247 |
248 | 249 | 250 | 251 |
252 | 253 |
254 | 255 | 256 |
257 |
258 | 261 | 262 |
263 |
264 | 265 |
266 | 267 | 268 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | -------------------------------------------------------------------------------- /docs/_site/about/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | About - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 161 |
162 | 163 | 164 | 165 | 166 | 167 |
168 | 169 |
170 |

About 171 |

172 | 173 |
174 | 175 | 176 |
177 | 178 |

Tempor velit sint sunt ipsum tempor enim ad qui ullamco. Est dolore anim ad velit duis dolore minim sunt aliquip amet commodo labore. Ut eu pariatur aute ea aute excepteur laborum. Esse ea esse excepteur minim mollit qui cillum excepteur ex dolore magna. Labore deserunt fugiat incididunt incididunt sint ea. Consequat dolore aute laboris quis proident quis non et est consectetur ex eiusmod sit culpa.

179 | 180 |

Cupidatat ea do et in excepteur in. Ad nostrud ut est esse eu duis ea sunt eiusmod. Aliquip tempor veniam sint elit fugiat. Velit incididunt laboris amet incididunt labore dolore irure velit excepteur commodo deserunt laborum. Consectetur eu fugiat veniam veniam Lorem labore magna eiusmod. Ea occaecat reprehenderit pariatur consectetur minim labore ut aliquip.

181 | 182 | 183 |
184 | 185 |
186 | 187 | 188 | 189 | 190 | 191 |
192 | 193 | 194 | 195 | 196 |
197 | 198 | 199 |
200 | 201 | 202 | 203 |
204 | 205 |
206 | 207 | 208 |
209 |
210 | 213 | 214 |
215 |
216 | 217 |
218 | 219 | 220 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /docs/_site/assets/images/bio-photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/bio-photo.jpg -------------------------------------------------------------------------------- /docs/_site/assets/images/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/demo.gif -------------------------------------------------------------------------------- /docs/_site/assets/images/demo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/demo2.png -------------------------------------------------------------------------------- /docs/_site/assets/images/demo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/demo3.png -------------------------------------------------------------------------------- /docs/_site/assets/images/demo4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/demo4.png -------------------------------------------------------------------------------- /docs/_site/assets/images/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/header.png -------------------------------------------------------------------------------- /docs/_site/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/logo.png -------------------------------------------------------------------------------- /docs/_site/assets/images/splash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/splash.jpg -------------------------------------------------------------------------------- /docs/_site/assets/images/term.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/term.jpg -------------------------------------------------------------------------------- /docs/_site/assets/images/term.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/images/term.png -------------------------------------------------------------------------------- /docs/_site/assets/js/_main.js: -------------------------------------------------------------------------------- 1 | /* ========================================================================== 2 | jQuery plugin settings and other scripts 3 | ========================================================================== */ 4 | 5 | $(document).ready(function() { 6 | // Sticky footer 7 | var bumpIt = function() { 8 | $("body").css("margin-bottom", $(".page__footer").outerHeight(true)); 9 | }; 10 | 11 | bumpIt(); 12 | $(window).resize( 13 | jQuery.throttle(250, function() { 14 | bumpIt(); 15 | }) 16 | ); 17 | 18 | // FitVids init 19 | $("#main").fitVids(); 20 | 21 | // Sticky sidebar 22 | var stickySideBar = function() { 23 | var show = 24 | $(".author__urls-wrapper button").length === 0 25 | ? $(window).width() > 1024 // width should match $large Sass variable 26 | : !$(".author__urls-wrapper button").is(":visible"); 27 | if (show) { 28 | // fix 29 | $(".sidebar").addClass("sticky"); 30 | } else { 31 | // unfix 32 | $(".sidebar").removeClass("sticky"); 33 | } 34 | }; 35 | 36 | stickySideBar(); 37 | 38 | $(window).resize(function() { 39 | stickySideBar(); 40 | }); 41 | 42 | // Follow menu drop down 43 | $(".author__urls-wrapper button").on("click", function() { 44 | $(".author__urls").toggleClass("is--visible"); 45 | $(".author__urls-wrapper button").toggleClass("open"); 46 | }); 47 | 48 | // Close search screen with Esc key 49 | $(document).keyup(function(e) { 50 | if (e.keyCode === 27) { 51 | if ($(".initial-content").hasClass("is--hidden")) { 52 | $(".search-content").toggleClass("is--visible"); 53 | $(".initial-content").toggleClass("is--hidden"); 54 | } 55 | } 56 | }); 57 | 58 | // Search toggle 59 | $(".search__toggle").on("click", function() { 60 | $(".search-content").toggleClass("is--visible"); 61 | $(".initial-content").toggleClass("is--hidden"); 62 | // set focus on input 63 | setTimeout(function() { 64 | $(".search-content input").focus(); 65 | }, 400); 66 | }); 67 | 68 | // Smooth scrolling 69 | var scroll = new SmoothScroll('a[href*="#"]', { 70 | offset: 20, 71 | speed: 400, 72 | speedAsDuration: true, 73 | durationMax: 500 74 | }); 75 | 76 | // Gumshoe scroll spy init 77 | if($("nav.toc").length > 0) { 78 | var spy = new Gumshoe("nav.toc a", { 79 | // Active classes 80 | navClass: "active", // applied to the nav list item 81 | contentClass: "active", // applied to the content 82 | 83 | // Nested navigation 84 | nested: false, // if true, add classes to parents of active link 85 | nestedClass: "active", // applied to the parent items 86 | 87 | // Offset & reflow 88 | offset: 20, // how far from the top of the page to activate a content area 89 | reflow: true, // if true, listen for reflows 90 | 91 | // Event support 92 | events: true // if true, emit custom events 93 | }); 94 | } 95 | 96 | // add lightbox class to all image links 97 | $( 98 | "a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif']" 99 | ).addClass("image-popup"); 100 | 101 | // Magnific-Popup options 102 | $(".image-popup").magnificPopup({ 103 | // disableOn: function() { 104 | // if( $(window).width() < 500 ) { 105 | // return false; 106 | // } 107 | // return true; 108 | // }, 109 | type: "image", 110 | tLoading: "Loading image #%curr%...", 111 | gallery: { 112 | enabled: true, 113 | navigateByImgClick: true, 114 | preload: [0, 1] // Will preload 0 - before current, and 1 after the current image 115 | }, 116 | image: { 117 | tError: 'Image #%curr% could not be loaded.' 118 | }, 119 | removalDelay: 500, // Delay in milliseconds before popup is removed 120 | // Class that is added to body when popup is open. 121 | // make it unique to apply your CSS animations just to this exact popup 122 | mainClass: "mfp-zoom-in", 123 | callbacks: { 124 | beforeOpen: function() { 125 | // just a hack that adds mfp-anim class to markup 126 | this.st.image.markup = this.st.image.markup.replace( 127 | "mfp-figure", 128 | "mfp-figure mfp-with-anim" 129 | ); 130 | } 131 | }, 132 | closeOnContentClick: true, 133 | midClick: true // allow opening popup on middle mouse click. Always set it to true if you don't provide alternative source. 134 | }); 135 | }); 136 | -------------------------------------------------------------------------------- /docs/_site/assets/js/lunr/lunr-en.js: -------------------------------------------------------------------------------- 1 | var idx = lunr(function () { 2 | this.field('title') 3 | this.field('excerpt') 4 | this.field('categories') 5 | this.field('tags') 6 | this.ref('id') 7 | 8 | this.pipeline.remove(lunr.trimmer) 9 | 10 | for (var item in store) { 11 | this.add({ 12 | title: store[item].title, 13 | excerpt: store[item].excerpt, 14 | categories: store[item].categories, 15 | tags: store[item].tags, 16 | id: item 17 | }) 18 | } 19 | }); 20 | 21 | $(document).ready(function() { 22 | $('input#search').on('keyup', function () { 23 | var resultdiv = $('#results'); 24 | var query = $(this).val().toLowerCase(); 25 | var result = 26 | idx.query(function (q) { 27 | query.split(lunr.tokenizer.separator).forEach(function (term) { 28 | q.term(term, { boost: 100 }) 29 | if(query.lastIndexOf(" ") != query.length-1){ 30 | q.term(term, { usePipeline: false, wildcard: lunr.Query.wildcard.TRAILING, boost: 10 }) 31 | } 32 | if (term != ""){ 33 | q.term(term, { usePipeline: false, editDistance: 1, boost: 1 }) 34 | } 35 | }) 36 | }); 37 | resultdiv.empty(); 38 | resultdiv.prepend('

'+result.length+' Result(s) found

'); 39 | for (var item in result) { 40 | var ref = result[item].ref; 41 | if(store[ref].teaser){ 42 | var searchitem = 43 | '
'+ 44 | '
'+ 45 | '

'+ 46 | ''+store[ref].title+''+ 47 | '

'+ 48 | '
'+ 49 | ''+ 50 | '
'+ 51 | '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ 52 | '
'+ 53 | '
'; 54 | } 55 | else{ 56 | var searchitem = 57 | '
'+ 58 | '
'+ 59 | '

'+ 60 | ''+store[ref].title+''+ 61 | '

'+ 62 | '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ 63 | '
'+ 64 | '
'; 65 | } 66 | resultdiv.append(searchitem); 67 | } 68 | }); 69 | }); 70 | -------------------------------------------------------------------------------- /docs/_site/assets/js/lunr/lunr-gr.js: -------------------------------------------------------------------------------- 1 | step1list = new Array(); 2 | step1list["ΦΑΓΙΑ"] = "ΦΑ"; 3 | step1list["ΦΑΓΙΟΥ"] = "ΦΑ"; 4 | step1list["ΦΑΓΙΩΝ"] = "ΦΑ"; 5 | step1list["ΣΚΑΓΙΑ"] = "ΣΚΑ"; 6 | step1list["ΣΚΑΓΙΟΥ"] = "ΣΚΑ"; 7 | step1list["ΣΚΑΓΙΩΝ"] = "ΣΚΑ"; 8 | step1list["ΟΛΟΓΙΟΥ"] = "ΟΛΟ"; 9 | step1list["ΟΛΟΓΙΑ"] = "ΟΛΟ"; 10 | step1list["ΟΛΟΓΙΩΝ"] = "ΟΛΟ"; 11 | step1list["ΣΟΓΙΟΥ"] = "ΣΟ"; 12 | step1list["ΣΟΓΙΑ"] = "ΣΟ"; 13 | step1list["ΣΟΓΙΩΝ"] = "ΣΟ"; 14 | step1list["ΤΑΤΟΓΙΑ"] = "ΤΑΤΟ"; 15 | step1list["ΤΑΤΟΓΙΟΥ"] = "ΤΑΤΟ"; 16 | step1list["ΤΑΤΟΓΙΩΝ"] = "ΤΑΤΟ"; 17 | step1list["ΚΡΕΑΣ"] = "ΚΡΕ"; 18 | step1list["ΚΡΕΑΤΟΣ"] = "ΚΡΕ"; 19 | step1list["ΚΡΕΑΤΑ"] = "ΚΡΕ"; 20 | step1list["ΚΡΕΑΤΩΝ"] = "ΚΡΕ"; 21 | step1list["ΠΕΡΑΣ"] = "ΠΕΡ"; 22 | step1list["ΠΕΡΑΤΟΣ"] = "ΠΕΡ"; 23 | step1list["ΠΕΡΑΤΑ"] = "ΠΕΡ"; 24 | step1list["ΠΕΡΑΤΩΝ"] = "ΠΕΡ"; 25 | step1list["ΤΕΡΑΣ"] = "ΤΕΡ"; 26 | step1list["ΤΕΡΑΤΟΣ"] = "ΤΕΡ"; 27 | step1list["ΤΕΡΑΤΑ"] = "ΤΕΡ"; 28 | step1list["ΤΕΡΑΤΩΝ"] = "ΤΕΡ"; 29 | step1list["ΦΩΣ"] = "ΦΩ"; 30 | step1list["ΦΩΤΟΣ"] = "ΦΩ"; 31 | step1list["ΦΩΤΑ"] = "ΦΩ"; 32 | step1list["ΦΩΤΩΝ"] = "ΦΩ"; 33 | step1list["ΚΑΘΕΣΤΩΣ"] = "ΚΑΘΕΣΤ"; 34 | step1list["ΚΑΘΕΣΤΩΤΟΣ"] = "ΚΑΘΕΣΤ"; 35 | step1list["ΚΑΘΕΣΤΩΤΑ"] = "ΚΑΘΕΣΤ"; 36 | step1list["ΚΑΘΕΣΤΩΤΩΝ"] = "ΚΑΘΕΣΤ"; 37 | step1list["ΓΕΓΟΝΟΣ"] = "ΓΕΓΟΝ"; 38 | step1list["ΓΕΓΟΝΟΤΟΣ"] = "ΓΕΓΟΝ"; 39 | step1list["ΓΕΓΟΝΟΤΑ"] = "ΓΕΓΟΝ"; 40 | step1list["ΓΕΓΟΝΟΤΩΝ"] = "ΓΕΓΟΝ"; 41 | 42 | v = "[ΑΕΗΙΟΥΩ]"; 43 | v2 = "[ΑΕΗΙΟΩ]" 44 | 45 | function stemWord(w) { 46 | var stem; 47 | var suffix; 48 | var firstch; 49 | var origword = w; 50 | test1 = new Boolean(true); 51 | 52 | if(w.length < 4) { 53 | return w; 54 | } 55 | 56 | var re; 57 | var re2; 58 | var re3; 59 | var re4; 60 | 61 | re = /(.*)(ΦΑΓΙΑ|ΦΑΓΙΟΥ|ΦΑΓΙΩΝ|ΣΚΑΓΙΑ|ΣΚΑΓΙΟΥ|ΣΚΑΓΙΩΝ|ΟΛΟΓΙΟΥ|ΟΛΟΓΙΑ|ΟΛΟΓΙΩΝ|ΣΟΓΙΟΥ|ΣΟΓΙΑ|ΣΟΓΙΩΝ|ΤΑΤΟΓΙΑ|ΤΑΤΟΓΙΟΥ|ΤΑΤΟΓΙΩΝ|ΚΡΕΑΣ|ΚΡΕΑΤΟΣ|ΚΡΕΑΤΑ|ΚΡΕΑΤΩΝ|ΠΕΡΑΣ|ΠΕΡΑΤΟΣ|ΠΕΡΑΤΑ|ΠΕΡΑΤΩΝ|ΤΕΡΑΣ|ΤΕΡΑΤΟΣ|ΤΕΡΑΤΑ|ΤΕΡΑΤΩΝ|ΦΩΣ|ΦΩΤΟΣ|ΦΩΤΑ|ΦΩΤΩΝ|ΚΑΘΕΣΤΩΣ|ΚΑΘΕΣΤΩΤΟΣ|ΚΑΘΕΣΤΩΤΑ|ΚΑΘΕΣΤΩΤΩΝ|ΓΕΓΟΝΟΣ|ΓΕΓΟΝΟΤΟΣ|ΓΕΓΟΝΟΤΑ|ΓΕΓΟΝΟΤΩΝ)$/; 62 | 63 | if(re.test(w)) { 64 | var fp = re.exec(w); 65 | stem = fp[1]; 66 | suffix = fp[2]; 67 | w = stem + step1list[suffix]; 68 | test1 = false; 69 | } 70 | 71 | re = /^(.+?)(ΑΔΕΣ|ΑΔΩΝ)$/; 72 | 73 | if(re.test(w)) { 74 | var fp = re.exec(w); 75 | stem = fp[1]; 76 | w = stem; 77 | 78 | reg1 = /(ΟΚ|ΜΑΜ|ΜΑΝ|ΜΠΑΜΠ|ΠΑΤΕΡ|ΓΙΑΓΙ|ΝΤΑΝΤ|ΚΥΡ|ΘΕΙ|ΠΕΘΕΡ)$/; 79 | 80 | if(!(reg1.test(w))) { 81 | w = w + "ΑΔ"; 82 | } 83 | } 84 | 85 | re2 = /^(.+?)(ΕΔΕΣ|ΕΔΩΝ)$/; 86 | 87 | if(re2.test(w)) { 88 | var fp = re2.exec(w); 89 | stem = fp[1]; 90 | w = stem; 91 | 92 | exept2 = /(ΟΠ|ΙΠ|ΕΜΠ|ΥΠ|ΓΗΠ|ΔΑΠ|ΚΡΑΣΠ|ΜΙΛ)$/; 93 | 94 | if(exept2.test(w)) { 95 | w = w + "ΕΔ"; 96 | } 97 | } 98 | 99 | re3 = /^(.+?)(ΟΥΔΕΣ|ΟΥΔΩΝ)$/; 100 | 101 | if(re3.test(w)) { 102 | var fp = re3.exec(w); 103 | stem = fp[1]; 104 | w = stem; 105 | 106 | exept3 = /(ΑΡΚ|ΚΑΛΙΑΚ|ΠΕΤΑΛ|ΛΙΧ|ΠΛΕΞ|ΣΚ|Σ|ΦΛ|ΦΡ|ΒΕΛ|ΛΟΥΛ|ΧΝ|ΣΠ|ΤΡΑΓ|ΦΕ)$/; 107 | 108 | if(exept3.test(w)) { 109 | w = w + "ΟΥΔ"; 110 | } 111 | } 112 | 113 | re4 = /^(.+?)(ΕΩΣ|ΕΩΝ)$/; 114 | 115 | if(re4.test(w)) { 116 | var fp = re4.exec(w); 117 | stem = fp[1]; 118 | w = stem; 119 | test1 = false; 120 | 121 | exept4 = /^(Θ|Δ|ΕΛ|ΓΑΛ|Ν|Π|ΙΔ|ΠΑΡ)$/; 122 | 123 | if(exept4.test(w)) { 124 | w = w + "Ε"; 125 | } 126 | } 127 | 128 | re = /^(.+?)(ΙΑ|ΙΟΥ|ΙΩΝ)$/; 129 | 130 | if(re.test(w)) { 131 | var fp = re.exec(w); 132 | stem = fp[1]; 133 | w = stem; 134 | re2 = new RegExp(v + "$"); 135 | test1 = false; 136 | 137 | if(re2.test(w)) { 138 | w = stem + "Ι"; 139 | } 140 | } 141 | 142 | re = /^(.+?)(ΙΚΑ|ΙΚΟ|ΙΚΟΥ|ΙΚΩΝ)$/; 143 | 144 | if(re.test(w)) { 145 | var fp = re.exec(w); 146 | stem = fp[1]; 147 | w = stem; 148 | test1 = false; 149 | 150 | re2 = new RegExp(v + "$"); 151 | exept5 = /^(ΑΛ|ΑΔ|ΕΝΔ|ΑΜΑΝ|ΑΜΜΟΧΑΛ|ΗΘ|ΑΝΗΘ|ΑΝΤΙΔ|ΦΥΣ|ΒΡΩΜ|ΓΕΡ|ΕΞΩΔ|ΚΑΛΠ|ΚΑΛΛΙΝ|ΚΑΤΑΔ|ΜΟΥΛ|ΜΠΑΝ|ΜΠΑΓΙΑΤ|ΜΠΟΛ|ΜΠΟΣ|ΝΙΤ|ΞΙΚ|ΣΥΝΟΜΗΛ|ΠΕΤΣ|ΠΙΤΣ|ΠΙΚΑΝΤ|ΠΛΙΑΤΣ|ΠΟΣΤΕΛΝ|ΠΡΩΤΟΔ|ΣΕΡΤ|ΣΥΝΑΔ|ΤΣΑΜ|ΥΠΟΔ|ΦΙΛΟΝ|ΦΥΛΟΔ|ΧΑΣ)$/; 152 | 153 | if((exept5.test(w)) || (re2.test(w))) { 154 | w = w + "ΙΚ"; 155 | } 156 | } 157 | 158 | re = /^(.+?)(ΑΜΕ)$/; 159 | re2 = /^(.+?)(ΑΓΑΜΕ|ΗΣΑΜΕ|ΟΥΣΑΜΕ|ΗΚΑΜΕ|ΗΘΗΚΑΜΕ)$/; 160 | if(w == "ΑΓΑΜΕ") { 161 | w = "ΑΓΑΜ"; 162 | } 163 | 164 | if(re2.test(w)) { 165 | var fp = re2.exec(w); 166 | stem = fp[1]; 167 | w = stem; 168 | test1 = false; 169 | } 170 | 171 | if(re.test(w)) { 172 | var fp = re.exec(w); 173 | stem = fp[1]; 174 | w = stem; 175 | test1 = false; 176 | 177 | exept6 = /^(ΑΝΑΠ|ΑΠΟΘ|ΑΠΟΚ|ΑΠΟΣΤ|ΒΟΥΒ|ΞΕΘ|ΟΥΛ|ΠΕΘ|ΠΙΚΡ|ΠΟΤ|ΣΙΧ|Χ)$/; 178 | 179 | if(exept6.test(w)) { 180 | w = w + "ΑΜ"; 181 | } 182 | } 183 | 184 | re2 = /^(.+?)(ΑΝΕ)$/; 185 | re3 = /^(.+?)(ΑΓΑΝΕ|ΗΣΑΝΕ|ΟΥΣΑΝΕ|ΙΟΝΤΑΝΕ|ΙΟΤΑΝΕ|ΙΟΥΝΤΑΝΕ|ΟΝΤΑΝΕ|ΟΤΑΝΕ|ΟΥΝΤΑΝΕ|ΗΚΑΝΕ|ΗΘΗΚΑΝΕ)$/; 186 | 187 | if(re3.test(w)) { 188 | var fp = re3.exec(w); 189 | stem = fp[1]; 190 | w = stem; 191 | test1 = false; 192 | 193 | re3 = /^(ΤΡ|ΤΣ)$/; 194 | 195 | if(re3.test(w)) { 196 | w = w + "ΑΓΑΝ"; 197 | } 198 | } 199 | 200 | if(re2.test(w)) { 201 | var fp = re2.exec(w); 202 | stem = fp[1]; 203 | w = stem; 204 | test1 = false; 205 | 206 | re2 = new RegExp(v2 + "$"); 207 | exept7 = /^(ΒΕΤΕΡ|ΒΟΥΛΚ|ΒΡΑΧΜ|Γ|ΔΡΑΔΟΥΜ|Θ|ΚΑΛΠΟΥΖ|ΚΑΣΤΕΛ|ΚΟΡΜΟΡ|ΛΑΟΠΛ|ΜΩΑΜΕΘ|Μ|ΜΟΥΣΟΥΛΜ|Ν|ΟΥΛ|Π|ΠΕΛΕΚ|ΠΛ|ΠΟΛΙΣ|ΠΟΡΤΟΛ|ΣΑΡΑΚΑΤΣ|ΣΟΥΛΤ|ΤΣΑΡΛΑΤ|ΟΡΦ|ΤΣΙΓΓ|ΤΣΟΠ|ΦΩΤΟΣΤΕΦ|Χ|ΨΥΧΟΠΛ|ΑΓ|ΟΡΦ|ΓΑΛ|ΓΕΡ|ΔΕΚ|ΔΙΠΛ|ΑΜΕΡΙΚΑΝ|ΟΥΡ|ΠΙΘ|ΠΟΥΡΙΤ|Σ|ΖΩΝΤ|ΙΚ|ΚΑΣΤ|ΚΟΠ|ΛΙΧ|ΛΟΥΘΗΡ|ΜΑΙΝΤ|ΜΕΛ|ΣΙΓ|ΣΠ|ΣΤΕΓ|ΤΡΑΓ|ΤΣΑΓ|Φ|ΕΡ|ΑΔΑΠ|ΑΘΙΓΓ|ΑΜΗΧ|ΑΝΙΚ|ΑΝΟΡΓ|ΑΠΗΓ|ΑΠΙΘ|ΑΤΣΙΓΓ|ΒΑΣ|ΒΑΣΚ|ΒΑΘΥΓΑΛ|ΒΙΟΜΗΧ|ΒΡΑΧΥΚ|ΔΙΑΤ|ΔΙΑΦ|ΕΝΟΡΓ|ΘΥΣ|ΚΑΠΝΟΒΙΟΜΗΧ|ΚΑΤΑΓΑΛ|ΚΛΙΒ|ΚΟΙΛΑΡΦ|ΛΙΒ|ΜΕΓΛΟΒΙΟΜΗΧ|ΜΙΚΡΟΒΙΟΜΗΧ|ΝΤΑΒ|ΞΗΡΟΚΛΙΒ|ΟΛΙΓΟΔΑΜ|ΟΛΟΓΑΛ|ΠΕΝΤΑΡΦ|ΠΕΡΗΦ|ΠΕΡΙΤΡ|ΠΛΑΤ|ΠΟΛΥΔΑΠ|ΠΟΛΥΜΗΧ|ΣΤΕΦ|ΤΑΒ|ΤΕΤ|ΥΠΕΡΗΦ|ΥΠΟΚΟΠ|ΧΑΜΗΛΟΔΑΠ|ΨΗΛΟΤΑΒ)$/; 208 | 209 | if((re2.test(w)) || (exept7.test(w))) { 210 | w = w + "ΑΝ"; 211 | } 212 | } 213 | 214 | re3 = /^(.+?)(ΕΤΕ)$/; 215 | re4 = /^(.+?)(ΗΣΕΤΕ)$/; 216 | 217 | if(re4.test(w)) { 218 | var fp = re4.exec(w); 219 | stem = fp[1]; 220 | w = stem; 221 | test1 = false; 222 | } 223 | 224 | if(re3.test(w)) { 225 | var fp = re3.exec(w); 226 | stem = fp[1]; 227 | w = stem; 228 | test1 = false; 229 | 230 | re3 = new RegExp(v2 + "$"); 231 | exept8 = /(ΟΔ|ΑΙΡ|ΦΟΡ|ΤΑΘ|ΔΙΑΘ|ΣΧ|ΕΝΔ|ΕΥΡ|ΤΙΘ|ΥΠΕΡΘ|ΡΑΘ|ΕΝΘ|ΡΟΘ|ΣΘ|ΠΥΡ|ΑΙΝ|ΣΥΝΔ|ΣΥΝ|ΣΥΝΘ|ΧΩΡ|ΠΟΝ|ΒΡ|ΚΑΘ|ΕΥΘ|ΕΚΘ|ΝΕΤ|ΡΟΝ|ΑΡΚ|ΒΑΡ|ΒΟΛ|ΩΦΕΛ)$/; 232 | exept9 = /^(ΑΒΑΡ|ΒΕΝ|ΕΝΑΡ|ΑΒΡ|ΑΔ|ΑΘ|ΑΝ|ΑΠΛ|ΒΑΡΟΝ|ΝΤΡ|ΣΚ|ΚΟΠ|ΜΠΟΡ|ΝΙΦ|ΠΑΓ|ΠΑΡΑΚΑΛ|ΣΕΡΠ|ΣΚΕΛ|ΣΥΡΦ|ΤΟΚ|Υ|Δ|ΕΜ|ΘΑΡΡ|Θ)$/; 233 | 234 | if((re3.test(w)) || (exept8.test(w)) || (exept9.test(w))) { 235 | w = w + "ΕΤ"; 236 | } 237 | } 238 | 239 | re = /^(.+?)(ΟΝΤΑΣ|ΩΝΤΑΣ)$/; 240 | 241 | if(re.test(w)) { 242 | var fp = re.exec(w); 243 | stem = fp[1]; 244 | w = stem; 245 | test1 = false; 246 | 247 | exept10 = /^(ΑΡΧ)$/; 248 | exept11 = /(ΚΡΕ)$/; 249 | if(exept10.test(w)) { 250 | w = w + "ΟΝΤ"; 251 | } 252 | if(exept11.test(w)) { 253 | w = w + "ΩΝΤ"; 254 | } 255 | } 256 | 257 | re = /^(.+?)(ΟΜΑΣΤΕ|ΙΟΜΑΣΤΕ)$/; 258 | 259 | if(re.test(w)) { 260 | var fp = re.exec(w); 261 | stem = fp[1]; 262 | w = stem; 263 | test1 = false; 264 | 265 | exept11 = /^(ΟΝ)$/; 266 | 267 | if(exept11.test(w)) { 268 | w = w + "ΟΜΑΣΤ"; 269 | } 270 | } 271 | 272 | re = /^(.+?)(ΕΣΤΕ)$/; 273 | re2 = /^(.+?)(ΙΕΣΤΕ)$/; 274 | 275 | if(re2.test(w)) { 276 | var fp = re2.exec(w); 277 | stem = fp[1]; 278 | w = stem; 279 | test1 = false; 280 | 281 | re2 = /^(Π|ΑΠ|ΣΥΜΠ|ΑΣΥΜΠ|ΑΚΑΤΑΠ|ΑΜΕΤΑΜΦ)$/; 282 | 283 | if(re2.test(w)) { 284 | w = w + "ΙΕΣΤ"; 285 | } 286 | } 287 | 288 | if(re.test(w)) { 289 | var fp = re.exec(w); 290 | stem = fp[1]; 291 | w = stem; 292 | test1 = false; 293 | 294 | exept12 = /^(ΑΛ|ΑΡ|ΕΚΤΕΛ|Ζ|Μ|Ξ|ΠΑΡΑΚΑΛ|ΑΡ|ΠΡΟ|ΝΙΣ)$/; 295 | 296 | if(exept12.test(w)) { 297 | w = w + "ΕΣΤ"; 298 | } 299 | } 300 | 301 | re = /^(.+?)(ΗΚΑ|ΗΚΕΣ|ΗΚΕ)$/; 302 | re2 = /^(.+?)(ΗΘΗΚΑ|ΗΘΗΚΕΣ|ΗΘΗΚΕ)$/; 303 | 304 | if(re2.test(w)) { 305 | var fp = re2.exec(w); 306 | stem = fp[1]; 307 | w = stem; 308 | test1 = false; 309 | } 310 | 311 | if(re.test(w)) { 312 | var fp = re.exec(w); 313 | stem = fp[1]; 314 | w = stem; 315 | test1 = false; 316 | 317 | exept13 = /(ΣΚΩΛ|ΣΚΟΥΛ|ΝΑΡΘ|ΣΦ|ΟΘ|ΠΙΘ)$/; 318 | exept14 = /^(ΔΙΑΘ|Θ|ΠΑΡΑΚΑΤΑΘ|ΠΡΟΣΘ|ΣΥΝΘ|)$/; 319 | 320 | if((exept13.test(w)) || (exept14.test(w))) { 321 | w = w + "ΗΚ"; 322 | } 323 | } 324 | 325 | re = /^(.+?)(ΟΥΣΑ|ΟΥΣΕΣ|ΟΥΣΕ)$/; 326 | 327 | if(re.test(w)) { 328 | var fp = re.exec(w); 329 | stem = fp[1]; 330 | w = stem; 331 | test1 = false; 332 | 333 | exept15 = /^(ΦΑΡΜΑΚ|ΧΑΔ|ΑΓΚ|ΑΝΑΡΡ|ΒΡΟΜ|ΕΚΛΙΠ|ΛΑΜΠΙΔ|ΛΕΧ|Μ|ΠΑΤ|Ρ|Λ|ΜΕΔ|ΜΕΣΑΖ|ΥΠΟΤΕΙΝ|ΑΜ|ΑΙΘ|ΑΝΗΚ|ΔΕΣΠΟΖ|ΕΝΔΙΑΦΕΡ|ΔΕ|ΔΕΥΤΕΡΕΥ|ΚΑΘΑΡΕΥ|ΠΛΕ|ΤΣΑ)$/; 334 | exept16 = /(ΠΟΔΑΡ|ΒΛΕΠ|ΠΑΝΤΑΧ|ΦΡΥΔ|ΜΑΝΤΙΛ|ΜΑΛΛ|ΚΥΜΑΤ|ΛΑΧ|ΛΗΓ|ΦΑΓ|ΟΜ|ΠΡΩΤ)$/; 335 | 336 | if((exept15.test(w)) || (exept16.test(w))) { 337 | w = w + "ΟΥΣ"; 338 | } 339 | } 340 | 341 | re = /^(.+?)(ΑΓΑ|ΑΓΕΣ|ΑΓΕ)$/; 342 | 343 | if(re.test(w)) { 344 | var fp = re.exec(w); 345 | stem = fp[1]; 346 | w = stem; 347 | test1 = false; 348 | 349 | exept17 = /^(ΨΟΦ|ΝΑΥΛΟΧ)$/; 350 | exept20 = /(ΚΟΛΛ)$/; 351 | exept18 = /^(ΑΒΑΣΤ|ΠΟΛΥΦ|ΑΔΗΦ|ΠΑΜΦ|Ρ|ΑΣΠ|ΑΦ|ΑΜΑΛ|ΑΜΑΛΛΙ|ΑΝΥΣΤ|ΑΠΕΡ|ΑΣΠΑΡ|ΑΧΑΡ|ΔΕΡΒΕΝ|ΔΡΟΣΟΠ|ΞΕΦ|ΝΕΟΠ|ΝΟΜΟΤ|ΟΛΟΠ|ΟΜΟΤ|ΠΡΟΣΤ|ΠΡΟΣΩΠΟΠ|ΣΥΜΠ|ΣΥΝΤ|Τ|ΥΠΟΤ|ΧΑΡ|ΑΕΙΠ|ΑΙΜΟΣΤ|ΑΝΥΠ|ΑΠΟΤ|ΑΡΤΙΠ|ΔΙΑΤ|ΕΝ|ΕΠΙΤ|ΚΡΟΚΑΛΟΠ|ΣΙΔΗΡΟΠ|Λ|ΝΑΥ|ΟΥΛΑΜ|ΟΥΡ|Π|ΤΡ|Μ)$/; 352 | exept19 = /(ΟΦ|ΠΕΛ|ΧΟΡΤ|ΛΛ|ΣΦ|ΡΠ|ΦΡ|ΠΡ|ΛΟΧ|ΣΜΗΝ)$/; 353 | 354 | if(((exept18.test(w)) || (exept19.test(w))) && !((exept17.test(w)) || (exept20.test(w)))) { 355 | w = w + "ΑΓ"; 356 | } 357 | } 358 | 359 | re = /^(.+?)(ΗΣΕ|ΗΣΟΥ|ΗΣΑ)$/; 360 | 361 | if(re.test(w)) { 362 | var fp = re.exec(w); 363 | stem = fp[1]; 364 | w = stem; 365 | test1 = false; 366 | 367 | exept21 = /^(Ν|ΧΕΡΣΟΝ|ΔΩΔΕΚΑΝ|ΕΡΗΜΟΝ|ΜΕΓΑΛΟΝ|ΕΠΤΑΝ)$/; 368 | 369 | if(exept21.test(w)) { 370 | w = w + "ΗΣ"; 371 | } 372 | } 373 | 374 | re = /^(.+?)(ΗΣΤΕ)$/; 375 | 376 | if(re.test(w)) { 377 | var fp = re.exec(w); 378 | stem = fp[1]; 379 | w = stem; 380 | test1 = false; 381 | 382 | exept22 = /^(ΑΣΒ|ΣΒ|ΑΧΡ|ΧΡ|ΑΠΛ|ΑΕΙΜΝ|ΔΥΣΧΡ|ΕΥΧΡ|ΚΟΙΝΟΧΡ|ΠΑΛΙΜΨ)$/; 383 | 384 | if(exept22.test(w)) { 385 | w = w + "ΗΣΤ"; 386 | } 387 | } 388 | 389 | re = /^(.+?)(ΟΥΝΕ|ΗΣΟΥΝΕ|ΗΘΟΥΝΕ)$/; 390 | 391 | if(re.test(w)) { 392 | var fp = re.exec(w); 393 | stem = fp[1]; 394 | w = stem; 395 | test1 = false; 396 | 397 | exept23 = /^(Ν|Ρ|ΣΠΙ|ΣΤΡΑΒΟΜΟΥΤΣ|ΚΑΚΟΜΟΥΤΣ|ΕΞΩΝ)$/; 398 | 399 | if(exept23.test(w)) { 400 | w = w + "ΟΥΝ"; 401 | } 402 | } 403 | 404 | re = /^(.+?)(ΟΥΜΕ|ΗΣΟΥΜΕ|ΗΘΟΥΜΕ)$/; 405 | 406 | if(re.test(w)) { 407 | var fp = re.exec(w); 408 | stem = fp[1]; 409 | w = stem; 410 | test1 = false; 411 | 412 | exept24 = /^(ΠΑΡΑΣΟΥΣ|Φ|Χ|ΩΡΙΟΠΛ|ΑΖ|ΑΛΛΟΣΟΥΣ|ΑΣΟΥΣ)$/; 413 | 414 | if(exept24.test(w)) { 415 | w = w + "ΟΥΜ"; 416 | } 417 | } 418 | 419 | re = /^(.+?)(ΜΑΤΑ|ΜΑΤΩΝ|ΜΑΤΟΣ)$/; 420 | re2 = /^(.+?)(Α|ΑΓΑΤΕ|ΑΓΑΝ|ΑΕΙ|ΑΜΑΙ|ΑΝ|ΑΣ|ΑΣΑΙ|ΑΤΑΙ|ΑΩ|Ε|ΕΙ|ΕΙΣ|ΕΙΤΕ|ΕΣΑΙ|ΕΣ|ΕΤΑΙ|Ι|ΙΕΜΑΙ|ΙΕΜΑΣΤΕ|ΙΕΤΑΙ|ΙΕΣΑΙ|ΙΕΣΑΣΤΕ|ΙΟΜΑΣΤΑΝ|ΙΟΜΟΥΝ|ΙΟΜΟΥΝΑ|ΙΟΝΤΑΝ|ΙΟΝΤΟΥΣΑΝ|ΙΟΣΑΣΤΑΝ|ΙΟΣΑΣΤΕ|ΙΟΣΟΥΝ|ΙΟΣΟΥΝΑ|ΙΟΤΑΝ|ΙΟΥΜΑ|ΙΟΥΜΑΣΤΕ|ΙΟΥΝΤΑΙ|ΙΟΥΝΤΑΝ|Η|ΗΔΕΣ|ΗΔΩΝ|ΗΘΕΙ|ΗΘΕΙΣ|ΗΘΕΙΤΕ|ΗΘΗΚΑΤΕ|ΗΘΗΚΑΝ|ΗΘΟΥΝ|ΗΘΩ|ΗΚΑΤΕ|ΗΚΑΝ|ΗΣ|ΗΣΑΝ|ΗΣΑΤΕ|ΗΣΕΙ|ΗΣΕΣ|ΗΣΟΥΝ|ΗΣΩ|Ο|ΟΙ|ΟΜΑΙ|ΟΜΑΣΤΑΝ|ΟΜΟΥΝ|ΟΜΟΥΝΑ|ΟΝΤΑΙ|ΟΝΤΑΝ|ΟΝΤΟΥΣΑΝ|ΟΣ|ΟΣΑΣΤΑΝ|ΟΣΑΣΤΕ|ΟΣΟΥΝ|ΟΣΟΥΝΑ|ΟΤΑΝ|ΟΥ|ΟΥΜΑΙ|ΟΥΜΑΣΤΕ|ΟΥΝ|ΟΥΝΤΑΙ|ΟΥΝΤΑΝ|ΟΥΣ|ΟΥΣΑΝ|ΟΥΣΑΤΕ|Υ|ΥΣ|Ω|ΩΝ)$/; 421 | 422 | if(re.test(w)) { 423 | var fp = re.exec(w); 424 | stem = fp[1]; 425 | w = stem + "ΜΑ"; 426 | } 427 | 428 | if((re2.test(w)) && (test1)) { 429 | var fp = re2.exec(w); 430 | stem = fp[1]; 431 | w = stem; 432 | 433 | } 434 | 435 | re = /^(.+?)(ΕΣΤΕΡ|ΕΣΤΑΤ|ΟΤΕΡ|ΟΤΑΤ|ΥΤΕΡ|ΥΤΑΤ|ΩΤΕΡ|ΩΤΑΤ)$/; 436 | 437 | if(re.test(w)) { 438 | var fp = re.exec(w); 439 | stem = fp[1]; 440 | w = stem; 441 | } 442 | 443 | return w; 444 | }; 445 | 446 | var greekStemmer = function (token) { 447 | return token.update(function (word) { 448 | return stemWord(word); 449 | }) 450 | } 451 | 452 | var idx = lunr(function () { 453 | this.field('title') 454 | this.field('excerpt') 455 | this.field('categories') 456 | this.field('tags') 457 | this.ref('id') 458 | 459 | this.pipeline.remove(lunr.trimmer) 460 | this.pipeline.add(greekStemmer) 461 | this.pipeline.remove(lunr.stemmer) 462 | 463 | for (var item in store) { 464 | this.add({ 465 | title: store[item].title, 466 | excerpt: store[item].excerpt, 467 | categories: store[item].categories, 468 | tags: store[item].tags, 469 | id: item 470 | }) 471 | } 472 | }); 473 | 474 | $(document).ready(function() { 475 | $('input#search').on('keyup', function () { 476 | var resultdiv = $('#results'); 477 | var query = $(this).val().toLowerCase(); 478 | var result = 479 | idx.query(function (q) { 480 | query.split(lunr.tokenizer.separator).forEach(function (term) { 481 | q.term(term, { boost: 100 }) 482 | if(query.lastIndexOf(" ") != query.length-1){ 483 | q.term(term, { usePipeline: false, wildcard: lunr.Query.wildcard.TRAILING, boost: 10 }) 484 | } 485 | if (term != ""){ 486 | q.term(term, { usePipeline: false, editDistance: 1, boost: 1 }) 487 | } 488 | }) 489 | }); 490 | resultdiv.empty(); 491 | resultdiv.prepend('

'+result.length+' Result(s) found

'); 492 | for (var item in result) { 493 | var ref = result[item].ref; 494 | if(store[ref].teaser){ 495 | var searchitem = 496 | '
'+ 497 | '
'+ 498 | '

'+ 499 | ''+store[ref].title+''+ 500 | '

'+ 501 | '
'+ 502 | ''+ 503 | '
'+ 504 | '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ 505 | '
'+ 506 | '
'; 507 | } 508 | else{ 509 | var searchitem = 510 | '
'+ 511 | '
'+ 512 | '

'+ 513 | ''+store[ref].title+''+ 514 | '

'+ 515 | '

'+store[ref].excerpt.split(" ").splice(0,20).join(" ")+'...

'+ 516 | '
'+ 517 | '
'; 518 | } 519 | resultdiv.append(searchitem); 520 | } 521 | }); 522 | }); 523 | -------------------------------------------------------------------------------- /docs/_site/assets/js/lunr/lunr-store.js: -------------------------------------------------------------------------------- 1 | var store = [{ 2 | "title": "Installing Prismatica", 3 | "excerpt":"The Prismatica project is dedicated to having your cake and eating it too. Getting Started To get started with Prismatica you will need to spin up an Emergence server to bind ","categories": ["Blog"], 4 | "tags": ["Post Formats","readability","standard"], 5 | "url": "http://localhost:4000/blog/getting-started/", 6 | "teaser":null}] 7 | -------------------------------------------------------------------------------- /docs/_site/assets/js/plugins/gumshoe.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * gumshoejs v5.1.1 3 | * A simple, framework-agnostic scrollspy script. 4 | * (c) 2019 Chris Ferdinandi 5 | * MIT License 6 | * http://github.com/cferdinandi/gumshoe 7 | */ 8 | 9 | (function (root, factory) { 10 | if ( typeof define === 'function' && define.amd ) { 11 | define([], (function () { 12 | return factory(root); 13 | })); 14 | } else if ( typeof exports === 'object' ) { 15 | module.exports = factory(root); 16 | } else { 17 | root.Gumshoe = factory(root); 18 | } 19 | })(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, (function (window) { 20 | 21 | 'use strict'; 22 | 23 | // 24 | // Defaults 25 | // 26 | 27 | var defaults = { 28 | 29 | // Active classes 30 | navClass: 'active', 31 | contentClass: 'active', 32 | 33 | // Nested navigation 34 | nested: false, 35 | nestedClass: 'active', 36 | 37 | // Offset & reflow 38 | offset: 0, 39 | reflow: false, 40 | 41 | // Event support 42 | events: true 43 | 44 | }; 45 | 46 | 47 | // 48 | // Methods 49 | // 50 | 51 | /** 52 | * Merge two or more objects together. 53 | * @param {Object} objects The objects to merge together 54 | * @returns {Object} Merged values of defaults and options 55 | */ 56 | var extend = function () { 57 | var merged = {}; 58 | Array.prototype.forEach.call(arguments, (function (obj) { 59 | for (var key in obj) { 60 | if (!obj.hasOwnProperty(key)) return; 61 | merged[key] = obj[key]; 62 | } 63 | })); 64 | return merged; 65 | }; 66 | 67 | /** 68 | * Emit a custom event 69 | * @param {String} type The event type 70 | * @param {Node} elem The element to attach the event to 71 | * @param {Object} detail Any details to pass along with the event 72 | */ 73 | var emitEvent = function (type, elem, detail) { 74 | 75 | // Make sure events are enabled 76 | if (!detail.settings.events) return; 77 | 78 | // Create a new event 79 | var event = new CustomEvent(type, { 80 | bubbles: true, 81 | cancelable: true, 82 | detail: detail 83 | }); 84 | 85 | // Dispatch the event 86 | elem.dispatchEvent(event); 87 | 88 | }; 89 | 90 | /** 91 | * Get an element's distance from the top of the Document. 92 | * @param {Node} elem The element 93 | * @return {Number} Distance from the top in pixels 94 | */ 95 | var getOffsetTop = function (elem) { 96 | var location = 0; 97 | if (elem.offsetParent) { 98 | while (elem) { 99 | location += elem.offsetTop; 100 | elem = elem.offsetParent; 101 | } 102 | } 103 | return location >= 0 ? location : 0; 104 | }; 105 | 106 | /** 107 | * Sort content from first to last in the DOM 108 | * @param {Array} contents The content areas 109 | */ 110 | var sortContents = function (contents) { 111 | if(contents) { 112 | contents.sort((function (item1, item2) { 113 | var offset1 = getOffsetTop(item1.content); 114 | var offset2 = getOffsetTop(item2.content); 115 | if (offset1 < offset2) return -1; 116 | return 1; 117 | })); 118 | } 119 | }; 120 | 121 | /** 122 | * Get the offset to use for calculating position 123 | * @param {Object} settings The settings for this instantiation 124 | * @return {Float} The number of pixels to offset the calculations 125 | */ 126 | var getOffset = function (settings) { 127 | 128 | // if the offset is a function run it 129 | if (typeof settings.offset === 'function') { 130 | return parseFloat(settings.offset()); 131 | } 132 | 133 | // Otherwise, return it as-is 134 | return parseFloat(settings.offset); 135 | 136 | }; 137 | 138 | /** 139 | * Get the document element's height 140 | * @private 141 | * @returns {Number} 142 | */ 143 | var getDocumentHeight = function () { 144 | return Math.max( 145 | document.body.scrollHeight, document.documentElement.scrollHeight, 146 | document.body.offsetHeight, document.documentElement.offsetHeight, 147 | document.body.clientHeight, document.documentElement.clientHeight 148 | ); 149 | }; 150 | 151 | /** 152 | * Determine if an element is in view 153 | * @param {Node} elem The element 154 | * @param {Object} settings The settings for this instantiation 155 | * @param {Boolean} bottom If true, check if element is above bottom of viewport instead 156 | * @return {Boolean} Returns true if element is in the viewport 157 | */ 158 | var isInView = function (elem, settings, bottom) { 159 | var bounds = elem.getBoundingClientRect(); 160 | var offset = getOffset(settings); 161 | if (bottom) { 162 | return parseInt(bounds.bottom, 10) < (window.innerHeight || document.documentElement.clientHeight); 163 | } 164 | return parseInt(bounds.top, 10) <= offset; 165 | }; 166 | 167 | /** 168 | * Check if at the bottom of the viewport 169 | * @return {Boolean} If true, page is at the bottom of the viewport 170 | */ 171 | var isAtBottom = function () { 172 | if (window.innerHeight + window.pageYOffset >= getDocumentHeight()) return true; 173 | return false; 174 | }; 175 | 176 | /** 177 | * Check if the last item should be used (even if not at the top of the page) 178 | * @param {Object} item The last item 179 | * @param {Object} settings The settings for this instantiation 180 | * @return {Boolean} If true, use the last item 181 | */ 182 | var useLastItem = function (item, settings) { 183 | if (isAtBottom() && isInView(item.content, settings, true)) return true; 184 | return false; 185 | }; 186 | 187 | /** 188 | * Get the active content 189 | * @param {Array} contents The content areas 190 | * @param {Object} settings The settings for this instantiation 191 | * @return {Object} The content area and matching navigation link 192 | */ 193 | var getActive = function (contents, settings) { 194 | var last = contents[contents.length-1]; 195 | if (useLastItem(last, settings)) return last; 196 | for (var i = contents.length - 1; i >= 0; i--) { 197 | if (isInView(contents[i].content, settings)) return contents[i]; 198 | } 199 | }; 200 | 201 | /** 202 | * Deactivate parent navs in a nested navigation 203 | * @param {Node} nav The starting navigation element 204 | * @param {Object} settings The settings for this instantiation 205 | */ 206 | var deactivateNested = function (nav, settings) { 207 | 208 | // If nesting isn't activated, bail 209 | if (!settings.nested) return; 210 | 211 | // Get the parent navigation 212 | var li = nav.parentNode.closest('li'); 213 | if (!li) return; 214 | 215 | // Remove the active class 216 | li.classList.remove(settings.nestedClass); 217 | 218 | // Apply recursively to any parent navigation elements 219 | deactivateNested(li, settings); 220 | 221 | }; 222 | 223 | /** 224 | * Deactivate a nav and content area 225 | * @param {Object} items The nav item and content to deactivate 226 | * @param {Object} settings The settings for this instantiation 227 | */ 228 | var deactivate = function (items, settings) { 229 | 230 | // Make sure their are items to deactivate 231 | if (!items) return; 232 | 233 | // Get the parent list item 234 | var li = items.nav.closest('li'); 235 | if (!li) return; 236 | 237 | // Remove the active class from the nav and content 238 | li.classList.remove(settings.navClass); 239 | items.content.classList.remove(settings.contentClass); 240 | 241 | // Deactivate any parent navs in a nested navigation 242 | deactivateNested(li, settings); 243 | 244 | // Emit a custom event 245 | emitEvent('gumshoeDeactivate', li, { 246 | link: items.nav, 247 | content: items.content, 248 | settings: settings 249 | }); 250 | 251 | }; 252 | 253 | 254 | /** 255 | * Activate parent navs in a nested navigation 256 | * @param {Node} nav The starting navigation element 257 | * @param {Object} settings The settings for this instantiation 258 | */ 259 | var activateNested = function (nav, settings) { 260 | 261 | // If nesting isn't activated, bail 262 | if (!settings.nested) return; 263 | 264 | // Get the parent navigation 265 | var li = nav.parentNode.closest('li'); 266 | if (!li) return; 267 | 268 | // Add the active class 269 | li.classList.add(settings.nestedClass); 270 | 271 | // Apply recursively to any parent navigation elements 272 | activateNested(li, settings); 273 | 274 | }; 275 | 276 | /** 277 | * Activate a nav and content area 278 | * @param {Object} items The nav item and content to activate 279 | * @param {Object} settings The settings for this instantiation 280 | */ 281 | var activate = function (items, settings) { 282 | 283 | // Make sure their are items to activate 284 | if (!items) return; 285 | 286 | // Get the parent list item 287 | var li = items.nav.closest('li'); 288 | if (!li) return; 289 | 290 | // Add the active class to the nav and content 291 | li.classList.add(settings.navClass); 292 | items.content.classList.add(settings.contentClass); 293 | 294 | // Activate any parent navs in a nested navigation 295 | activateNested(li, settings); 296 | 297 | // Emit a custom event 298 | emitEvent('gumshoeActivate', li, { 299 | link: items.nav, 300 | content: items.content, 301 | settings: settings 302 | }); 303 | 304 | }; 305 | 306 | /** 307 | * Create the Constructor object 308 | * @param {String} selector The selector to use for navigation items 309 | * @param {Object} options User options and settings 310 | */ 311 | var Constructor = function (selector, options) { 312 | 313 | // 314 | // Variables 315 | // 316 | 317 | var publicAPIs = {}; 318 | var navItems, contents, current, timeout, settings; 319 | 320 | 321 | // 322 | // Methods 323 | // 324 | 325 | /** 326 | * Set variables from DOM elements 327 | */ 328 | publicAPIs.setup = function () { 329 | 330 | // Get all nav items 331 | navItems = document.querySelectorAll(selector); 332 | 333 | // Create contents array 334 | contents = []; 335 | 336 | // Loop through each item, get it's matching content, and push to the array 337 | Array.prototype.forEach.call(navItems, (function (item) { 338 | 339 | // Get the content for the nav item 340 | var content = document.getElementById(decodeURIComponent(item.hash.substr(1))); 341 | if (!content) return; 342 | 343 | // Push to the contents array 344 | contents.push({ 345 | nav: item, 346 | content: content 347 | }); 348 | 349 | })); 350 | 351 | // Sort contents by the order they appear in the DOM 352 | sortContents(contents); 353 | 354 | }; 355 | 356 | /** 357 | * Detect which content is currently active 358 | */ 359 | publicAPIs.detect = function () { 360 | 361 | // Get the active content 362 | var active = getActive(contents, settings); 363 | 364 | // if there's no active content, deactivate and bail 365 | if (!active) { 366 | if (current) { 367 | deactivate(current, settings); 368 | current = null; 369 | } 370 | return; 371 | } 372 | 373 | // If the active content is the one currently active, do nothing 374 | if (current && active.content === current.content) return; 375 | 376 | // Deactivate the current content and activate the new content 377 | deactivate(current, settings); 378 | activate(active, settings); 379 | 380 | // Update the currently active content 381 | current = active; 382 | 383 | }; 384 | 385 | /** 386 | * Detect the active content on scroll 387 | * Debounced for performance 388 | */ 389 | var scrollHandler = function (event) { 390 | 391 | // If there's a timer, cancel it 392 | if (timeout) { 393 | window.cancelAnimationFrame(timeout); 394 | } 395 | 396 | // Setup debounce callback 397 | timeout = window.requestAnimationFrame(publicAPIs.detect); 398 | 399 | }; 400 | 401 | /** 402 | * Update content sorting on resize 403 | * Debounced for performance 404 | */ 405 | var resizeHandler = function (event) { 406 | 407 | // If there's a timer, cancel it 408 | if (timeout) { 409 | window.cancelAnimationFrame(timeout); 410 | } 411 | 412 | // Setup debounce callback 413 | timeout = window.requestAnimationFrame((function () { 414 | sortContents(contents); 415 | publicAPIs.detect(); 416 | })); 417 | 418 | }; 419 | 420 | /** 421 | * Destroy the current instantiation 422 | */ 423 | publicAPIs.destroy = function () { 424 | 425 | // Undo DOM changes 426 | if (current) { 427 | deactivate(current, settings); 428 | } 429 | 430 | // Remove event listeners 431 | window.removeEventListener('scroll', scrollHandler, false); 432 | if (settings.reflow) { 433 | window.removeEventListener('resize', resizeHandler, false); 434 | } 435 | 436 | // Reset variables 437 | contents = null; 438 | navItems = null; 439 | current = null; 440 | timeout = null; 441 | settings = null; 442 | 443 | }; 444 | 445 | /** 446 | * Initialize the current instantiation 447 | */ 448 | var init = function () { 449 | 450 | // Merge user options into defaults 451 | settings = extend(defaults, options || {}); 452 | 453 | // Setup variables based on the current DOM 454 | publicAPIs.setup(); 455 | 456 | // Find the currently active content 457 | publicAPIs.detect(); 458 | 459 | // Setup event listeners 460 | window.addEventListener('scroll', scrollHandler, false); 461 | if (settings.reflow) { 462 | window.addEventListener('resize', resizeHandler, false); 463 | } 464 | 465 | }; 466 | 467 | 468 | // 469 | // Initialize and return the public APIs 470 | // 471 | 472 | init(); 473 | return publicAPIs; 474 | 475 | }; 476 | 477 | 478 | // 479 | // Return the Constructor 480 | // 481 | 482 | return Constructor; 483 | 484 | })); -------------------------------------------------------------------------------- /docs/_site/assets/js/plugins/jquery.ba-throttle-debounce.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery throttle / debounce - v1.1 - 3/7/2010 3 | * http://benalman.com/projects/jquery-throttle-debounce-plugin/ 4 | * 5 | * Copyright (c) 2010 "Cowboy" Ben Alman 6 | * Dual licensed under the MIT and GPL licenses. 7 | * http://benalman.com/about/license/ 8 | */ 9 | 10 | // Script: jQuery throttle / debounce: Sometimes, less is more! 11 | // 12 | // *Version: 1.1, Last updated: 3/7/2010* 13 | // 14 | // Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/ 15 | // GitHub - http://github.com/cowboy/jquery-throttle-debounce/ 16 | // Source - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js 17 | // (Minified) - http://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb) 18 | // 19 | // About: License 20 | // 21 | // Copyright (c) 2010 "Cowboy" Ben Alman, 22 | // Dual licensed under the MIT and GPL licenses. 23 | // http://benalman.com/about/license/ 24 | // 25 | // About: Examples 26 | // 27 | // These working examples, complete with fully commented code, illustrate a few 28 | // ways in which this plugin can be used. 29 | // 30 | // Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/ 31 | // Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/ 32 | // 33 | // About: Support and Testing 34 | // 35 | // Information about what version or versions of jQuery this plugin has been 36 | // tested with, what browsers it has been tested in, and where the unit tests 37 | // reside (so you can test it yourself). 38 | // 39 | // jQuery Versions - none, 1.3.2, 1.4.2 40 | // Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1. 41 | // Unit Tests - http://benalman.com/code/projects/jquery-throttle-debounce/unit/ 42 | // 43 | // About: Release History 44 | // 45 | // 1.1 - (3/7/2010) Fixed a bug in where trailing callbacks 46 | // executed later than they should. Reworked a fair amount of internal 47 | // logic as well. 48 | // 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over 49 | // from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the 50 | // no_trailing throttle parameter and debounce functionality. 51 | // 52 | // Topic: Note for non-jQuery users 53 | // 54 | // jQuery isn't actually required for this plugin, because nothing internal 55 | // uses any jQuery methods or properties. jQuery is just used as a namespace 56 | // under which these methods can exist. 57 | // 58 | // Since jQuery isn't actually required for this plugin, if jQuery doesn't exist 59 | // when this plugin is loaded, the method described below will be created in 60 | // the `Cowboy` namespace. Usage will be exactly the same, but instead of 61 | // $.method() or jQuery.method(), you'll need to use Cowboy.method(). 62 | 63 | (function(window,undefined){ 64 | '$:nomunge'; // Used by YUI compressor. 65 | 66 | // Since jQuery really isn't required for this plugin, use `jQuery` as the 67 | // namespace only if it already exists, otherwise use the `Cowboy` namespace, 68 | // creating it if necessary. 69 | var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ), 70 | 71 | // Internal method reference. 72 | jq_throttle; 73 | 74 | // Method: jQuery.throttle 75 | // 76 | // Throttle execution of a function. Especially useful for rate limiting 77 | // execution of handlers on events like resize and scroll. If you want to 78 | // rate-limit execution of a function to a single time, see the 79 | // method. 80 | // 81 | // In this visualization, | is a throttled-function call and X is the actual 82 | // callback execution: 83 | // 84 | // > Throttled with `no_trailing` specified as false or unspecified: 85 | // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| 86 | // > X X X X X X X X X X X X 87 | // > 88 | // > Throttled with `no_trailing` specified as true: 89 | // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| 90 | // > X X X X X X X X X X 91 | // 92 | // Usage: 93 | // 94 | // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback ); 95 | // > 96 | // > jQuery('selector').bind( 'someevent', throttled ); 97 | // > jQuery('selector').unbind( 'someevent', throttled ); 98 | // 99 | // This also works in jQuery 1.4+: 100 | // 101 | // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) ); 102 | // > jQuery('selector').unbind( 'someevent', callback ); 103 | // 104 | // Arguments: 105 | // 106 | // delay - (Number) A zero-or-greater delay in milliseconds. For event 107 | // callbacks, values around 100 or 250 (or even higher) are most useful. 108 | // no_trailing - (Boolean) Optional, defaults to false. If no_trailing is 109 | // true, callback will only execute every `delay` milliseconds while the 110 | // throttled-function is being called. If no_trailing is false or 111 | // unspecified, callback will be executed one final time after the last 112 | // throttled-function call. (After the throttled-function has not been 113 | // called for `delay` milliseconds, the internal counter is reset) 114 | // callback - (Function) A function to be executed after delay milliseconds. 115 | // The `this` context and all arguments are passed through, as-is, to 116 | // `callback` when the throttled-function is executed. 117 | // 118 | // Returns: 119 | // 120 | // (Function) A new, throttled, function. 121 | 122 | $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) { 123 | // After wrapper has stopped being called, this timeout ensures that 124 | // `callback` is executed at the proper times in `throttle` and `end` 125 | // debounce modes. 126 | var timeout_id, 127 | 128 | // Keep track of the last time `callback` was executed. 129 | last_exec = 0; 130 | 131 | // `no_trailing` defaults to falsy. 132 | if ( typeof no_trailing !== 'boolean' ) { 133 | debounce_mode = callback; 134 | callback = no_trailing; 135 | no_trailing = undefined; 136 | } 137 | 138 | // The `wrapper` function encapsulates all of the throttling / debouncing 139 | // functionality and when executed will limit the rate at which `callback` 140 | // is executed. 141 | function wrapper() { 142 | var that = this, 143 | elapsed = +new Date() - last_exec, 144 | args = arguments; 145 | 146 | // Execute `callback` and update the `last_exec` timestamp. 147 | function exec() { 148 | last_exec = +new Date(); 149 | callback.apply( that, args ); 150 | }; 151 | 152 | // If `debounce_mode` is true (at_begin) this is used to clear the flag 153 | // to allow future `callback` executions. 154 | function clear() { 155 | timeout_id = undefined; 156 | }; 157 | 158 | if ( debounce_mode && !timeout_id ) { 159 | // Since `wrapper` is being called for the first time and 160 | // `debounce_mode` is true (at_begin), execute `callback`. 161 | exec(); 162 | } 163 | 164 | // Clear any existing timeout. 165 | timeout_id && clearTimeout( timeout_id ); 166 | 167 | if ( debounce_mode === undefined && elapsed > delay ) { 168 | // In throttle mode, if `delay` time has been exceeded, execute 169 | // `callback`. 170 | exec(); 171 | 172 | } else if ( no_trailing !== true ) { 173 | // In trailing throttle mode, since `delay` time has not been 174 | // exceeded, schedule `callback` to execute `delay` ms after most 175 | // recent execution. 176 | // 177 | // If `debounce_mode` is true (at_begin), schedule `clear` to execute 178 | // after `delay` ms. 179 | // 180 | // If `debounce_mode` is false (at end), schedule `callback` to 181 | // execute after `delay` ms. 182 | timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay ); 183 | } 184 | }; 185 | 186 | // Set the guid of `wrapper` function to the same of original callback, so 187 | // it can be removed in jQuery 1.4+ .unbind or .die by using the original 188 | // callback as a reference. 189 | if ( $.guid ) { 190 | wrapper.guid = callback.guid = callback.guid || $.guid++; 191 | } 192 | 193 | // Return the wrapper function. 194 | return wrapper; 195 | }; 196 | 197 | // Method: jQuery.debounce 198 | // 199 | // Debounce execution of a function. Debouncing, unlike throttling, 200 | // guarantees that a function is only executed a single time, either at the 201 | // very beginning of a series of calls, or at the very end. If you want to 202 | // simply rate-limit execution of a function, see the 203 | // method. 204 | // 205 | // In this visualization, | is a debounced-function call and X is the actual 206 | // callback execution: 207 | // 208 | // > Debounced with `at_begin` specified as false or unspecified: 209 | // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| 210 | // > X X 211 | // > 212 | // > Debounced with `at_begin` specified as true: 213 | // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| 214 | // > X X 215 | // 216 | // Usage: 217 | // 218 | // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback ); 219 | // > 220 | // > jQuery('selector').bind( 'someevent', debounced ); 221 | // > jQuery('selector').unbind( 'someevent', debounced ); 222 | // 223 | // This also works in jQuery 1.4+: 224 | // 225 | // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) ); 226 | // > jQuery('selector').unbind( 'someevent', callback ); 227 | // 228 | // Arguments: 229 | // 230 | // delay - (Number) A zero-or-greater delay in milliseconds. For event 231 | // callbacks, values around 100 or 250 (or even higher) are most useful. 232 | // at_begin - (Boolean) Optional, defaults to false. If at_begin is false or 233 | // unspecified, callback will only be executed `delay` milliseconds after 234 | // the last debounced-function call. If at_begin is true, callback will be 235 | // executed only at the first debounced-function call. (After the 236 | // throttled-function has not been called for `delay` milliseconds, the 237 | // internal counter is reset) 238 | // callback - (Function) A function to be executed after delay milliseconds. 239 | // The `this` context and all arguments are passed through, as-is, to 240 | // `callback` when the debounced-function is executed. 241 | // 242 | // Returns: 243 | // 244 | // (Function) A new, debounced, function. 245 | 246 | $.debounce = function( delay, at_begin, callback ) { 247 | return callback === undefined 248 | ? jq_throttle( delay, at_begin, false ) 249 | : jq_throttle( delay, callback, at_begin !== false ); 250 | }; 251 | 252 | })(this); 253 | -------------------------------------------------------------------------------- /docs/_site/assets/js/plugins/jquery.fitvids.js: -------------------------------------------------------------------------------- 1 | /*jshint browser:true */ 2 | /*! 3 | * FitVids 1.1 4 | * 5 | * Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com 6 | * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ 7 | * Released under the WTFPL license - http://sam.zoy.org/wtfpl/ 8 | * 9 | */ 10 | 11 | ;(function( $ ){ 12 | 13 | 'use strict'; 14 | 15 | $.fn.fitVids = function( options ) { 16 | var settings = { 17 | customSelector: null, 18 | ignore: null 19 | }; 20 | 21 | if(!document.getElementById('fit-vids-style')) { 22 | // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js 23 | var head = document.head || document.getElementsByTagName('head')[0]; 24 | var css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'; 25 | var div = document.createElement("div"); 26 | div.innerHTML = '

x

'; 27 | head.appendChild(div.childNodes[1]); 28 | } 29 | 30 | if ( options ) { 31 | $.extend( settings, options ); 32 | } 33 | 34 | return this.each(function(){ 35 | var selectors = [ 36 | 'iframe[src*="player.vimeo.com"]', 37 | 'iframe[src*="youtube.com"]', 38 | 'iframe[src*="youtube-nocookie.com"]', 39 | 'iframe[src*="kickstarter.com"][src*="video.html"]', 40 | 'object', 41 | 'embed' 42 | ]; 43 | 44 | if (settings.customSelector) { 45 | selectors.push(settings.customSelector); 46 | } 47 | 48 | var ignoreList = '.fitvidsignore'; 49 | 50 | if(settings.ignore) { 51 | ignoreList = ignoreList + ', ' + settings.ignore; 52 | } 53 | 54 | var $allVideos = $(this).find(selectors.join(',')); 55 | $allVideos = $allVideos.not('object object'); // SwfObj conflict patch 56 | $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. 57 | 58 | $allVideos.each(function(count){ 59 | var $this = $(this); 60 | if($this.parents(ignoreList).length > 0) { 61 | return; // Disable FitVids on this video. 62 | } 63 | if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } 64 | if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) 65 | { 66 | $this.attr('height', 9); 67 | $this.attr('width', 16); 68 | } 69 | var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), 70 | width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), 71 | aspectRatio = height / width; 72 | if(!$this.attr('id')){ 73 | var videoID = 'fitvid' + count; 74 | $this.attr('id', videoID); 75 | } 76 | $this.wrap('
').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); 77 | $this.removeAttr('height').removeAttr('width'); 78 | }); 79 | }); 80 | }; 81 | // Works with either jQuery or Zepto 82 | })( window.jQuery || window.Zepto ); -------------------------------------------------------------------------------- /docs/_site/assets/js/plugins/jquery.greedy-navigation.js: -------------------------------------------------------------------------------- 1 | /* 2 | GreedyNav.js - https://github.com/lukejacksonn/GreedyNav 3 | Licensed under the MIT license - http://opensource.org/licenses/MIT 4 | Copyright (c) 2015 Luke Jackson 5 | */ 6 | 7 | $(document).ready(function() { 8 | var $btn = $("nav.greedy-nav .greedy-nav__toggle"); 9 | var $vlinks = $("nav.greedy-nav .visible-links"); 10 | var $hlinks = $("nav.greedy-nav .hidden-links"); 11 | 12 | var numOfItems = 0; 13 | var totalSpace = 0; 14 | var closingTime = 1000; 15 | var breakWidths = []; 16 | 17 | // Get initial state 18 | $vlinks.children().outerWidth(function(i, w) { 19 | totalSpace += w; 20 | numOfItems += 1; 21 | breakWidths.push(totalSpace); 22 | }); 23 | 24 | var availableSpace, numOfVisibleItems, requiredSpace, timer; 25 | 26 | function check() { 27 | // Get instant state 28 | availableSpace = $vlinks.width() - $btn.width(); 29 | numOfVisibleItems = $vlinks.children().length; 30 | requiredSpace = breakWidths[numOfVisibleItems - 1]; 31 | 32 | // There is not enough space 33 | if (requiredSpace > availableSpace) { 34 | $vlinks 35 | .children() 36 | .last() 37 | .prependTo($hlinks); 38 | numOfVisibleItems -= 1; 39 | check(); 40 | // There is more than enough space 41 | } else if (availableSpace > breakWidths[numOfVisibleItems]) { 42 | $hlinks 43 | .children() 44 | .first() 45 | .appendTo($vlinks); 46 | numOfVisibleItems += 1; 47 | check(); 48 | } 49 | // Update the button accordingly 50 | $btn.attr("count", numOfItems - numOfVisibleItems); 51 | if (numOfVisibleItems === numOfItems) { 52 | $btn.addClass("hidden"); 53 | } else { 54 | $btn.removeClass("hidden"); 55 | } 56 | } 57 | 58 | // Window listeners 59 | $(window).resize(function() { 60 | check(); 61 | }); 62 | 63 | $btn.on("click", function() { 64 | $hlinks.toggleClass("hidden"); 65 | $(this).toggleClass("close"); 66 | clearTimeout(timer); 67 | }); 68 | 69 | $hlinks 70 | .on("mouseleave", function() { 71 | // Mouse has left, start the timer 72 | timer = setTimeout(function() { 73 | $hlinks.addClass("hidden"); 74 | $btn.toggleClass("close"); 75 | }, closingTime); 76 | }) 77 | .on("mouseenter", function() { 78 | // Mouse is back, cancel the timer 79 | clearTimeout(timer); 80 | }); 81 | 82 | check(); 83 | }); 84 | -------------------------------------------------------------------------------- /docs/_site/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/assets/logo.png -------------------------------------------------------------------------------- /docs/_site/blog/getting-started/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Installing Prismatica - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 71 | 72 | 73 | 74 | 75 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 109 | 110 | 113 | 114 | 115 | 116 |
117 |
118 |
119 | 152 |
153 |
154 |
155 | 156 | 157 |
158 |

The Prismatica project is dedicated to having your cake and eating it too.

159 | 160 |

Getting Started

161 | 162 |

To get started with Prismatica you will need to spin up an Emergence server to bind

163 | 164 |
165 | 166 | 167 |
168 |
169 | 172 | 173 |
174 |
175 | 176 |
177 | 178 | 179 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | -------------------------------------------------------------------------------- /docs/_site/categories/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Posts by Category - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 243 | 244 | 245 |
246 | 247 |

Posts by Category

248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 268 | 269 | 270 | 271 | 272 |
273 |

Blog

274 |
275 | 276 | 277 | 278 | 279 | 280 |
281 |
282 | 283 |

284 | 285 | Installing Prismatica 286 | 287 | 288 |

289 | 290 |

The Prismatica project is dedicated to having your cake and eating it too. 291 | 292 |

293 |
294 |
295 | 296 | 297 |
298 | Back to Top ↑ 299 |
300 | 301 | 302 | 303 | 304 |
305 |
306 |
307 | 308 | 309 |
310 |
311 | 314 | 315 |
316 |
317 | 318 |
319 | 320 | 321 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | -------------------------------------------------------------------------------- /docs/_site/diagon/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Prismatica Core C2 Components - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 161 |
162 | 163 |

Prismatica Core C2 Components

164 | 165 |

Diagon is the default C2 toolset of Prismatica Project. The primary implant for Diagon is Gryffindor a JavaScript-based implant that leverages Windows Scripting Host (WSH) for execution. Gryffindor also has the capability to load and execute arbitrary .NET assemblies through the DotNetToJScript project.

166 | 167 |

Screenshot

168 | 169 |

Base Gryffindor Commands

170 | 171 |

Gryffindor includes custom WSH, COM, and .NET post-exploitation capabilities however the implant also supports the ability to InvokeAssembly for futher post exploitation capability. Gryffindor includes two core .NET assembly frameworks actualized through DotNetToJScript:

172 | 173 |
    174 |
  • Mimikatz
  • 175 |
  • SharpSploit
  • 176 |
177 | 178 |
===========================
179 | Gryffindor Commands:
180 | ===========================
181 | help - Show this information
182 | cat - Show file contents
183 | type - Show file contents
184 | cd - Change directory
185 | ls - Show directory contents
186 | dir - Show directory contents
187 | die - Exit session
188 | kill - Exit session
189 | set - Modify payload settings
190 |  - interval <ms>
191 |  - sleep <ms>
192 |  - jitter <percent>
193 | show - Display payload information
194 |  - settings <ms>
195 | upload - Upload a file to the target system
196 | download - Download a remote file from the target system
197 | spawn - Instantiate a new session on the target system
198 |    - Example Usage: spawn <target-ip> <user> <password>
199 | WMIExecute - Instantiate a new session on the target system
200 |    - Example Usage: WMIExecute <target-ip> <cmd> <user> <password>
201 | hashdump - Use Mimikatz to dump SAM hashes
202 | InvokeAssembly - Run an payload from within a loaded .NET assembly (Defaults:SharpSploit)
203 |    - Example Usage: InvokeAssembly -Entry SharpSploit.Execution.Shell -Module ShellExecute -Args ('calc.exe','','','')
204 | LoadAssembly - Load an arbitrary .NET assembly payload
205 | type -
206 | Other commands sent to Gryffindor are executed in the Windows cmd.exe shell.
207 | ===========================
208 | 
209 | 210 |

Starting a Listener

211 |

Before establishing remote access to a target system it is important to instantiate a listener for the implant to connect into. Click on the headphones icon to access the listeners panel. Next, click start listener to instantiate a basic http listener in Oculus.

212 | 213 |

Screenshot

214 | 215 |

As seen above Diagon provides a direct staging command; however, standalone .js payloads can be generated as seen below.

216 | 217 |

Generating a Payload

218 |

Click on the factory icon to open the backdoor factory modal window. Generated payloads will appear in the current user’s home/.prismatica directory on both Windows and Linux operating systems.

219 | 220 |

Screenshot

221 | 222 |


223 | 224 |
225 | 226 | 227 | 228 | 229 | 230 |
231 |
232 | 233 |
234 | placeholder image 1 235 | 236 |
237 | 238 | 239 |
240 | 241 |

C2 Architecture

242 | 243 | 244 | 245 |
246 |

Learn more about C2 architecture and concepts

247 | 248 |
249 | 250 | 251 | 252 |

Read More

253 | 254 |
255 |
256 |
257 | 258 | 259 | 260 | 261 |
262 |
263 | 264 |
265 | placeholder image 2 266 | 267 |
268 | 269 | 270 |
271 | 272 |

Prismatica API

273 | 274 | 275 | 276 |
277 |

Project Prismatica is built around the concept of Emergence. Explore the Emergence API!

278 | 279 |
280 | 281 | 282 | 283 |

Read More

284 | 285 |
286 |
287 |
288 | 289 | 290 | 291 | 292 |
293 |
294 | 295 |
296 | 297 | 298 |
299 | 300 | 301 |
302 | 303 |

UI and Implants

304 | 305 | 306 | 307 |
308 |

Everything you wanted to know about Gryffindor and Diagon

309 | 310 |
311 | 312 | 313 | 314 |

Read More

315 | 316 |
317 |
318 |
319 | 320 | 321 |
322 | 323 | 324 | 334 | 335 | 336 | 337 |
338 |

2019

339 |
340 | 341 | 342 | 343 | 344 | 345 |
346 |
347 | 348 |

349 | 350 | Installing Prismatica 351 | 352 | 353 |

354 | 355 |

The Prismatica project is dedicated to having your cake and eating it too. 356 | 357 |

358 |
359 |
360 | 361 | 362 |
363 | Back to Top ↑ 364 |
365 | 366 | 367 |
368 |
369 |
370 | 371 | 372 |
373 |
374 | 377 | 378 |
379 |
380 | 381 |
382 | 383 | 384 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | -------------------------------------------------------------------------------- /docs/_site/feed.xml: -------------------------------------------------------------------------------- 1 | Jekyll2019-09-09T17:41:43-05:00http://localhost:4000/feed.xmlPrismaticaWrite an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.Installing Prismatica2019-09-09T00:00:00-05:002019-09-09T00:00:00-05:00http://localhost:4000/blog/getting-started<p>The Prismatica project is dedicated to having your cake and eating it too.</p> 2 | 3 | <h2 id="getting-started">Getting Started</h2> 4 | 5 | <p>To get started with Prismatica you will need to spin up an Emergence server to bind</p>The Prismatica project is dedicated to having your cake and eating it too. -------------------------------------------------------------------------------- /docs/_site/hills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/hills.png -------------------------------------------------------------------------------- /docs/_site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Project Prismatica - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 73 | 74 | 75 | 76 | 77 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 111 | 112 | 115 | 116 | 117 | 118 |
119 |
120 |
121 | 154 |
155 |
156 |
157 | 158 | 159 |
160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 |
176 | 177 |
178 |

179 | 180 | Project Prismatica 181 | 182 | 183 |

184 | 185 |

C2 - Modular, agnostic, and better than ever. 186 |

187 | 188 | 189 | 190 | 191 |

192 | 193 | 194 | Download 195 | 196 | 197 |

198 | 199 | 200 | Image courtesy of Open Security 201 | 202 | 203 |
204 | 205 | 206 | 207 |
208 |
209 | 210 | 211 | 212 | 213 | 214 |
215 | 216 |
217 | 218 | 219 | 220 | 221 | 222 |
223 |
224 | 225 | 226 |
227 | 228 | 229 | 230 |
231 |

Project Prismatica is a focused framework for Command and Control that is dedicated to extensibility. Our core objective is to provide a convenient platform with modular Transports, Backends, and Implants to enable rapid retooling opportunities and enhance Red Team operations.

232 | 233 |
234 | 235 | 236 | 237 |
238 |
239 |
240 | 241 | 242 |
243 | 244 |
245 | 246 | 247 | 248 | 249 | 250 |
251 |
252 | 253 |
254 | placeholder image 2 255 | 256 |
257 | 258 | 259 |
260 | 261 |

Having your cake and eating it too

262 | 263 | 264 | 265 |
266 |

Prismatica was designed from the ground up to be flexible, modular, and extensible. While the system does have core C2 components, extending and integrating 0-day capabilities has never been easier! Watch the Security Weekly episode below to learn how to make a python implant that takes advantage of all of Prismatica’s capability in under 15 minutes.

267 | 268 |
269 | 270 | 271 | 272 |

See the Video

273 | 274 |
275 |
276 |
277 | 278 | 279 |
280 | 281 |
282 | 283 | 284 | 285 | 286 | 287 |
288 |
289 | 290 |
291 | placeholder image 2 292 | 293 |
294 | 295 | 296 |
297 | 298 |

Cross-Platform, Multiuser, Scriptable

299 | 300 | 301 | 302 |
303 |

Prismatica supports multiple users operating from Linux, Windows, and MacOS systems to enable red teams to maximize their efficency while on engagements. When handling large numbers of agents filtering numerous filtering options are available to enhance OnNet target interaction.

304 | 305 |
306 | 307 | 308 | 309 |
310 |
311 |
312 | 313 | 314 |
315 | 316 |
317 | 318 | 319 | 320 | 321 | 322 |
323 |
324 | 325 |
326 | placeholder image 2 327 | 328 |
329 | 330 | 331 |
332 | 333 |

Prismatica Implants

334 | 335 | 336 | 337 |
338 |

Prismatica includes a Backdoor Factory to enable the rapid development and deployment of implants. The default Prismatica implant, Gryffindor, is written in WSH JavaScript and leverages .NET Post-Exploitation libraries through DotNetToJScript.

339 | 340 |
341 | 342 | 343 | 344 |
345 |
346 |
347 | 348 | 349 |
350 | 351 |
352 | 353 | 354 | 355 | 356 | 357 |
358 |
359 | 360 |
361 | placeholder image 2 362 | 363 |
364 | 365 | 366 |
367 | 368 |

Open Source | Open API | Open Security

369 | 370 | 371 | 372 |
373 |

Prismatica is fully open source and open API. The C2 UI (Diagon) and primary implant (Gryffindor) are not intended to be the ONLY way to interface with Prismatica, but simply one option. Checkout the documentation for developer information

374 | 375 |
376 | 377 | 378 | 379 |

Documentation

380 | 381 |
382 |
383 |
384 | 385 | 386 |
387 | 388 |
389 |
390 |
391 | 392 |
393 | 394 | 395 |
396 |
397 | 400 | 401 |
402 |
403 | 404 |
405 | 406 | 407 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | -------------------------------------------------------------------------------- /docs/_site/overview/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | C2 Architecture - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 161 |
162 | 163 | 164 | 165 | 166 | 167 |
168 | 169 |
170 |

C2 Architecture 171 |

172 | 173 |
174 | 175 | 176 |
177 | 178 |

It is the golden age of C2! As a result of the major strides that have been recently accomplished by the information security community there are now more implant frameworks than ever! One downside of this incredible opportunity is the drift in terminology. This page discusses C2 concepts as they relate to the Prismatica Project.

179 | 180 |
    181 |
  • Payload: A self-encapsulated action that can be executed on a target in order to accomplish an exploitative objective. This could be used to establish an agent.
  • 182 |
  • Agent: A mechanism that provides interactive remote access to a target system. The default implant for Prismatica is Gryffindor.
  • 183 |
  • Implant: A mechanism that provides interactive remote access to a target system. The default implant for Prismatica is Gryffindor.
  • 184 |
  • Transport: A method or channel to enable communication between the C2 server and implant.
  • 185 |
  • Listener: A server that resides between the Emergence API and active implants.
  • 186 |
  • Interface: The control component providing operators with interactive access to the C2 system. The default interface for Prismatica is Diagon.
  • 187 |
  • PostEx Language: A language library supported by a given implant for modular post-exploitation tooling. i.e. SharpSploit (.NET), Impacket (Python)
  • 188 |
189 | 190 |


191 | 192 |
193 | 194 | 195 | 196 | 197 | 198 |
199 |
200 | 201 |
202 | placeholder image 1 203 | 204 |
205 | 206 | 207 |
208 | 209 |

C2 Architecture

210 | 211 | 212 | 213 |
214 |

Learn more about C2 architecture and concepts

215 | 216 |
217 | 218 | 219 | 220 |

Read More

221 | 222 |
223 |
224 |
225 | 226 | 227 | 228 | 229 |
230 |
231 | 232 |
233 | placeholder image 2 234 | 235 |
236 | 237 | 238 |
239 | 240 |

Prismatica API

241 | 242 | 243 | 244 |
245 |

Project Prismatica is built around the concept of Emergence. Explore the Emergence API!

246 | 247 |
248 | 249 | 250 | 251 |

Read More

252 | 253 |
254 |
255 |
256 | 257 | 258 | 259 | 260 |
261 |
262 | 263 |
264 | 265 | 266 |
267 | 268 | 269 |
270 | 271 |

UI and Implants

272 | 273 | 274 | 275 |
276 |

Everything you wanted to know about Gryffindor and Diagon

277 | 278 |
279 | 280 | 281 | 282 |

Read More

283 | 284 |
285 |
286 |
287 | 288 | 289 |
290 | 291 | 292 |
293 | 294 |
295 | 296 | 297 | 298 | 299 | 300 |
301 | 302 | 303 | 304 | 305 |
306 | 307 | 308 |
309 | 310 | 311 | 312 |
313 | 314 |
315 | 316 | 317 |
318 |
319 | 322 | 323 |
324 |
325 | 326 |
327 | 328 | 329 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | -------------------------------------------------------------------------------- /docs/_site/posts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Posts by Year - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 243 | 244 | 245 |
246 | 247 |

Posts by Year

248 | 249 | 250 | 251 | 252 | 262 | 263 | 264 | 265 |
266 |

2019

267 |
268 | 269 | 270 | 271 | 272 | 273 |
274 |
275 | 276 |

277 | 278 | Installing Prismatica 279 | 280 | 281 |

282 | 283 |

The Prismatica project is dedicated to having your cake and eating it too. 284 | 285 |

286 |
287 |
288 | 289 | 290 |
291 | Back to Top ↑ 292 |
293 | 294 | 295 |
296 |
297 |
298 | 299 | 300 |
301 |
302 | 305 | 306 |
307 |
308 | 309 |
310 | 311 | 312 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | -------------------------------------------------------------------------------- /docs/_site/robots.txt: -------------------------------------------------------------------------------- 1 | Sitemap: http://localhost:4000/sitemap.xml 2 | -------------------------------------------------------------------------------- /docs/_site/screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/_site/screenshot.gif -------------------------------------------------------------------------------- /docs/_site/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | http://localhost:4000/blog/getting-started/ 5 | 2019-09-09T00:00:00-05:00 6 | 7 | 8 | http://localhost:4000/_posts/2019-09-09-getting-started/ 9 | 10 | 11 | http://localhost:4000/about/ 12 | 13 | 14 | http://localhost:4000/categories/ 15 | 16 | 17 | http://localhost:4000/ 18 | 19 | 20 | http://localhost:4000/ 21 | 22 | 23 | http://localhost:4000/tags/ 24 | 25 | 26 | http://localhost:4000/posts/ 27 | 28 | 29 | http://localhost:4000/tmp/ 30 | 31 | 32 | -------------------------------------------------------------------------------- /docs/_site/tags/index.html: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | Posts by Tag - Prismatica 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 67 | 68 | 69 | 70 | 71 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 105 | 106 | 109 | 110 | 111 | 112 |
113 |
114 |
115 | 148 |
149 |
150 |
151 | 152 | 153 |
154 | 155 | 156 | 157 | 158 |
159 | 160 | 243 | 244 | 245 |
246 | 247 |

Posts by Tag

248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 284 | 285 | 286 | 287 | 288 |
289 |

Post Formats

290 |
291 | 292 | 293 | 294 | 295 | 296 |
297 |
298 | 299 |

300 | 301 | Installing Prismatica 302 | 303 | 304 |

305 | 306 |

The Prismatica project is dedicated to having your cake and eating it too. 307 | 308 |

309 |
310 |
311 | 312 | 313 |
314 | Back to Top ↑ 315 |
316 | 317 | 318 | 319 |
320 |

readability

321 |
322 | 323 | 324 | 325 | 326 | 327 |
328 |
329 | 330 |

331 | 332 | Installing Prismatica 333 | 334 | 335 |

336 | 337 |

The Prismatica project is dedicated to having your cake and eating it too. 338 | 339 |

340 |
341 |
342 | 343 | 344 |
345 | Back to Top ↑ 346 |
347 | 348 | 349 | 350 |
351 |

standard

352 |
353 | 354 | 355 | 356 | 357 | 358 |
359 |
360 | 361 |

362 | 363 | Installing Prismatica 364 | 365 | 366 |

367 | 368 |

The Prismatica project is dedicated to having your cake and eating it too. 369 | 370 |

371 |
372 |
373 | 374 | 375 |
376 | Back to Top ↑ 377 |
378 | 379 | 380 | 381 | 382 |
383 |
384 |
385 | 386 | 387 |
388 |
389 | 392 | 393 |
394 |
395 | 396 |
397 | 398 | 399 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | -------------------------------------------------------------------------------- /docs/_site/tmp.md: -------------------------------------------------------------------------------- 1 | The Prismatica project is dedicated to having your cake and eating it too. 2 | 3 | ## Getting Started 4 | 5 | To get started with Prismatica you will need to spin up an Emergence server to bind all subcomponents together across a shared data model. Emergence servers can be spun up quickly using Docker. Alternately, it can be executed manually using the `npm install` and `npm start` commnads. To run Emergence within a Docker container the `docker` and `docker-compose` commands must be installed. Installing Docker: 6 | 7 | On Windows: https://docs.docker.com/docker-for-windows/install/ 8 | 9 | On Linux: 10 | ``` 11 | apt install docker.io 12 | apt install docker-compose 13 | ``` 14 | 15 | Run Emergence: 16 | ``` 17 | git clone https://github.com/Project-Prismatica/Emergence.git 18 | cd Emergence 19 | docker-compose up 20 | ``` 21 | 22 | Now that Emergence is running you are ready to start up Prism Apps! Diagon and Oculus are a good place to start. 23 | 24 | Installing Diagon: 25 | 26 | Diagon can be downloaded at the following link: [Diagon](https://github.com/Project-Prismatica/Diagon) 27 | 28 | ![Screenshot]({{ site.url }}/screenshot.gif) 29 | 30 | You will need to configure the Diagon settings with the IP address of the system where Emergence is running. Then to setup listeners you will need to run Oculus. 31 | 32 | Installing Oculus: 33 | 34 | ``` 35 | git clone https://github.com/Project-Prismatica/Oculus.git 36 | cd Oculus 37 | python oculus.py 38 | ``` 39 | 40 | Now you're all ready to rock and roll! Happy Hacking! 41 | 42 | ## Prismatica Application Marketplace 43 | 44 | - [Diagon](https://github.com/Project-Prismatica/Diagon) The Diagon Attack Framework is a Prismatica application containing the Ravenclaw, Gryffindor, and Slytherin remote access tools (RATs). 45 | - [Emergence](https://github.com/Project-Prismatica/Emergence) The Emergence fabric is an interface where interaction and integration of disparate information security subsystems gain combined intelligence. 46 | - [Oculus](https://github.com/Project-Prismatica/Oculus) Oculus is a malleable python-based C2 system allowing for instantiation of listeners for the purpose of communication with remote access tools (RATs). 47 | - [Prism Launcher]() The package manager for Prism Apps (Releasing at WWHF) 48 | - [Prism Project Manager]() Project management, findigns, and reporting tool (Releasing at WWHF) 49 | - [Acheron](https://github.com/Acheron-VAF/Acheron) Acheron is a RESTful vulnerability assessment and management framework built around search and dedicated to terminal extensibility. 50 | - [Tiberium](https://github.com/0sm0s1z/Tiberium/releases) A Command and Control scanning tool 51 | 52 | 53 | ## Simple REACTJS Beacon 54 | 55 | ```js 56 | // Defining a BeaconHandler Class 57 | var BeaconHandler = React.createClass({ 58 | loadCommandsFromServer: function() { 59 | $.ajax({ 60 | url: this.props.url, 61 | dataType: 'json', 62 | cache: false, 63 | success: function(data) { 64 | this.setState({data: data}); 65 | }.bind(this), 66 | error: function(xhr, status, err) { 67 | console.log(this.props.url, status, err.toString()); 68 | }.bind(this) 69 | }); 70 | }, 71 | getInitialState: function() { 72 | return {data: []}; 73 | }, 74 | componentDidMount: function() { 75 | this.loadCommandsFromServer(); 76 | setInterval(this.loadCommandsFromServer, this.props.pollInterval); 77 | }, 78 | //Push tasks to execution 79 | render: function() { 80 | return ( 81 | 82 | ); 83 | } 84 | }); 85 | ``` 86 | 87 | 88 | ![Screenshot]({{ site.url }}/hills.png) 89 | -------------------------------------------------------------------------------- /docs/assets/images/bio-photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/bio-photo.jpg -------------------------------------------------------------------------------- /docs/assets/images/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/demo.gif -------------------------------------------------------------------------------- /docs/assets/images/demo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/demo2.png -------------------------------------------------------------------------------- /docs/assets/images/demo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/demo3.png -------------------------------------------------------------------------------- /docs/assets/images/demo4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/demo4.png -------------------------------------------------------------------------------- /docs/assets/images/header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/header.png -------------------------------------------------------------------------------- /docs/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/logo.png -------------------------------------------------------------------------------- /docs/assets/images/splash.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/splash.jpg -------------------------------------------------------------------------------- /docs/assets/images/term.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/term.jpg -------------------------------------------------------------------------------- /docs/assets/images/term.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/images/term.png -------------------------------------------------------------------------------- /docs/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/assets/logo.png -------------------------------------------------------------------------------- /docs/hills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/hills.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | --- 2 | # You don't need to edit this file, it's empty on purpose. 3 | # Edit theme's home layout instead if you wanna make some changes 4 | # See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults 5 | layout: home 6 | author_profile: false 7 | --- 8 | -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Project Prismatica" 3 | layout: splash 4 | permalink: / 5 | date: 2016-03-23T11:48:41-04:00 6 | header: 7 | overlay_color: "#000" 8 | overlay_filter: "0.3" 9 | overlay_image: /assets/images/splash.jpg 10 | actions: 11 | - label: "Download" 12 | url: "https://github.com/Project-Prismatica/Diagon/releases" 13 | caption: "Image courtesy of [Open Security](https://opensecurity.com/)" 14 | excerpt: "C2 - Modular, agnostic, and better than ever." 15 | intro: 16 | - excerpt: 'Project Prismatica is a focused framework for Command and Control that is dedicated to extensibility. Our core objective is to provide a convenient platform with modular **Transports**, **Backends**, and **Implants** to enable rapid retooling opportunities and enhance Red Team operations.' 17 | 18 | introimg: 19 | - image_path: /assets/images/demo.gif 20 | alt: "placeholder image 2" 21 | type: "center" 22 | title: "Having your cake and eating it too" 23 | excerpt: "Prismatica was designed from the ground up to be flexible, modular, and extensible. While the system does have core C2 components, extending and integrating 0-day capabilities has never been easier! 24 | Watch the Security Weekly episode below to learn how to make a python implant that takes advantage of all of Prismatica's capability in under 15 minutes." 25 | url: "https://youtu.be/SUu_VtJo19Y" 26 | btn_label: "See the Video" 27 | btn_class: "btn--primary" 28 | introimg2: 29 | - image_path: /assets/images/demo2.png 30 | alt: "placeholder image 2" 31 | type: "center" 32 | title: "Cross-Platform, Multiuser, Scriptable" 33 | excerpt: 'Prismatica supports multiple users operating from Linux, Windows, and MacOS systems to enable red teams to maximize their efficency while on engagements. 34 | When handling large numbers of agents filtering numerous filtering options are available to enhance OnNet target interaction.' 35 | introimg3: 36 | - image_path: /assets/images/demo3.png 37 | alt: "placeholder image 2" 38 | type: "center" 39 | title: "Prismatica Implants" 40 | excerpt: 'Prismatica includes a **Backdoor Factory** to enable the rapid development and deployment of implants. 41 | The default Prismatica implant, Gryffindor, is written in WSH JavaScript and leverages .NET Post-Exploitation libraries through DotNetToJScript.' 42 | url: "/diagon/" 43 | btn_label: "Read More" 44 | btn_class: "btn--primary" 45 | outro: 46 | - image_path: /assets/images/demo4.png 47 | alt: "placeholder image 2" 48 | type: "center" 49 | title: "Open Source | Open API | Open Security" 50 | excerpt: 'Prismatica is fully open source and open API. The C2 UI (Diagon) and primary implant (Gryffindor) are not intended to be the ONLY way to interface with Prismatica, but simply one option. Checkout the **documentation** for developer information' 51 | url: "https://documenter.getpostman.com/view/1609493/7TT8UqJ?version=latest" 52 | btn_label: "Documentation" 53 | btn_class: "btn--primary" 54 | --- 55 | 56 | {% include feature_row id="intro" type="center" %} 57 | {% include feature_row id="introimg" type="left" %} 58 | {% include feature_row id="introimg2" type="right" %} 59 | {% include feature_row id="introimg3" type="left" %} 60 | {% include feature_row id="outro" type="center" %} 61 | -------------------------------------------------------------------------------- /docs/screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/docs/screenshot.gif -------------------------------------------------------------------------------- /docs/tmp.md: -------------------------------------------------------------------------------- 1 | The Prismatica project is dedicated to having your cake and eating it too. 2 | 3 | ## Getting Started 4 | 5 | To get started with Prismatica you will need to spin up an Emergence server to bind all subcomponents together across a shared data model. Emergence servers can be spun up quickly using Docker. Alternately, it can be executed manually using the `npm install` and `npm start` commnads. To run Emergence within a Docker container the `docker` and `docker-compose` commands must be installed. Installing Docker: 6 | 7 | On Windows: https://docs.docker.com/docker-for-windows/install/ 8 | 9 | On Linux: 10 | ``` 11 | apt install docker.io 12 | apt install docker-compose 13 | ``` 14 | 15 | Run Emergence: 16 | ``` 17 | git clone https://github.com/Project-Prismatica/Emergence.git 18 | cd Emergence 19 | docker-compose up 20 | ``` 21 | 22 | Now that Emergence is running you are ready to start up Prism Apps! Diagon and Oculus are a good place to start. 23 | 24 | Installing Diagon: 25 | 26 | Diagon can be downloaded at the following link: [Diagon](https://github.com/Project-Prismatica/Diagon) 27 | 28 | ![Screenshot]({{ site.url }}/screenshot.gif) 29 | 30 | You will need to configure the Diagon settings with the IP address of the system where Emergence is running. Then to setup listeners you will need to run Oculus. 31 | 32 | Installing Oculus: 33 | 34 | ``` 35 | git clone https://github.com/Project-Prismatica/Oculus.git 36 | cd Oculus 37 | python oculus.py 38 | ``` 39 | 40 | Now you're all ready to rock and roll! Happy Hacking! 41 | 42 | ## Prismatica Application Marketplace 43 | 44 | - [Diagon](https://github.com/Project-Prismatica/Diagon) The Diagon Attack Framework is a Prismatica application containing the Ravenclaw, Gryffindor, and Slytherin remote access tools (RATs). 45 | - [Emergence](https://github.com/Project-Prismatica/Emergence) The Emergence fabric is an interface where interaction and integration of disparate information security subsystems gain combined intelligence. 46 | - [Oculus](https://github.com/Project-Prismatica/Oculus) Oculus is a malleable python-based C2 system allowing for instantiation of listeners for the purpose of communication with remote access tools (RATs). 47 | - [Prism Launcher]() The package manager for Prism Apps (Releasing at WWHF) 48 | - [Prism Project Manager]() Project management, findigns, and reporting tool (Releasing at WWHF) 49 | - [Acheron](https://github.com/Acheron-VAF/Acheron) Acheron is a RESTful vulnerability assessment and management framework built around search and dedicated to terminal extensibility. 50 | - [Tiberium](https://github.com/0sm0s1z/Tiberium/releases) A Command and Control scanning tool 51 | 52 | 53 | ## Simple REACTJS Beacon 54 | 55 | ```js 56 | // Defining a BeaconHandler Class 57 | var BeaconHandler = React.createClass({ 58 | loadCommandsFromServer: function() { 59 | $.ajax({ 60 | url: this.props.url, 61 | dataType: 'json', 62 | cache: false, 63 | success: function(data) { 64 | this.setState({data: data}); 65 | }.bind(this), 66 | error: function(xhr, status, err) { 67 | console.log(this.props.url, status, err.toString()); 68 | }.bind(this) 69 | }); 70 | }, 71 | getInitialState: function() { 72 | return {data: []}; 73 | }, 74 | componentDidMount: function() { 75 | this.loadCommandsFromServer(); 76 | setInterval(this.loadCommandsFromServer, this.props.pollInterval); 77 | }, 78 | //Push tasks to execution 79 | render: function() { 80 | return ( 81 | 82 | ); 83 | } 84 | }); 85 | ``` 86 | 87 | 88 | ![Screenshot]({{ site.url }}/hills.png) 89 | -------------------------------------------------------------------------------- /hills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/hills.png -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/logo.png -------------------------------------------------------------------------------- /screenshot.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Project-Prismatica/Prismatica/dc9d7e4de53b394a3001dde661d0ef492ca76416/screenshot.gif --------------------------------------------------------------------------------