From f990be50b1e507b23bef6243afa4596bd3c78436 Mon Sep 17 00:00:00 2001 From: Pravesh Soni <1870821+pjsoni@users.noreply.github.com> Date: Mon, 12 Jan 2026 10:53:29 -0600 Subject: [PATCH] Updated project and added posts --- .github/copilot-instructions.md | 86 + .gitignore | 48 +- Gemfile | 36 +- Gemfile.lock | 279 +- README.md | 3 + _config.yml | 281 +- _drafts/2024-03-08.md | 8 - ...-01-08-proxmox-network-isolation-part-1.md | 286 + ...-01-08-proxmox-network-isolation-part-2.md | 150 + ...1-08-proxmox-network-isolation-part-3.5.md | 368 + ...-01-08-proxmox-network-isolation-part-3.md | 332 + ...12-zerotrust-iot-homeassistant-firewall.md | 282 + _drafts/Firewall Rules.md | 47 + _includes/analytics-providers/custom.html | 3 - .../analytics-providers/google-gtag.html | 9 - .../analytics-providers/google-universal.html | 7 - _includes/analytics-providers/google.html | 14 - _includes/analytics.html | 14 - _includes/archive-single.html | 30 - _includes/author-profile-custom-links.html | 7 - _includes/author-profile.html | 252 - _includes/breadcrumbs.html | 39 - _includes/browser-upgrade.html | 3 - _includes/category-list.html | 26 - _includes/comment.html | 22 - _includes/comments-providers/custom.html | 3 - .../comments-providers/custom_scripts.html | 3 - _includes/comments-providers/discourse.html | 13 - _includes/comments-providers/disqus.html | 15 - _includes/comments-providers/facebook.html | 8 - _includes/comments-providers/scripts.html | 18 - _includes/comments-providers/staticman.html | 40 - .../comments-providers/staticman_v2.html | 40 - _includes/comments-providers/utterances.html | 20 - _includes/comments.html | 159 - _includes/documents-collection.html | 21 - _includes/feature_row | 41 - _includes/figure | 9 - _includes/footer.html | 19 - _includes/footer/custom.html | 3 - _includes/gallery | 35 - _includes/group-by-array | 47 - _includes/head.html | 37 - _includes/head/custom.html | 5 - _includes/masthead.html | 37 - _includes/nav_list | 26 - _includes/page__date.html | 5 - _includes/page__hero.html | 51 - _includes/page__hero_video.html | 2 - _includes/page__meta.html | 30 - _includes/page__taxonomy.html | 7 - _includes/paginator.html | 69 - _includes/post_pagination.html | 14 - _includes/posts-category.html | 5 - _includes/posts-tag.html | 5 - _includes/scripts.html | 28 - _includes/search/algolia-search-scripts.html | 61 - _includes/search/google-search-scripts.html | 30 - _includes/search/lunr-search-scripts.html | 10 - _includes/search/search_form.html | 26 - _includes/seo.html | 155 - _includes/sidebar.html | 19 - _includes/skip-links.html | 8 - _includes/social-share.html | 11 - _includes/tag-list.html | 26 - _includes/toc | 7 - _includes/toc.html | 182 - _includes/video | 24 - _layouts/archive-taxonomy.html | 29 - _layouts/archive.html | 26 - _layouts/categories.html | 43 - _layouts/category.html | 10 - _layouts/collection.html | 10 - _layouts/compress.html | 10 - _layouts/default.html | 36 - _layouts/home.html | 22 - _layouts/homepage.html | 40 - _layouts/nosidebar.html | 88 - _layouts/posts.html | 30 - _layouts/search.html | 42 - _layouts/single.html | 89 - _layouts/splash.html | 22 - _layouts/tag.html | 10 - _layouts/tags.html | 43 - _pages/about.md | 32 +- _sass/minimal-mistakes.scss | 40 - _sass/minimal-mistakes/_animations.scss | 21 - _sass/minimal-mistakes/_archive.scss | 463 - _sass/minimal-mistakes/_base.scss | 357 - _sass/minimal-mistakes/_buttons.scss | 97 - _sass/minimal-mistakes/_footer.scss | 85 - _sass/minimal-mistakes/_forms.scss | 393 - _sass/minimal-mistakes/_masthead.scss | 93 - _sass/minimal-mistakes/_mixins.scss | 92 - _sass/minimal-mistakes/_navigation.scss | 573 - _sass/minimal-mistakes/_notices.scss | 105 - _sass/minimal-mistakes/_page.scss | 559 - _sass/minimal-mistakes/_print.scss | 252 - _sass/minimal-mistakes/_reset.scss | 187 - _sass/minimal-mistakes/_search.scss | 132 - _sass/minimal-mistakes/_sidebar.scss | 346 - _sass/minimal-mistakes/_syntax.scss | 324 - _sass/minimal-mistakes/_tables.scss | 39 - _sass/minimal-mistakes/_utilities.scss | 593 - _sass/minimal-mistakes/_variables.scss | 169 - _sass/minimal-mistakes/skins/_air.scss | 23 - _sass/minimal-mistakes/skins/_aqua.scss | 30 - _sass/minimal-mistakes/skins/_contrast.scss | 52 - _sass/minimal-mistakes/skins/_dark.scss | 30 - _sass/minimal-mistakes/skins/_default.scss | 5 - _sass/minimal-mistakes/skins/_dirt.scss | 33 - _sass/minimal-mistakes/skins/_mint.scss | 24 - _sass/minimal-mistakes/skins/_neon.scss | 59 - _sass/minimal-mistakes/skins/_plum.scss | 66 - _sass/minimal-mistakes/skins/_sunrise.scss | 46 - .../vendor/breakpoint/_breakpoint.scss | 114 - .../vendor/breakpoint/_context.scss | 95 - .../vendor/breakpoint/_helpers.scss | 151 - .../vendor/breakpoint/_legacy-settings.scss | 50 - .../vendor/breakpoint/_no-query.scss | 15 - .../vendor/breakpoint/_parsers.scss | 215 - .../vendor/breakpoint/_respond-to.scss | 82 - .../vendor/breakpoint/_settings.scss | 71 - .../vendor/breakpoint/parsers/_double.scss | 33 - .../vendor/breakpoint/parsers/_query.scss | 82 - .../breakpoint/parsers/_resolution.scss | 31 - .../vendor/breakpoint/parsers/_single.scss | 26 - .../vendor/breakpoint/parsers/_triple.scss | 36 - .../parsers/double/_default-pair.scss | 21 - .../breakpoint/parsers/double/_default.scss | 22 - .../parsers/double/_double-string.scss | 22 - .../parsers/resolution/_resolution.scss | 60 - .../breakpoint/parsers/single/_default.scss | 13 - .../breakpoint/parsers/triple/_default.scss | 18 - .../magnific-popup/_magnific-popup.scss | 649 - .../vendor/magnific-popup/_settings.scss | 46 - _sass/minimal-mistakes/vendor/susy/_su.scss | 4 - .../vendor/susy/_susy-prefix.scss | 13 - _sass/minimal-mistakes/vendor/susy/_susy.scss | 5 - .../vendor/susy/plugins/_svg-grid.scss | 5 - .../vendor/susy/plugins/svg-grid/_prefix.scss | 7 - .../susy/plugins/svg-grid/_svg-api.scss | 114 - .../susy/plugins/svg-grid/_svg-grid-math.scss | 67 - .../susy/plugins/svg-grid/_svg-settings.scss | 14 - .../susy/plugins/svg-grid/_svg-unprefix.scss | 18 - .../susy/plugins/svg-grid/_svg-utilities.scss | 133 - .../vendor/susy/susy/_api.scss | 318 - .../vendor/susy/susy/_normalize.scss | 261 - .../vendor/susy/susy/_parse.scss | 163 - .../vendor/susy/susy/_settings.scss | 329 - .../vendor/susy/susy/_su-math.scss | 441 - .../vendor/susy/susy/_su-validate.scss | 213 - .../vendor/susy/susy/_syntax-helpers.scss | 191 - .../vendor/susy/susy/_unprefix.scss | 56 - .../vendor/susy/susy/_utilities.scss | 167 - assets/css/main.scss | 8 - assets/images/proxmox-part2-topology.svg | 23 + assets/img/404-southpark.jpg | Bin 60624 -> 0 bytes assets/img/avatar-icon.png | Bin 19023 -> 0 bytes assets/img/bgimage.png | Bin 2135 -> 0 bytes assets/img/hello_world.jpeg | Bin 18136 -> 0 bytes assets/img/install-steps.gif | Bin 803524 -> 0 bytes assets/img/path.jpg | Bin 268425 -> 0 bytes assets/img/thumb.png | Bin 396424 -> 0 bytes assets/js/_main.js | 136 - assets/js/lunr/lunr-en.js | 73 - assets/js/lunr/lunr-gr.js | 526 - assets/js/lunr/lunr-store.js | 49 - assets/js/lunr/lunr.js | 3484 ----- assets/js/lunr/lunr.min.js | 1 - assets/js/main.min.js | 6 - assets/js/plugins/gumshoe.js | 484 - .../js/plugins/jquery.ba-throttle-debounce.js | 252 - assets/js/plugins/jquery.fitvids.js | 82 - assets/js/plugins/jquery.greedy-navigation.js | 126 - assets/js/plugins/jquery.magnific-popup.js | 1860 --- assets/js/plugins/smooth-scroll.js | 650 - assets/js/vendor/jquery/jquery-3.5.1.js | 10872 ---------------- index.html | 3 +- 179 files changed, 1886 insertions(+), 30996 deletions(-) create mode 100644 .github/copilot-instructions.md create mode 100644 README.md delete mode 100644 _drafts/2024-03-08.md create mode 100644 _drafts/2026-01-08-proxmox-network-isolation-part-1.md create mode 100644 _drafts/2026-01-08-proxmox-network-isolation-part-2.md create mode 100644 _drafts/2026-01-08-proxmox-network-isolation-part-3.5.md create mode 100644 _drafts/2026-01-08-proxmox-network-isolation-part-3.md create mode 100644 _drafts/2026-01-12-zerotrust-iot-homeassistant-firewall.md create mode 100644 _drafts/Firewall Rules.md delete mode 100644 _includes/analytics-providers/custom.html delete mode 100644 _includes/analytics-providers/google-gtag.html delete mode 100644 _includes/analytics-providers/google-universal.html delete mode 100644 _includes/analytics-providers/google.html delete mode 100644 _includes/analytics.html delete mode 100644 _includes/archive-single.html delete mode 100644 _includes/author-profile-custom-links.html delete mode 100644 _includes/author-profile.html delete mode 100644 _includes/breadcrumbs.html delete mode 100644 _includes/browser-upgrade.html delete mode 100644 _includes/category-list.html delete mode 100644 _includes/comment.html delete mode 100644 _includes/comments-providers/custom.html delete mode 100644 _includes/comments-providers/custom_scripts.html delete mode 100644 _includes/comments-providers/discourse.html delete mode 100644 _includes/comments-providers/disqus.html delete mode 100644 _includes/comments-providers/facebook.html delete mode 100644 _includes/comments-providers/scripts.html delete mode 100644 _includes/comments-providers/staticman.html delete mode 100644 _includes/comments-providers/staticman_v2.html delete mode 100644 _includes/comments-providers/utterances.html delete mode 100644 _includes/comments.html delete mode 100644 _includes/documents-collection.html delete mode 100644 _includes/feature_row delete mode 100644 _includes/figure delete mode 100644 _includes/footer.html delete mode 100644 _includes/footer/custom.html delete mode 100644 _includes/gallery delete mode 100644 _includes/group-by-array delete mode 100644 _includes/head.html delete mode 100644 _includes/head/custom.html delete mode 100644 _includes/masthead.html delete mode 100644 _includes/nav_list delete mode 100644 _includes/page__date.html delete mode 100644 _includes/page__hero.html delete mode 100644 _includes/page__hero_video.html delete mode 100644 _includes/page__meta.html delete mode 100644 _includes/page__taxonomy.html delete mode 100644 _includes/paginator.html delete mode 100644 _includes/post_pagination.html delete mode 100644 _includes/posts-category.html delete mode 100644 _includes/posts-tag.html delete mode 100644 _includes/scripts.html delete mode 100644 _includes/search/algolia-search-scripts.html delete mode 100644 _includes/search/google-search-scripts.html delete mode 100644 _includes/search/lunr-search-scripts.html delete mode 100644 _includes/search/search_form.html delete mode 100644 _includes/seo.html delete mode 100644 _includes/sidebar.html delete mode 100644 _includes/skip-links.html delete mode 100644 _includes/social-share.html delete mode 100644 _includes/tag-list.html delete mode 100644 _includes/toc delete mode 100644 _includes/toc.html delete mode 100644 _includes/video delete mode 100644 _layouts/archive-taxonomy.html delete mode 100644 _layouts/archive.html delete mode 100644 _layouts/categories.html delete mode 100644 _layouts/category.html delete mode 100644 _layouts/collection.html delete mode 100644 _layouts/compress.html delete mode 100644 _layouts/default.html delete mode 100644 _layouts/home.html delete mode 100644 _layouts/homepage.html delete mode 100644 _layouts/nosidebar.html delete mode 100644 _layouts/posts.html delete mode 100644 _layouts/search.html delete mode 100644 _layouts/single.html delete mode 100644 _layouts/splash.html delete mode 100644 _layouts/tag.html delete mode 100644 _layouts/tags.html delete mode 100644 _sass/minimal-mistakes.scss delete mode 100644 _sass/minimal-mistakes/_animations.scss delete mode 100644 _sass/minimal-mistakes/_archive.scss delete mode 100644 _sass/minimal-mistakes/_base.scss delete mode 100644 _sass/minimal-mistakes/_buttons.scss delete mode 100644 _sass/minimal-mistakes/_footer.scss delete mode 100644 _sass/minimal-mistakes/_forms.scss delete mode 100644 _sass/minimal-mistakes/_masthead.scss delete mode 100644 _sass/minimal-mistakes/_mixins.scss delete mode 100644 _sass/minimal-mistakes/_navigation.scss delete mode 100644 _sass/minimal-mistakes/_notices.scss delete mode 100644 _sass/minimal-mistakes/_page.scss delete mode 100644 _sass/minimal-mistakes/_print.scss delete mode 100644 _sass/minimal-mistakes/_reset.scss delete mode 100644 _sass/minimal-mistakes/_search.scss delete mode 100644 _sass/minimal-mistakes/_sidebar.scss delete mode 100644 _sass/minimal-mistakes/_syntax.scss delete mode 100644 _sass/minimal-mistakes/_tables.scss delete mode 100644 _sass/minimal-mistakes/_utilities.scss delete mode 100644 _sass/minimal-mistakes/_variables.scss delete mode 100644 _sass/minimal-mistakes/skins/_air.scss delete mode 100644 _sass/minimal-mistakes/skins/_aqua.scss delete mode 100644 _sass/minimal-mistakes/skins/_contrast.scss delete mode 100644 _sass/minimal-mistakes/skins/_dark.scss delete mode 100644 _sass/minimal-mistakes/skins/_default.scss delete mode 100644 _sass/minimal-mistakes/skins/_dirt.scss delete mode 100644 _sass/minimal-mistakes/skins/_mint.scss delete mode 100644 _sass/minimal-mistakes/skins/_neon.scss delete mode 100644 _sass/minimal-mistakes/skins/_plum.scss delete mode 100644 _sass/minimal-mistakes/skins/_sunrise.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_context.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_helpers.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_no-query.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_parsers.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/_settings.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss delete mode 100644 _sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss delete mode 100644 _sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss delete mode 100644 _sass/minimal-mistakes/vendor/magnific-popup/_settings.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/_su.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/_susy-prefix.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/_susy.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_api.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_normalize.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_parse.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_settings.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_su-math.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss delete mode 100644 _sass/minimal-mistakes/vendor/susy/susy/_utilities.scss delete mode 100644 assets/css/main.scss create mode 100644 assets/images/proxmox-part2-topology.svg delete mode 100644 assets/img/404-southpark.jpg delete mode 100644 assets/img/avatar-icon.png delete mode 100644 assets/img/bgimage.png delete mode 100644 assets/img/hello_world.jpeg delete mode 100644 assets/img/install-steps.gif delete mode 100644 assets/img/path.jpg delete mode 100644 assets/img/thumb.png delete mode 100644 assets/js/_main.js delete mode 100644 assets/js/lunr/lunr-en.js delete mode 100644 assets/js/lunr/lunr-gr.js delete mode 100644 assets/js/lunr/lunr-store.js delete mode 100644 assets/js/lunr/lunr.js delete mode 100644 assets/js/lunr/lunr.min.js delete mode 100644 assets/js/main.min.js delete mode 100644 assets/js/plugins/gumshoe.js delete mode 100644 assets/js/plugins/jquery.ba-throttle-debounce.js delete mode 100644 assets/js/plugins/jquery.fitvids.js delete mode 100644 assets/js/plugins/jquery.greedy-navigation.js delete mode 100644 assets/js/plugins/jquery.magnific-popup.js delete mode 100644 assets/js/plugins/smooth-scroll.js delete mode 100644 assets/js/vendor/jquery/jquery-3.5.1.js diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..f21ee90 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,86 @@ +# Copilot Instructions for pjsoni.github.io + +## Project Overview +This is a **Jekyll-based static blog/portfolio site** hosted on GitHub Pages, built with the Minimal Mistakes theme. It showcases a personal tech portfolio with blog posts spanning from 2009 onwards and professional pages (about, resume, blog). The site is configured for custom domain hosting at `pravesh.me`. + +## Key Architecture + +### Core Structure +- **Build System**: Jekyll 4.3.3 with Ruby/Bundler - run `bundle exec jekyll serve` to build/preview +- **Theme**: Minimal Mistakes (local customization layer over remote theme) +- **Content Types**: + - **Posts** (`_posts/`): Blog articles with YAML frontmatter including `layout: single`, tags, and categories + - **Pages** (`_pages/`): Static pages (about.md, blog.md, resume.md, 404.md) with `permalink` in frontmatter + - **Navigation**: Defined in `_data/navigation.yml` - add new main navigation items in the `main:` section + - **Drafts** (`_drafts/`): Unpublished posts (not built by default) + +### Content Configuration +- `_config.yml`: Site-wide settings (title, URL, locale, comments provider, etc.) +- `_data/navigation.yml`: Main navigation menu +- `_data/ui-text.yml`: UI labels and strings for translations + +### Template & Styling Layers +- **Layouts** (`_layouts/`): Post/page templates (single.html, archive.html, homepage.html, etc.) +- **Includes** (`_includes/`): Reusable components (masthead, footer, sidebar, social-share, etc.) +- **Styling** (`_sass/minimal-mistakes/`): Scoped SCSS modules (animations, archive, base, navigation, sidebar, etc.) organized by component + +## Development Workflow + +### Local Setup & Running +```bash +bundle install # Install gem dependencies +bundle exec jekyll serve # Build and run locally on http://localhost:4000 +``` +Changes to markdown files auto-refresh; changes to `_config.yml` require server restart. + +### Publishing Content +1. **Blog Posts**: Add `.md` file to `_posts/` with filename format `YYYY-MM-DD-title.md` +2. **Pages**: Add `.md` to `_pages/` with `permalink` in frontmatter +3. **Frontmatter Pattern**: + ```yaml + --- + layout: single + title: "Your Title" + tags: [tag1, tag2] + category: [blog] + --- + ``` + +## Project-Specific Conventions + +### Content Organization +- **Taxonomy**: Posts use `tags:` (multiple) and `category:` (typically single) for classification +- **Navigation**: Edit `_data/navigation.yml` to update main menu links - don't hardcode routes +- **Layout Choices**: Single blog posts use `layout: single`, multi-item pages use `layout: archive` or `layout: posts` + +### Styling & Theme Customization +- Theme skin set to `"air"` in `_config.yml` (options: air, aqua, contrast, dark, dirt, neon, mint, plum, sunrise) +- Custom SCSS placed in `_sass/minimal-mistakes/` - files are prefixed with `_` (e.g., `_archive.scss`) +- Component variables defined in `_variables.scss`; mixins in `_mixins.scss` + +### Image Assets +- Images stored in `assets/images/` +- Relative paths in markdown: `/assets/images/filename.ext` +- Inline image styling supported: `{: .align-left}`, `{:width="180px"}` + +## Common Tasks + +| Task | Location/Pattern | +|------|------------------| +| Add blog post | Create `_posts/YYYY-MM-DD-title.md` with single layout | +| Update navigation menu | Edit `_data/navigation.yml` | +| Change site title/URL | Edit `_config.yml` | +| Modify page template | Edit `_layouts/` `.html` file | +| Add reusable component | Create `_includes/component-name.html` and use `{% include component-name.html %}` | +| Customize styling | Add/edit `_sass/minimal-mistakes/_component.scss` | +| Manage permalinks | Set `permalink: /custom-url.html` in page frontmatter | + +## GitHub Pages Deployment +- Site is pushed to GitHub Pages (custom domain: pravesh.me via CNAME file) +- Uses Jekyll build process automatically +- Ensure `Gemfile` dependencies are compatible with GitHub Pages environment + +## Notable Patterns +- **Image alignment**: Use Markdown image syntax with Jekyll classes: `![alt](/path/to/image.jpg){: .align-left}` +- **Collection display**: `_layouts/archive.html` groups posts by taxonomy (tag/category) +- **Comments**: Disabled for this site (`provider: false`); could enable via disqus/discourse by updating config diff --git a/.gitignore b/.gitignore index b0e4354..5d6409a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,11 @@ -# General +# ============================================================================ +# macOS system files +# ============================================================================ .DS_Store .AppleDouble .LSOverride - -# Icon must end with two \r Icon - -# Thumbnails ._* - -# Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 @@ -17,19 +13,45 @@ Icon .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share .AppleDB .AppleDesktop -Network Trash Folder -Temporary Items +Network\ Trash\ Folder +Temporary\ Items .apdisk -# Ignore Jekyll files +# ============================================================================ +# Jekyll build output and cache +# ============================================================================ _site/ .sass-cache/ .jekyll-cache/ .jekyll-metadata -# Ignore folders generated by Bundler + +# ============================================================================ +# Ruby bundle and dependencies +# ============================================================================ .bundle/ vendor/ +Gemfile.lock + +# ============================================================================ +# IDE and editor configuration +# ============================================================================ +.vscode/ +.idea/ +*.sublime-project +*.sublime-workspace + +# ============================================================================ +# Editor temporary files +# ============================================================================ +*.swp +*.swo +*~ + +# ============================================================================ +# Environment and configuration +# ============================================================================ +.env +.env.local +*.log diff --git a/Gemfile b/Gemfile index 0155f46..646b92c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,36 +1,4 @@ source "https://rubygems.org" -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -gem "jekyll", "~> 4.3.3" -# This is the default theme for new Jekyll sites. You may change this to anything you like. -gem "minima", "~> 2.5" -# If you want to use GitHub Pages, remove the "gem "jekyll"" above and -# uncomment the line below. To upgrade, run `bundle update github-pages`. -# gem "github-pages", group: :jekyll_plugins -# If you have any plugins, put them here! -group :jekyll_plugins do - gem "jekyll-feed", "~> 0.12" -end -# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem -# and associated library. -platforms :mingw, :x64_mingw, :mswin, :jruby do - gem "tzinfo", ">= 1", "< 3" - gem "tzinfo-data" -end - -# Performance-booster for watching directories on Windows -gem "wdm", "~> 0.1.1", :platforms => [:mingw, :x64_mingw, :mswin] - -# Lock `http_parser.rb` gem to `v0.6.x` on JRuby builds since newer versions of the gem -# do not have a Java counterpart. -gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby] - -gem "minimal-mistakes-jekyll" -gem "jekyll-archives" \ No newline at end of file +gem "github-pages", group: :jekyll_plugins +gem "jekyll-include-cache", group: :jekyll_plugins diff --git a/Gemfile.lock b/Gemfile.lock index 74d1139..10a00ee 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,58 +1,222 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.8.6) - public_suffix (>= 2.0.2, < 6.0) + activesupport (7.2.3) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) + base64 (0.3.0) + benchmark (0.5.0) + bigdecimal (4.0.1) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.12.2) colorator (1.1.0) - concurrent-ruby (1.2.3) + commonmarker (0.23.12) + concurrent-ruby (1.3.6) + connection_pool (2.5.5) + csv (3.3.5) + dnsruby (1.73.1) + base64 (>= 0.2) + logger (~> 1.6) + simpleidn (~> 0.2.1) + drb (2.2.3) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) + ethon (0.15.0) + ffi (>= 1.15.0) eventmachine (1.2.7) - faraday (2.9.0) - faraday-net_http (>= 2.0, < 3.2) - faraday-net_http (3.1.0) - net-http - ffi (1.16.3) + execjs (2.10.0) + faraday (2.14.0) + faraday-net_http (>= 2.0, < 3.5) + json + logger + faraday-net_http (3.4.2) + net-http (~> 0.5) + ffi (1.17.3-x86_64-darwin) forwardable-extended (2.6.0) - google-protobuf (3.25.3-x86_64-darwin) - http_parser.rb (0.8.0) - i18n (1.14.3) + gemoji (4.1.0) + github-pages (232) + github-pages-health-check (= 1.18.2) + jekyll (= 3.10.0) + jekyll-avatar (= 0.8.0) + jekyll-coffeescript (= 1.2.2) + jekyll-commonmark-ghpages (= 0.5.1) + jekyll-default-layout (= 0.1.5) + jekyll-feed (= 0.17.0) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.16.1) + jekyll-include-cache (= 0.2.1) + jekyll-mentions (= 1.6.0) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.16.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.3) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.8.0) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.2.0) + jekyll-theme-cayman (= 0.2.0) + jekyll-theme-dinky (= 0.2.0) + jekyll-theme-hacker (= 0.2.0) + jekyll-theme-leap-day (= 0.2.0) + jekyll-theme-merlot (= 0.2.0) + jekyll-theme-midnight (= 0.2.0) + jekyll-theme-minimal (= 0.2.0) + jekyll-theme-modernist (= 0.2.0) + jekyll-theme-primer (= 0.6.0) + jekyll-theme-slate (= 0.2.0) + jekyll-theme-tactile (= 0.2.0) + jekyll-theme-time-machine (= 0.2.0) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.13.0) + kramdown (= 2.4.0) + kramdown-parser-gfm (= 1.1.0) + liquid (= 4.0.4) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.16.2, < 2.0) + rouge (= 3.30.0) + terminal-table (~> 1.4) + webrick (~> 1.8) + github-pages-health-check (1.18.2) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (>= 4, < 8) + public_suffix (>= 3.0, < 6.0) + typhoeus (~> 1.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.8.1) + i18n (1.14.8) concurrent-ruby (~> 1.0) - racc (~> 1.7) - jekyll (4.3.3) + jekyll (3.10.0) addressable (~> 2.4) colorator (~> 1.0) + csv (~> 3.0) em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (>= 2.0, < 4.0) + i18n (>= 0.7, < 2) + jekyll-sass-converter (~> 1.0) jekyll-watch (~> 2.0) - kramdown (~> 2.3, >= 2.3.1) - kramdown-parser-gfm (~> 1.0) + kramdown (>= 1.17, < 3) liquid (~> 4.0) - mercenary (>= 0.3.6, < 0.5) + mercenary (~> 0.3.3) pathutil (~> 0.9) - rouge (>= 3.0, < 5.0) + rouge (>= 1.7, < 4) safe_yaml (~> 1.0) - terminal-table (>= 1.8, < 4.0) - webrick (~> 1.7) - jekyll-archives (2.2.1) - jekyll (>= 3.6, < 5.0) + webrick (>= 1.0) + jekyll-avatar (0.8.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.2.2) + coffee-script (~> 2.2) + coffee-script-source (~> 1.12) + jekyll-commonmark (1.4.0) + commonmarker (~> 0.22) + jekyll-commonmark-ghpages (0.5.1) + commonmarker (>= 0.23.7, < 1.1.0) + jekyll (>= 3.9, < 4.0) + jekyll-commonmark (~> 1.4.0) + rouge (>= 2.0, < 5.0) + jekyll-default-layout (0.1.5) + jekyll (>= 3.0, < 5.0) jekyll-feed (0.17.0) jekyll (>= 3.7, < 5.0) jekyll-gist (1.5.0) octokit (~> 4.2) + jekyll-github-metadata (2.16.1) + jekyll (>= 3.4, < 5.0) + octokit (>= 4, < 7, != 4.4.0) jekyll-include-cache (0.2.1) jekyll (>= 3.7, < 5.0) + jekyll-mentions (1.6.0) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) jekyll-paginate (1.1.0) - jekyll-sass-converter (3.0.0) - sass-embedded (~> 1.54) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.16.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.3) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) + rubyzip (>= 1.3.0, < 3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) jekyll-seo-tag (2.8.0) jekyll (>= 3.8, < 5.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.6.0) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.2.0) + jekyll (> 3.5, < 5.0) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) jekyll-watch (2.2.1) listen (~> 3.0) + jemoji (0.13.0) + gemoji (>= 3, < 5) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.18.0) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) @@ -61,57 +225,58 @@ GEM listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.4.0) + logger (1.7.0) + mercenary (0.3.6) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minimal-mistakes-jekyll (4.24.0) - jekyll (>= 3.7, < 5.0) - jekyll-feed (~> 0.1) - jekyll-gist (~> 1.5) - jekyll-include-cache (~> 0.1) - jekyll-paginate (~> 1.1) - jekyll-sitemap (~> 1.3) - net-http (0.4.1) - uri + minitest (5.27.0) + net-http (0.9.1) + uri (>= 0.11.1) + nokogiri (1.18.10-x86_64-darwin) + racc (~> 1.4) octokit (4.25.1) faraday (>= 1, < 3) sawyer (~> 0.9) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (5.0.4) - racc (1.7.3) + public_suffix (5.1.1) + racc (1.8.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - rexml (3.2.6) - rouge (4.2.0) + rexml (3.4.4) + rouge (3.30.0) + rubyzip (2.4.1) safe_yaml (1.0.5) - sass-embedded (1.71.1-x86_64-darwin) - google-protobuf (~> 3.25) - sawyer (0.9.2) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.9.3) addressable (>= 2.3.5) faraday (>= 0.17.3, < 3) - terminal-table (3.0.2) - unicode-display_width (>= 1.1.1, < 3) - unicode-display_width (2.5.0) - uri (0.13.0) - webrick (1.8.1) + securerandom (0.4.1) + simpleidn (0.2.3) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + typhoeus (1.5.0) + ethon (>= 0.9.0, < 0.16.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (1.8.0) + uri (1.1.1) + webrick (1.9.2) PLATFORMS x86_64-darwin-23 + x86_64-darwin-24 DEPENDENCIES - http_parser.rb (~> 0.6.0) - jekyll (~> 4.3.3) - jekyll-archives - jekyll-feed (~> 0.12) - minima (~> 2.5) - minimal-mistakes-jekyll - tzinfo (>= 1, < 3) - tzinfo-data - wdm (~> 0.1.1) + github-pages + jekyll-include-cache BUNDLED WITH 2.5.6 diff --git a/README.md b/README.md new file mode 100644 index 0000000..453d7b0 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# pjsoni.github.io + +This repository contains base code for the blog. \ No newline at end of file diff --git a/_config.yml b/_config.yml index 603b3aa..bba388a 100644 --- a/_config.yml +++ b/_config.yml @@ -1,228 +1,43 @@ -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your entire site, values -# which you are expected to set up once and rarely need to edit after that. -# For technical reasons, this file is *NOT* reloaded automatically when you use -# `jekyll serve`. If you change this file, please restart the server process. - -# Theme Settings -# -# Review documentation to determine if you should use `theme` or `remote_theme` -# https://mmistakes.github.io/minimal-mistakes/docs/quick-start-guide/#installing-the-theme - -# theme : "minimal-mistakes-jekyll" -# remote_theme : "mmistakes/minimal-mistakes" -minimal_mistakes_skin : "air" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise" - -# Site Settings -locale : "en-US" -title : "Pravesh Soni" -title_separator : "-" -subtitle : "My journey in to unknown of IT" # site tagline that appears below site title in masthead -name : "Pravesh Soni" -description : "" -url : "https://pravesh.me" # the base hostname & protocol for your site e.g. "https://mmistakes.github.io" -baseurl : "" # the subpath of your site, e.g. "/blog" -repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes" -teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png" -logo : # path of logo image to display in the masthead, e.g. "/assets/images/88x88.png" -masthead_title : # overrides the website title displayed in the masthead, use " " for no title -# breadcrumbs : false # true, false (default) -words_per_minute : 150 -comments: - provider : # false (default), "disqus", "discourse", "facebook", "staticman", "staticman_v2", "utterances", "custom" - disqus: - shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname- - discourse: - server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org - facebook: - # https://developers.facebook.com/docs/plugins/comments - appid : - num_posts : # 5 (default) - colorscheme : # "light" (default), "dark" - utterances: - theme : # "github-light" (default), "github-dark" - issue_term : # "pathname" (default) - staticman: - branch : # "master" - endpoint : # "https://{your Staticman v3 API}/v3/entry/github/" -reCaptcha: - siteKey : - secret : -atom_feed: - path : # blank (default) uses feed.xml -search : # true, false (default) -search_full_content : # true, false (default) -search_provider : # lunr (default), algolia, google -algolia: - application_id : # YOUR_APPLICATION_ID - index_name : # YOUR_INDEX_NAME - search_only_api_key : # YOUR_SEARCH_ONLY_API_KEY - powered_by : # true (default), false -google: - search_engine_id : # YOUR_SEARCH_ENGINE_ID - instant_search : # false (default), true -# SEO Related -google_site_verification : -bing_site_verification : -yandex_site_verification : -naver_site_verification : - -# Social Sharing -twitter: - username : -facebook: - username : - app_id : - publisher : -og_image : # Open Graph/Twitter default site image -# For specifying social profiles -# - https://developers.google.com/structured-data/customize/social-profiles -social: - type : # Person or Organization (defaults to Person) - name : # If the user or organization name differs from the site's name - links: # An array of links to social media profiles - -# Analytics -analytics: - provider : false # false (default), "google", "google-universal", "google-gtag", "custom" - google: - tracking_id : - anonymize_ip : # true, false (default) - - -# Site Author -author: - name : "Pravesh Soni" - avatar : # path of avatar image, e.g. "/assets/images/bio-photo.jpg" - bio : - location : - email : - links: - - label: "Email" - icon: "fas fa-fw fa-envelope-square" - # url: "mailto:your.name@email.com" - - label: "Website" - icon: "fas fa-fw fa-link" - url: "https://pravesh.me" - - label: "Twitter" - icon: "fab fa-fw fa-twitter-square" - url: "https://twitter.com/pjsoni" - - label: "Facebook" - icon: "fab fa-fw fa-facebook-square" - # url: "https://facebook.com/" - - label: "GitHub" - icon: "fab fa-fw fa-github" - url: "https://github.com/pjsoni" - - label: "Instagram" - icon: "fab fa-fw fa-instagram" - # url: "https://instagram.com/" - -# Site Footer -footer: - links: - - label: "Twitter" - icon: "fab fa-fw fa-twitter-square" - url: "https://twitter.com/pjsoni" - - label: "Facebook" - icon: "fab fa-fw fa-facebook-square" - # url: - - label: "GitHub" - icon: "fab fa-fw fa-github" - url: "https://github.com/pjsoni" - - label: "GitLab" - icon: "fab fa-fw fa-gitlab" - # url: - - label: "Bitbucket" - icon: "fab fa-fw fa-bitbucket" - # url: - - label: "Instagram" - icon: "fab fa-fw fa-instagram" - # url: - - -# Reading Files +# Minimal, remote-theme-friendly Jekyll configuration + +# Use the remote Minimal Mistakes theme +remote_theme: "mmistakes/minimal-mistakes@4.27.3" +minimal_mistakes_skin: "air" + +# Basic site settings +locale: "en-US" +title: "Pravesh Soni" +title_separator: "-" +subtitle: "My journey in to unknown of IT" +name: "Pravesh Soni" +url: "https://pravesh.me" +baseurl: "" # leave empty for root + +# Files and folders to include/exclude from site build include: - .htaccess - _pages exclude: - - "*.gem" - - "*.gemspec" - - docs - - tools - - README.md - - LICENSE - - "*.sublime-project" - - "*.sublime-workspace" - vendor - - .asset-cache - .bundle - - .jekyll-assets-cache - - .sass-cache - - assets/js/plugins - - assets/js/_main.js - - assets/js/vendor - - Capfile - - CHANGELOG - - config - - Gemfile - - Gruntfile.js - - gulpfile.js - - LICENSE - - log - node_modules - - package.json - - package-lock.json - - Rakefile - - README.md - tmp - - /docs # ignore Minimal Mistakes /docs - - /test # ignore Minimal Mistakes /test -keep_files: - - .git - - .svn + - README.md + encoding: "utf-8" markdown_ext: "markdown,mkdown,mkdn,mkd,md" - -# Conversion +# Markdown and conversion markdown: kramdown highlighter: rouge -lsi: false -excerpt_separator: "\n\n" -incremental: false - - -# Markdown Processing -kramdown: - syntax_highlighter: rouge - syntax_highlighter_opts: # Rouge Options › https://github.com/jneen/rouge#full-options - css_class: highlight - # default_lang: console - input: GFM - hard_wrap: false - auto_ids: true - footnote_nr: 1 - entity_output: as_char - toc_levels: 1..6 - smart_quotes: lsquo,rsquo,ldquo,rdquo - enable_coderay: false - - -# Sass/SCSS -sass: - sass_dir: _sass - style: compressed # https://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style - # Outputting -permalink: /:categories/:title/ -paginate: 5 # amount of posts to show +permalink: /:title/ +paginate: 5 paginate_path: /page:num/ -timezone: America/Chicago # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +timezone: America/Chicago - -# Plugins (previously gems:) +# Plugins plugins: - jekyll-paginate - jekyll-sitemap @@ -231,33 +46,14 @@ plugins: - jekyll-include-cache - jekyll-archives -# mimic GitHub Pages with --safe -whitelist: - - jekyll-paginate - - jekyll-sitemap - - jekyll-gist - - jekyll-feed - - jekyll-include-cache - - jekyll-archives - - -# Archives -# Type -# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default) -# - Jekyll Archives plugin archive pages ~> type: jekyll-archives -# Path (examples) -# - Archive page should exist at path when using Liquid method or you can -# expect broken links (especially with breadcrumbs enabled) -# - /tags/my-awesome-tag/index.html ~> path: /tags/ -# - /categories/my-awesome-category/index.html ~> path: /categories/ -# - /my-awesome-category/index.html ~> path: / +# Archives (jekyll-archives) category_archive: type: liquid path: /categories/ tag_archive: type: liquid path: /tags/ -# https://github.com/jekyll/jekyll-archives + jekyll-archives: enabled: - categories @@ -269,22 +65,8 @@ jekyll-archives: category: /categories/:name/ tag: /tags/:name/ - -# HTML Compression -# - https://jch.penibelst.de/ -compress_html: - clippings: all - comments: all - endings: all - profile: false - blanklines: false - ignore: - envs: [development] - - -# Defaults +# Defaults (pages and posts) defaults: - # _pages - scope: path: "" type: pages @@ -292,7 +74,6 @@ defaults: layout: single header: overlay_image: /assets/images/chicago.jpg - # _posts - scope: path: "" type: posts @@ -305,13 +86,3 @@ defaults: related: true paginate: true permalink: /blog/:title/ - - scope: - path: "" - type: tag - values: - author_profile: true - - scope: - path: "" - type: category - values: - comments: false diff --git a/_drafts/2024-03-08.md b/_drafts/2024-03-08.md deleted file mode 100644 index 5fbe6a2..0000000 --- a/_drafts/2024-03-08.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: single -title: Exposing the internal services securely to outside world -tags: [blogengine.net] -category: [blog] -comments: false - ---- \ No newline at end of file diff --git a/_drafts/2026-01-08-proxmox-network-isolation-part-1.md b/_drafts/2026-01-08-proxmox-network-isolation-part-1.md new file mode 100644 index 0000000..246b477 --- /dev/null +++ b/_drafts/2026-01-08-proxmox-network-isolation-part-1.md @@ -0,0 +1,286 @@ +--- +layout: post +title: "Proxmox Network Isolation Series – Part 1: Securing a Single-Node Hypervisor" +date: 2026-01-08 +categories: [homelab, proxmox, security, networking] +tags: [Proxmox, VLAN, Homelab, Virtualization, Security, Firewall] +--- + +## Introduction + +This article is **Part 1 of a multi-part series** focused on hardening Proxmox by removing it from the native VLAN and enforcing strict network isolation. + +We intentionally start with the **simplest and lowest-risk scenario**: a **single-node Proxmox hypervisor**. + +Even without clustering, a Proxmox host is a **high-value target**. It controls virtual machines, storage access, and often backup credentials. Exposing it on the same network as user devices significantly increases risk. + +This article focuses exclusively on: + +- One Proxmox node +- Management traffic isolation +- VLAN-aware VM networking +- Firewall-enforced security boundaries + +> No clustering, Corosync, or migration complexity is introduced in Part 1. + +--- + +## Threat Model (Why This Matters) + +Without isolation, a single-node Proxmox host is typically exposed to: + +- User endpoints +- IoT devices +- Guest or lab networks + +If any of those systems are compromised, the hypervisor itself becomes reachable. + +Our goal is to ensure: + +- The **Proxmox management plane** is reachable only from trusted admin networks +- **VM traffic** is isolated from the hypervisor +- The **native VLAN is completely removed** from the host + +--- + +## Prerequisites (Non-Negotiable) + +VLANs alone do **not** provide security. They only provide separation. + +### Mandatory Components + +- **Managed switch** with VLAN tagging and trunking +- **Stateful firewall/router** capable of: + - Inter-VLAN routing + - Explicit allow/deny rules +- Console or out-of-band access to the Proxmox host + +> ⚠️ If your router can route VLANs but cannot enforce firewall rules, this architecture provides **no real security benefit**. + +### Roles and Responsibilities + +- **Switch** → Enforces segmentation +- **Firewall** → Enforces security + +Both are required. + +--- + +## VLAN Design (Single-Node Only) + +For a single-node hypervisor, the VLAN model is intentionally minimal. + +| VLAN ID | Name | Purpose | +|-------:|-------------|---------| +| 90 | Management | Proxmox Web UI, SSH | +| 200+ | VM Networks | Guest virtual machines | + +### Design Principles + +- Proxmox management traffic must live on a **dedicated management VLAN** +- VM networks must never share the management VLAN +- The native (untagged) VLAN must not touch the host + +--- + +## Example Environment + +| Hostname | Role | Management IP | +|---------|--------------|---------------| +| hv1 | Proxmox Node | 192.168.90.11 | + +### Logical Topology + +```text + ┌──────────────────────┐ + │ Firewall / Router │ + │ (Routing + Policy) │ + └─────────┬────────────┘ + │ + ┌─────────┴─────────┐ + │ Managed Switch │ + │ (VLAN Trunk Port) │ + └─────────┬─────────┘ + │ + hv1 + ┌──────────────────────────────────┐ + │ VLAN 90 → Proxmox Management │ + │ VLAN 200 → Virtual Machines │ + │ No Native VLAN │ + └──────────────────────────────────┘ +```` + +--- + +## Step 1: Switch Configuration + +Configure the switch port connected to the Proxmox host as a **trunk**. + +* Allowed VLANs: `90, 200+` +* Native VLAN: **None** (or unused VLAN) + +Conceptual example: + +```text +Proxmox Port: + Tagged VLANs: 90, 200 + Native VLAN: Disabled +``` + +This ensures the host never sees untagged traffic. + +--- + +## Step 2: Firewall Configuration + +On the firewall: + +* Create a VLAN interface for **VLAN 90 (Management)** +* Assign a gateway IP (e.g. `192.168.90.1`) +* Create VLAN interfaces for VM networks as needed + +### Minimum Firewall Rules + +* Allow HTTPS (8006) to VLAN 90 **only** from admin networks or hosts +* Allow SSH only from trusted IPs +* Deny all other inbound access to VLAN 90 + +> If a user VLAN can reach the Proxmox UI, the design has failed. + +--- + +## Step 3: Proxmox Network Configuration + +Edit `/etc/network/interfaces`: + +```text +auto lo +iface lo inet loopback + +iface eno1 inet manual + +auto vmbr0 +iface vmbr0 inet static + address 192.168.90.11/24 + gateway 192.168.90.1 + bridge-ports eno1.90 + bridge-stp off + bridge-fd 0 +``` + +This bridge is **management only**. + +--- + +## Step 4: VLAN-Aware VM Bridge + +Create a dedicated bridge for virtual machines: + +```text +auto vmbr1 +iface vmbr1 inet manual + bridge-ports eno1 + bridge-vlan-aware yes + bridge-stp off + bridge-fd 0 +``` + +Attach VM NICs to `vmbr1` and assign VLAN tags (e.g. `200`). + +--- + +## Step 5: Validation + +From the Proxmox host: + +```bash +ip a +ip route +``` + +Confirm: + +* Default route exists only on VLAN 90 +* No interface is attached to an untagged VLAN + +From an untrusted VLAN: + +* Proxmox UI should be unreachable + +--- +## Firewall Rule Examples + +### pfSense / OPNsense + +**VLAN 90 (Management)** + +* Allow TCP 8006 from admin subnet +* Allow SSH from admin IPs +* Block all other inbound traffic +* Log activities (Optional but important) + +**VLAN 99 (Cluster)** + +* Block all routed traffic +* No default gateway preferred + +**VLAN 200+ (VMs)** + +* Explicit allow rules only + +--- + +### Ubiquiti (Conceptual) + +* Create LAN-IN rules denying access to VLAN 90 +* Permit admin subnet → VLAN 90 +* Block VLAN 200+ → VLAN 90/99 + +--- + +## Common Pitfalls (Single Node) + +### Leaving the Native VLAN Enabled + +Even one untagged interface can expose the host. + +**Fix:** Remove native VLAN access entirely. + +--- + +### Treating VLANs as Security Controls + +VLANs without firewall rules are not security boundaries. + +**Fix:** Enforce policy at the firewall. + +--- + +### Mixing VM and Management Traffic + +Sharing a bridge increases blast radius. + +**Fix:** Separate management and VM bridges. + +--- + +## What Comes Next + +In **Part 2**, we extend this exact design to a **fresh three-node Proxmox cluster**, introducing: + +* Dedicated cluster networking +* Corosync isolation +* Quorum-safe design + +No rework required. + +--- + +## Closing Thoughts + +A single-node hypervisor deserves the same security discipline as a cluster. + +When the native VLAN is removed, management is isolated, and firewall policy is enforced, Proxmox becomes **predictable, secure, and safe to grow**. + +Happy virtualizing 🚀 + diff --git a/_drafts/2026-01-08-proxmox-network-isolation-part-2.md b/_drafts/2026-01-08-proxmox-network-isolation-part-2.md new file mode 100644 index 0000000..b274c89 --- /dev/null +++ b/_drafts/2026-01-08-proxmox-network-isolation-part-2.md @@ -0,0 +1,150 @@ +--- + +layout: post +title: "Proxmox Network Isolation Series – Part 2: Fresh Three-Node Cluster" +date: 2026-01-08 +categories: [homelab, proxmox, security, networking] +tags: [Proxmox, VLAN, Cluster, Corosync, Firewall] +-------------------------------------------------- + +## Scope and Assumptions + +This article builds **directly on Part 1**. Nothing introduced here replaces earlier guidance. + +**Assumptions:** + +* Three *fresh* Proxmox nodes +* No existing VMs +* No existing cluster +* Managed switch + stateful firewall already in place + +If your cluster already exists or hosts VMs, **do not follow this guide**. That scenario is covered in **Part 3**. + +--- + +## VLAN Architecture (Expanded) + +| VLAN | Name | Purpose | +| ---: | ---------- | ----------------------- | +| 90 | Management | Web UI, SSH | +| 99 | Cluster | Corosync (L2 preferred) | +| 200+ | VM | Guest workloads | + +### Key Rules + +* Corosync **must not traverse user or VM networks** +* Management traffic must remain routable and firewalled +* VM traffic must never touch VLAN 90 or 99 + +--- + +## Logical Topology + +![Cluster Topology](/assets/proxmox-part2-topology.svg) + +--- + +## Host Addressing + +| Host | Mgmt (VLAN 90) | Cluster (VLAN 99) | +| ---- | -------------- | ----------------- | +| hv1 | 192.168.90.11 | 192.168.99.11 | +| hv2 | 192.168.90.12 | 192.168.99.12 | +| hv3 | 192.168.90.13 | 192.168.99.13 | + +--- + +## Switch Configuration + +Each Proxmox port: + +* Tagged VLANs: `90, 99, 200+` +* Native VLAN: **None** + +This ensures deterministic traffic separation. + +--- + +## Firewall Responsibilities + +### Critical Requirement + +If your firewall cannot enforce **inter-VLAN policy**, this architecture collapses. + +A "VLAN-capable" router without firewall rules provides **zero isolation**. + +--- + +## Proxmox Network Configuration (All Nodes) + +### Management Bridge + +```text +auto vmbr0 +iface vmbr0 inet static + address 192.168.90.11/24 + gateway 192.168.90.1 + bridge-ports eno1.90 +``` + +### Cluster Interface + +```text +auto vmbr99 +iface vmbr99 inet static + address 192.168.99.11/24 + bridge-ports eno1.99 +``` + +> VLAN 99 should ideally be **non-routed**. + +--- + +## Cluster Creation + +From `hv1`: + +```bash +pvecm create secure-cluster --bindnet0 192.168.99.0 +``` + +Join `hv2` and `hv3` using their **VLAN 99 addresses only**. + +--- + +## Threat–Mitigation Matrix + +| Threat | Mitigation | +| ---------------------- | --------------------------- | +| User device compromise | Mgmt VLAN isolation | +| VM breakout | Separate VM VLANs | +| Corosync instability | Dedicated cluster VLAN | +| Lateral movement | Firewall policy enforcement | +| Mis-tagged traffic | No native VLAN | + +--- + +## Common Pitfalls + +* Using management IPs for Corosync +* Allowing VLAN 99 to route +* Forgetting to firewall east–west traffic + +--- + +![Diagram](/assets/images/proxmox-part2-topology.svg) + +--- + +## What’s Next + +**Part 3** covers the hardest scenario: + +* Existing cluster +* Live VMs +* Native VLAN dependency +* Zero-downtime migration strategy + +--- + +**End of Part 2** diff --git a/_drafts/2026-01-08-proxmox-network-isolation-part-3.5.md b/_drafts/2026-01-08-proxmox-network-isolation-part-3.5.md new file mode 100644 index 0000000..7e53775 --- /dev/null +++ b/_drafts/2026-01-08-proxmox-network-isolation-part-3.5.md @@ -0,0 +1,368 @@ +--- + +layout: post +title: "Proxmox Network Isolation Series – Part 3.5: Recovering From Broken Quorum Without Losing VMs" +date: 2026-01-08 +categories: [homelab, proxmox, security, networking, recovery] +tags: [Proxmox, Quorum, Corosync, Recovery, VLAN, Migration, Security] +---------------------------------------------------------------------- + +## Introduction + +This article is a **direct follow-up to Part 3**. + +In Part 3, we stated clearly: + +> **If quorum is unstable, stop.** + +This article explains **what to do next** when you cannot proceed safely. + +We focus on a common real-world scenario: + +* A Proxmox cluster exists +* Quorum is **broken or flapping** +* Network design is mixed or incorrect +* VMs are **running and must be preserved** + +The goal is **not** to fix quorum immediately. + +The goal is to: + +> **Safely dismantle the broken cluster while keeping all VMs intact**, +> then rebuild the cluster later using a hardened VLAN design. + +--- + +## What This Article Does (and Does Not) Do + +### This Article Does + +* Preserve all existing VMs and disks +* Break a failing cluster **deliberately and cleanly** +* Convert each hypervisor into a **standalone node** +* Remove Corosync safely +* Prepare hosts for secure re-clustering + +### This Article Does NOT + +* Attempt live quorum repair on unstable networks +* Hide risk behind automation +* Guarantee zero downtime + +> A broken cluster is already unsafe. Controlled disassembly is safer. + +--- + +## Why Broken Quorum Must Be Addressed First + +Operating on an unstable cluster is dangerous because: + +* Proxmox fencing decisions become unpredictable +* VM ownership may change unexpectedly +* Network changes can trigger split brain + +If quorum is not stable: + +* **Do not migrate networking** +* **Do not rebind Corosync** +* **Do not remove gateways** + +First, regain **administrative control**. + +--- + +## High-Level Recovery Strategy + +We will: + +1. Freeze the environment +2. Force single-node quorum temporarily +3. Safely remove Corosync +4. Verify VMs remain accessible +5. Convert hosts to standalone mode + +Only *after* this process should VLAN segmentation begin. + +--- + +## Phase 0: Freeze the Environment + +### Stop All Cluster Operations + +* Disable HA (if enabled) +* Stop scheduled backups +* Avoid VM migrations + +On each node: + +```bash +systemctl stop pve-ha-lrm +systemctl stop pve-ha-crm +``` + +--- + +## Phase 1: Identify the Most Stable Node + +Choose the node that: + +* Has the **most running VMs** +* Has reliable console access +* Can reach its own disks consistently + +This node will temporarily become the **cluster authority**. + +--- + +## Phase 2: Force Quorum (Temporary Emergency State) + +On the selected node **only**: + +```bash +pvecm expected 1 +``` + +This tells Proxmox: + +> "Assume you are alone. Do not fence." + +⚠️ This is a **temporary survival measure**, not a fix. + +--- + +## Phase 3: Verify VM Integrity + +Confirm that: + +* All VMs appear in the Web UI +* VM disks are accessible +* Storage is not read-only + +```bash +qm list +pvesm status +``` + +If disks are unavailable, **stop here**. + +--- + +## Phase 4: Cleanly Remove Corosync + +On **each node**, one at a time: + +```bash +systemctl stop corosync +systemctl disable corosync +``` + +Then remove cluster configuration: + +```bash +rm -rf /etc/corosync/* +rm -rf /var/lib/corosync/* +``` + +On the authoritative node: + +```bash +rm -rf /etc/pve/corosync.conf +``` + +This breaks cluster membership **without touching VM data**. + +--- + +## Phase 5: Restart Proxmox Services + +On each node: + +```bash +systemctl restart pve-cluster +systemctl restart pvedaemon +systemctl restart pveproxy +``` + +The Web UI should now show: + +* No cluster +* Local node only + +--- + +## Phase 6: Validate Standalone Operation + +On each host: + +```bash +pvecm status +``` + +Expected output: + +* Not a member of any cluster + +Confirm: + +* VMs start and stop normally +* Storage behaves correctly + +At this point, **each hypervisor is independent**. + +--- + +## Phase 7: Why This Works (And Why VMs Survive) + +Key facts: + +* VM configs live in `/etc/pve/nodes//qemu-server/` +* VM disks are not stored in Corosync +* Corosync controls **coordination**, not storage + +Removing Corosync does **not** delete VMs. + +--- + +## Common Mistakes During Quorum Recovery + +### 1. Removing Corosync Before Forcing Quorum + +This can cause: + +* Services to stop responding +* UI lockups + +**Always force quorum first.** + +--- + +### 2. Attempting Network Migration Mid-Recovery + +Changing VLANs during quorum instability increases risk. + +**Stabilize → dismantle → redesign → rebuild.** + +--- + +### 3. Leaving HA Enabled + +HA assumes quorum. + +Disable it before proceeding. + +--- + +## Transition to Secure Rebuild + +You now have: + +* Independent Proxmox nodes +* All VMs intact +* No cluster dependencies + +From here, you can safely: + +* Apply **Part 1** to each node +* Introduce VLAN isolation cleanly +* Proceed to **Part 2** to rebuild a secure cluster + +--- + +## Why Not Just “Fix Quorum?” + +This is a fair question, and it deserves a direct answer. + +In theory, quorum issues *can* sometimes be fixed by: + +* Adjusting Corosync bind addresses +* Tuning timeouts +* Restarting services +* Reordering interfaces + +In practice, **that approach is unsafe when the network itself is wrong**. + +### The Core Problem + +Quorum failures are rarely the *root cause*. + +They are a **symptom** of deeper issues such as: + +* Mixed or ambiguous VLAN usage +* Multiple default gateways +* Routed cluster traffic +* DNS or `/etc/hosts` ambiguity +* Proxmox binding to the "first working interface" + +Trying to fix quorum without fixing these fundamentals is like: + +> Re-aligning wheels on a car with a bent frame. + +You may get temporary stability, but the system remains fragile. + +--- + +### Why Repairing Quorum In-Place Is Risky + +Attempting live quorum repair in a misdesigned network can cause: + +* Sudden fencing events +* VM ownership confusion +* Split brain during partial fixes +* Cascading failures when a "fix" partially works + +Worse, these failures often happen **minutes or hours later**, not immediately. + +--- + +### The Safer Philosophy: Control First, Optimization Later + +This series deliberately chooses a conservative approach: + +1. **Regain control** (force quorum or dismantle) +2. **Remove undefined behavior** (Corosync on a bad network) +3. **Redesign networking correctly** (VLAN isolation + firewall enforcement) +4. **Rebuild the cluster cleanly** + +This may feel slower — but it is: + +* More predictable +* Easier to reason about +* Far less likely to cause data loss + +--- + +### When *Does* It Make Sense to Fix Quorum Directly? + +Direct quorum repair can be reasonable **only if**: + +* Network design is already correct +* Cluster traffic is isolated +* Gateways are unambiguous +* Name resolution is deterministic +* You can reproduce the failure reliably + +If those conditions are not true, fixing quorum treats the symptom — not the disease. + +--- + +## Final Thoughts + +A broken cluster is not a failure — it is a **signal**. + +By intentionally dismantling it: + +* You regain control +* You eliminate undefined behavior +* You create space for a correct design + +Only after control is restored does security work begin. + +--- + +**Next Steps** + +* Apply Part 1 to each standalone node +* Rebuild using Part 2 +* If needed, return to Part 3 for migration guidance + +This completes the **full lifecycle**: from broken quorum → hardened cluster. diff --git a/_drafts/2026-01-08-proxmox-network-isolation-part-3.md b/_drafts/2026-01-08-proxmox-network-isolation-part-3.md new file mode 100644 index 0000000..0f7a66a --- /dev/null +++ b/_drafts/2026-01-08-proxmox-network-isolation-part-3.md @@ -0,0 +1,332 @@ +--- + +layout: post +title: "Proxmox Network Isolation Series – Part 3: Migrating an Existing Cluster with Running VMs" +date: 2026-01-08 +categories: [homelab, proxmox, security, networking] +tags: [Proxmox, VLAN, Migration, Cluster, Corosync, Firewall, Security] +----------------------------------------------------------------------- + +## Introduction + +This article is **Part 3** of the Proxmox Network Isolation Series. + +In this part, we tackle the **hardest and most dangerous scenario**: + +> A **running Proxmox cluster** with **active VMs**, where: +> +> * Hypervisors live on the **native VLAN** +> * Management, cluster, and VM traffic are **mixed** +> * Proxmox has already made **bad interface decisions** +> * Downtime must be **minimized** + +Unlike Parts 1 and 2, this is **not a clean build**. This is controlled surgery. + +--- + +## ⚠️ Read This First: Scope and Risk + +This guide assumes: + +* A **functional but poorly isolated** Proxmox cluster +* **Quorum is healthy** at the start +* VMs are **running and providing services** + +This guide does **not** attempt: + +* Zero-risk migration (that does not exist) +* Blind automation +* "Just reboot everything" shortcuts + +> If you rush this process, you *will* lose cluster communication. + +--- + +## Why Existing Clusters Break During VLAN Migration + +Most legacy clusters fail for predictable reasons: + +| Failure | Root Cause | +| ------------------------- | ---------------------------------- | +| Nodes join using wrong IP | DNS / `/etc/hosts` ambiguity | +| Corosync flaps | Routed or unstable cluster network | +| Random node fencing | Multiple default gateways | +| Split brain | Cluster traffic crossing firewall | +| Management lockout | Gateway removed too early | + +Proxmox is **not wrong** — it simply uses the *first valid path it sees*. + +--- + +## Target End State (Recap) + +By the end of this migration: + +| VLAN | Purpose | Routing | +| ---: | ----------- | -------------------- | +| 90 | Management | Routed + Firewalled | +| 99 | Cluster | L2-only (no gateway) | +| 200+ | VM Networks | Routed + Firewalled | + +* No Proxmox service touches the native VLAN +* Corosync traffic never reaches the firewall +* VM traffic is isolated from the hypervisor + +--- + +## Migration Strategy Overview + +This migration follows **four controlled phases**: + +1. **Stabilize and observe** (no changes yet) +2. **Add new VLANs in parallel** +3. **Move management traffic first** +4. **Rebind cluster traffic last** + +> Management first. Cluster last. Never reverse this order. + +--- + +## Phase 0: Pre-flight Validation (Do Not Skip) + +### 1. Verify Cluster Health + +```bash +pvecm status +``` + +Confirm: + +* Quorum is healthy +* All nodes are visible +* No packet loss warnings + +If quorum is unstable now, **stop**. + +--- + +### 2. Identify Current Traffic Paths + +On each node: + +```bash +ip route +ip addr +``` + +Document: + +* Default gateway +* Interface used for cluster traffic +* Any secondary routes + +You *must* know what Proxmox is using today before changing it. + +--- + +## Phase 1: Prepare the Network (No Host Changes Yet) + +### Switch Configuration + +* Convert Proxmox ports to **trunk ports** +* Allow VLANs: `90`, `99`, `200+` +* Leave native VLAN temporarily + +This ensures **no traffic loss** when VLANs are added. + +--- + +### Firewall Preparation + +* Create VLAN interfaces for `90` and `200+` +* **Do NOT create VLAN 99 on the firewall** +* Prepare rules but do not enforce yet + +> VLAN 99 must never be routable. + +--- + +## Phase 2: Fix Name Resolution (Critical) + +This is where most migrations fail. + +Edit `/etc/hosts` on **every node**: + +```text +192.168.90.11 hv1.mgmt hv1 +192.168.90.12 hv2.mgmt hv2 +192.168.90.13 hv3.mgmt hv3 + +10.99.0.11 hv1-cluster +10.99.0.12 hv2-cluster +10.99.0.13 hv3-cluster +``` + +Rules: + +* Management names resolve **only** to VLAN 90 +* Cluster names resolve **only** to VLAN 99 +* Never reuse hostnames across VLANs + +--- + +## Phase 3: Add Management VLAN (Parallel Operation) + +On **one node at a time**: + +1. Add VLAN 90 interface +2. Assign management IP +3. Move Web UI + SSH access + +Example: + +```text +auto vmbr0 +iface vmbr0 inet static + address 192.168.90.11/24 + gateway 192.168.90.1 + bridge-ports eno1.90 + bridge-stp off + bridge-fd 0 +``` + +### Validation + +* Open Proxmox UI via VLAN 90 +* Keep existing access until verified + +Repeat node-by-node. + +--- + +## Phase 4: Remove Native VLAN Dependency + +Once **all nodes** are reachable via VLAN 90: + +* Remove default gateway from native interface +* Ensure **only one default gateway exists** + +This step prevents: + +* Asymmetric routing +* Corosync flapping + +--- + +## Phase 5: Add Cluster VLAN (No Routing) + +On each node: + +```text +auto vmbr99 +iface vmbr99 inet static + address 10.99.0.11/24 + bridge-ports eno1.99 + bridge-stp off + bridge-fd 0 +``` + +⚠️ No gateway. Ever. + +Verify node-to-node ping on VLAN 99. + +--- + +## Phase 6: Rebind Corosync (The Dangerous Step) + +On **one node only**: + +```bash +pvecm expected 1 +``` + +Then recreate the cluster configuration: + +```bash +pvecm create homelab --bindnet0 10.99.0.0 +``` + +Rejoin remaining nodes **one at a time**: + +```bash +pvecm add 10.99.0.11 +``` + +Restore quorum: + +```bash +pvecm expected 3 +``` + +--- + +## Phase 7: Lock Down the Firewall + +Now — and only now — enforce rules. + +### Management VLAN (90) + +* Allow 8006 / 22 from admin IPs +* Deny all other inbound + +### Cluster VLAN (99) + +* No firewall interface +* No routing + +### VM VLANs (200+) + +* Apply least-privilege rules + +If VLAN 99 appears on the firewall, **stop and fix it**. + +--- + +## Common Failure Modes and Recovery + +| Symptom | Likely Cause | Recovery | +| ------------------ | ------------------------- | -------------------------- | +| Node drops | Cluster VLAN routed | Remove gateway immediately | +| Join uses wrong IP | DNS ambiguity | Fix `/etc/hosts` | +| Web UI unreachable | Gateway removed too early | Re-add temporarily | +| Split brain | Multiple gateways | Single default route | + +--- + +## Final State Verification + +```bash +pvecm status +ip route +``` + +Confirm: + +* Corosync on VLAN 99 only +* Management via VLAN 90 +* No native VLAN usage + +--- + +## Closing Thoughts + +Migrating a live Proxmox cluster is **not configuration work** — it is **change management**. + +The rules are simple: + +* Observe before changing +* One node at a time +* Management first +* Cluster last + +Do this correctly, and you transform a fragile environment into a **predictable, hardened platform**. + +--- + +**Series Complete** 🚀 + +You now have: + +* A secure single node +* A clean new cluster design +* A safe path for legacy migrations diff --git a/_drafts/2026-01-12-zerotrust-iot-homeassistant-firewall.md b/_drafts/2026-01-12-zerotrust-iot-homeassistant-firewall.md new file mode 100644 index 0000000..8293c2b --- /dev/null +++ b/_drafts/2026-01-12-zerotrust-iot-homeassistant-firewall.md @@ -0,0 +1,282 @@ +--- + +layout: post +slug: zerotrust-iot-homeassistant-firewall +title: "Zero-Trust IoT & Home Assistant Firewall Architecture" +date: 2026-01-12 +categories: [networking, security, homelab] +tags: [firewall, iot, homeassistant, zerotrust, dns] +---------------------------------------------------- + +## Overview + +This post documents a **vendor-agnostic, zero-trust firewall design** for a modern smart home and homelab. The goal is to securely operate IoT devices and Home Assistant (HA) while maintaining **strict VLAN isolation**, **single-source DNS**, and **explicit trust boundaries**. + +This is not a theoretical design — it is a **battle-tested, production homelab configuration** built iteratively after real-world issues with Matter, HomeKit, TP-Link Kasa, Sonos, ESP-based devices, and mDNS discovery. + +--- + +## Who This Is For (and Not For) + +### This post **is for you** if: + +* You run **Home Assistant** (bare metal, VM, or appliance) +* You want **strong IoT isolation** without breaking Matter or HomeKit +* You use **Pi-hole** (or similar) and want DNS to be a control plane +* You prefer **explicit firewall rules** over flat trusted networks +* You want a design that survives vendor changes + +### This post **is not for you** if: + +* All devices live on a single flat LAN +* You rely entirely on vendor cloud apps +* You are not using VLANs or inter-VLAN firewalls +* You want a "plug-and-play" consumer router setup + +--- + +## Design Principles + +1. **Default Deny Everywhere** – No inter-VLAN communication unless explicitly allowed +2. **Single Controller Model** – Home Assistant is the only IoT control plane +3. **Single DNS Authority** – One recursive DNS resolver for the entire network +4. **Discovery Without Trust** – mDNS allowed only where required +5. **Maintenance Is Temporary** – Admin access is disabled by default + +--- + +## Network Segmentation + +| VLAN | Purpose | +| --------------- | ------------------------------------------------------- | +| IoT VLAN | Smart devices (Matter, HomeKit, ESP, Kasa, Sonos, etc.) | +| Trusted / Admin | Admin workstation | +| Infrastructure | Pi-hole + recursive DNS resolver | +| Home Assistant | Dedicated HA subnet or host | + +Each VLAN is isolated at Layer 3. **No implicit routing** exists between them. + +--- + +-|--------| +| Management (VLAN 90) | Proxmox UI, SSH, infrastructure services | +| IoT VLAN | Smart devices (Matter, HomeKit, ESP, Kasa, Sonos, etc.) | +| Trusted / Admin | Admin workstation | +| Infrastructure | Pi-hole + recursive DNS resolver | + +Each VLAN is isolated at Layer 3. **No implicit routing** exists between them. + +--- + +## DNS Architecture (Single Source of Truth) + +All devices use **Pi-hole** as their *only* DNS server. + +Pi-hole runs a **local recursive resolver** on the same host, making it: + +* The only system allowed to query root servers +* The only system allowed outbound DNS +* The enforcement point for DNS-based policy + +### Firewall Enforcement + +* All DNS (TCP/UDP 53) is blocked except: + + * Clients → Pi-hole + * Pi-hole → Internet (root servers) +* DoH and DoT from IoT networks are explicitly blocked + +This guarantees: + +* No DNS bypass +* No vendor hardcoded resolvers +* No split-brain resolution + +--- + +## Home Assistant Trust Model + +Home Assistant is treated as a **high-trust internal controller**: + +* Not directly exposed to the Internet +* Accessed externally only via **Cloudflare Tunnel** +* End-to-end TLS from client → Cloudflare → tunnel → reverse proxy → HA + +IoT devices **cannot initiate arbitrary connections** back to HA. + +--- + +## IoT Control & Discovery + +### mDNS + +mDNS is required for: + +* Matter +* HomeKit +* ESP-based devices +* Vendor discovery protocols + +Instead of flooding all VLANs: + +* HA → IoT mDNS is explicitly allowed +* IoT → HA mDNS is explicitly allowed +* No other multicast is permitted + +### TCP / UDP Control + +IoT devices are controlled through **explicit port allowlists**: + +* Matter +* TP-Link Kasa +* Sonos +* Wiz bulbs +* ESPHome / Tasmota / WLED + +Ports are grouped by **TCP vs UDP** and allowed **only from HA**. + +--- + +## Firewall Ruleset + +### LAN_IN Rules (Order Matters) + +1. Allow Established and Related +2. Allow IoT → Pi-hole DNS +3. Allow HA → IoT HTTP/S (TCP 80, 443) +4. Allow HA → IoT mDNS (UDP 5353) +5. Allow IoT → HA mDNS (UDP 5353) +6. Allow HA → IoT TCP (Matter / vendor-specific ports) +7. Allow HA → IoT UDP (Matter / vendor-specific ports) +8. Block IoT → Public DNS +9. Block IoT → DoH / DoT (Work in Progress) +10. Block All External DNS (except Pi-hole) +11. Block All Inter-VLAN Traffic (Default Deny) + +### LAN_LOCAL Rules + +* Block gateway ICMP to other VLAN gateways + +--- + +## Maintenance Access Model + +Direct device management (e.g. Tasmota, WLED web UI) is **intentionally disabled by default**. + +Two rules exist but remain disabled: + +* Admin PC → IoT subnet (HTTP) +* Admin PC → IoT subnet (mDNS) + +These rules are enabled **only during maintenance windows** and disabled immediately after. + +Most firmware updates and configuration changes are performed via Home Assistant. + +--- + +## Security Analysis + +### What Is Allowed + +* HA can fully control IoT devices +* IoT devices can only talk to Pi-hole and HA (selectively) +* Admin access to IoT is disabled by default + +### What Is Prevented + +* IoT lateral movement +* DNS exfiltration +* Vendor cloud bypass +* Accidental trust expansion +* Network discovery across VLANs + +### Accepted Risk + +If Home Assistant is compromised, IoT control is possible. + +This is a **conscious trust decision**, mitigated by: + +* No direct exposure +* Cloudflare Tunnel +* TLS everywhere +* Minimal inbound paths + +--- + +## Matter, HomeKit, and Vendor Port Appendix + +> **Note:** Ports listed here are based on observed behavior and specifications. Always validate in your environment. + +### Common Protocols (All Vendors) + +| Protocol | Transport | Ports | Notes | +| -------- | --------- | ----- | --------------------------------------------- | +| mDNS | UDP | 5353 | Required for discovery (Matter, HomeKit, ESP) | +| HTTP | TCP | 80 | Local device APIs, some Matter/Wiz devices | +| HTTPS | TCP | 443 | Secure local APIs | + +--- + +### Matter (CSA Specification) + +| Purpose | Transport | Ports | +| -------------- | --------- | ----- | +| Matter Control | TCP | 5540 | +| Matter UDP | UDP | 5540 | +| Discovery | UDP | 5353 | + +--- + +### Apple HomeKit + +| Purpose | Transport | Ports | +| ----------------- | --------- | --------------------- | +| Pairing & Control | TCP | 80, 443 | +| Accessory Control | TCP | 51826–51850 (dynamic) | +| Discovery | UDP | 5353 | + +--- + +### TP-Link Kasa + +| Purpose | Transport | Ports | +| ------------- | --------- | ----- | +| Local Control | TCP | 9999 | +| Discovery | UDP | 9999 | + +--- + +### Sonos + +| Purpose | Transport | Ports | +| --------- | --------- | ---------- | +| Control | TCP | 1400, 1443 | +| Discovery | UDP | 1900, 5353 | + +--- + +### ESPHome / Tasmota / WLED + +| Purpose | Transport | Ports | +| --------- | --------- | -------- | +| API / OTA | TCP | 80, 8266 | +| Discovery | UDP | 5353 | + +--- + +## Conclusion + +This architecture delivers: + +* Strong VLAN isolation +* Predictable behavior +* Vendor-agnostic IoT support +* Operational sanity + +It is **secure by default**, flexible when needed, and fully auditable. + +This is how zero-trust networking principles can be **practically applied** to a real smart home. + +--- + +*If you’re building something similar, adapt the port lists — not the trust model.* diff --git a/_drafts/Firewall Rules.md b/_drafts/Firewall Rules.md new file mode 100644 index 0000000..9299c1d --- /dev/null +++ b/_drafts/Firewall Rules.md @@ -0,0 +1,47 @@ +Firewall Rules +You assume role of IT ecurity expert who specializs on building corporate network security. I'm building firewall rules from scratch. The network is segmented and have multiple vlans. + +vLAN Topology: +Name | vlan# | Notes +Default | vlan1 | Trusted core Network +Iot Network | vlan10 | IoT devices with internet access +Guest Network | vlan20 +IoT No Internet | vlan40 +proxmox-mgmt | vlan90 +proxmox-cluster | vlan99 +DMZ | vlan30 | Isolated vlan just to host cloudflare tunnel + +Default network contains NAS, Homeassistant, DNS Hosts, Docker Hosts, Personal devices + +Rules to be enforced +Block access to all known DOH and DOT hosts +Allow Proxmox cluster Vlan 90 to Synology NAS NFS protocol +Allow tunnel host to reverse proxy +Allow sonos to homeassistant +block direct access to external DNS +block other gateway except network +Block all intervlan communication + +Constrains +Only allow IPv4 +Block all IPv6 + + +network object lists +Name | Type +mDNS | Port +HomeAssistant | IP +MQTT Ports | Ports +DNS | Port +DNS Hosts | IP +Sonos Devices | IP +Sonos Ports | Ports +Admin-PC | IP +Proxmox Ports | ports +HTTP | Ports +Tunnel host | IP +Reverse Proxy | IP + +Give me clear conscise and meaningful firewall rules. Suggest any additional rules which I may missed. + + diff --git a/_includes/analytics-providers/custom.html b/_includes/analytics-providers/custom.html deleted file mode 100644 index c34b97a..0000000 --- a/_includes/analytics-providers/custom.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/_includes/analytics-providers/google-gtag.html b/_includes/analytics-providers/google-gtag.html deleted file mode 100644 index 16d0cf1..0000000 --- a/_includes/analytics-providers/google-gtag.html +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/_includes/analytics-providers/google-universal.html b/_includes/analytics-providers/google-universal.html deleted file mode 100644 index 68c2674..0000000 --- a/_includes/analytics-providers/google-universal.html +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/_includes/analytics-providers/google.html b/_includes/analytics-providers/google.html deleted file mode 100644 index c5742b9..0000000 --- a/_includes/analytics-providers/google.html +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/_includes/analytics.html b/_includes/analytics.html deleted file mode 100644 index 371469f..0000000 --- a/_includes/analytics.html +++ /dev/null @@ -1,14 +0,0 @@ -{% if jekyll.environment == 'production' and site.analytics.provider and page.analytics != false %} - -{% case site.analytics.provider %} -{% when "google" %} - {% include /analytics-providers/google.html %} -{% when "google-universal" %} - {% include /analytics-providers/google-universal.html %} -{% when "google-gtag" %} - {% include /analytics-providers/google-gtag.html %} -{% when "custom" %} - {% include /analytics-providers/custom.html %} -{% endcase %} - -{% endif %} \ No newline at end of file diff --git a/_includes/archive-single.html b/_includes/archive-single.html deleted file mode 100644 index 6817480..0000000 --- a/_includes/archive-single.html +++ /dev/null @@ -1,30 +0,0 @@ -{% if post.header.teaser %} - {% capture teaser %}{{ post.header.teaser }}{% endcapture %} -{% else %} - {% assign teaser = site.teaser %} -{% endif %} - -{% if post.id %} - {% assign title = post.title | markdownify | remove: "

" | remove: "

" %} -{% else %} - {% assign title = post.title %} -{% endif %} - -
-
- {% if include.type == "grid" and teaser %} -
- -
- {% endif %} -

- {% if post.link %} - {{ title }} Permalink - {% else %} - {{ title }} - {% endif %} -

- {% include page__meta.html type=include.type %} - {% if post.excerpt %}

{{ post.excerpt | markdownify | strip_html | truncate: 160 }}

{% endif %} -
-
diff --git a/_includes/author-profile-custom-links.html b/_includes/author-profile-custom-links.html deleted file mode 100644 index b89ffcb..0000000 --- a/_includes/author-profile-custom-links.html +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/_includes/author-profile.html b/_includes/author-profile.html deleted file mode 100644 index d384ee7..0000000 --- a/_includes/author-profile.html +++ /dev/null @@ -1,252 +0,0 @@ -{% assign author = page.author | default: page.authors[0] | default: site.author %} -{% assign author = site.data.authors[author] | default: author %} - -
- - {% if author.avatar %} -
- {% if author.home %} - - {{ author.name }} - - {% else %} - {{ author.name }} - {% endif %} -
- {% endif %} - -
- {% if author.home %} -

{{ author.name }}

- {% else %} -

{{ author.name }}

- {% endif %} - {% if author.bio %} -
- {{ author.bio | markdownify }} -
- {% endif %} -
- -
- - -
-
diff --git a/_includes/breadcrumbs.html b/_includes/breadcrumbs.html deleted file mode 100644 index cba3d41..0000000 --- a/_includes/breadcrumbs.html +++ /dev/null @@ -1,39 +0,0 @@ -{% case site.category_archive.type %} - {% when "liquid" %} - {% assign path_type = "#" %} - {% when "jekyll-archives" %} - {% assign path_type = nil %} -{% endcase %} - -{% if page.collection != 'posts' %} - {% assign path_type = nil %} - {% assign crumb_path = '/' %} -{% else %} - {% assign crumb_path = site.category_archive.path %} -{% endif %} - - diff --git a/_includes/browser-upgrade.html b/_includes/browser-upgrade.html deleted file mode 100644 index ec6ad0a..0000000 --- a/_includes/browser-upgrade.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_includes/category-list.html b/_includes/category-list.html deleted file mode 100644 index d684a28..0000000 --- a/_includes/category-list.html +++ /dev/null @@ -1,26 +0,0 @@ -{% case site.category_archive.type %} - {% when "liquid" %} - {% assign path_type = "#" %} - {% when "jekyll-archives" %} - {% assign path_type = nil %} -{% endcase %} - -{% if site.category_archive.path %} - {% comment %} - - - {% endcomment %} - {% capture page_categories %}{% for category in page.categories %}{{ category | downcase }}|{{ category }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %} - {% assign category_hashes = page_categories | split: ',' | sort %} - -

- {{ site.data.ui-text[site.locale].categories_label | default: "Categories:" }} - - {% for hash in category_hashes %} - {% assign keyValue = hash | split: '|' %} - {% capture category_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %} - {% unless forloop.last %}, {% endunless %} - {% endfor %} - -

-{% endif %} \ No newline at end of file diff --git a/_includes/comment.html b/_includes/comment.html deleted file mode 100644 index 2e3013e..0000000 --- a/_includes/comment.html +++ /dev/null @@ -1,22 +0,0 @@ - diff --git a/_includes/comments-providers/custom.html b/_includes/comments-providers/custom.html deleted file mode 100644 index 9099369..0000000 --- a/_includes/comments-providers/custom.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/_includes/comments-providers/custom_scripts.html b/_includes/comments-providers/custom_scripts.html deleted file mode 100644 index 6947946..0000000 --- a/_includes/comments-providers/custom_scripts.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/_includes/comments-providers/discourse.html b/_includes/comments-providers/discourse.html deleted file mode 100644 index aca62cc..0000000 --- a/_includes/comments-providers/discourse.html +++ /dev/null @@ -1,13 +0,0 @@ -{% if site.comments.discourse.server %} -{% capture canonical %}{% if site.permalink contains '.html' %}{{ page.url | absolute_url }}{% else %}{{ page.url | absolute_url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %} - - -{% endif %} diff --git a/_includes/comments-providers/disqus.html b/_includes/comments-providers/disqus.html deleted file mode 100644 index 16a6027..0000000 --- a/_includes/comments-providers/disqus.html +++ /dev/null @@ -1,15 +0,0 @@ -{% if site.comments.disqus.shortname %} - - -{% endif %} diff --git a/_includes/comments-providers/facebook.html b/_includes/comments-providers/facebook.html deleted file mode 100644 index 009dc1c..0000000 --- a/_includes/comments-providers/facebook.html +++ /dev/null @@ -1,8 +0,0 @@ -
- \ No newline at end of file diff --git a/_includes/comments-providers/scripts.html b/_includes/comments-providers/scripts.html deleted file mode 100644 index c550618..0000000 --- a/_includes/comments-providers/scripts.html +++ /dev/null @@ -1,18 +0,0 @@ -{% if site.comments.provider and page.comments %} -{% case site.comments.provider %} - {% when "disqus" %} - {% include /comments-providers/disqus.html %} - {% when "discourse" %} - {% include /comments-providers/discourse.html %} - {% when "facebook" %} - {% include /comments-providers/facebook.html %} - {% when "staticman" %} - {% include /comments-providers/staticman.html %} - {% when "staticman_v2" %} - {% include /comments-providers/staticman_v2.html %} - {% when "utterances" %} - {% include /comments-providers/utterances.html %} - {% when "custom" %} - {% include /comments-providers/custom_scripts.html %} -{% endcase %} -{% endif %} \ No newline at end of file diff --git a/_includes/comments-providers/staticman.html b/_includes/comments-providers/staticman.html deleted file mode 100644 index ae3991d..0000000 --- a/_includes/comments-providers/staticman.html +++ /dev/null @@ -1,40 +0,0 @@ -{% if site.repository and site.staticman.branch %} - -{% endif %} diff --git a/_includes/comments-providers/staticman_v2.html b/_includes/comments-providers/staticman_v2.html deleted file mode 100644 index 3d8ba11..0000000 --- a/_includes/comments-providers/staticman_v2.html +++ /dev/null @@ -1,40 +0,0 @@ -{% if site.repository and site.comments.staticman.branch %} - -{% endif %} diff --git a/_includes/comments-providers/utterances.html b/_includes/comments-providers/utterances.html deleted file mode 100644 index 129ab77..0000000 --- a/_includes/comments-providers/utterances.html +++ /dev/null @@ -1,20 +0,0 @@ - diff --git a/_includes/comments.html b/_includes/comments.html deleted file mode 100644 index dbb90d1..0000000 --- a/_includes/comments.html +++ /dev/null @@ -1,159 +0,0 @@ -
- {% capture comments_label %}{{ site.data.ui-text[site.locale].comments_label | default: "Comments" }}{% endcapture %} - {% case site.comments.provider %} - {% when "discourse" %} -

{{ comments_label }}

-
- {% when "disqus" %} -

{{ comments_label }}

-
- {% when "facebook" %} -

{{ comments_label }}

-
- {% when "staticman_v2" %} -
- {% if site.repository and site.comments.staticman.branch %} - -
- {% if site.data.comments[page.slug] %} -

{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}

- {% assign comments = site.data.comments[page.slug] | sort %} - - {% for comment in comments %} - {% assign email = comment[1].email %} - {% assign name = comment[1].name %} - {% assign url = comment[1].url %} - {% assign date = comment[1].date %} - {% assign message = comment[1].message %} - {% include comment.html index=forloop.index email=email name=name url=url date=date message=message %} - {% endfor %} - {% endif %} -
- - - -
-

{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}

-

{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} *

-
-
- - {{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }} -
- -
- - - -
-
- - -
-
- - -
-
- - -
- - - - - {% if site.reCaptcha.siteKey %} -
-
-
- {% endif %} -
- -
-
-
- - {% if site.reCaptcha.siteKey %}{% endif %} - {% endif %} -
- {% when "staticman" %} -
- {% if site.repository and site.staticman.branch %} - -
- {% if site.data.comments[page.slug] %} -

{{ site.data.ui-text[site.locale].comments_title | default: "Comments" }}

- {% assign comments = site.data.comments[page.slug] | sort %} - - {% for comment in comments %} - {% assign email = comment[1].email %} - {% assign name = comment[1].name %} - {% assign url = comment[1].url %} - {% assign date = comment[1].date %} - {% assign message = comment[1].message %} - {% include comment.html index=forloop.index email=email name=name url=url date=date message=message %} - {% endfor %} - {% endif %} -
- - - -
-

{{ site.data.ui-text[site.locale].comments_label | default: "Leave a Comment" }}

-

{{ site.data.ui-text[site.locale].comment_form_info | default: "Your email address will not be published. Required fields are marked" }} *

-
-
- - {{ site.data.ui-text[site.locale].loading_label | default: "Loading..." }} -
- -
- - - -
-
- - -
-
- - -
-
- - -
- - - - -
- -
-
-
- - {% endif %} -
- {% when "utterances" %} -

{{ comments_label }}

-
- {% when "custom" %} - {% include /comments-providers/custom.html %} - {% endcase %} -
diff --git a/_includes/documents-collection.html b/_includes/documents-collection.html deleted file mode 100644 index 376a509..0000000 --- a/_includes/documents-collection.html +++ /dev/null @@ -1,21 +0,0 @@ -{% assign entries = site[include.collection] %} - -{% if include.sort_by == 'title' %} - {% if include.sort_order == 'reverse' %} - {% assign entries = entries | sort: 'title' | reverse %} - {% else %} - {% assign entries = entries | sort: 'title' %} - {% endif %} -{% elsif include.sort_by == 'date' %} - {% if include.sort_order == 'reverse' %} - {% assign entries = entries | sort: 'date' | reverse %} - {% else %} - {% assign entries = entries | sort: 'date' %} - {% endif %} -{% endif %} - -{%- for post in entries -%} - {%- unless post.hidden -%} - {% include archive-single.html %} - {%- endunless -%} -{%- endfor -%} diff --git a/_includes/feature_row b/_includes/feature_row deleted file mode 100644 index 03f09c1..0000000 --- a/_includes/feature_row +++ /dev/null @@ -1,41 +0,0 @@ -{% if include.id %} - {% assign feature_row = page[include.id] %} -{% else %} - {% assign feature_row = page.feature_row %} -{% endif %} - -
- - {% for f in feature_row %} -
-
- {% if f.image_path %} -
- {% if f.alt %}{{ f.alt }}{% endif %} - {% if f.image_caption %} - {{ f.image_caption | markdownify | remove: "

" | remove: "

" }}
- {% endif %} -
- {% endif %} - -
- {% if f.title %} -

{{ f.title }}

- {% endif %} - - {% if f.excerpt %} -
- {{ f.excerpt | markdownify }} -
- {% endif %} - - {% if f.url %} -

{{ f.btn_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

- {% endif %} -
-
-
- {% endfor %} - -
diff --git a/_includes/figure b/_includes/figure deleted file mode 100644 index dacc668..0000000 --- a/_includes/figure +++ /dev/null @@ -1,9 +0,0 @@ -
- {% if include.alt %}{{ include.alt }}{% endif %} - {%- if include.caption -%} -
- {{ include.caption | markdownify | remove: "

" | remove: "

" }} -
- {%- endif -%} -
diff --git a/_includes/footer.html b/_includes/footer.html deleted file mode 100644 index 77a575f..0000000 --- a/_includes/footer.html +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/_includes/footer/custom.html b/_includes/footer/custom.html deleted file mode 100644 index d512599..0000000 --- a/_includes/footer/custom.html +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/_includes/gallery b/_includes/gallery deleted file mode 100644 index 71a9e1e..0000000 --- a/_includes/gallery +++ /dev/null @@ -1,35 +0,0 @@ -{% if include.id %} - {% assign gallery = page[include.id] %} -{% else %} - {% assign gallery = page.gallery %} -{% endif %} - -{% if include.layout %} - {% assign gallery_layout = include.layout %} -{% else %} - {% if gallery.size == 2 %} - {% assign gallery_layout = 'half' %} - {% elsif gallery.size >= 3 %} - {% assign gallery_layout = 'third' %} - {% else %} - {% assign gallery_layout = '' %} - {% endif %} -{% endif %} - - diff --git a/_includes/group-by-array b/_includes/group-by-array deleted file mode 100644 index 708de41..0000000 --- a/_includes/group-by-array +++ /dev/null @@ -1,47 +0,0 @@ - - - -{% assign __empty_array = '' | split: ',' %} -{% assign group_names = __empty_array %} -{% assign group_items = __empty_array %} - - -{% assign __names = include.collection | map: include.field %} - - -{% assign __names = __names | join: ',' | join: ',' | split: ',' %} - - -{% assign __names = __names | sort %} -{% for name in __names %} - - -{% unless name == previous %} - - -{% assign group_names = group_names | push: name %} -{% endunless %} - -{% assign previous = name %} -{% endfor %} - - - -{% for name in group_names %} - - -{% assign __item = __empty_array %} -{% for __element in include.collection %} -{% if __element[include.field] contains name %} -{% assign __item = __item | push: __element %} -{% endif %} -{% endfor %} - - -{% assign group_items = group_items | push: __item %} -{% endfor %} \ No newline at end of file diff --git a/_includes/head.html b/_includes/head.html deleted file mode 100644 index 3b99471..0000000 --- a/_includes/head.html +++ /dev/null @@ -1,37 +0,0 @@ - - -{% include seo.html %} - - - - - - - - - - - - - - -{% if site.head_scripts %} - {% for script in site.head_scripts %} - - {% endfor %} -{% endif %} diff --git a/_includes/head/custom.html b/_includes/head/custom.html deleted file mode 100644 index 978d84f..0000000 --- a/_includes/head/custom.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/_includes/masthead.html b/_includes/masthead.html deleted file mode 100644 index 47cce0a..0000000 --- a/_includes/masthead.html +++ /dev/null @@ -1,37 +0,0 @@ -{% capture logo_path %}{{ site.logo }}{% endcapture %} - -
-
-
- -
-
-
diff --git a/_includes/nav_list b/_includes/nav_list deleted file mode 100644 index a035a5b..0000000 --- a/_includes/nav_list +++ /dev/null @@ -1,26 +0,0 @@ -{% assign navigation = site.data.navigation[include.nav] %} - - diff --git a/_includes/page__date.html b/_includes/page__date.html deleted file mode 100644 index e663f9b..0000000 --- a/_includes/page__date.html +++ /dev/null @@ -1,5 +0,0 @@ -{% if page.last_modified_at %} -

{{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}

-{% elsif page.date %} -

{{ site.data.ui-text[site.locale].date_label | default: "Updated:" }}

-{% endif %} diff --git a/_includes/page__hero.html b/_includes/page__hero.html deleted file mode 100644 index 3f55aaa..0000000 --- a/_includes/page__hero.html +++ /dev/null @@ -1,51 +0,0 @@ -{% capture overlay_img_path %}{{ page.header.overlay_image | relative_url }}{% endcapture %} - -{% if page.header.overlay_filter contains "rgba" %} - {% capture overlay_filter %}{{ page.header.overlay_filter }}{% endcapture %} -{% elsif page.header.overlay_filter %} - {% capture overlay_filter %}rgba(0, 0, 0, {{ page.header.overlay_filter }}){% endcapture %} -{% endif %} - -{% if page.header.image_description %} - {% assign image_description = page.header.image_description %} -{% else %} - {% assign image_description = page.title %} -{% endif %} - -{% assign image_description = image_description | markdownify | strip_html | strip_newlines | escape_once %} - -
- {% if page.header.overlay_color or page.header.overlay_image %} -
-

- {% if paginator and site.paginate_show_page_num %} - {{ site.title }}{% unless paginator.page == 1 %} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %} - {% else %} - {{ page.title | default: site.title | markdownify | remove: "

" | remove: "

" }} - {% endif %} -

- {% if page.tagline %} -

{{ page.tagline | markdownify | remove: "

" | remove: "

" }}

- {% elsif page.header.show_overlay_excerpt != false and page.excerpt %} -

{{ page.excerpt | markdownify | remove: "

" | remove: "

" }}

- {% endif %} - {% include page__meta.html %} - {% if page.header.cta_url %} -

{{ page.header.cta_label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }}

- {% endif %} - {% if page.header.actions %} -

- {% for action in page.header.actions %} - {{ action.label | default: site.data.ui-text[site.locale].more_label | default: "Learn More" }} - {% endfor %} - {% endif %} -

- {% else %} - {{ image_description }} - {% endif %} - {% if page.header.caption %} - {{ page.header.caption | markdownify | remove: "

" | remove: "

" }}
- {% endif %} -
diff --git a/_includes/page__hero_video.html b/_includes/page__hero_video.html deleted file mode 100644 index a313a23..0000000 --- a/_includes/page__hero_video.html +++ /dev/null @@ -1,2 +0,0 @@ -{% assign video = page.header.video %} -{% include video id=video.id provider=video.provider danmaku=video.danmaku %} diff --git a/_includes/page__meta.html b/_includes/page__meta.html deleted file mode 100644 index 1afc3d8..0000000 --- a/_includes/page__meta.html +++ /dev/null @@ -1,30 +0,0 @@ -{% assign document = post | default: page %} -{% if document.read_time or document.show_date %} -

- {% if document.show_date and document.date %} - {% assign date = document.date %} - - - - - {% endif %} - - {% if document.read_time and document.show_date %}{% endif %} - - {% if document.read_time %} - {% assign words_per_minute = document.words_per_minute | default: site.words_per_minute | default: 200 %} - {% assign words = document.content | strip_html | number_of_words %} - - - - {% if words < words_per_minute %} - {{ site.data.ui-text[site.locale].less_than | default: "less than" }} 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} - {% elsif words == words_per_minute %} - 1 {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} - {% else %} - {{ words | divided_by: words_per_minute }} {{ site.data.ui-text[site.locale].minute_read | default: "minute read" }} - {% endif %} - - {% endif %} -

-{% endif %} diff --git a/_includes/page__taxonomy.html b/_includes/page__taxonomy.html deleted file mode 100644 index 75c76c8..0000000 --- a/_includes/page__taxonomy.html +++ /dev/null @@ -1,7 +0,0 @@ -{% if site.tag_archive.type and page.tags[0] %} - {% include tag-list.html %} -{% endif %} - -{% if site.category_archive.type and page.categories[0] %} - {% include category-list.html %} -{% endif %} \ No newline at end of file diff --git a/_includes/paginator.html b/_includes/paginator.html deleted file mode 100644 index bffa079..0000000 --- a/_includes/paginator.html +++ /dev/null @@ -1,69 +0,0 @@ -{% if paginator.total_pages > 1 %} - -{% endif %} diff --git a/_includes/post_pagination.html b/_includes/post_pagination.html deleted file mode 100644 index c09dd29..0000000 --- a/_includes/post_pagination.html +++ /dev/null @@ -1,14 +0,0 @@ -{% if page.previous or page.next %} - -{% endif %} diff --git a/_includes/posts-category.html b/_includes/posts-category.html deleted file mode 100644 index b364f30..0000000 --- a/_includes/posts-category.html +++ /dev/null @@ -1,5 +0,0 @@ -{%- for post in site.categories[include.taxonomy] -%} - {%- unless post.hidden -%} - {% include archive-single.html %} - {%- endunless -%} -{%- endfor -%} diff --git a/_includes/posts-tag.html b/_includes/posts-tag.html deleted file mode 100644 index 46fade0..0000000 --- a/_includes/posts-tag.html +++ /dev/null @@ -1,5 +0,0 @@ -{%- for post in site.tags[include.taxonomy] -%} - {%- unless post.hidden -%} - {% include archive-single.html %} - {%- endunless -%} -{%- endfor -%} diff --git a/_includes/scripts.html b/_includes/scripts.html deleted file mode 100644 index bbdaddf..0000000 --- a/_includes/scripts.html +++ /dev/null @@ -1,28 +0,0 @@ -{% if site.footer_scripts %} - {% for script in site.footer_scripts %} - - {% endfor %} -{% else %} - -{% endif %} - -{% if site.search == true or page.layout == "search" %} - {%- assign search_provider = site.search_provider | default: "lunr" -%} - {%- case search_provider -%} - {%- when "lunr" -%} - {% include_cached search/lunr-search-scripts.html %} - {%- when "google" -%} - {% include_cached search/google-search-scripts.html %} - {%- when "algolia" -%} - {% include_cached search/algolia-search-scripts.html %} - {%- endcase -%} -{% endif %} - -{% include analytics.html %} -{% include /comments-providers/scripts.html %} - -{% if site.after_footer_scripts %} - {% for script in site.after_footer_scripts %} - - {% endfor %} -{% endif %} diff --git a/_includes/search/algolia-search-scripts.html b/_includes/search/algolia-search-scripts.html deleted file mode 100644 index 2728d29..0000000 --- a/_includes/search/algolia-search-scripts.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - diff --git a/_includes/search/google-search-scripts.html b/_includes/search/google-search-scripts.html deleted file mode 100644 index 4af7423..0000000 --- a/_includes/search/google-search-scripts.html +++ /dev/null @@ -1,30 +0,0 @@ - \ No newline at end of file diff --git a/_includes/search/lunr-search-scripts.html b/_includes/search/lunr-search-scripts.html deleted file mode 100644 index 574c390..0000000 --- a/_includes/search/lunr-search-scripts.html +++ /dev/null @@ -1,10 +0,0 @@ -{% assign lang = site.locale | slice: 0,2 | default: "en" %} -{% case lang %} -{% when "gr" %} - {% assign lang = "gr" %} -{% else %} - {% assign lang = "en" %} -{% endcase %} - - - \ No newline at end of file diff --git a/_includes/search/search_form.html b/_includes/search/search_form.html deleted file mode 100644 index c346379..0000000 --- a/_includes/search/search_form.html +++ /dev/null @@ -1,26 +0,0 @@ -
- {%- assign search_provider = site.search_provider | default: "lunr" -%} - {%- case search_provider -%} - {%- when "lunr" -%} -
- - -
-
- {%- when "google" -%} -
- - -
-
- -
- {%- when "algolia" -%} - -
- {%- endcase -%} -
diff --git a/_includes/seo.html b/_includes/seo.html deleted file mode 100644 index 7df1253..0000000 --- a/_includes/seo.html +++ /dev/null @@ -1,155 +0,0 @@ - -{%- if site.url -%} - {%- assign seo_url = site.url | append: site.baseurl -%} -{%- endif -%} -{%- assign seo_url = seo_url | default: site.github.url -%} - -{% assign title_separator = site.title_separator | default: '-' | replace: '|', '|' %} - -{%- if page.title -%} - {%- assign seo_title = page.title | append: " " | append: title_separator | append: " " | append: site.title -%} -{%- endif -%} - -{%- if seo_title -%} - {%- assign seo_title = seo_title | markdownify | strip_html | strip_newlines | escape_once -%} -{%- endif -%} - -{% if page.canonical_url %} - {%- assign canonical_url = page.canonical_url %} -{% else %} - {%- assign canonical_url = page.url | replace: "index.html", "" | absolute_url %} -{% endif %} - -{%- assign seo_description = page.description | default: page.excerpt | default: site.description -%} -{%- if seo_description -%} - {%- assign seo_description = seo_description | markdownify | strip_html | newline_to_br | strip_newlines | replace: '
', ' ' | escape_once | strip -%} -{%- endif -%} - -{%- assign author = page.author | default: page.authors[0] | default: site.author -%} -{%- assign author = site.data.authors[author] | default: author -%} - -{%- if author.twitter -%} - {%- assign author_twitter = author.twitter | replace: "@", "" -%} -{%- endif -%} - -{%- assign page_large_image = page.header.og_image | default: page.header.overlay_image | default: page.header.image | absolute_url -%} -{%- assign page_large_image = page_large_image | escape -%} - -{%- assign page_teaser_image = page.header.teaser | default: site.og_image | absolute_url -%} -{%- assign page_teaser_image = page_teaser_image | escape -%} - -{%- assign site_og_image = site.og_image | absolute_url -%} -{%- assign site_og_image = site_og_image | escape -%} - -{%- if page.date -%} - {%- assign og_type = "article" -%} -{%- else -%} - {%- assign og_type = "website" -%} -{%- endif -%} - -{{ seo_title | default: site.title }}{% if paginator %}{% unless paginator.page == 1 %} {{ title_separator }} {{ site.data.ui-text[site.locale].page | default: "Page" }} {{ paginator.page }}{% endunless %}{% endif %} - - -{% if author.name %} - - {% if og_type == "article" %} - - {% endif %} -{% endif %} - - - - - - - -{% if seo_description %} - -{% endif %} - -{% if page_large_image %} - -{% elsif page_teaser_image %} - -{% endif %} - -{% if site.twitter.username %} - - - - - - {% if page_large_image %} - - - {% else %} - - {% if page_teaser_image %} - - {% endif %} - {% endif %} - - {% if author_twitter %} - - {% endif %} -{% endif %} - -{% if page.date %} - -{% endif %} - -{% if og_type == "article" and page.last_modified_at %} - -{% endif %} - -{% if site.facebook %} - {% if site.facebook.publisher %} - - {% endif %} - - {% if site.facebook.app_id %} - - {% endif %} -{% endif %} - - - -{% if paginator.previous_page %} - -{% endif %} -{% if paginator.next_page %} - -{% endif %} - - - -{% if site.google_site_verification %} - -{% endif %} -{% if site.bing_site_verification %} - -{% endif %} -{% if site.alexa_site_verification %} - -{% endif %} -{% if site.yandex_site_verification %} - -{% endif %} -{% if site.naver_site_verification %} - -{% endif %} - diff --git a/_includes/sidebar.html b/_includes/sidebar.html deleted file mode 100644 index a4ca1ca..0000000 --- a/_includes/sidebar.html +++ /dev/null @@ -1,19 +0,0 @@ -{% if page.author_profile or layout.author_profile or page.sidebar %} - -{% endif %} diff --git a/_includes/skip-links.html b/_includes/skip-links.html deleted file mode 100644 index 2cd9f17..0000000 --- a/_includes/skip-links.html +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/_includes/social-share.html b/_includes/social-share.html deleted file mode 100644 index 0b37798..0000000 --- a/_includes/social-share.html +++ /dev/null @@ -1,11 +0,0 @@ - diff --git a/_includes/tag-list.html b/_includes/tag-list.html deleted file mode 100644 index e0d02bf..0000000 --- a/_includes/tag-list.html +++ /dev/null @@ -1,26 +0,0 @@ -{% case site.tag_archive.type %} - {% when "liquid" %} - {% assign path_type = "#" %} - {% when "jekyll-archives" %} - {% assign path_type = nil %} -{% endcase %} - -{% if site.tag_archive.path %} - {% comment %} - - - {% endcomment %} - {% capture page_tags %}{% for tag in page.tags %}{{ tag | downcase }}|{{ tag }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %} - {% assign tag_hashes = page_tags | split: ',' | sort %} - -

- {{ site.data.ui-text[site.locale].tags_label | default: "Tags:" }} - - {% for hash in tag_hashes %} - {% assign keyValue = hash | split: '|' %} - {% capture tag_word %}{{ keyValue[1] | strip_newlines }}{% endcapture %} - {% unless forloop.last %}, {% endunless %} - {% endfor %} - -

-{% endif %} \ No newline at end of file diff --git a/_includes/toc b/_includes/toc deleted file mode 100644 index 6423ccd..0000000 --- a/_includes/toc +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/_includes/toc.html b/_includes/toc.html deleted file mode 100644 index 8c71007..0000000 --- a/_includes/toc.html +++ /dev/null @@ -1,182 +0,0 @@ -{% capture tocWorkspace %} - {% comment %} - Copyright (c) 2017 Vladimir "allejo" Jimenez - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - {% endcomment %} - {% comment %} - Version 1.1.0 - https://github.com/allejo/jekyll-toc - - "...like all things liquid - where there's a will, and ~36 hours to spare, there's usually a/some way" ~jaybe - - Usage: - {% include toc.html html=content sanitize=true class="inline_toc" id="my_toc" h_min=2 h_max=3 %} - - Parameters: - * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll - - Optional Parameters: - * sanitize (bool) : false - when set to true, the headers will be stripped of any HTML in the TOC - * class (string) : '' - a CSS class assigned to the TOC - * id (string) : '' - an ID to assigned to the TOC - * h_min (int) : 1 - the minimum TOC header level to use; any header lower than this value will be ignored - * h_max (int) : 6 - the maximum TOC header level to use; any header greater than this value will be ignored - * ordered (bool) : false - when set to true, an ordered list will be outputted instead of an unordered list - * item_class (string) : '' - add custom class(es) for each list item; has support for '%level%' placeholder, which is the current heading level - * submenu_class (string) : '' - add custom class(es) for each child group of headings; has support for '%level%' placeholder which is the current "submenu" heading level - * base_url (string) : '' - add a base url to the TOC links for when your TOC is on another page than the actual content - * anchor_class (string) : '' - add custom class(es) for each anchor element - * skip_no_ids (bool) : false - skip headers that do not have an `id` attribute - - Output: - An ordered or unordered list representing the table of contents of a markdown block. This snippet will only - generate the table of contents and will NOT output the markdown given to it - {% endcomment %} - - {% capture newline %} - {% endcapture %} - {% assign newline = newline | rstrip %} - - {% capture deprecation_warnings %}{% endcapture %} - - {% if include.baseurl %} - {% capture deprecation_warnings %}{{ deprecation_warnings }}{{ newline }}{% endcapture %} - {% endif %} - - {% if include.skipNoIDs %} - {% capture deprecation_warnings %}{{ deprecation_warnings }}{{ newline }}{% endcapture %} - {% endif %} - - {% capture jekyll_toc %}{% endcapture %} - {% assign orderedList = include.ordered | default: false %} - {% assign baseURL = include.base_url | default: include.baseurl | default: '' %} - {% assign skipNoIDs = include.skip_no_ids | default: include.skipNoIDs | default: false %} - {% assign minHeader = include.h_min | default: 1 %} - {% assign maxHeader = include.h_max | default: 6 %} - {% assign nodes = include.html | strip | split: ' maxHeader %} - {% continue %} - {% endif %} - - {% assign _workspace = node | split: '' | first }}>{% endcapture %} - {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %} - - {% if include.item_class and include.item_class != blank %} - {% capture listItemClass %} class="{{ include.item_class | replace: '%level%', currLevel | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% if include.submenu_class and include.submenu_class != blank %} - {% assign subMenuLevel = currLevel | minus: 1 %} - {% capture subMenuClass %} class="{{ include.submenu_class | replace: '%level%', subMenuLevel | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% capture anchorBody %}{% if include.sanitize %}{{ header | strip_html }}{% else %}{{ header }}{% endif %}{% endcapture %} - - {% if htmlID %} - {% capture anchorAttributes %} href="{% if baseURL %}{{ baseURL }}{% endif %}#{{ htmlID }}"{% endcapture %} - - {% if include.anchor_class %} - {% capture anchorAttributes %}{{ anchorAttributes }} class="{{ include.anchor_class | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% capture listItem %}{{ anchorBody }}{% endcapture %} - {% elsif skipNoIDs == true %} - {% continue %} - {% else %} - {% capture listItem %}{{ anchorBody }}{% endcapture %} - {% endif %} - - {% if currLevel > lastLevel %} - {% capture jekyll_toc %}{{ jekyll_toc }}<{{ listModifier }}{{ subMenuClass }}>{% endcapture %} - {% elsif currLevel < lastLevel %} - {% assign repeatCount = lastLevel | minus: currLevel %} - - {% for i in (1..repeatCount) %} - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% endfor %} - - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% else %} - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% endif %} - - {% capture jekyll_toc %}{{ jekyll_toc }}{{ listItem }}{% endcapture %} - - {% assign lastLevel = currLevel %} - {% assign firstHeader = false %} - {% endfor %} - - {% assign repeatCount = minHeader | minus: 1 %} - {% assign repeatCount = lastLevel | minus: repeatCount %} - {% for i in (1..repeatCount) %} - {% capture jekyll_toc %}{{ jekyll_toc }}{% endcapture %} - {% endfor %} - - {% if jekyll_toc != '' %} - {% assign rootAttributes = '' %} - {% if include.class and include.class != blank %} - {% capture rootAttributes %} class="{{ include.class | split: '.' | join: ' ' }}"{% endcapture %} - {% endif %} - - {% if include.id and include.id != blank %} - {% capture rootAttributes %}{{ rootAttributes }} id="{{ include.id }}"{% endcapture %} - {% endif %} - - {% if rootAttributes %} - {% assign nodes = jekyll_toc | split: '>' %} - {% capture jekyll_toc %}<{{ listModifier }}{{ rootAttributes }}>{{ nodes | shift | join: '>' }}>{% endcapture %} - {% endif %} - {% endif %} -{% endcapture %}{% assign tocWorkspace = '' %}{{ deprecation_warnings }}{{ jekyll_toc }} diff --git a/_includes/video b/_includes/video deleted file mode 100644 index d653fd6..0000000 --- a/_includes/video +++ /dev/null @@ -1,24 +0,0 @@ -{% capture video_id %}{{ include.id }}{% endcapture %} -{% capture video_provider %}{{ include.provider }}{% endcapture %} -{% capture video_danmaku %}{{ include.danmaku | default: 0 }}{% endcapture %} - -{% capture video_src %} - {% case video_provider %} - {% when "vimeo" %} - https://player.vimeo.com/video/{{ video_id }}?dnt=true - {% when "youtube" %} - https://www.youtube-nocookie.com/embed/{{ video_id }} - {% when "google-drive" %} - https://drive.google.com/file/d/{{ video_id }}/preview - {% when "bilibili" %} - https://player.bilibili.com/player.html?bvid={{ video_id }}&page=1&as_wide=1&high_quality=1&danmaku={{ video_danmaku }} - {% endcase %} -{% endcapture %} -{% assign video_src = video_src | strip %} - - -{% unless video_src == "" %} -
- -
-{% endunless %} diff --git a/_layouts/archive-taxonomy.html b/_layouts/archive-taxonomy.html deleted file mode 100644 index eb62a87..0000000 --- a/_layouts/archive-taxonomy.html +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: default -author_profile: false ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% elsif page.header.video.id and page.header.video.provider %} - {% include page__hero_video.html %} -{% endif %} - -{% if page.url != "/" and site.breadcrumbs %} - {% unless paginator %} - {% include breadcrumbs.html %} - {% endunless %} -{% endif %} - -
- {% include sidebar.html %} - -
- {% unless page.header.overlay_color or page.header.overlay_image %} -

{{ page.title }}

- {% endunless %} - {% for post in page.posts %} - {% include archive-single.html %} - {% endfor %} -
-
diff --git a/_layouts/archive.html b/_layouts/archive.html deleted file mode 100644 index 08beb89..0000000 --- a/_layouts/archive.html +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: default ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% elsif page.header.video.id and page.header.video.provider %} - {% include page__hero_video.html %} -{% endif %} - -{% if page.url != "/" and site.breadcrumbs %} - {% unless paginator %} - {% include breadcrumbs.html %} - {% endunless %} -{% endif %} - -
- {% include sidebar.html %} - -
- {% unless page.header.overlay_color or page.header.overlay_image %} -

{{ page.title }}

- {% endunless %} - {{ content }} -
-
\ No newline at end of file diff --git a/_layouts/categories.html b/_layouts/categories.html deleted file mode 100644 index f5448a2..0000000 --- a/_layouts/categories.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -{% assign categories_max = 0 %} -{% for category in site.categories %} - {% if category[1].size > categories_max %} - {% assign categories_max = category[1].size %} - {% endif %} -{% endfor %} - -
    - {% for i in (1..categories_max) reversed %} - {% for category in site.categories %} - {% if category[1].size == i %} -
  • - - {{ category[0] }} {{ i }} - -
  • - {% endif %} - {% endfor %} - {% endfor %} -
- -{% assign entries_layout = page.entries_layout | default: 'list' %} -{% for i in (1..categories_max) reversed %} - {% for category in site.categories %} - {% if category[1].size == i %} -
-

{{ category[0] }}

-
- {% for post in category.last %} - {% include archive-single.html type=entries_layout %} - {% endfor %} -
- {{ site.data.ui-text[site.locale].back_to_top | default: 'Back to Top' }} ↑ -
- {% endif %} - {% endfor %} -{% endfor %} diff --git a/_layouts/category.html b/_layouts/category.html deleted file mode 100644 index b281c85..0000000 --- a/_layouts/category.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -{% assign entries_layout = page.entries_layout | default: 'list' %} -
- {% include posts-category.html taxonomy=page.taxonomy type=entries_layout %} -
diff --git a/_layouts/collection.html b/_layouts/collection.html deleted file mode 100644 index d23d0c7..0000000 --- a/_layouts/collection.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -{% assign entries_layout = page.entries_layout | default: 'list' %} -
- {% include documents-collection.html collection=page.collection sort_by=page.sort_by sort_order=page.sort_order type=entries_layout %} -
diff --git a/_layouts/compress.html b/_layouts/compress.html deleted file mode 100644 index bb34487..0000000 --- a/_layouts/compress.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -# Jekyll layout that compresses HTML -# v3.1.0 -# http://jch.penibelst.de/ -# © 2014–2015 Anatol Broder -# MIT License ---- - -{% capture _LINE_FEED %} -{% endcapture %}{% if site.compress_html.ignore.envs contains jekyll.environment or site.compress_html.ignore.envs == "all" %}{{ content }}{% else %}{% capture _content %}{{ content }}{% endcapture %}{% assign _profile = site.compress_html.profile %}{% if site.compress_html.endings == "all" %}{% assign _endings = "html head body li dt dd optgroup option colgroup caption thead tbody tfoot tr td th" | split: " " %}{% else %}{% assign _endings = site.compress_html.endings %}{% endif %}{% for _element in _endings %}{% capture _end %}{% endcapture %}{% assign _content = _content | remove: _end %}{% endfor %}{% if _profile and _endings %}{% assign _profile_endings = _content | size | plus: 1 %}{% endif %}{% for _element in site.compress_html.startings %}{% capture _start %}<{{ _element }}>{% endcapture %}{% assign _content = _content | remove: _start %}{% endfor %}{% if _profile and site.compress_html.startings %}{% assign _profile_startings = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.comments == "all" %}{% assign _comments = "" | split: " " %}{% else %}{% assign _comments = site.compress_html.comments %}{% endif %}{% if _comments.size == 2 %}{% capture _comment_befores %}.{{ _content }}{% endcapture %}{% assign _comment_befores = _comment_befores | split: _comments.first %}{% for _comment_before in _comment_befores %}{% if forloop.first %}{% continue %}{% endif %}{% capture _comment_outside %}{% if _carry %}{{ _comments.first }}{% endif %}{{ _comment_before }}{% endcapture %}{% capture _comment %}{% unless _carry %}{{ _comments.first }}{% endunless %}{{ _comment_outside | split: _comments.last | first }}{% if _comment_outside contains _comments.last %}{{ _comments.last }}{% assign _carry = false %}{% else %}{% assign _carry = true %}{% endif %}{% endcapture %}{% assign _content = _content | remove_first: _comment %}{% endfor %}{% if _profile %}{% assign _profile_comments = _content | size | plus: 1 %}{% endif %}{% endif %}{% assign _pre_befores = _content | split: "" %}{% assign _pres_after = "" %}{% if _pres.size != 0 %}{% if site.compress_html.blanklines %}{% assign _lines = _pres.last | split: _LINE_FEED %}{% capture _pres_after %}{% for _line in _lines %}{% assign _trimmed = _line | split: " " | join: " " %}{% if _trimmed != empty or forloop.last %}{% unless forloop.first %}{{ _LINE_FEED }}{% endunless %}{{ _line }}{% endif %}{% endfor %}{% endcapture %}{% else %}{% assign _pres_after = _pres.last | split: " " | join: " " %}{% endif %}{% endif %}{% capture _content %}{{ _content }}{% if _pre_before contains "" %}{% endif %}{% unless _pre_before contains "" and _pres.size == 1 %}{{ _pres_after }}{% endunless %}{% endcapture %}{% endfor %}{% if _profile %}{% assign _profile_collapse = _content | size | plus: 1 %}{% endif %}{% if site.compress_html.clippings == "all" %}{% assign _clippings = "html head title base link meta style body article section nav aside h1 h2 h3 h4 h5 h6 hgroup header footer address p hr blockquote ol ul li dl dt dd figure figcaption main div table caption colgroup col tbody thead tfoot tr td th" | split: " " %}{% else %}{% assign _clippings = site.compress_html.clippings %}{% endif %}{% for _element in _clippings %}{% assign _edges = " ;; ;" | replace: "e", _element | split: ";" %}{% assign _content = _content | replace: _edges[0], _edges[1] | replace: _edges[2], _edges[3] | replace: _edges[4], _edges[5] %}{% endfor %}{% if _profile and _clippings %}{% assign _profile_clippings = _content | size | plus: 1 %}{% endif %}{{ _content }}{% if _profile %}
Step Bytes
raw {{ content | size }}{% if _profile_endings %}
endings {{ _profile_endings }}{% endif %}{% if _profile_startings %}
startings {{ _profile_startings }}{% endif %}{% if _profile_comments %}
comments {{ _profile_comments }}{% endif %}{% if _profile_collapse %}
collapse {{ _profile_collapse }}{% endif %}{% if _profile_clippings %}
clippings {{ _profile_clippings }}{% endif %}
{% endif %}{% endif %} diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index b0bca28..0000000 --- a/_layouts/default.html +++ /dev/null @@ -1,36 +0,0 @@ ---- ---- - - - - - {% include head.html %} - {% include head/custom.html %} - - - - {% include_cached skip-links.html %} - {% include_cached browser-upgrade.html %} - {% include_cached masthead.html %} - -
- {{ content }} -
- - {% if site.search == true %} -
- {% include_cached search/search_form.html %} -
- {% endif %} - - - - {% include scripts.html %} - - - diff --git a/_layouts/home.html b/_layouts/home.html deleted file mode 100644 index 02e96eb..0000000 --- a/_layouts/home.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -

{{ site.data.ui-text[site.locale].recent_posts | default: "Recent Posts" }}

- -{% if paginator %} - {% assign posts = paginator.posts %} -{% else %} - {% assign posts = site.posts %} -{% endif %} - -{% assign entries_layout = page.entries_layout | default: 'list' %} -
- {% for post in posts %} - {% include archive-single.html type=entries_layout %} - {% endfor %} -
- -{% include paginator.html %} diff --git a/_layouts/homepage.html b/_layouts/homepage.html deleted file mode 100644 index 2b330ec..0000000 --- a/_layouts/homepage.html +++ /dev/null @@ -1,40 +0,0 @@ ---- -layout: default ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% elsif page.header.video.id and page.header.video.provider %} - {% include page__hero_video.html %} -{% endif %} - -
-
- {% if page.title %}{% endif %} - {% if page.excerpt %}{% endif %} - {% if page.date %}{% endif %} - {% if page.last_modified_at %}{% endif %} - -
- {{ content }} -
-
- - - -

{{ site.data.ui-text[site.locale].recent_posts | default: "Recent Posts" }}

- -{% if paginator %} - {% assign posts = paginator.posts %} -{% else %} - {% assign posts = site.posts %} -{% endif %} - -{% assign entries_layout = page.entries_layout | default: 'list' %} -
- {% for post in posts limit:5 %} - {% include archive-single.html type=entries_layout %} - {% endfor %} -
- -
diff --git a/_layouts/nosidebar.html b/_layouts/nosidebar.html deleted file mode 100644 index 6417efd..0000000 --- a/_layouts/nosidebar.html +++ /dev/null @@ -1,88 +0,0 @@ ---- -layout: default ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% elsif page.header.video.id and page.header.video.provider %} - {% include page__hero_video.html %} -{% endif %} - -{% if page.url != "/" and site.breadcrumbs %} - {% unless paginator %} - {% include breadcrumbs.html %} - {% endunless %} -{% endif %} - -
- -
- {% if page.title %}{% endif %} - {% if page.excerpt %}{% endif %} - {% if page.date %}{% endif %} - {% if page.last_modified_at %}{% endif %} - -
- {% unless page.header.overlay_color or page.header.overlay_image %} -
- {% if page.title %}

{{ page.title | markdownify | remove: "

" | remove: "

" }}

{% endif %} - {% include page__meta.html %} -
- {% endunless %} - -
- {% if page.toc %} - - {% endif %} - {{ content }} - {% if page.link %}{% endif %} -
- -
- {% if site.data.ui-text[site.locale].meta_label %} -

{{ site.data.ui-text[site.locale].meta_label }}

- {% endif %} - {% include page__taxonomy.html %} - {% include page__date.html %} -
- - {% if page.share %}{% include social-share.html %}{% endif %} - - {% include post_pagination.html %} -
- - {% if jekyll.environment == 'production' and site.comments.provider and page.comments %} - {% include comments.html %} - {% endif %} -
- - {% comment %}{% endcomment %} - {% if page.id and page.related and site.related_posts.size > 0 %} - - {% comment %}{% endcomment %} - {% elsif page.id and page.related %} - - {% endif %} -
diff --git a/_layouts/posts.html b/_layouts/posts.html deleted file mode 100644 index 13fc707..0000000 --- a/_layouts/posts.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -
    - {% assign postsInYear = site.posts | where_exp: "item", "item.hidden != true" | group_by_exp: 'post', 'post.date | date: "%Y"' %} - {% for year in postsInYear %} -
  • - - {{ year.name }} {{ year.items | size }} - -
  • - {% endfor %} -
- -{% assign entries_layout = page.entries_layout | default: 'list' %} -{% assign postsByYear = site.posts | where_exp: "item", "item.hidden != true" | group_by_exp: 'post', 'post.date | date: "%Y"' %} -{% for year in postsByYear %} -
-

{{ year.name }}

-
- {% for post in year.items %} - {% include archive-single.html type=entries_layout %} - {% endfor %} -
- {{ site.data.ui-text[site.locale].back_to_top | default: 'Back to Top' }} ↑ -
-{% endfor %} diff --git a/_layouts/search.html b/_layouts/search.html deleted file mode 100644 index d18f223..0000000 --- a/_layouts/search.html +++ /dev/null @@ -1,42 +0,0 @@ ---- -layout: default ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% endif %} - -{% if page.url != "/" and site.breadcrumbs %} - {% unless paginator %} - {% include breadcrumbs.html %} - {% endunless %} -{% endif %} - -
- {% include sidebar.html %} - -
- {% unless page.header.overlay_color or page.header.overlay_image %} -

{{ page.title }}

- {% endunless %} - - {{ content }} - - {%- assign search_provider = site.search_provider | default: "lunr" -%} - {%- case search_provider -%} - {%- when "lunr" -%} - -
- {%- when "google" -%} -
- -
-
- -
- {%- when "algolia" -%} - -
- {%- endcase -%} -
-
diff --git a/_layouts/single.html b/_layouts/single.html deleted file mode 100644 index 7120aba..0000000 --- a/_layouts/single.html +++ /dev/null @@ -1,89 +0,0 @@ ---- -layout: default ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% elsif page.header.video.id and page.header.video.provider %} - {% include page__hero_video.html %} -{% endif %} - -{% if page.url != "/" and site.breadcrumbs %} - {% unless paginator %} - {% include breadcrumbs.html %} - {% endunless %} -{% endif %} - -
- {% include sidebar.html %} - -
- {% if page.title %}{% endif %} - {% if page.excerpt %}{% endif %} - {% if page.date %}{% endif %} - {% if page.last_modified_at %}{% endif %} - -
- {% unless page.header.overlay_color or page.header.overlay_image %} -
- {% if page.title %}

{{ page.title | markdownify | remove: "

" | remove: "

" }}

{% endif %} - {% include page__meta.html %} -
- {% endunless %} - -
- {% if page.toc %} - - {% endif %} - {{ content }} - {% if page.link %}{% endif %} -
- -
- {% if site.data.ui-text[site.locale].meta_label %} -

{{ site.data.ui-text[site.locale].meta_label }}

- {% endif %} - {% include page__taxonomy.html %} - {% include page__date.html %} -
- - {% if page.share %}{% include social-share.html %}{% endif %} - - {% if page.paginate %}{% include post_pagination.html %}{% endif %} -
- - {% if jekyll.environment == 'production' and site.comments.provider and page.comments %} - {% include comments.html %} - {% endif %} -
- - {% comment %}{% endcomment %} - {% if page.id and page.related and site.related_posts.size > 0 %} - - {% comment %}{% endcomment %} - {% elsif page.id and page.related %} - - {% endif %} -
diff --git a/_layouts/splash.html b/_layouts/splash.html deleted file mode 100644 index 2116502..0000000 --- a/_layouts/splash.html +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: default ---- - -{% if page.header.overlay_color or page.header.overlay_image or page.header.image %} - {% include page__hero.html %} -{% elsif page.header.video.id and page.header.video.provider %} - {% include page__hero_video.html %} -{% endif %} - -
-
- {% if page.title %}{% endif %} - {% if page.excerpt %}{% endif %} - {% if page.date %}{% endif %} - {% if page.last_modified_at %}{% endif %} - -
- {{ content }} -
-
-
diff --git a/_layouts/tag.html b/_layouts/tag.html deleted file mode 100644 index 8b1c188..0000000 --- a/_layouts/tag.html +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -{% assign entries_layout = page.entries_layout | default: 'list' %} -
- {% include posts-tag.html taxonomy=page.taxonomy type=entries_layout %} -
diff --git a/_layouts/tags.html b/_layouts/tags.html deleted file mode 100644 index daa1182..0000000 --- a/_layouts/tags.html +++ /dev/null @@ -1,43 +0,0 @@ ---- -layout: archive ---- - -{{ content }} - -{% assign tags_max = 0 %} -{% for tag in site.tags %} - {% if tag[1].size > tags_max %} - {% assign tags_max = tag[1].size %} - {% endif %} -{% endfor %} - -
    - {% for i in (1..tags_max) reversed %} - {% for tag in site.tags %} - {% if tag[1].size == i %} -
  • - - {{ tag[0] }} {{ i }} - -
  • - {% endif %} - {% endfor %} - {% endfor %} -
- -{% assign entries_layout = page.entries_layout | default: 'list' %} -{% for i in (1..tags_max) reversed %} - {% for tag in site.tags %} - {% if tag[1].size == i %} -
-

{{ tag[0] }}

-
- {% for post in tag.last %} - {% include archive-single.html type=entries_layout %} - {% endfor %} -
- {{ site.data.ui-text[site.locale].back_to_top | default: 'Back to Top' }} ↑ -
- {% endif %} - {% endfor %} -{% endfor %} diff --git a/_pages/about.md b/_pages/about.md index ef5fbc5..b16db80 100644 --- a/_pages/about.md +++ b/_pages/about.md @@ -1,21 +1,33 @@ --- title: About me permalink: /about.html -#subtitle: Why you'd want to go on a date with me header: overlay_image: /assets/images/Chicago.jpg --- -![Pravesh Soni](/assets/images/pravesh.png){:width="180px" style="float:left; margin-right: 1.5em;"} My name is Pravesh Soni and I’m software professional. I got involved with computers since last two decades starting with playing games developed in BASIC. I am a tech enthusiast and I love writing code, blogging, science fiction, cartoons, music, robotics, IoT, home automation and I am a big Microsoft fan too. +![Pravesh Soni](/assets/images/pravesh.png){:width="180px" style="float:left; margin-right: 1.5em;"} -I started programming in classic asp and later switch to .net and now at present I have over two decades of application development experience in Microsoft technologies. I got involved in customized software development in my career of programming, now contributing to some open source community development. +## My Journey into Technology -If you are looking for more details to know me better, here are the links to get more details about me. +I grew up fascinated by computers specifically those used for early games. My first interaction with the computer when I got chance to play games on Spectravideo SVI-728 at my friend's house. That started my exploration in the early days of personal computing. My first brush with programming came through BASIC—writing simple games and scripts that sparked an enduring passion for building software. What began as childhood curiosity evolved into a 20+ year career in software development. -- Resume - - [HTML](/resume.html){:target="_blank"} (Preferred for on screen viewing) - - [PDF](/assets/docs/resume.pdf){:target="_blank"} (Preferred for printing/emailing) -- [LinkedIn Profile](https://www.linkedin.com/in/pjsoni) -- [GitHub Profile](https://github.com/pjsoni) +My early years in the industry introduced me to **Classic ASP**, where I learned web development fundamentals. This foundation led me to **Microsoft technologies**, particularly **.NET and C#**, which became my primary focus. Over the decades, I've deepened my expertise in application architecture, performance optimization, and DevOps practices, working across the full technology stack—from database design to cloud infrastructure. -**Note:** _A recently updated resume does not indicate looking for a new job. A resume is also used for applying for memberships in committees, participation in panels, speaking engagements and further education. It is good practice to review your career growth every couple of months and update your resume. This way, you don’t have dig to find the information when you need to send an update resume._ +## What Drives Me + +I'm energized by solving complex technical problems, whether it's architecting scalable systems, tuning database queries for optimal performance, or designing CI/CD pipelines that enable teams to ship faster. I'm equally passionate about **writing and sharing knowledge**—through blogging, contributing to open source communities, and exploring emerging technologies like IoT and home automation. + +Beyond code, I'm a fan of science fiction, music, and creative pursuits. I'm an enthusiast of the Microsoft ecosystem and genuinely excited about how technology continues to evolve and shape our world. + +## Connect With Me + +For detailed information about my professional background and skills: + +- **Resume**: [View Online](/resume.html) | [Download PDF](/assets/docs/resume.pdf) +- **LinkedIn**: [linkedin.com/in/pjsoni](https://www.linkedin.com/in/pjsoni) +- **GitHub**: [github.com/pjsoni](https://github.com/pjsoni) +- **Blog**: [Read my latest posts](/blog/) + +--- + +*A regularly updated resume reflects my commitment to professional growth and continuous learning—not necessarily a job search. I maintain an up-to-date resume for various opportunities including committee memberships, speaking engagements, panel participation, and further education. It's good practice to review your career development regularly and keep your resume current.* diff --git a/_sass/minimal-mistakes.scss b/_sass/minimal-mistakes.scss deleted file mode 100644 index 950e145..0000000 --- a/_sass/minimal-mistakes.scss +++ /dev/null @@ -1,40 +0,0 @@ -/*! - * Minimal Mistakes Jekyll Theme 4.21.0 by Michael Rose - * Copyright 2013-2020 Michael Rose - mademistakes.com | @mmistakes - * Licensed under MIT (https://github.com/mmistakes/minimal-mistakes/blob/master/LICENSE) -*/ - -/* Variables */ -@import "minimal-mistakes/variables"; - -/* Mixins and functions */ -@import "minimal-mistakes/vendor/breakpoint/breakpoint"; -@include breakpoint-set("to ems", true); -@import "minimal-mistakes/vendor/magnific-popup/magnific-popup"; // Magnific Popup -@import "minimal-mistakes/vendor/susy/susy"; -@import "minimal-mistakes/mixins"; - -/* Core CSS */ -@import "minimal-mistakes/reset"; -@import "minimal-mistakes/base"; -@import "minimal-mistakes/forms"; -@import "minimal-mistakes/tables"; -@import "minimal-mistakes/animations"; - -/* Components */ -@import "minimal-mistakes/buttons"; -@import "minimal-mistakes/notices"; -@import "minimal-mistakes/masthead"; -@import "minimal-mistakes/navigation"; -@import "minimal-mistakes/footer"; -@import "minimal-mistakes/search"; -@import "minimal-mistakes/syntax"; - -/* Utility classes */ -@import "minimal-mistakes/utilities"; - -/* Layout specific */ -@import "minimal-mistakes/page"; -@import "minimal-mistakes/archive"; -@import "minimal-mistakes/sidebar"; -@import "minimal-mistakes/print"; diff --git a/_sass/minimal-mistakes/_animations.scss b/_sass/minimal-mistakes/_animations.scss deleted file mode 100644 index 25ef77f..0000000 --- a/_sass/minimal-mistakes/_animations.scss +++ /dev/null @@ -1,21 +0,0 @@ -/* ========================================================================== - ANIMATIONS - ========================================================================== */ - -@-webkit-keyframes intro { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} - -@keyframes intro { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_archive.scss b/_sass/minimal-mistakes/_archive.scss deleted file mode 100644 index 9f57632..0000000 --- a/_sass/minimal-mistakes/_archive.scss +++ /dev/null @@ -1,463 +0,0 @@ -/* ========================================================================== - ARCHIVE - ========================================================================== */ - -.archive { - margin-top: 1em; - margin-bottom: 2em; - - @include breakpoint($large) { - float: right; - width: calc(100% - #{$right-sidebar-width-narrow}); - padding-right: $right-sidebar-width-narrow; - } - - @include breakpoint($x-large) { - width: calc(100% - #{$right-sidebar-width}); - padding-right: $right-sidebar-width; - } -} - -.archive__item { - position: relative; - - a { - position: relative; - z-index: 10; - } - - a[rel="permalink"] { - position: static; - } -} - -.archive__subtitle { - margin: 1.414em 0 0.5em; - padding-bottom: 0.5em; - font-size: $type-size-5; - color: $muted-text-color; - border-bottom: 1px solid $border-color; - - + .list__item .archive__item-title { - margin-top: 0.5em; - } -} - -.archive__item-title { - margin-bottom: 0.25em; - font-family: $sans-serif-narrow; - line-height: initial; - overflow: hidden; - text-overflow: ellipsis; - - a[rel="permalink"]::before { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - } - - a + a { - opacity: 0.5; - } -} - -/* remove border*/ -.page__content { - .archive__item-title { - margin-top: 1em; - border-bottom: none; - } -} - -.archive__item-excerpt { - margin-top: 0; - font-size: $type-size-6; - - & + p { - text-indent: 0; - } - - a { - position: relative; - } -} - -.archive__item-teaser { - position: relative; - border-radius: $border-radius; - overflow: hidden; - - img { - width: 100%; - } -} - -.archive__item-caption { - position: absolute; - bottom: 0; - right: 0; - margin: 0 auto; - padding: 2px 5px; - color: #fff; - font-family: $caption-font-family; - font-size: $type-size-8; - background: #000; - text-align: right; - z-index: 5; - opacity: 0.5; - border-radius: $border-radius 0 0 0; - - @include breakpoint($large) { - padding: 5px 10px; - } - - a { - color: #fff; - text-decoration: none; - } -} - -/* - List view - ========================================================================== */ - -.list__item { - .page__meta { - margin: 0 0 4px; - font-size: 0.6em; - } -} - -/* - Grid view - ========================================================================== */ - -.archive { - .grid__wrapper { - /* extend grid elements to the right */ - - @include breakpoint($large) { - margin-right: -1 * $right-sidebar-width-narrow; - } - - @include breakpoint($x-large) { - margin-right: -1 * $right-sidebar-width; - } - } -} - -.grid__item { - margin-bottom: 2em; - - @include breakpoint($small) { - float: left; - width: span(5 of 10); - - &:nth-child(2n + 1) { - clear: both; - margin-left: 0; - } - - &:nth-child(2n + 2) { - clear: none; - margin-left: gutter(of 10); - } - } - - @include breakpoint($medium) { - margin-left: 0; /* override margin*/ - margin-right: 0; /* override margin*/ - width: span(3 of 12); - - &:nth-child(2n + 1) { - clear: none; - } - - &:nth-child(4n + 1) { - clear: both; - } - - &:nth-child(4n + 2) { - clear: none; - margin-left: gutter(1 of 12); - } - - &:nth-child(4n + 3) { - clear: none; - margin-left: gutter(1 of 12); - } - - &:nth-child(4n + 4) { - clear: none; - margin-left: gutter(1 of 12); - } - } - - .page__meta { - margin: 0 0 4px; - font-size: 0.6em; - } - - .page__meta-sep { - display: block; - - &::before { - display: none; - } - } - - .archive__item-title { - margin-top: 0.5em; - font-size: $type-size-5; - } - - .archive__item-excerpt { - display: none; - - @include breakpoint($medium) { - display: block; - font-size: $type-size-6; - } - } - - .archive__item-teaser { - @include breakpoint($small) { - max-height: 200px; - } - - @include breakpoint($medium) { - max-height: 120px; - } - } -} - -/* - Features - ========================================================================== */ - -.feature__wrapper { - @include clearfix(); - margin-bottom: 2em; - border-bottom: 1px solid $border-color; - - .archive__item-title { - margin-bottom: 0; - } -} - -.feature__item { - position: relative; - margin-bottom: 2em; - font-size: 1.125em; - - @include breakpoint($small) { - float: left; - margin-bottom: 0; - width: span(4 of 12); - - &:nth-child(3n + 1) { - clear: both; - margin-left: 0; - } - - &:nth-child(3n + 2) { - clear: none; - margin-left: gutter(of 12); - } - - &:nth-child(3n + 3) { - clear: none; - margin-left: gutter(of 12); - } - - .feature__item-teaser { - max-height: 200px; - overflow: hidden; - } - } - - .archive__item-body { - padding-left: gutter(1 of 12); - padding-right: gutter(1 of 12); - } - - a.btn::before { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - } - - &--left { - position: relative; - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; - font-size: 1.125em; - - .archive__item { - float: left; - } - - .archive__item-teaser { - margin-bottom: 2em; - } - - a.btn::before { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - } - - @include breakpoint($small) { - .archive__item-teaser { - float: left; - width: span(5 of 12); - } - - .archive__item-body { - float: right; - padding-left: gutter(0.5 of 12); - padding-right: gutter(1 of 12); - width: span(7 of 12); - } - } - } - - &--right { - position: relative; - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; - font-size: 1.125em; - - .archive__item { - float: left; - } - - .archive__item-teaser { - margin-bottom: 2em; - } - - a.btn::before { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - } - - @include breakpoint($small) { - text-align: right; - - .archive__item-teaser { - float: right; - width: span(5 of 12); - } - - .archive__item-body { - float: left; - width: span(7 of 12); - padding-left: gutter(0.5 of 12); - padding-right: gutter(1 of 12); - } - } - } - - &--center { - position: relative; - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; - font-size: 1.125em; - - .archive__item { - float: left; - width: 100%; - } - - .archive__item-teaser { - margin-bottom: 2em; - } - - a.btn::before { - content: ''; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - } - - @include breakpoint($small) { - text-align: center; - - .archive__item-teaser { - margin: 0 auto; - width: span(5 of 12); - } - - .archive__item-body { - margin: 0 auto; - width: span(7 of 12); - } - } - } -} - -/* Place inside an archive layout */ - -.archive { - .feature__wrapper { - .archive__item-title { - margin-top: 0.25em; - font-size: 1em; - } - } - - .feature__item, - .feature__item--left, - .feature__item--center, - .feature__item--right { - font-size: 1em; - } -} - -/* - Wide Pages - ========================================================================== */ - - .wide { - .archive { - @include breakpoint($large) { - padding-right: 0; - } - - @include breakpoint($x-large) { - padding-right: 0; - } - } -} - -/* Place inside a single layout */ - -.layout--single { - .feature__wrapper { - display: inline-block; - } -} diff --git a/_sass/minimal-mistakes/_base.scss b/_sass/minimal-mistakes/_base.scss deleted file mode 100644 index 3796eb6..0000000 --- a/_sass/minimal-mistakes/_base.scss +++ /dev/null @@ -1,357 +0,0 @@ -/* ========================================================================== - BASE ELEMENTS - ========================================================================== */ - -html { - /* sticky footer fix */ - position: relative; - min-height: 100%; -} - -body { - margin: 0; - padding: 0; - color: $text-color; - font-family: $global-font-family; - line-height: 1.5; - - &.overflow--hidden { - /* when primary navigation is visible, the content in the background won't scroll */ - overflow: hidden; - } -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 2em 0 0.5em; - line-height: 1.2; - font-family: $header-font-family; - font-weight: bold; -} - -h1 { - margin-top: 0; - font-size: $h-size-1; -} - -h2 { - font-size: $h-size-2; -} - -h3 { - font-size: $h-size-3; -} - -h4 { - font-size: $h-size-4; -} - -h5 { - font-size: $h-size-5; -} - -h6 { - font-size: $h-size-6; -} - -small, -.small { - font-size: $type-size-6; -} - -p { - margin-bottom: 1.3em; -} - -u, -ins { - text-decoration: none; - border-bottom: 1px solid $text-color; - a { - color: inherit; - } -} - -del a { - color: inherit; -} - -/* reduce orphans and widows when printing */ - -p, -pre, -blockquote, -ul, -ol, -dl, -figure, -table, -fieldset { - orphans: 3; - widows: 3; -} - -/* abbreviations */ - -abbr[title], -abbr[data-original-title] { - text-decoration: none; - cursor: help; - border-bottom: 1px dotted $text-color; -} - -/* blockquotes */ - -blockquote { - margin: 2em 1em 2em 0; - padding-left: 1em; - padding-right: 1em; - font-style: italic; - border-left: 0.25em solid $primary-color; - - cite { - font-style: italic; - - &:before { - content: "\2014"; - padding-right: 5px; - } - } -} - -/* links */ - -a { - &:focus { - @extend %tab-focus; - } - - &:visited { - color: $link-color-visited; - } - - &:hover { - color: $link-color-hover; - outline: 0; - } -} - -/* buttons */ - -button:focus { - @extend %tab-focus; -} - -/* code */ - -tt, -code, -kbd, -samp, -pre { - font-family: $monospace; -} - -pre { - overflow-x: auto; /* add scrollbars to wide code blocks*/ -} - -p > code, -a > code, -li > code, -figcaption > code, -td > code { - padding-top: 0.1rem; - padding-bottom: 0.1rem; - font-size: 0.8em; - background: $code-background-color; - border-radius: $border-radius; - - &:before, - &:after { - letter-spacing: -0.2em; - content: "\00a0"; /* non-breaking space*/ - } -} - -/* horizontal rule */ - -hr { - display: block; - margin: 1em 0; - border: 0; - border-top: 1px solid $border-color; -} - -/* lists */ - -ul li, -ol li { - margin-bottom: 0.5em; -} - -li ul, -li ol { - margin-top: 0.5em; -} - -/* - Media and embeds - ========================================================================== */ - -/* Figures and images */ - -figure { - display: -webkit-box; - display: flex; - -webkit-box-pack: justify; - justify-content: space-between; - -webkit-box-align: start; - align-items: flex-start; - flex-wrap: wrap; - margin: 2em 0; - - img, - iframe, - .fluid-width-video-wrapper { - margin-bottom: 1em; - } - - img { - width: 100%; - border-radius: $border-radius; - -webkit-transition: $global-transition; - transition: $global-transition; - } - - > a { - display: block; - } - - &.half { - > a, - > img { - @include breakpoint($small) { - width: calc(50% - 0.5em); - } - } - - figcaption { - width: 100%; - } - } - - &.third { - > a, - > img { - @include breakpoint($small) { - width: calc(33.3333% - 0.5em); - } - } - - figcaption { - width: 100%; - } - } -} - -/* Figure captions */ - -figcaption { - margin-bottom: 0.5em; - color: $muted-text-color; - font-family: $caption-font-family; - font-size: $type-size-6; - - a { - -webkit-transition: $global-transition; - transition: $global-transition; - - &:hover { - color: $link-color-hover; - } - } -} - -/* Fix IE9 SVG bug */ - -svg:not(:root) { - overflow: hidden; -} - -/* - Navigation lists - ========================================================================== */ - -/** - * Removes margins, padding, and bullet points from navigation lists - * - * Example usage: - * - */ - -nav { - ul { - margin: 0; - padding: 0; - } - - li { - list-style: none; - } - - a { - text-decoration: none; - } - - /* override white-space for nested lists */ - ul li, - ol li { - margin-bottom: 0; - } - - li ul, - li ol { - margin-top: 0; - } -} - -/* - Global animation transition - ========================================================================== */ - -b, -i, -strong, -em, -blockquote, -p, -q, -span, -figure, -img, -h1, -h2, -header, -input, -a, -tr, -td, -form button, -input[type="submit"], -.btn, -.highlight, -.archive__item-teaser { - -webkit-transition: $global-transition; - transition: $global-transition; -} diff --git a/_sass/minimal-mistakes/_buttons.scss b/_sass/minimal-mistakes/_buttons.scss deleted file mode 100644 index 9ef60a8..0000000 --- a/_sass/minimal-mistakes/_buttons.scss +++ /dev/null @@ -1,97 +0,0 @@ -/* ========================================================================== - BUTTONS - ========================================================================== */ - -/* - Default button - ========================================================================== */ - -.btn { - /* default */ - display: inline-block; - margin-bottom: 0.25em; - padding: 0.5em 1em; - font-family: $sans-serif; - font-size: $type-size-6; - font-weight: bold; - text-align: center; - text-decoration: none; - border-width: 0; - border-radius: $border-radius; - cursor: pointer; - - .icon { - margin-right: 0.5em; - } - - .icon + .hidden { - margin-left: -0.5em; /* override for hidden text*/ - } - - /* button colors */ - $buttoncolors: - (primary, $primary-color), - (inverse, #fff), - (light-outline, transparent), - (success, $success-color), - (warning, $warning-color), - (danger, $danger-color), - (info, $info-color), - (facebook, $facebook-color), - (twitter, $twitter-color), - (linkedin, $linkedin-color); - - @each $buttoncolor, $color in $buttoncolors { - &--#{$buttoncolor} { - @include yiq-contrasted($color); - @if ($buttoncolor == inverse) { - border: 1px solid $border-color; - } - @if ($buttoncolor == light-outline) { - border: 1px solid #fff; - } - - &:visited { - @include yiq-contrasted($color); - } - - &:hover { - @include yiq-contrasted(mix(#000, $color, 20%)); - } - } - } - - /* fills width of parent container */ - &--block { - display: block; - width: 100%; - - + .btn--block { - margin-top: 0.25em; - } - } - - /* disabled */ - &--disabled { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - box-shadow: none; - opacity: 0.65; - } - - /* extra large button */ - &--x-large { - font-size: $type-size-4; - } - - /* large button */ - &--large { - font-size: $type-size-5; - } - - /* small button */ - &--small { - font-size: $type-size-7; - } -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_footer.scss b/_sass/minimal-mistakes/_footer.scss deleted file mode 100644 index c0b0625..0000000 --- a/_sass/minimal-mistakes/_footer.scss +++ /dev/null @@ -1,85 +0,0 @@ -/* ========================================================================== - FOOTER - ========================================================================== */ - -.page__footer { - @include clearfix; - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - margin-top: 3em; - color: $muted-text-color; - -webkit-animation: $intro-transition; - animation: $intro-transition; - -webkit-animation-delay: 0.45s; - animation-delay: 0.45s; - background-color: $footer-background-color; - - footer { - @include clearfix; - margin-left: auto; - margin-right: auto; - margin-top: 2em; - max-width: 100%; - padding: 0 1em 2em; - - @include breakpoint($x-large) { - max-width: $x-large; - } - } - - a { - color: inherit; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } - - .fas, - .fab, - .far, - .fal { - color: $muted-text-color; - } -} - -.page__footer-copyright { - font-family: $global-font-family; - font-size: $type-size-7; -} - -.page__footer-follow { - ul { - margin: 0; - padding: 0; - list-style-type: none; - } - - li { - display: inline-block; - padding-top: 5px; - padding-bottom: 5px; - font-family: $sans-serif-narrow; - font-size: $type-size-6; - text-transform: uppercase; - } - - li + li:before { - content: ""; - padding-right: 5px; - } - - a { - padding-right: 10px; - font-weight: bold; - } - - .social-icons { - a { - white-space: nowrap; - } - } -} diff --git a/_sass/minimal-mistakes/_forms.scss b/_sass/minimal-mistakes/_forms.scss deleted file mode 100644 index ec77c54..0000000 --- a/_sass/minimal-mistakes/_forms.scss +++ /dev/null @@ -1,393 +0,0 @@ -/* ========================================================================== - Forms - ========================================================================== */ - -form { - margin: 0 0 5px 0; - padding: 1em; - background-color: $form-background-color; - - fieldset { - margin-bottom: 5px; - padding: 0; - border-width: 0; - } - - legend { - display: block; - width: 100%; - margin-bottom: 5px * 2; - *margin-left: -7px; - padding: 0; - color: $text-color; - border: 0; - white-space: normal; - } - - p { - margin-bottom: (5px / 2); - } - - ul { - list-style-type: none; - margin: 0 0 5px 0; - padding: 0; - } - - br { - display: none; - } -} - -label, -input, -button, -select, -textarea { - vertical-align: baseline; - *vertical-align: middle; -} - -input, -button, -select, -textarea { - box-sizing: border-box; - font-family: $sans-serif; -} - -label { - display: block; - margin-bottom: 0.25em; - color: $text-color; - cursor: pointer; - - small { - font-size: $type-size-6; - } - - input, - textarea, - select { - display: block; - } -} - -input, -textarea, -select { - display: inline-block; - width: 100%; - padding: 0.25em; - margin-bottom: 0.5em; - color: $text-color; - background-color: $background-color; - border: $border-color; - border-radius: $border-radius; - box-shadow: $box-shadow; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -input[type="image"], -input[type="checkbox"], -input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - line-height: normal; - cursor: pointer; - border-radius: 0; - border: 0 \9; - box-shadow: none; -} - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - padding: 0; - *width: 13px; - *height: 13px; -} - -input[type="image"] { - border: 0; -} - -input[type="file"] { - width: auto; - padding: initial; - line-height: initial; - border: initial; - background-color: transparent; - background-color: initial; - box-shadow: none; -} - -input[type="button"], -input[type="reset"], -input[type="submit"] { - width: auto; - height: auto; - cursor: pointer; - *overflow: visible; -} - -select, -input[type="file"] { - *margin-top: 4px; -} - -select { - width: auto; - background-color: #fff; -} - -select[multiple], -select[size] { - height: auto; -} - -textarea { - resize: vertical; - height: auto; - overflow: auto; - vertical-align: top; -} - -input[type="hidden"] { - display: none; -} - -.form { - position: relative; -} - -.radio, -.checkbox { - padding-left: 18px; - font-weight: normal; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -/* - Disabled state - ========================================================================== */ - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - opacity: 0.5; - cursor: not-allowed; -} - -/* - Focus & active state - ========================================================================== */ - -input:focus, -textarea:focus { - border-color: $primary-color; - outline: 0; - outline: thin dotted \9; - box-shadow: inset 0 1px 3px rgba($text-color, 0.06), - 0 0 5px rgba($primary-color, 0.7); -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus, -select:focus { - box-shadow: none; -} - -/* - Help text - ========================================================================== */ - -.help-block, -.help-inline { - color: $muted-text-color; -} - -.help-block { - display: block; - margin-bottom: 1em; - line-height: 1em; -} - -.help-inline { - display: inline-block; - vertical-align: middle; - padding-left: 5px; -} - -/* - .form-group - ========================================================================== */ - -.form-group { - margin-bottom: 5px; - padding: 0; - border-width: 0; -} - -/* - .form-inline - ========================================================================== */ - -.form-inline input, -.form-inline textarea, -.form-inline select { - display: inline-block; - margin-bottom: 0; -} - -.form-inline label { - display: inline-block; -} - -.form-inline .radio, -.form-inline .checkbox, -.form-inline .radio { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-left: 0; - margin-right: 3px; -} - -/* - .form-search - ========================================================================== */ - -.form-search input, -.form-search textarea, -.form-search select { - display: inline-block; - margin-bottom: 0; -} - -.form-search .search-query { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; - border-radius: 14px; -} - -.form-search label { - display: inline-block; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"] { - float: left; - margin-left: 0; - margin-right: 3px; -} - -/* - .form--loading - ========================================================================== */ - -.form--loading:before { - content: ""; -} - -.form--loading .form__spinner { - display: block; -} - -.form:before { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(255, 255, 255, 0.7); - z-index: 10; -} - -.form__spinner { - display: none; - position: absolute; - top: 50%; - left: 50%; - z-index: 11; -} - -/* - Google search form - ========================================================================== */ - -#goog-fixurl { - ul { - list-style: none; - margin-left: 0; - padding-left: 0; - li { - list-style-type: none; - } - } -} - -#goog-wm-qt { - width: auto; - margin-right: 10px; - margin-bottom: 20px; - padding: 8px 20px; - display: inline-block; - font-size: $type-size-6; - background-color: #fff; - color: #000; - border-width: 2px !important; - border-style: solid !important; - border-color: $border-color; - border-radius: $border-radius; -} - -#goog-wm-sb { - @extend .btn; -} diff --git a/_sass/minimal-mistakes/_masthead.scss b/_sass/minimal-mistakes/_masthead.scss deleted file mode 100644 index 2dfefcc..0000000 --- a/_sass/minimal-mistakes/_masthead.scss +++ /dev/null @@ -1,93 +0,0 @@ -/* ========================================================================== - MASTHEAD - ========================================================================== */ - -.masthead { - position: relative; - border-bottom: 1px solid $border-color; - -webkit-animation: $intro-transition; - animation: $intro-transition; - -webkit-animation-delay: 0.15s; - animation-delay: 0.15s; - z-index: 20; - - &__inner-wrap { - @include clearfix; - margin-left: auto; - margin-right: auto; - padding: 1em; - max-width: 100%; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - font-family: $sans-serif-narrow; - - @include breakpoint($x-large) { - max-width: $max-width; - } - - nav { - z-index: 10; - } - - a { - text-decoration: none; - } - } -} - -.site-logo img { - max-height: 2rem; -} - -.site-title { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-item-align: center; - align-self: center; - font-weight: bold; - // z-index: 20; -} - -.site-subtitle { - display: block; - font-size: $type-size-8; -} - -.masthead__menu { - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; - - .site-nav { - margin-left: 0; - - @include breakpoint($small) { - float: right; - } - } - - ul { - margin: 0; - padding: 0; - clear: both; - list-style-type: none; - } -} - -.masthead__menu-item { - display: block; - list-style-type: none; - white-space: nowrap; - - &--lg { - padding-right: 2em; - font-weight: 700; - } -} diff --git a/_sass/minimal-mistakes/_mixins.scss b/_sass/minimal-mistakes/_mixins.scss deleted file mode 100644 index 4aa9eb0..0000000 --- a/_sass/minimal-mistakes/_mixins.scss +++ /dev/null @@ -1,92 +0,0 @@ -/* ========================================================================== - MIXINS - ========================================================================== */ - -%tab-focus { - /* Default*/ - outline: thin dotted $focus-color; - /* Webkit*/ - outline: 5px auto $focus-color; - outline-offset: -2px; -} - -/* - em function - ========================================================================== */ - -@function em($target, $context: $doc-font-size) { - @return ($target / $context) * 1em; -} - - -/* - Bourbon clearfix - ========================================================================== */ - -/* - * Provides an easy way to include a clearfix for containing floats. - * link http://cssmojo.com/latest_new_clearfix_so_far/ - * - * example scss - Usage - * - * .element { - * @include clearfix; - * } - * - * example css - CSS Output - * - * .element::after { - * clear: both; - * content: ""; - * display: table; - * } -*/ - -@mixin clearfix { - clear: both; - - &::after { - clear: both; - content: ""; - display: table; - } -} - -/* - Compass YIQ Color Contrast - https://github.com/easy-designs/yiq-color-contrast - ========================================================================== */ - -@function yiq-is-light( - $color, - $threshold: $yiq-contrasted-threshold -) { - $red: red($color); - $green: green($color); - $blue: blue($color); - - $yiq: (($red*299)+($green*587)+($blue*114))/1000; - - @if $yiq-debug { @debug $yiq, $threshold; } - - @return if($yiq >= $threshold, true, false); -} - -@function yiq-contrast-color( - $color, - $dark: $yiq-contrasted-dark-default, - $light: $yiq-contrasted-light-default, - $threshold: $yiq-contrasted-threshold -) { - @return if(yiq-is-light($color, $threshold), $yiq-contrasted-dark-default, $yiq-contrasted-light-default); -} - -@mixin yiq-contrasted( - $background-color, - $dark: $yiq-contrasted-dark-default, - $light: $yiq-contrasted-light-default, - $threshold: $yiq-contrasted-threshold -) { - background-color: $background-color; - color: yiq-contrast-color($background-color, $dark, $light, $threshold); -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_navigation.scss b/_sass/minimal-mistakes/_navigation.scss deleted file mode 100644 index 4909c2d..0000000 --- a/_sass/minimal-mistakes/_navigation.scss +++ /dev/null @@ -1,573 +0,0 @@ -/* ========================================================================== - NAVIGATION - ========================================================================== */ - -/* - Breadcrumb navigation links - ========================================================================== */ - -.breadcrumbs { - @include clearfix; - margin: 0 auto; - max-width: 100%; - padding-left: 1em; - padding-right: 1em; - font-family: $sans-serif; - -webkit-animation: $intro-transition; - animation: $intro-transition; - -webkit-animation-delay: 0.3s; - animation-delay: 0.3s; - - @include breakpoint($x-large) { - max-width: $x-large; - } - - ol { - padding: 0; - list-style: none; - font-size: $type-size-6; - - @include breakpoint($large) { - float: right; - width: calc(100% - #{$right-sidebar-width-narrow}); - } - - @include breakpoint($x-large) { - width: calc(100% - #{$right-sidebar-width}); - } - } - - li { - display: inline; - } - - .current { - font-weight: bold; - } -} - -/* - Post pagination navigation links - ========================================================================== */ - -.pagination { - @include clearfix(); - float: left; - margin-top: 1em; - padding-top: 1em; - width: 100%; - - ul { - margin: 0; - padding: 0; - list-style-type: none; - font-family: $sans-serif; - } - - li { - display: block; - float: left; - margin-left: -1px; - - a { - display: block; - margin-bottom: 0.25em; - padding: 0.5em 1em; - font-family: $sans-serif; - font-size: 14px; - font-weight: bold; - line-height: 1.5; - text-align: center; - text-decoration: none; - color: $muted-text-color; - border: 1px solid mix(#000, $border-color, 25%); - border-radius: 0; - - &:hover { - color: $link-color-hover; - } - - &.current, - &.current.disabled { - color: #fff; - background: $primary-color; - } - - &.disabled { - color: rgba($muted-text-color, 0.5); - pointer-events: none; - cursor: not-allowed; - } - } - - &:first-child { - margin-left: 0; - - a { - border-top-left-radius: $border-radius; - border-bottom-left-radius: $border-radius; - } - } - - &:last-child { - a { - border-top-right-radius: $border-radius; - border-bottom-right-radius: $border-radius; - } - } - } - - /* next/previous buttons */ - &--pager { - display: block; - padding: 1em 2em; - float: left; - width: 50%; - font-family: $sans-serif; - font-size: $type-size-5; - font-weight: bold; - text-align: center; - text-decoration: none; - color: $muted-text-color; - border: 1px solid mix(#000, $border-color, 25%); - border-radius: $border-radius; - - &:hover { - @include yiq-contrasted($muted-text-color); - } - - &:first-child { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - } - - &:last-child { - margin-left: -1px; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - } - - &.disabled { - color: rgba($muted-text-color, 0.5); - pointer-events: none; - cursor: not-allowed; - } - } -} - -.page__content + .pagination, -.page__meta + .pagination, -.page__share + .pagination, -.page__comments + .pagination { - margin-top: 2em; - padding-top: 2em; - border-top: 1px solid $border-color; -} - -/* - Priority plus navigation - ========================================================================== */ - -.greedy-nav { - position: relative; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - min-height: $nav-height; - background: $background-color; - - a { - display: block; - margin: 0 1rem; - color: $masthead-link-color; - text-decoration: none; - -webkit-transition: none; - transition: none; - - &:hover { - color: $masthead-link-color-hover; - } - - &.site-logo { - margin-left: 0; - margin-right: 0.5rem; - } - - &.site-title { - margin-left: 0; - } - } - - img{ - -webkit-transition: none; - transition: none; - } - - &__toggle { - -ms-flex-item-align: center; - align-self: center; - height: $nav-toggle-height; - border: 0; - outline: none; - background-color: transparent; - cursor: pointer; - } - - .visible-links { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: hidden; - - li { - -webkit-box-flex: 0; - -ms-flex: none; - flex: none; - } - - a { - position: relative; - - &:before { - content: ""; - position: absolute; - left: 0; - bottom: 0; - height: 4px; - background: $primary-color; - width: 100%; - -webkit-transition: $global-transition; - transition: $global-transition; - -webkit-transform: scaleX(0) translate3d(0, 0, 0); - transform: scaleX(0) translate3d(0, 0, 0); // hide - } - - &:hover:before { - -webkit-transform: scaleX(1); - -ms-transform: scaleX(1); - transform: scaleX(1); // reveal - } - } - } - - .hidden-links { - position: absolute; - top: 100%; - right: 0; - margin-top: 15px; - padding: 5px; - border: 1px solid $border-color; - border-radius: $border-radius; - background: $background-color; - -webkit-box-shadow: 0 2px 4px 0 rgba(#000, 0.16), - 0 2px 10px 0 rgba(#000, 0.12); - box-shadow: 0 2px 4px 0 rgba(#000, 0.16), 0 2px 10px 0 rgba(#000, 0.12); - - &.hidden { - display: none; - } - - a { - margin: 0; - padding: 10px 20px; - font-size: $type-size-5; - - &:hover { - color: $masthead-link-color-hover; - background: $navicon-link-color-hover; - } - } - - &:before { - content: ""; - position: absolute; - top: -11px; - right: 10px; - width: 0; - border-style: solid; - border-width: 0 10px 10px; - border-color: $border-color transparent; - display: block; - z-index: 0; - } - - &:after { - content: ""; - position: absolute; - top: -10px; - right: 10px; - width: 0; - border-style: solid; - border-width: 0 10px 10px; - border-color: $background-color transparent; - display: block; - z-index: 1; - } - - li { - display: block; - border-bottom: 1px solid $border-color; - - &:last-child { - border-bottom: none; - } - } - } -} - -.no-js { - .greedy-nav { - .visible-links { - -ms-flex-wrap: wrap; - flex-wrap: wrap; - overflow: visible; - } - } -} - -/* - Navigation list - ========================================================================== */ - -.nav__list { - margin-bottom: 1.5em; - - input[type="checkbox"], - label { - display: none; - } - - @include breakpoint(max-width $large - 1px) { - label { - position: relative; - display: inline-block; - padding: 0.5em 2.5em 0.5em 1em; - color: $gray; - font-size: $type-size-6; - font-weight: bold; - border: 1px solid $light-gray; - border-radius: $border-radius; - z-index: 20; - -webkit-transition: 0.2s ease-out; - transition: 0.2s ease-out; - cursor: pointer; - - &:before, - &:after { - content: ""; - position: absolute; - right: 1em; - top: 1.25em; - width: 0.75em; - height: 0.125em; - line-height: 1; - background-color: $gray; - -webkit-transition: 0.2s ease-out; - transition: 0.2s ease-out; - } - - &:after { - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); - } - - &:hover { - color: #fff; - border-color: $gray; - background-color: mix(white, #000, 20%); - - &:before, - &:after { - background-color: #fff; - } - } - } - - /* selected*/ - input:checked + label { - color: white; - background-color: mix(white, #000, 20%); - - &:before, - &:after { - background-color: #fff; - } - } - - /* on hover show expand*/ - label:hover:after { - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); - } - - input:checked + label:hover:after { - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - } - - ul { - margin-bottom: 1em; - } - - a { - display: block; - padding: 0.25em 0; - - @include breakpoint($large) { - padding-top: 0.125em; - padding-bottom: 0.125em; - } - - &:hover { - text-decoration: underline; - } - } - } -} - -.nav__list .nav__items { - margin: 0; - font-size: 1.25rem; - - a { - color: inherit; - } - - .active { - margin-left: -0.5em; - padding-left: 0.5em; - padding-right: 0.5em; - font-weight: bold; - } - - @include breakpoint(max-width $large - 1px) { - position: relative; - max-height: 0; - opacity: 0%; - overflow: hidden; - z-index: 10; - -webkit-transition: 0.3s ease-in-out; - transition: 0.3s ease-in-out; - -webkit-transform: translate(0, 10%); - -ms-transform: translate(0, 10%); - transform: translate(0, 10%); - } -} - -@include breakpoint(max-width $large - 1px) { - .nav__list input:checked ~ .nav__items { - -webkit-transition: 0.5s ease-in-out; - transition: 0.5s ease-in-out; - max-height: 9999px; /* exaggerate max-height to accommodate tall lists*/ - overflow: visible; - opacity: 1; - margin-top: 1em; - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); - } -} - -.nav__title { - margin: 0; - padding: 0.5rem 0.75rem; - font-family: $sans-serif-narrow; - font-size: $type-size-5; - font-weight: bold; -} - -.nav__sub-title { - display: block; - margin: 0.5rem 0; - padding: 0.25rem 0; - font-family: $sans-serif-narrow; - font-size: $type-size-6; - font-weight: bold; - text-transform: uppercase; - border-bottom: 1px solid $border-color; -} - -/* - Table of contents navigation - ========================================================================== */ - -.toc { - font-family: $sans-serif-narrow; - color: $gray; - background-color: $background-color; - border: 1px solid $border-color; - border-radius: $border-radius; - -webkit-box-shadow: $box-shadow; - box-shadow: $box-shadow; - - .nav__title { - color: #fff; - font-size: $type-size-6; - background: $primary-color; - border-top-left-radius: $border-radius; - border-top-right-radius: $border-radius; - } - - // Scrollspy marks toc items as .active when they are in focus - .active a { - @include yiq-contrasted($active-color); - } -} - -.toc__menu { - margin: 0; - padding: 0; - width: 100%; - list-style: none; - font-size: $type-size-6; - - @include breakpoint($large) { - font-size: $type-size-7; - } - - a { - display: block; - padding: 0.25rem 0.75rem; - color: $muted-text-color; - font-weight: bold; - line-height: 1.5; - border-bottom: 1px solid $border-color; - - &:hover { - color: $text-color; - } - } - - li ul > li a { - padding-left: 1.25rem; - font-weight: normal; - } - - li ul li ul > li a { - padding-left: 1.75rem; - } - - li ul li ul li ul > li a { - padding-left: 2.25rem; - } - - li ul li ul li ul li ul > li a { - padding-left: 2.75rem; - } - - li ul li ul li ul li ul li ul > li a { - padding-left: 3.25rem - } -} diff --git a/_sass/minimal-mistakes/_notices.scss b/_sass/minimal-mistakes/_notices.scss deleted file mode 100644 index 5c087ed..0000000 --- a/_sass/minimal-mistakes/_notices.scss +++ /dev/null @@ -1,105 +0,0 @@ -/* ========================================================================== - NOTICE TEXT BLOCKS - ========================================================================== */ - -/** - * Default Kramdown usage (no indents!): - *
- * #### Headline for the Notice - * Text for the notice - *
- */ - -@mixin notice($notice-color) { - margin: 2em 0 !important; /* override*/ - padding: 1em; - color: $dark-gray; - font-family: $global-font-family; - font-size: $type-size-6 !important; - text-indent: initial; /* override*/ - background-color: mix(#fff, $notice-color, 90%); - border-radius: $border-radius; - box-shadow: 0 1px 1px rgba($notice-color, 0.25); - - h4 { - margin-top: 0 !important; /* override*/ - margin-bottom: 0.75em; - line-height: inherit; - } - - @at-root .page__content #{&} h4 { - /* using at-root to override .page-content h4 font size*/ - margin-bottom: 0; - font-size: 1em; - } - - p { - &:last-child { - margin-bottom: 0 !important; /* override*/ - } - } - - h4 + p { - /* remove space above paragraphs that appear directly after notice headline*/ - margin-top: 0; - padding-top: 0; - } - - a { - color: $notice-color; - - &:hover { - color: mix(#000, $notice-color, 40%); - } - } - - code { - background-color: mix(#fff, $notice-color, 95%) - } - - pre code { - background-color: inherit; - } - - ul { - &:last-child { - margin-bottom: 0; /* override*/ - } - } -} - -/* Default notice */ - -.notice { - @include notice($light-gray); -} - -/* Primary notice */ - -.notice--primary { - @include notice($primary-color); -} - -/* Info notice */ - -.notice--info { - @include notice($info-color); -} - -/* Warning notice */ - -.notice--warning { - @include notice($warning-color); -} - -/* Success notice */ - -.notice--success { - @include notice($success-color); -} - -/* Danger notice */ - -.notice--danger { - @include notice($danger-color); -} diff --git a/_sass/minimal-mistakes/_page.scss b/_sass/minimal-mistakes/_page.scss deleted file mode 100644 index f25f75f..0000000 --- a/_sass/minimal-mistakes/_page.scss +++ /dev/null @@ -1,559 +0,0 @@ -/* ========================================================================== - SINGLE PAGE/POST - ========================================================================== */ - -#main { - @include clearfix; - margin-left: auto; - margin-right: auto; - padding-left: 1em; - padding-right: 1em; - -webkit-animation: $intro-transition; - animation: $intro-transition; - max-width: 100%; - -webkit-animation-delay: 0.15s; - animation-delay: 0.15s; - - @include breakpoint($x-large) { - max-width: $max-width; - } -} - -body { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - min-height: 100vh; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; -} - -.initial-content, -.search-content { - flex: 1 0 auto; -} - -.page { - @include breakpoint($large) { - float: right; - width: calc(100% - #{$right-sidebar-width-narrow}); - padding-right: $right-sidebar-width-narrow; - } - - @include breakpoint($x-large) { - width: calc(100% - #{$right-sidebar-width}); - padding-right: $right-sidebar-width; - } - - .page__inner-wrap { - float: left; - margin-top: 1em; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; - - .page__content, - .page__meta, - .page__share { - position: relative; - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; - } - } -} - -.page__title { - margin-top: 0; - line-height: 1; - - & + .page__meta { - margin-top: -0.5em; - } -} - -.page__lead { - font-family: $global-font-family; - font-size: $type-size-4; -} - -.page__content { - h2 { - padding-bottom: 0.5em; - border-bottom: 1px solid $border-color; - } - - h1, h2, h3, h4, h5, h6 { - .header-link { - position: relative; - left: 0.5em; - opacity: 0; - font-size: 0.8em; - -webkit-transition: opacity 0.2s ease-in-out 0.1s; - -moz-transition: opacity 0.2s ease-in-out 0.1s; - -o-transition: opacity 0.2s ease-in-out 0.1s; - transition: opacity 0.2s ease-in-out 0.1s; - } - - &:hover .header-link { - opacity: 1; - } - } - - p, - li, - dl { - font-size: 1em; - } - - /* paragraph indents */ - p { - margin: 0 0 $indent-var; - - /* sibling indentation*/ - @if $paragraph-indent == true { - & + p { - text-indent: $indent-var; - margin-top: -($indent-var); - } - } - } - - a:not(.btn) { - &:hover { - text-decoration: underline; - - img { - box-shadow: 0 0 10px rgba(#000, 0.25); - } - } - } - - dt { - margin-top: 1em; - font-family: $sans-serif; - font-weight: bold; - } - - dd { - margin-left: 1em; - font-family: $sans-serif; - font-size: $type-size-6; - } - - .small { - font-size: $type-size-6; - } - - /* blockquote citations */ - blockquote + .small { - margin-top: -1.5em; - padding-left: 1.25rem; - } -} - -.page__hero { - position: relative; - margin-bottom: 2em; - @include clearfix; - -webkit-animation: $intro-transition; - animation: $intro-transition; - -webkit-animation-delay: 0.25s; - animation-delay: 0.25s; - - &--overlay { - position: relative; - margin-bottom: 2em; - padding: 3em 0; - @include clearfix; - background-size: cover; - background-repeat: no-repeat; - background-position: center; - -webkit-animation: $intro-transition; - animation: $intro-transition; - -webkit-animation-delay: 0.25s; - animation-delay: 0.25s; - - a { - color: #fff; - } - - .wrapper { - padding-left: 1em; - padding-right: 1em; - - @include breakpoint($x-large) { - max-width: $x-large; - } - } - - .page__title, - .page__meta, - .page__lead, - .btn { - color: #fff; - text-shadow: 1px 1px 4px rgba(#000, 0.5); - } - - .page__lead { - max-width: $medium; - } - - .page__title { - font-size: $type-size-2; - - @include breakpoint($small) { - font-size: $type-size-1; - } - } - } -} - -.page__hero-image { - width: 100%; - height: auto; - -ms-interpolation-mode: bicubic; -} - -.page__hero-caption { - position: absolute; - bottom: 0; - right: 0; - margin: 0 auto; - padding: 2px 5px; - color: #fff; - font-family: $caption-font-family; - font-size: $type-size-7; - background: #000; - text-align: right; - z-index: 5; - opacity: 0.5; - border-radius: $border-radius 0 0 0; - - @include breakpoint($large) { - padding: 5px 10px; - } - - a { - color: #fff; - text-decoration: none; - } -} - -/* - Social sharing - ========================================================================== */ - -.page__share { - margin-top: 2em; - padding-top: 1em; - border-top: 1px solid $border-color; - - @include breakpoint(max-width $small) { - .btn span { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; - } - } -} - -.page__share-title { - margin-bottom: 10px; - font-size: $type-size-6; - text-transform: uppercase; -} - -/* - Page meta - ========================================================================== */ - -.page__meta { - margin-top: 2em; - color: $muted-text-color; - font-family: $sans-serif; - font-size: $type-size-6; - - p { - margin: 0; - } - - a { - color: inherit; - } -} - -.page__meta-title { - margin-bottom: 10px; - font-size: $type-size-6; - text-transform: uppercase; -} - -.page__meta-sep::before { - content: "\2022"; - padding-left: 0.5em; - padding-right: 0.5em; -} - -/* - Page taxonomy - ========================================================================== */ - -.page__taxonomy { - .sep { - display: none; - } - - strong { - margin-right: 10px; - } -} - -.page__taxonomy-item { - display: inline-block; - margin-right: 5px; - margin-bottom: 8px; - padding: 5px 10px; - text-decoration: none; - border: 1px solid mix(#000, $border-color, 25%); - border-radius: $border-radius; - - &:hover { - text-decoration: none; - color: $link-color-hover; - } -} - -.taxonomy__section { - margin-bottom: 2em; - padding-bottom: 1em; - - &:not(:last-child) { - border-bottom: solid 1px $border-color; - } - - .archive__item-title { - margin-top: 0; - } - - .archive__subtitle { - clear: both; - border: 0; - } - - + .taxonomy__section { - margin-top: 2em; - } -} - -.taxonomy__title { - margin-bottom: 0.5em; - color: $muted-text-color; -} - -.taxonomy__count { - color: $muted-text-color; -} - -.taxonomy__index { - display: grid; - grid-column-gap: 2em; - grid-template-columns: repeat(2, 1fr); - margin: 1.414em 0; - padding: 0; - font-size: 0.75em; - list-style: none; - - @include breakpoint($large) { - grid-template-columns: repeat(3, 1fr); - } - - a { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - padding: 0.25em 0; - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between; - color: inherit; - text-decoration: none; - border-bottom: 1px solid $border-color; - } -} - -.back-to-top { - display: block; - clear: both; - color: $muted-text-color; - font-size: 0.6em; - text-transform: uppercase; - text-align: right; - text-decoration: none; -} - -/* - Comments - ========================================================================== */ - -.page__comments { - float: left; - margin-left: 0; - margin-right: 0; - width: 100%; - clear: both; -} - -.page__comments-title { - margin-top: 2rem; - margin-bottom: 10px; - padding-top: 2rem; - font-size: $type-size-6; - border-top: 1px solid $border-color; - text-transform: uppercase; -} - -.page__comments-form { - -webkit-transition: $global-transition; - transition: $global-transition; - - &.disabled { - input, - button, - textarea, - label { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - box-shadow: none; - opacity: 0.65; - } - } -} - -.comment { - @include clearfix(); - margin: 1em 0; - - &:not(:last-child) { - border-bottom: 1px solid $border-color; - } -} - -.comment__avatar-wrapper { - float: left; - width: 60px; - height: 60px; - - @include breakpoint($large) { - width: 100px; - height: 100px; - } -} - -.comment__avatar { - width: 40px; - height: 40px; - border-radius: 50%; - - @include breakpoint($large) { - width: 80px; - height: 80px; - padding: 5px; - border: 1px solid $border-color; - } -} - -.comment__content-wrapper { - float: right; - width: calc(100% - 60px); - - @include breakpoint($large) { - width: calc(100% - 100px); - } -} - -.comment__author { - margin: 0; - - a { - text-decoration: none; - } -} - -.comment__date { - @extend .page__meta; - margin: 0; - - a { - text-decoration: none; - } -} - -/* - Related - ========================================================================== */ - -.page__related { - @include clearfix(); - float: left; - margin-top: 2em; - padding-top: 1em; - border-top: 1px solid $border-color; - - @include breakpoint($large) { - float: right; - width: calc(100% - #{$right-sidebar-width-narrow}); - } - - @include breakpoint($x-large) { - width: calc(100% - #{$right-sidebar-width}); - } - - a { - color: inherit; - text-decoration: none; - } -} - -.page__related-title { - margin-bottom: 10px; - font-size: $type-size-6; - text-transform: uppercase; -} - -/* - Wide Pages - ========================================================================== */ - -.wide { - .page { - @include breakpoint($large) { - padding-right: 0; - } - - @include breakpoint($x-large) { - padding-right: 0; - } - } - - .page__related { - @include breakpoint($large) { - padding-right: 0; - } - - @include breakpoint($x-large) { - padding-right: 0; - } - } -} diff --git a/_sass/minimal-mistakes/_print.scss b/_sass/minimal-mistakes/_print.scss deleted file mode 100644 index b93f1d4..0000000 --- a/_sass/minimal-mistakes/_print.scss +++ /dev/null @@ -1,252 +0,0 @@ -/* ========================================================================== - PRINT STYLES - ========================================================================== */ - -@media print { - - [hidden] { - display: none; - } - - * { - -moz-box-sizing: border-box; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - - html { - margin: 0; - padding: 0; - min-height: auto !important; - font-size: 16px; - } - - body { - margin: 0 auto; - background: #fff !important; - color: #000 !important; - font-size: 1rem; - line-height: 1.5; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - text-rendering: optimizeLegibility; - } - - h1, - h2, - h3, - h4, - h5, - h6 { - color: #000; - line-height: 1.2; - margin-bottom: 0.75rem; - margin-top: 0; - } - - h1 { - font-size: 2.5rem; - } - - h2 { - font-size: 2rem; - } - - h3 { - font-size: 1.75rem; - } - - h4 { - font-size: 1.5rem; - } - - h5 { - font-size: 1.25rem; - } - - h6 { - font-size: 1rem; - } - - a, - a:visited { - color: #000; - text-decoration: underline; - word-wrap: break-word; - } - - table { - border-collapse: collapse; - } - - thead { - display: table-header-group; - } - - table, - th, - td { - border-bottom: 1px solid #000; - } - - td, - th { - padding: 8px 16px; - } - - img { - border: 0; - display: block; - max-width: 100% !important; - vertical-align: middle; - } - - hr { - border: 0; - border-bottom: 2px solid #bbb; - height: 0; - margin: 2.25rem 0; - padding: 0; - } - - dt { - font-weight: bold; - } - - dd { - margin: 0; - margin-bottom: 0.75rem; - } - - abbr[title], - acronym[title] { - border: 0; - text-decoration: none; - } - - table, - blockquote, - pre, - code, - figure, - li, - hr, - ul, - ol, - a, - tr { - page-break-inside: avoid; - } - - h2, - h3, - h4, - p, - a { - orphans: 3; - widows: 3; - } - - h1, - h2, - h3, - h4, - h5, - h6 { - page-break-after: avoid; - page-break-inside: avoid; - } - - h1 + p, - h2 + p, - h3 + p { - page-break-before: avoid; - } - - img { - page-break-after: auto; - page-break-before: auto; - page-break-inside: avoid; - } - - pre { - white-space: pre-wrap !important; - word-wrap: break-word; - } - - a[href^='http://']:after, - a[href^='https://']:after, - a[href^='ftp://']:after { - content: " (" attr(href) ")"; - font-size: 80%; - } - - abbr[title]:after, - acronym[title]:after { - content: " (" attr(title) ")"; - } - - #main { - max-width: 100%; - } - - .page { - margin: 0; - padding: 0; - width: 100%; - } - - .page-break, - .page-break-before { - page-break-before: always; - } - - .page-break-after { - page-break-after: always; - } - - .no-print { - display: none; - } - - a.no-reformat:after { - content: ''; - } - - abbr[title].no-reformat:after, - acronym[title].no-reformat:after { - content: ''; - } - - .page__hero-caption { - color: #000 !important; - background: #fff !important; - opacity: 1; - - a { - color: #000 !important; - } - } - -/* - Hide the following elements on print - ========================================================================== */ - - .masthead, - .toc, - .page__share, - .page__related, - .pagination, - .ads, - .page__footer, - .page__comments-form, - .author__avatar, - .author__content, - .author__urls-wrapper, - .nav__list, - .sidebar, - .adsbygoogle { - display: none !important; - height: 1px !important; - } -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_reset.scss b/_sass/minimal-mistakes/_reset.scss deleted file mode 100644 index 2259fd0..0000000 --- a/_sass/minimal-mistakes/_reset.scss +++ /dev/null @@ -1,187 +0,0 @@ -/* ========================================================================== - STYLE RESETS - ========================================================================== */ - -* { box-sizing: border-box; } - -html { - /* apply a natural box layout model to all elements */ - box-sizing: border-box; - background-color: $background-color; - font-size: 16px; - - @include breakpoint($medium) { - font-size: 18px; - } - - @include breakpoint($large) { - font-size: 20px; - } - - @include breakpoint($x-large) { - font-size: 22px; - } - - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -/* Remove margin */ - -body { margin: 0; } - -/* Selected elements */ - -::-moz-selection { - color: #fff; - background: #000; -} - -::selection { - color: #fff; - background: #000; -} - -/* Display HTML5 elements in IE6-9 and FF3 */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section { - display: block; -} - -/* Display block in IE6-9 and FF3 */ - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -/* Prevents modern browsers from displaying 'audio' without controls */ - -audio:not([controls]) { - display: none; -} - -a { - color: $link-color; -} - -/* Apply focus state */ - -a:focus { - @extend %tab-focus; -} - -/* Remove outline from links */ - -a:hover, -a:active { - outline: 0; -} - -/* Prevent sub and sup affecting line-height in all browsers */ - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* img border in anchor's and image quality */ - -img { - /* Responsive images (ensure images don't scale beyond their parents) */ - max-width: 100%; /* part 1: Set a maximum relative to the parent*/ - width: auto\9; /* IE7-8 need help adjusting responsive images*/ - height: auto; /* part 2: Scale the height according to the width, otherwise you get stretching*/ - - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -/* Prevent max-width from affecting Google Maps */ - -#map_canvas img, -.google-maps img { - max-width: none; -} - -/* Consistent form font size in all browsers, margin changes, misc */ - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; /* inner spacing ie IE6/7*/ - line-height: normal; /* FF3/4 have !important on line-height in UA stylesheet*/ -} - -button::-moz-focus-inner, -input::-moz-focus-inner { /* inner padding and border oddities in FF3/4*/ - padding: 0; - border: 0; -} - -button, -html input[type="button"], // avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* corrects inability to style clickable `input` types in iOS*/ - cursor: pointer; /* improves usability and consistency of cursor style between image-type `input` and others*/ -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; /* improves usability and consistency of cursor style between image-type `input` and others*/ -} - -input[type="search"] { /* Appearance in Safari/Chrome*/ - box-sizing: border-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; /* inner-padding issues in Chrome OSX, Safari 5*/ -} - -textarea { - overflow: auto; /* remove vertical scrollbar in IE6-9*/ - vertical-align: top; /* readability and alignment cross-browser*/ -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_search.scss b/_sass/minimal-mistakes/_search.scss deleted file mode 100644 index fa7ee83..0000000 --- a/_sass/minimal-mistakes/_search.scss +++ /dev/null @@ -1,132 +0,0 @@ -/* ========================================================================== - SEARCH - ========================================================================== */ - -.layout--search { - .archive__item-teaser { - margin-bottom: 0.25em; - } -} - -.search__toggle { - margin-left: 1rem; - margin-right: 1rem; - height: $nav-toggle-height; - border: 0; - outline: none; - color: $primary-color; - background-color: transparent; - cursor: pointer; - -webkit-transition: 0.2s; - transition: 0.2s; - - &:hover { - color: mix(#000, $primary-color, 25%); - } -} - -.search-icon { - width: 100%; - height: 100%; -} - -.search-content { - display: none; - visibility: hidden; - padding-top: 1em; - padding-bottom: 1em; - - &__inner-wrap { - width: 100%; - margin-left: auto; - margin-right: auto; - padding-left: 1em; - padding-right: 1em; - -webkit-animation: $intro-transition; - animation: $intro-transition; - -webkit-animation-delay: 0.15s; - animation-delay: 0.15s; - - @include breakpoint($x-large) { - max-width: $max-width; - } - - } - - &__form { - background-color: transparent; - } - - .search-input { - display: block; - margin-bottom: 0; - padding: 0; - border: none; - outline: none; - box-shadow: none; - background-color: transparent; - font-size: $type-size-3; - - @include breakpoint($large) { - font-size: $type-size-2; - } - - @include breakpoint($x-large) { - font-size: $type-size-1; - } - } - - &.is--visible { - display: block; - visibility: visible; - - &::after { - content: ""; - display: block; - } - } - - .results__found { - margin-top: 0.5em; - font-size: $type-size-6; - } - - .archive__item { - margin-bottom: 2em; - - @include breakpoint($large) { - width: 75%; - } - - @include breakpoint($x-large) { - width: 50%; - } - } - - .archive__item-title { - margin-top: 0; - } - - .archive__item-excerpt { - margin-bottom: 0; - } -} - -/* Algolia search */ - -.ais-search-box { - max-width: 100% !important; - margin-bottom: 2em; -} - -.archive__item-title .ais-Highlight { - color: $primary-color; - font-style: normal; - text-decoration: underline; -} - -.archive__item-excerpt .ais-Highlight { - color: $primary-color; - font-style: normal; - font-weight: bold; -} diff --git a/_sass/minimal-mistakes/_sidebar.scss b/_sass/minimal-mistakes/_sidebar.scss deleted file mode 100644 index b1f5ca9..0000000 --- a/_sass/minimal-mistakes/_sidebar.scss +++ /dev/null @@ -1,346 +0,0 @@ -/* ========================================================================== - SIDEBAR - ========================================================================== */ - -/* - Default - ========================================================================== */ - -.sidebar { - @include clearfix(); - // @include breakpoint(max-width $large) { - // /* fix z-index order of follow links */ - // position: relative; - // z-index: 10; - // -webkit-transform: translate3d(0, 0, 0); - // transform: translate3d(0, 0, 0); - // } - - @include breakpoint($large) { - float: left; - width: calc(#{$right-sidebar-width-narrow} - 1em); - opacity: 0.75; - -webkit-transition: opacity 0.2s ease-in-out; - transition: opacity 0.2s ease-in-out; - - &:hover { - opacity: 1; - } - - &.sticky { - overflow-y: auto; - /* calculate height of nav list - viewport height - nav height - masthead x-padding - */ - max-height: calc(100vh - #{$nav-height} - 2em); - } - } - - @include breakpoint($x-large) { - width: calc(#{$right-sidebar-width} - 1em); - } - - > * { - margin-top: 1em; - margin-bottom: 1em; - } - - h2, - h3, - h4, - h5, - h6 { - margin-bottom: 0; - font-family: $sans-serif-narrow; - } - - p, - li { - font-family: $sans-serif; - font-size: $type-size-6; - line-height: 1.5; - } - - img { - width: 100%; - - &.emoji { - width: 20px; - height: 20px; - } - } -} - -.sidebar__right { - margin-bottom: 1em; - - @include breakpoint($large) { - position: absolute; - top: 0; - right: 0; - width: $right-sidebar-width-narrow; - margin-right: -1 * $right-sidebar-width-narrow; - padding-left: 1em; - z-index: 10; - - &.sticky { - @include clearfix(); - position: -webkit-sticky; - position: sticky; - top: 2em; - float: right; - } - } - - @include breakpoint($x-large) { - width: $right-sidebar-width; - margin-right: -1 * $right-sidebar-width; - } -} - -.splash .sidebar__right { - @include breakpoint($large) { - position: relative; - float: right; - margin-right: 0; - } - - @include breakpoint($x-large) { - margin-right: 0; - } -} - -/* - Author profile and links - ========================================================================== */ - -.author__avatar { - display: table-cell; - vertical-align: top; - width: 36px; - height: 36px; - - @include breakpoint($large) { - display: block; - width: auto; - height: auto; - } - - img { - max-width: 110px; - border-radius: 50%; - - @include breakpoint($large) { - padding: 5px; - border: 1px solid $border-color; - } - } -} - -.author__content { - display: table-cell; - vertical-align: top; - padding-left: 15px; - padding-right: 25px; - line-height: 1; - - @include breakpoint($large) { - display: block; - width: 100%; - padding-left: 0; - padding-right: 0; - } - - a { - color: inherit; - text-decoration: none; - } -} - -.author__name { - margin: 0; - - @include breakpoint($large) { - margin-top: 10px; - margin-bottom: 10px; - } -} -.sidebar .author__name { - font-family: $sans-serif; - font-size: $type-size-5; -} - -.author__bio { - margin: 0; - - @include breakpoint($large) { - margin-top: 10px; - margin-bottom: 20px; - } -} - -.author__urls-wrapper { - position: relative; - display: table-cell; - vertical-align: middle; - font-family: $sans-serif; - z-index: 20; - cursor: pointer; - - li:last-child { - a { - margin-bottom: 0; - } - } - - .author__urls { - span.label { - padding-left: 5px; - } - } - - @include breakpoint($large) { - display: block; - } - - button { - position: relative; - margin-bottom: 0; - - &:before { - @supports (pointer-events: none) { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - } - } - - &.open { - &:before { - pointer-events: auto; - } - } - - @include breakpoint($large) { - display: none; - } - } -} - -.author__urls { - display: none; - position: absolute; - right: 0; - margin-top: 15px; - padding: 10px; - list-style-type: none; - border: 1px solid $border-color; - border-radius: $border-radius; - background: $background-color; - box-shadow: 0 2px 4px 0 rgba(#000, 0.16), 0 2px 10px 0 rgba(#000, 0.12); - cursor: default; - - &.is--visible { - display: block; - } - - @include breakpoint($large) { - display: block; - position: relative; - margin: 0; - padding: 0; - border: 0; - background: transparent; - box-shadow: none; - } - - &:before { - display: block; - content: ""; - position: absolute; - top: -11px; - left: calc(50% - 10px); - width: 0; - border-style: solid; - border-width: 0 10px 10px; - border-color: $border-color transparent; - z-index: 0; - - @include breakpoint($large) { - display: none; - } - } - - &:after { - display: block; - content: ""; - position: absolute; - top: -10px; - left: calc(50% - 10px); - width: 0; - border-style: solid; - border-width: 0 10px 10px; - border-color: $background-color transparent; - z-index: 1; - - @include breakpoint($large) { - display: none; - } - } - - ul { - padding: 10px; - list-style-type: none; - } - - li { - white-space: nowrap; - } - - a { - display: block; - margin-bottom: 5px; - padding-right: 5px; - padding-top: 2px; - padding-bottom: 2px; - color: inherit; - font-size: $type-size-5; - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } -} - -/* - Wide Pages - ========================================================================== */ - -.wide .sidebar__right { - margin-bottom: 1em; - - @include breakpoint($large) { - position: initial; - top: initial; - right: initial; - width: initial; - margin-right: initial; - padding-left: initial; - z-index: initial; - - &.sticky { - float: none; - } - } - - @include breakpoint($x-large) { - width: initial; - margin-right: initial; - } -} - diff --git a/_sass/minimal-mistakes/_syntax.scss b/_sass/minimal-mistakes/_syntax.scss deleted file mode 100644 index 7265202..0000000 --- a/_sass/minimal-mistakes/_syntax.scss +++ /dev/null @@ -1,324 +0,0 @@ -/* ========================================================================== - Syntax highlighting - ========================================================================== */ - -div.highlighter-rouge, -figure.highlight { - position: relative; - margin-bottom: 1em; - background: $base00; - color: $base05; - font-family: $monospace; - font-size: $type-size-6; - line-height: 1.8; - border-radius: $border-radius; - - > pre, - pre.highlight { - margin: 0; - padding: 1em; - } -} - -.highlight table { - margin-bottom: 0; - font-size: 1em; - border: 0; - - td { - padding: 0; - width: calc(100% - 1em); - border: 0; - - /* line numbers*/ - &.gutter, - &.rouge-gutter { - padding-right: 1em; - width: 1em; - color: $base04; - border-right: 1px solid $base04; - text-align: right; - } - - /* code */ - &.code, - &.rouge-code { - padding-left: 1em; - } - } - - pre { - margin: 0; - } -} - -.highlight pre { - width: 100%; -} - -.highlight .hll { - background-color: $base06; -} -.highlight { - .c { - /* Comment */ - color: $base04; - } - .err { - /* Error */ - color: $base08; - } - .k { - /* Keyword */ - color: $base0e; - } - .l { - /* Literal */ - color: $base09; - } - .n { - /* Name */ - color: $base05; - } - .o { - /* Operator */ - color: $base0c; - } - .p { - /* Punctuation */ - color: $base05; - } - .cm { - /* Comment.Multiline */ - color: $base04; - } - .cp { - /* Comment.Preproc */ - color: $base04; - } - .c1 { - /* Comment.Single */ - color: $base04; - } - .cs { - /* Comment.Special */ - color: $base04; - } - .gd { - /* Generic.Deleted */ - color: $base08; - } - .ge { - /* Generic.Emph */ - font-style: italic; - } - .gh { - /* Generic.Heading */ - color: $base05; - font-weight: bold; - } - .gi { - /* Generic.Inserted */ - color: $base0b; - } - .gp { - /* Generic.Prompt */ - color: $base04; - font-weight: bold; - } - .gs { - /* Generic.Strong */ - font-weight: bold; - } - .gu { - /* Generic.Subheading */ - color: $base0c; - font-weight: bold; - } - .kc { - /* Keyword.Constant */ - color: $base0e; - } - .kd { - /* Keyword.Declaration */ - color: $base0e; - } - .kn { - /* Keyword.Namespace */ - color: $base0c; - } - .kp { - /* Keyword.Pseudo */ - color: $base0e; - } - .kr { - /* Keyword.Reserved */ - color: $base0e; - } - .kt { - /* Keyword.Type */ - color: $base0a; - } - .ld { - /* Literal.Date */ - color: $base0b; - } - .m { - /* Literal.Number */ - color: $base09; - } - .s { - /* Literal.String */ - color: $base0b; - } - .na { - /* Name.Attribute */ - color: $base0d; - } - .nb { - /* Name.Builtin */ - color: $base05; - } - .nc { - /* Name.Class */ - color: $base0a; - } - .no { - /* Name.Constant */ - color: $base08; - } - .nd { - /* Name.Decorator */ - color: $base0c; - } - .ni { - /* Name.Entity */ - color: $base05; - } - .ne { - /* Name.Exception */ - color: $base08; - } - .nf { - /* Name.Function */ - color: $base0d; - } - .nl { - /* Name.Label */ - color: $base05; - } - .nn { - /* Name.Namespace */ - color: $base0a; - } - .nx { - /* Name.Other */ - color: $base0d; - } - .py { - /* Name.Property */ - color: $base05; - } - .nt { - /* Name.Tag */ - color: $base0c; - } - .nv { - /* Name.Variable */ - color: $base08; - } - .ow { - /* Operator.Word */ - color: $base0c; - } - .w { - /* Text.Whitespace */ - color: $base05; - } - .mf { - /* Literal.Number.Float */ - color: $base09; - } - .mh { - /* Literal.Number.Hex */ - color: $base09; - } - .mi { - /* Literal.Number.Integer */ - color: $base09; - } - .mo { - /* Literal.Number.Oct */ - color: $base09; - } - .sb { - /* Literal.String.Backtick */ - color: $base0b; - } - .sc { - /* Literal.String.Char */ - color: $base05; - } - .sd { - /* Literal.String.Doc */ - color: $base04; - } - .s2 { - /* Literal.String.Double */ - color: $base0b; - } - .se { - /* Literal.String.Escape */ - color: $base09; - } - .sh { - /* Literal.String.Heredoc */ - color: $base0b; - } - .si { - /* Literal.String.Interpol */ - color: $base09; - } - .sx { - /* Literal.String.Other */ - color: $base0b; - } - .sr { - /* Literal.String.Regex */ - color: $base0b; - } - .s1 { - /* Literal.String.Single */ - color: $base0b; - } - .ss { - /* Literal.String.Symbol */ - color: $base0b; - } - .bp { - /* Name.Builtin.Pseudo */ - color: $base05; - } - .vc { - /* Name.Variable.Class */ - color: $base08; - } - .vg { - /* Name.Variable.Global */ - color: $base08; - } - .vi { - /* Name.Variable.Instance */ - color: $base08; - } - .il { - /* Literal.Number.Integer.Long */ - color: $base09; - } -} - -.gist { - th, td { - border-bottom: 0; - } -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_tables.scss b/_sass/minimal-mistakes/_tables.scss deleted file mode 100644 index c270a77..0000000 --- a/_sass/minimal-mistakes/_tables.scss +++ /dev/null @@ -1,39 +0,0 @@ -/* ========================================================================== - TABLES - ========================================================================== */ - -table { - display: block; - margin-bottom: 1em; - width: 100%; - font-family: $global-font-family; - font-size: $type-size-6; - border-collapse: collapse; - overflow-x: auto; - - & + table { - margin-top: 1em; - } -} - -thead { - background-color: $border-color; - border-bottom: 2px solid mix(#000, $border-color, 25%); -} - -th { - padding: 0.5em; - font-weight: bold; - text-align: left; -} - -td { - padding: 0.5em; - border-bottom: 1px solid mix(#000, $border-color, 25%); -} - -tr, -td, -th { - vertical-align: middle; -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/_utilities.scss b/_sass/minimal-mistakes/_utilities.scss deleted file mode 100644 index 1c127d3..0000000 --- a/_sass/minimal-mistakes/_utilities.scss +++ /dev/null @@ -1,593 +0,0 @@ -/* ========================================================================== - UTILITY CLASSES - ========================================================================== */ - -/* - Visibility - ========================================================================== */ - -/* http://www.456bereastreet.com/archive/200711/screen_readers_sometimes_ignore_displaynone/ */ - -.hidden, -.is--hidden { - display: none; - visibility: hidden; -} - -/* for preloading images */ - -.load { - display: none; -} - -.transparent { - opacity: 0; -} - -/* https://developer.yahoo.com/blogs/ydn/clip-hidden-content-better-accessibility-53456.html */ - -.visually-hidden, -.screen-reader-text, -.screen-reader-text span, -.screen-reader-shortcut { - position: absolute !important; - clip: rect(1px, 1px, 1px, 1px); - height: 1px !important; - width: 1px !important; - border: 0 !important; - overflow: hidden; -} - -body:hover .visually-hidden a, -body:hover .visually-hidden input, -body:hover .visually-hidden button { - display: none !important; -} - -/* screen readers */ - -.screen-reader-text:focus, -.screen-reader-shortcut:focus { - clip: auto !important; - height: auto !important; - width: auto !important; - display: block; - font-size: 1em; - font-weight: bold; - padding: 15px 23px 14px; - background: #fff; - z-index: 100000; - text-decoration: none; - box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); -} - -/* - Skip links - ========================================================================== */ - -.skip-link { - position: fixed; - z-index: 20; - margin: 0; - font-family: $sans-serif; - white-space: nowrap; -} - -.skip-link li { - height: 0; - width: 0; - list-style: none; -} - -/* - Type - ========================================================================== */ - -.text-left { - text-align: left; -} - -.text-center { - text-align: center; -} - -.text-right { - text-align: right; -} - -.text-justify { - text-align: justify; -} - -.text-nowrap { - white-space: nowrap; -} - -/* - Task lists - ========================================================================== */ - -.task-list { - padding:0; - - li { - list-style-type: none; - } - - .task-list-item-checkbox { - margin-right: 0.5em; - opacity: 1; - } -} - -.task-list .task-list { - margin-left: 1em; -} - -/* - Alignment - ========================================================================== */ - -/* clearfix */ - -.cf { - clear: both; -} - -.wrapper { - margin-left: auto; - margin-right: auto; - width: 100%; -} - -/* - Images - ========================================================================== */ - -/* image align left */ - -.align-left { - display: block; - margin-left: auto; - margin-right: auto; - - @include breakpoint($small) { - float: left; - margin-right: 1em; - } -} - -/* image align right */ - -.align-right { - display: block; - margin-left: auto; - margin-right: auto; - - @include breakpoint($small) { - float: right; - margin-left: 1em; - } -} - -/* image align center */ - -.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -/* file page content container */ - -.full { - @include breakpoint($large) { - margin-right: -1 * span(2.5 of 12) !important; - } -} - -/* - Icons - ========================================================================== */ - -.icon { - display: inline-block; - fill: currentColor; - width: 1em; - height: 1.1em; - line-height: 1; - position: relative; - top: -0.1em; - vertical-align: middle; -} - -/* social icons*/ - -.social-icons { - .fas, - .fab, - .far, - .fal { - color: $text-color; - } - - .fa-behance, - .fa-behance-square { - color: $behance-color; - } - - .fa-bitbucket { - color: $bitbucket-color; - } - - .fa-dribbble, - .fa-dribble-square { - color: $dribbble-color; - } - - .fa-facebook, - .fa-facebook-square, - .fa-facebook-f { - color: $facebook-color; - } - - .fa-flickr { - color: $flickr-color; - } - - .fa-foursquare { - color: $foursquare-color; - } - - .fa-github, - .fa-github-alt, - .fa-github-square { - color: $github-color; - } - - .fa-gitlab { - color: $gitlab-color; - } - - .fa-instagram { - color: $instagram-color; - } - - .fa-keybase { - color: $keybase-color; - } - - .fa-lastfm, - .fa-lastfm-square { - color: $lastfm-color; - } - - .fa-linkedin, - .fa-linkedin-in { - color: $linkedin-color; - } - - .fa-mastodon, - .fa-mastodon-square { - color: $mastodon-color; - } - - .fa-pinterest, - .fa-pinterest-p, - .fa-pinterest-square { - color: $pinterest-color; - } - - .fa-reddit { - color: $reddit-color; - } - - .fa-rss, - .fa-rss-square { - color: $rss-color; - } - - .fa-soundcloud { - color: $soundcloud-color; - } - - .fa-stack-exchange, - .fa-stack-overflow { - color: $stackoverflow-color; - } - - .fa-tumblr, - .fa-tumblr-square { - color: $tumblr-color; - } - - .fa-twitter, - .fa-twitter-square { - color: $twitter-color; - } - - .fa-vimeo, - .fa-vimeo-square, - .fa-vimeo-v { - color: $vimeo-color; - } - - .fa-vine { - color: $vine-color; - } - - .fa-youtube { - color: $youtube-color; - } - - .fa-xing, - .fa-xing-square { - color: $xing-color; - } -} - -/* - Navicons - ========================================================================== */ - -.navicon { - position: relative; - width: $navicon-width; - height: $navicon-height; - background: $primary-color; - margin: auto; - -webkit-transition: 0.3s; - transition: 0.3s; - - &:before, - &:after { - content: ""; - position: absolute; - left: 0; - width: $navicon-width; - height: $navicon-height; - background: $primary-color; - -webkit-transition: 0.3s; - transition: 0.3s; - } - - &:before { - top: (-2 * $navicon-height); - } - - &:after { - bottom: (-2 * $navicon-height); - } -} - -.close .navicon { - /* hide the middle line*/ - background: transparent; - - /* overlay the lines by setting both their top values to 0*/ - &:before, - &:after { - -webkit-transform-origin: 50% 50%; - -ms-transform-origin: 50% 50%; - transform-origin: 50% 50%; - top: 0; - width: $navicon-width; - } - - /* rotate the lines to form the x shape*/ - &:before { - -webkit-transform: rotate3d(0, 0, 1, 45deg); - transform: rotate3d(0, 0, 1, 45deg); - } - &:after { - -webkit-transform: rotate3d(0, 0, 1, -45deg); - transform: rotate3d(0, 0, 1, -45deg); - } -} - -.greedy-nav__toggle { - &:before { - @supports (pointer-events: none) { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - opacity: 0; - background-color: $background-color; - -webkit-transition: $global-transition; - transition: $global-transition; - pointer-events: none; - } - } - - &.close { - &:before { - opacity: 0.9; - -webkit-transition: $global-transition; - transition: $global-transition; - pointer-events: auto; - } - } -} - -.greedy-nav__toggle:hover { - .navicon, - .navicon:before, - .navicon:after { - background: mix(#000, $primary-color, 25%); - } - - &.close { - .navicon { - background: transparent; - } - } -} - -/* - Sticky, fixed to top content - ========================================================================== */ - -.sticky { - @include breakpoint($large) { - @include clearfix(); - position: -webkit-sticky; - position: sticky; - top: 2em; - - > * { - display: block; - } - } -} - -/* - Wells - ========================================================================== */ - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: $border-radius; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -/* - Modals - ========================================================================== */ - -.show-modal { - overflow: hidden; - position: relative; - - &:before { - position: absolute; - content: ""; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 999; - background-color: rgba(255, 255, 255, 0.85); - } - - .modal { - display: block; - } -} - -.modal { - display: none; - position: fixed; - width: 300px; - top: 50%; - left: 50%; - margin-left: -150px; - margin-top: -150px; - min-height: 0; - z-index: 9999; - background: #fff; - border: 1px solid $border-color; - border-radius: $border-radius; - box-shadow: $box-shadow; - - &__title { - margin: 0; - padding: 0.5em 1em; - } - - &__supporting-text { - padding: 0 1em 0.5em 1em; - } - - &__actions { - padding: 0.5em 1em; - border-top: 1px solid $border-color; - } -} - -/* - Footnotes - ========================================================================== */ - -.footnote { - color: mix(#fff, $gray, 25%); - text-decoration: none; -} - -.footnotes { - color: mix(#fff, $gray, 25%); - - ol, - li, - p { - margin-bottom: 0; - font-size: $type-size-6; - } -} - -a.reversefootnote { - color: $gray; - text-decoration: none; - - &:hover { - text-decoration: underline; - } -} - -/* - Required - ========================================================================== */ - -.required { - color: $danger-color; - font-weight: bold; -} - -/* - Google Custom Search Engine - ========================================================================== */ - -.gsc-control-cse { - table, - tr, - td { - border: 0; /* remove table borders widget */ - } -} - -/* - Responsive Video Embed - ========================================================================== */ - -.responsive-video-container { - position: relative; - margin-bottom: 1em; - padding-bottom: 56.25%; - height: 0; - overflow: hidden; - max-width: 100%; - - iframe, - object, - embed { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} - -// full screen video fixes -:-webkit-full-screen-ancestor { - .masthead, - .page__footer { - position: static; - } -} diff --git a/_sass/minimal-mistakes/_variables.scss b/_sass/minimal-mistakes/_variables.scss deleted file mode 100644 index 4065a0e..0000000 --- a/_sass/minimal-mistakes/_variables.scss +++ /dev/null @@ -1,169 +0,0 @@ -/* ========================================================================== - Variables - ========================================================================== */ - -/* - Typography - ========================================================================== */ - -$doc-font-size: 16 !default; - -/* paragraph indention */ -$paragraph-indent: false !default; // true, false (default) -$indent-var: 1.3em !default; - -/* system typefaces */ -$serif: Georgia, Times, serif !default; -$sans-serif: -apple-system, BlinkMacSystemFont, "Roboto", "Segoe UI", - "Helvetica Neue", "Lucida Grande", Arial, sans-serif !default; -$monospace: Monaco, Consolas, "Lucida Console", monospace !default; - -/* sans serif typefaces */ -$sans-serif-narrow: $sans-serif !default; -$helvetica: Helvetica, "Helvetica Neue", Arial, sans-serif !default; - -/* serif typefaces */ -$georgia: Georgia, serif !default; -$times: Times, serif !default; -$bodoni: "Bodoni MT", serif !default; -$calisto: "Calisto MT", serif !default; -$garamond: Garamond, serif !default; - -$global-font-family: $sans-serif !default; -$header-font-family: $sans-serif !default; -$caption-font-family: $serif !default; - -/* type scale */ -$type-size-1: 2.441em !default; // ~39.056px -$type-size-2: 1.953em !default; // ~31.248px -$type-size-3: 1.563em !default; // ~25.008px -$type-size-4: 1.25em !default; // ~20px -$type-size-5: 1em !default; // ~16px -$type-size-6: 0.75em !default; // ~12px -$type-size-7: 0.6875em !default; // ~11px -$type-size-8: 0.625em !default; // ~10px - -/* headline scale */ -$h-size-1: 1.563em !default; // ~25.008px -$h-size-2: 1.25em !default; // ~20px -$h-size-3: 1.125em !default; // ~18px -$h-size-4: 1.0625em !default; // ~17px -$h-size-5: 1.03125em !default; // ~16.5px -$h-size-6: 1em !default; // ~16px - -/* - Colors - ========================================================================== */ - -$gray: #7a8288 !default; -$dark-gray: mix(#000, $gray, 50%) !default; -$darker-gray: mix(#000, $gray, 60%) !default; -$light-gray: mix(#fff, $gray, 50%) !default; -$lighter-gray: mix(#fff, $gray, 90%) !default; - -$background-color: #fff !default; -$code-background-color: #fafafa !default; -$code-background-color-dark: $light-gray !default; -$text-color: $dark-gray !default; -$muted-text-color: mix(#fff, $text-color, 20%) !default; -$border-color: $lighter-gray !default; -$form-background-color: $lighter-gray !default; -$footer-background-color: $lighter-gray !default; - -$primary-color: #6f777d !default; -$success-color: #3fa63f !default; -$warning-color: #d67f05 !default; -$danger-color: #ee5f5b !default; -$info-color: #3b9cba !default; -$focus-color: $primary-color !default; -$active-color: mix(#fff, $primary-color, 80%) !default; - -/* YIQ color contrast */ -$yiq-contrasted-dark-default: $dark-gray !default; -$yiq-contrasted-light-default: #fff !default; -$yiq-contrasted-threshold: 175 !default; -$yiq-debug: false !default; - -/* brands */ -$behance-color: #1769ff !default; -$bitbucket-color: #205081 !default; -$dribbble-color: #ea4c89 !default; -$facebook-color: #3b5998 !default; -$flickr-color: #ff0084 !default; -$foursquare-color: #0072b1 !default; -$github-color: #171516 !default; -$gitlab-color: #e24329 !default; -$instagram-color: #517fa4 !default; -$keybase-color: #ef7639 !default; -$lastfm-color: #d51007 !default; -$linkedin-color: #007bb6 !default; -$mastodon-color: #2b90d9 !default; -$pinterest-color: #cb2027 !default; -$reddit-color: #ff4500 !default; -$rss-color: #fa9b39 !default; -$soundcloud-color: #ff3300 !default; -$stackoverflow-color: #fe7a15 !default; -$tumblr-color: #32506d !default; -$twitter-color: #55acee !default; -$vimeo-color: #1ab7ea !default; -$vine-color: #00bf8f !default; -$youtube-color: #bb0000 !default; -$xing-color: #006567 !default; - -/* links */ -$link-color: mix(#000, $info-color, 20%) !default; -$link-color-hover: mix(#000, $link-color, 25%) !default; -$link-color-visited: mix(#fff, $link-color, 15%) !default; -$masthead-link-color: $primary-color !default; -$masthead-link-color-hover: mix(#000, $primary-color, 25%) !default; -$navicon-link-color-hover: mix(#fff, $primary-color, 75%) !default; - -/* syntax highlighting (base16) */ -$base00: #263238 !default; -$base01: #2e3c43 !default; -$base02: #314549 !default; -$base03: #546e7a !default; -$base04: #b2ccd6 !default; -$base05: #eeffff !default; -$base06: #eeffff !default; -$base07: #ffffff !default; -$base08: #f07178 !default; -$base09: #f78c6c !default; -$base0a: #ffcb6b !default; -$base0b: #c3e88d !default; -$base0c: #89ddff !default; -$base0d: #82aaff !default; -$base0e: #c792ea !default; -$base0f: #ff5370 !default; - -/* - Breakpoints - ========================================================================== */ - -$small: 600px !default; -$medium: 768px !default; -$medium-wide: 900px !default; -$large: 1024px !default; -$x-large: 1280px !default; -$max-width: $x-large !default; - -/* - Grid - ========================================================================== */ - -$right-sidebar-width-narrow: 200px !default; -$right-sidebar-width: 300px !default; -$right-sidebar-width-wide: 400px !default; - -/* - Other - ========================================================================== */ - -$border-radius: 4px !default; -$box-shadow: 0 1px 1px rgba(0, 0, 0, 0.125) !default; -$nav-height: 2em !default; -$nav-toggle-height: 2rem !default; -$navicon-width: 1.5rem !default; -$navicon-height: 0.25rem !default; -$global-transition: all 0.2s ease-in-out !default; -$intro-transition: intro 0.3s both !default; diff --git a/_sass/minimal-mistakes/skins/_air.scss b/_sass/minimal-mistakes/skins/_air.scss deleted file mode 100644 index 0e5360c..0000000 --- a/_sass/minimal-mistakes/skins/_air.scss +++ /dev/null @@ -1,23 +0,0 @@ -/* ========================================================================== - Air skin - ========================================================================== */ - -/* Colors */ -$background-color: #eeeeee !default; -$text-color: #222831 !default; -$muted-text-color: #393e46 !default; -$primary-color: #0092ca !default; -$border-color: mix(#fff, #393e46, 75%) !default; -$footer-background-color: $primary-color !default; -$link-color: #393e46 !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: $text-color !default; -$navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; - -.page__footer { - color: #fff !important; // override -} - -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} diff --git a/_sass/minimal-mistakes/skins/_aqua.scss b/_sass/minimal-mistakes/skins/_aqua.scss deleted file mode 100644 index f5a69af..0000000 --- a/_sass/minimal-mistakes/skins/_aqua.scss +++ /dev/null @@ -1,30 +0,0 @@ -/* ========================================================================== - Aqua skin - ========================================================================== */ - -/* Colors */ -$gray : #1976d2 !default; -$dark-gray : mix(#000, $gray, 40%) !default; -$darker-gray : mix(#000, $gray, 60%) !default; -$light-gray : mix(#fff, $gray, 50%) !default; -$lighter-gray : mix(#fff, $gray, 90%) !default; - -$body-color : #fff !default; -$background-color : #f0fff0 !default; -$code-background-color : $lighter-gray !default; -$code-background-color-dark : $light-gray !default; -$text-color : $dark-gray !default; -$border-color : $lighter-gray !default; - -$primary-color : $gray !default; -$success-color : #27ae60 !default; -$warning-color : #e67e22 !default; -$danger-color : #c0392b !default; -$info-color : #03a9f4 !default; - -/* links */ -$link-color : $info-color !default; -$link-color-hover : mix(#000, $link-color, 25%) !default; -$link-color-visited : mix(#fff, $link-color, 25%) !default; -$masthead-link-color : $primary-color !default; -$masthead-link-color-hover : mix(#000, $primary-color, 25%) !default; \ No newline at end of file diff --git a/_sass/minimal-mistakes/skins/_contrast.scss b/_sass/minimal-mistakes/skins/_contrast.scss deleted file mode 100644 index 38283b8..0000000 --- a/_sass/minimal-mistakes/skins/_contrast.scss +++ /dev/null @@ -1,52 +0,0 @@ -/* ========================================================================== - Contrast skin - ========================================================================== */ - -/* Colors */ -$text-color: #000 !default; -$muted-text-color: $text-color !default; -$primary-color: #ff0000 !default; -$border-color: mix(#fff, $text-color, 75%) !default; -$footer-background-color: #000 !default; -$link-color: #0000ff !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: $text-color !default; -$navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; - -/* contrast syntax highlighting (base16) */ -$base00: #000000 !default; -$base01: #242422 !default; -$base02: #484844 !default; -$base03: #6c6c66 !default; -$base04: #918f88 !default; -$base05: #b5b3aa !default; -$base06: #d9d7cc !default; -$base07: #fdfbee !default; -$base08: #ff6c60 !default; -$base09: #e9c062 !default; -$base0a: #ffffb6 !default; -$base0b: #a8ff60 !default; -$base0c: #c6c5fe !default; -$base0d: #96cbfe !default; -$base0e: #ff73fd !default; -$base0f: #b18a3d !default; - -.page__content { - .notice, - .notice--primary, - .notice--info, - .notice--warning, - .notice--success, - .notice--danger { - color: $text-color; - } -} - -.page__footer { - color: #fff !important; // override -} - -.page__footer-follow .social-icons i, -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} diff --git a/_sass/minimal-mistakes/skins/_dark.scss b/_sass/minimal-mistakes/skins/_dark.scss deleted file mode 100644 index d3d24ef..0000000 --- a/_sass/minimal-mistakes/skins/_dark.scss +++ /dev/null @@ -1,30 +0,0 @@ -/* ========================================================================== - Dark skin - ========================================================================== */ - -/* Colors */ -$background-color: #252a34 !default; -$text-color: #eaeaea !default; -$primary-color: #00adb5 !default; -$border-color: mix(#fff, $background-color, 20%) !default; -$code-background-color: mix(#000, $background-color, 15%) !default; -$code-background-color-dark: mix(#000, $background-color, 20%) !default; -$form-background-color: mix(#000, $background-color, 15%) !default; -$footer-background-color: mix(#000, $background-color, 30%) !default; -$link-color: mix($primary-color, $text-color, 40%) !default; -$link-color-hover: mix(#fff, $link-color, 25%) !default; -$link-color-visited: mix(#000, $link-color, 25%) !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: mix(#000, $text-color, 20%) !default; -$navicon-link-color-hover: mix(#000, $background-color, 30%) !default; - -.author__urls.social-icons i, -.author__urls.social-icons .svg-inline--fa, -.page__footer-follow .social-icons i, -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} - -.ais-search-box .ais-search-box--input { - background-color: $form-background-color; -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/skins/_default.scss b/_sass/minimal-mistakes/skins/_default.scss deleted file mode 100644 index 7489b58..0000000 --- a/_sass/minimal-mistakes/skins/_default.scss +++ /dev/null @@ -1,5 +0,0 @@ -/* ========================================================================== - Default skin - ========================================================================== */ - -// Intentionally left blank diff --git a/_sass/minimal-mistakes/skins/_dirt.scss b/_sass/minimal-mistakes/skins/_dirt.scss deleted file mode 100644 index 5090f55..0000000 --- a/_sass/minimal-mistakes/skins/_dirt.scss +++ /dev/null @@ -1,33 +0,0 @@ -/* ========================================================================== - Dirt skin - ========================================================================== */ - -/* Colors */ -$background-color: #f3f3f3 !default; -$text-color: #343434 !default; -$muted-text-color: #8e8b82 !default; -$primary-color: #343434 !default; -$border-color: #e9dcbe !default; -$footer-background-color: #e9dcbe !default; -$link-color: #343434 !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: $text-color !default; -$navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; - -/* dirt syntax highlighting (base16) */ -$base00: #231e18 !default; -$base01: #302b25 !default; -$base02: #48413a !default; -$base03: #9d8b70 !default; -$base04: #b4a490 !default; -$base05: #cabcb1 !default; -$base06: #d7c8bc !default; -$base07: #e4d4c8 !default; -$base08: #d35c5c !default; -$base09: #ca7f32 !default; -$base0a: #e0ac16 !default; -$base0b: #b7ba53 !default; -$base0c: #6eb958 !default; -$base0d: #88a4d3 !default; -$base0e: #bb90e2 !default; -$base0f: #b49368 !default; diff --git a/_sass/minimal-mistakes/skins/_mint.scss b/_sass/minimal-mistakes/skins/_mint.scss deleted file mode 100644 index 28557a3..0000000 --- a/_sass/minimal-mistakes/skins/_mint.scss +++ /dev/null @@ -1,24 +0,0 @@ -/* ========================================================================== - Mint skin - ========================================================================== */ - -/* Colors */ -$background-color: #f3f6f6 !default; -$text-color: #40514e !default; -$muted-text-color: #40514e !default; -$primary-color: #11999e !default; -$border-color: mix(#fff, #40514e, 75%) !default; -$footer-background-color: #30e3ca !default; -$link-color: #11999e !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: $text-color !default; -$navicon-link-color-hover: mix(#fff, $text-color, 80%) !default; - -.page__footer { - color: #fff !important; // override -} - -.page__footer-follow .social-icons i, -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} diff --git a/_sass/minimal-mistakes/skins/_neon.scss b/_sass/minimal-mistakes/skins/_neon.scss deleted file mode 100644 index 737e6b4..0000000 --- a/_sass/minimal-mistakes/skins/_neon.scss +++ /dev/null @@ -1,59 +0,0 @@ -/* ========================================================================== - Neon skin - ========================================================================== */ - -/* Colors */ -$background-color: #141010 !default; -$text-color: #fff6fb !default; -$primary-color: #f21368 !default; -$border-color: mix(#fff, $background-color, 20%) !default; -$code-background-color: mix(#000, $background-color, 15%) !default; -$code-background-color-dark: mix(#000, $background-color, 20%) !default; -$form-background-color: mix(#000, $background-color, 15%) !default; -$footer-background-color: mix($primary-color, #000, 10%) !default; -$link-color: $primary-color !default; -$link-color-hover: mix(#fff, $link-color, 25%) !default; -$link-color-visited: mix(#000, $link-color, 25%) !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: mix(#000, $text-color, 20%) !default; -$navicon-link-color-hover: mix(#000, $background-color, 30%) !default; - -/* neon syntax highlighting (base16) */ -$base00: #ffffff !default; -$base01: #e0e0e0 !default; -$base02: #d0d0d0 !default; -$base03: #b0b0b0 !default; -$base04: #000000 !default; -$base05: #101010 !default; -$base06: #151515 !default; -$base07: #202020 !default; -$base08: #ff0086 !default; -$base09: #fd8900 !default; -$base0a: #aba800 !default; -$base0b: #00c918 !default; -$base0c: #1faaaa !default; -$base0d: #3777e6 !default; -$base0e: #ad00a1 !default; -$base0f: #cc6633 !default; - -.author__urls.social-icons i, -.author__urls.social-icons .svg-inline--fa, -.page__footer-follow .social-icons i, -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} - -/* next/previous buttons */ -.pagination--pager { - color: $text-color; - background-color: $primary-color; - border-color: transparent; - - &:visited { - color: $text-color; - } -} - -.ais-search-box .ais-search-box--input { - background-color: $form-background-color; -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/skins/_plum.scss b/_sass/minimal-mistakes/skins/_plum.scss deleted file mode 100644 index 135db90..0000000 --- a/_sass/minimal-mistakes/skins/_plum.scss +++ /dev/null @@ -1,66 +0,0 @@ -/* ========================================================================== - Plum skin - ========================================================================== */ - -/* Colors */ -$background-color: #521477 !default; -$text-color: #fffd86 !default; -$primary-color: #c327ab !default; -$border-color: mix(#fff, $background-color, 20%) !default; -$code-background-color: mix(#000, $background-color, 15%) !default; -$code-background-color-dark: mix(#000, $background-color, 20%) !default; -$form-background-color: mix(#000, $background-color, 15%) !default; -$footer-background-color: mix(#000, $background-color, 25%) !default; -$link-color: $primary-color !default; -$link-color-hover: mix(#fff, $link-color, 25%) !default; -$link-color-visited: mix(#000, $link-color, 25%) !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: mix(#000, $text-color, 20%) !default; -$navicon-link-color-hover: mix(#000, $background-color, 30%) !default; - -/* plum syntax highlighting (base16) */ -$base00: #ffffff !default; -$base01: #e0e0e0 !default; -$base02: #d0d0d0 !default; -$base03: #b0b0b0 !default; -$base04: #000000 !default; -$base05: #101010 !default; -$base06: #151515 !default; -$base07: #202020 !default; -$base08: #ff0086 !default; -$base09: #fd8900 !default; -$base0a: #aba800 !default; -$base0b: #00c918 !default; -$base0c: #1faaaa !default; -$base0d: #3777e6 !default; -$base0e: #ad00a1 !default; -$base0f: #cc6633 !default; - -.author__urls.social-icons i, -.author__urls.social-icons .svg-inline--fa, -.page__footer-follow .social-icons i, -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} - -.page__content { - a, - a:visited { - color: inherit; - } -} - -/* next/previous buttons */ -.pagination--pager { - color: $text-color; - background-color: $primary-color; - border-color: transparent; - - &:visited { - color: $text-color; - } -} - -.ais-search-box .ais-search-box--input { - background-color: $form-background-color; -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/skins/_sunrise.scss b/_sass/minimal-mistakes/skins/_sunrise.scss deleted file mode 100644 index f23d4f9..0000000 --- a/_sass/minimal-mistakes/skins/_sunrise.scss +++ /dev/null @@ -1,46 +0,0 @@ -/* ========================================================================== - Sunrise skin - ========================================================================== */ - -/* Colors */ -$dark-gray: #0e2431 !default; -$background-color: #e8d5b7 !default; -$text-color: #000 !default; -$muted-text-color: $dark-gray !default; -$primary-color: #fc3a52 !default; -$border-color: mix(#000, $background-color, 20%) !default; -$code-background-color: mix(#fff, $background-color, 20%) !default; -$code-background-color-dark: mix(#000, $background-color, 10%) !default; -$form-background-color: mix(#fff, $background-color, 15%) !default; -$footer-background-color: #f9b248 !default; -$link-color: mix(#000, $primary-color, 10%) !default; -$link-color-hover: mix(#fff, $link-color, 25%) !default; -$link-color-visited: mix(#000, $link-color, 25%) !default; -$masthead-link-color: $text-color !default; -$masthead-link-color-hover: mix(#000, $text-color, 20%) !default; -$navicon-link-color-hover: mix(#000, $background-color, 30%) !default; - -/* sunrise syntax highlighting (base16) */ -$base00: #1d1f21 !default; -$base01: #282a2e !default; -$base02: #373b41 !default; -$base03: #969896 !default; -$base04: #b4b7b4 !default; -$base05: #c5c8c6 !default; -$base06: #e0e0e0 !default; -$base07: #ffffff !default; -$base08: #cc6666 !default; -$base09: #de935f !default; -$base0a: #f0c674 !default; -$base0b: #b5bd68 !default; -$base0c: #8abeb7 !default; -$base0d: #81a2be !default; -$base0e: #b294bb !default; -$base0f: #a3685a !default; - -.author__urls.social-icons i, -.author__urls.social-icons .svg-inline--fa, -.page__footer-follow .social-icons i, -.page__footer-follow .social-icons .svg-inline--fa { - color: inherit; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss b/_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss deleted file mode 100644 index a0528eb..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_breakpoint.scss +++ /dev/null @@ -1,114 +0,0 @@ -////////////////////////////// -// Default Variables -////////////////////////////// -$Breakpoint-Settings: ( - 'default media': all, - 'default feature': min-width, - 'default pair': width, - - 'force all media type': false, - 'to ems': false, - 'transform resolutions': true, - - 'no queries': false, - 'no query fallbacks': false, - - 'base font size': 16px, - - 'legacy syntax': false -); - -$breakpoint: () !default; - -////////////////////////////// -// Imports -////////////////////////////// -@import "settings"; -@import "context"; -@import "helpers"; -@import "parsers"; -@import "no-query"; - -@import "respond-to"; - -@import "legacy-settings"; - -////////////////////////////// -// Breakpoint Mixin -////////////////////////////// - -@mixin breakpoint($query, $no-query: false) { - @include legacy-settings-warning; - - // Reset contexts - @include private-breakpoint-reset-contexts(); - - $breakpoint: breakpoint($query, false); - - $query-string: map-get($breakpoint, 'query'); - $query-fallback: map-get($breakpoint, 'fallback'); - - $private-breakpoint-context-holder: map-get($breakpoint, 'context holder') !global; - $private-breakpoint-query-count: map-get($breakpoint, 'query count') !global; - - // Allow for an as-needed override or usage of no query fallback. - @if $no-query != false { - $query-fallback: $no-query; - } - - @if $query-fallback != false { - $context-setter: private-breakpoint-set-context('no-query', $query-fallback); - } - - // Print Out Query String - @if not breakpoint-get('no queries') { - @media #{$query-string} { - @content; - } - } - - @if breakpoint-get('no query fallbacks') != false or breakpoint-get('no queries') == true { - - $type: type-of(breakpoint-get('no query fallbacks')); - $print: false; - - @if ($type == 'bool') { - $print: true; - } - @else if ($type == 'string') { - @if $query-fallback == breakpoint-get('no query fallbacks') { - $print: true; - } - } - @else if ($type == 'list') { - @each $wrapper in breakpoint-get('no query fallbacks') { - @if $query-fallback == $wrapper { - $print: true; - } - } - } - - // Write Fallback - @if ($query-fallback != false) and ($print == true) { - $type-fallback: type-of($query-fallback); - - @if ($type-fallback != 'bool') { - #{$query-fallback} & { - @content; - } - } - @else { - @content; - } - } - } - - @include private-breakpoint-reset-contexts(); -} - - -@mixin mq($query, $no-query: false) { - @include breakpoint($query, $no-query) { - @content; - } -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_context.scss b/_sass/minimal-mistakes/vendor/breakpoint/_context.scss deleted file mode 100644 index 57947f5..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_context.scss +++ /dev/null @@ -1,95 +0,0 @@ -////////////////////////////// -// Private Breakpoint Variables -////////////////////////////// -$private-breakpoint-context-holder: (); -$private-breakpoint-query-count: 0 !default; - -////////////////////////////// -// Breakpoint Has Context -// Returns whether or not you are inside a Breakpoint query -////////////////////////////// -@function breakpoint-has-context() { - @if length($private-breakpoint-query-count) { - @return true; - } - @else { - @return false; - } -} - -////////////////////////////// -// Breakpoint Get Context -// $feature: Input feature to get it's current MQ context. Returns false if no context -////////////////////////////// -@function breakpoint-get-context($feature) { - @if map-has-key($private-breakpoint-context-holder, $feature) { - $get: map-get($private-breakpoint-context-holder, $feature); - // Special handling of no-query from get side so /false/ prepends aren't returned - @if $feature == 'no-query' { - @if type-of($get) == 'list' and length($get) > 1 and nth($get, 1) == false { - $get: nth($get, length($get)); - } - } - @return $get; - } - @else { - @if breakpoint-has-context() and $feature == 'media' { - @return breakpoint-get('default media'); - } - @else { - @return false; - } - } -} - -////////////////////////////// -// Private function to set context -////////////////////////////// -@function private-breakpoint-set-context($feature, $value) { - @if $value == 'monochrome' { - $feature: 'monochrome'; - } - - $current: map-get($private-breakpoint-context-holder, $feature); - @if $current and length($current) == $private-breakpoint-query-count { - @warn "You have already queried against `#{$feature}`. Unexpected things may happen if you query against the same feature more than once in the same `and` query. Breakpoint is overwriting the current context with `#{$value}`"; - } - - @if not map-has-key($private-breakpoint-context-holder, $feature) { - $v-holder: (); - @for $i from 1 to $private-breakpoint-query-count { - @if $feature == 'media' { - $v-holder: append($v-holder, breakpoint-get('default media')); - } - @else { - $v-holder: append($v-holder, false); - } - } - $v-holder: append($v-holder, $value); - $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; - } - @else { - $v-holder: map-get($private-breakpoint-context-holder, $feature); - $length: length($v-holder); - @for $i from $length to $private-breakpoint-query-count - 1 { - @if $feature == 'media' { - $v-holder: append($v-holder, breakpoint-get('default media')); - } - @else { - $v-holder: append($v-holder, false); - } - } - $v-holder: append($v-holder, $value); - $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($feature: $v-holder)) !global; - } - - @return true; -} - -////////////////////////////// -// Private function to reset context -////////////////////////////// -@mixin private-breakpoint-reset-contexts { - $private-breakpoint-context-holder: () !global; - $private-breakpoint-query-count: 0 !global; -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss b/_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss deleted file mode 100644 index 97e522d..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_helpers.scss +++ /dev/null @@ -1,151 +0,0 @@ -////////////////////////////// -// Converts the input value to Base EMs -////////////////////////////// -@function breakpoint-to-base-em($value) { - $value-unit: unit($value); - - // Will convert relative EMs into root EMs. - @if breakpoint-get('base font size') and type-of(breakpoint-get('base font size')) == 'number' and $value-unit == 'em' { - $base-unit: unit(breakpoint-get('base font size')); - - @if $base-unit == 'px' or $base-unit == '%' or $base-unit == 'em' or $base-unit == 'pt' { - @return base-conversion($value) / base-conversion(breakpoint-get('base font size')) * 1em; - } - @else { - @warn '#{breakpoint-get(\'base font size\')} is not set in valid units for font size!'; - @return false; - } - } - @else { - @return base-conversion($value); - } -} - -@function base-conversion($value) { - $unit: unit($value); - - @if $unit == 'px' { - @return $value / 16px * 1em; - } - @else if $unit == '%' { - @return $value / 100% * 1em; - } - @else if $unit == 'em' { - @return $value; - } - @else if $unit == 'pt' { - @return $value / 12pt * 1em; - } - @else { - @return $value; -// @warn 'Everything is terrible! What have you done?!'; - } -} - -////////////////////////////// -// Returns whether the feature can have a min/max pair -////////////////////////////// -$breakpoint-min-max-features: 'color', - 'color-index', - 'aspect-ratio', - 'device-aspect-ratio', - 'device-height', - 'device-width', - 'height', - 'monochrome', - 'resolution', - 'width'; - -@function breakpoint-min-max($feature) { - @each $item in $breakpoint-min-max-features { - @if $feature == $item { - @return true; - } - } - @return false; -} - -////////////////////////////// -// Returns whether the feature can have a string value -////////////////////////////// -$breakpoint-string-features: 'orientation', - 'scan', - 'color', - 'aspect-ratio', - 'device-aspect-ratio', - 'pointer', - 'luminosity'; - -@function breakpoint-string-value($feature) { - @each $item in $breakpoint-string-features { - @if breakpoint-min-max($item) { - @if $feature == 'min-#{$item}' or $feature == 'max-#{$item}' { - @return true; - } - } - @else if $feature == $item { - @return true; - } - } - @return false; -} - -////////////////////////////// -// Returns whether the feature is a media type -////////////////////////////// -$breakpoint-media-types: 'all', - 'braille', - 'embossed', - 'handheld', - 'print', - 'projection', - 'screen', - 'speech', - 'tty', - 'tv'; - -@function breakpoint-is-media($feature) { - @each $media in $breakpoint-media-types { - @if ($feature == $media) or ($feature == 'not #{$media}') or ($feature == 'only #{$media}') { - @return true; - } - } - - @return false; -} - -////////////////////////////// -// Returns whether the feature can stand alone -////////////////////////////// -$breakpoint-single-string-features: 'color', - 'color-index', - 'grid', - 'monochrome'; - -@function breakpoint-single-string($feature) { - @each $item in $breakpoint-single-string-features { - @if $feature == $item { - @return true; - } - } - @return false; -} - -////////////////////////////// -// Returns whether the feature -////////////////////////////// -@function breakpoint-is-resolution($feature) { - $resolutions: 'device-pixel-ratio', 'dpr'; - - @if breakpoint-get('transform resolutions') { - $resolutions: append($resolutions, 'resolution'); - } - - @each $reso in $resolutions { - @if index($feature, $reso) or index($feature, 'min-#{$reso}') or index($feature, 'max-#{$reso}') { - @return true; - } - } - - @return false; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss b/_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss deleted file mode 100644 index e060ebe..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_legacy-settings.scss +++ /dev/null @@ -1,50 +0,0 @@ -@mixin legacy-settings-warning { - $legacyVars: ( - 'default-media': 'default media', - 'default-feature': 'default feature', - 'force-media-all': 'force all media type', - 'to-ems': 'to ems', - 'resolutions': 'transform resolutions', - 'no-queries': 'no queries', - 'no-query-fallbacks': 'no query fallbacks', - 'base-font-size': 'base font size', - 'legacy-syntax': 'legacy syntax' - ); - - @each $legacy, $new in $legacyVars { - @if global-variable-exists('breakpoint-' + $legacy) { - @warn "In order to avoid variable namspace collisions, we have updated the way to change settings for Breakpoint. Please change all instances of `$breakpoint-#{$legacy}: {{setting}}` to `@include breakpoint-set('#{$new}', {{setting}})`. Variable settings, as well as this warning will be deprecated in a future release." - } - }; - - ////////////////////////////// - // Hand correct each setting - ////////////////////////////// - @if global-variable-exists('breakpoint-default-media') and $breakpoint-default-media != breakpoint-get('default media') { - @include breakpoint-set('default media', $breakpoint-default-media); - } - @if global-variable-exists('breakpoint-default-feature') and $breakpoint-default-feature != breakpoint-get('default feature') { - @include breakpoint-set('default feature', $breakpoint-default-feature); - } - @if global-variable-exists('breakpoint-force-media-all') and $breakpoint-force-media-all != breakpoint-get('force all media type') { - @include breakpoint-set('force all media type', $breakpoint-force-media-all); - } - @if global-variable-exists('breakpoint-to-ems') and $breakpoint-to-ems != breakpoint-get('to ems') { - @include breakpoint-set('to ems', $breakpoint-to-ems); - } - @if global-variable-exists('breakpoint-resolutions') and $breakpoint-resolutions != breakpoint-get('transform resolutions') { - @include breakpoint-set('transform resolutions', $breakpoint-resolutions); - } - @if global-variable-exists('breakpoint-no-queries') and $breakpoint-no-queries != breakpoint-get('no queries') { - @include breakpoint-set('no queries', $breakpoint-no-queries); - } - @if global-variable-exists('breakpoint-no-query-fallbacks') and $breakpoint-no-query-fallbacks != breakpoint-get('no query fallbacks') { - @include breakpoint-set('no query fallbacks', $breakpoint-no-query-fallbacks); - } - @if global-variable-exists('breakpoint-base-font-size') and $breakpoint-base-font-size != breakpoint-get('base font size') { - @include breakpoint-set('base font size', $breakpoint-base-font-size); - } - @if global-variable-exists('breakpoint-legacy-syntax') and $breakpoint-legacy-syntax != breakpoint-get('legacy syntax') { - @include breakpoint-set('legacy syntax', $breakpoint-legacy-syntax); - } -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss b/_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss deleted file mode 100644 index 0b5a81f..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_no-query.scss +++ /dev/null @@ -1,15 +0,0 @@ -@function breakpoint-no-query($query) { - @if type-of($query) == 'list' { - $keyword: nth($query, 1); - - @if type-of($keyword) == 'string' and ($keyword == 'no-query' or $keyword == 'no query' or $keyword == 'fallback') { - @return nth($query, 2); - } - @else { - @return false; - } - } - @else { - @return false; - } -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_parsers.scss b/_sass/minimal-mistakes/vendor/breakpoint/_parsers.scss deleted file mode 100644 index f0b053f..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_parsers.scss +++ /dev/null @@ -1,215 +0,0 @@ -////////////////////////////// -// Import Parser Pieces -////////////////////////////// -@import "parsers/query"; -@import "parsers/single"; -@import "parsers/double"; -@import "parsers/triple"; -@import "parsers/resolution"; - -$Memo-Exists: function-exists(memo-get) and function-exists(memo-set); - -////////////////////////////// -// Breakpoint Function -////////////////////////////// -@function breakpoint($query, $contexts...) { - $run: true; - $return: (); - - // Grab the Memo Output if Memoization can be a thing - @if $Memo-Exists { - $return: memo-get(breakpoint, breakpoint $query $contexts); - - @if $return != null { - $run: false; - } - } - - @if not $Memo-Exists or $run { - // Internal Variables - $query-string: ''; - $query-fallback: false; - $return: (); - - // Reserve Global Private Breakpoint Context - $holder-context: $private-breakpoint-context-holder; - $holder-query-count: $private-breakpoint-query-count; - - // Reset Global Private Breakpoint Context - $private-breakpoint-context-holder: () !global; - $private-breakpoint-query-count: 0 !global; - - - // Test to see if it's a comma-separated list - $or-list: if(list-separator($query) == 'comma', true, false); - - - @if ($or-list == false and breakpoint-get('legacy syntax') == false) { - $query-string: breakpoint-parse($query); - } - @else { - $length: length($query); - - $last: nth($query, $length); - $query-fallback: breakpoint-no-query($last); - - @if ($query-fallback != false) { - $length: $length - 1; - } - - @if (breakpoint-get('legacy syntax') == true) { - $mq: (); - - @for $i from 1 through $length { - $mq: append($mq, nth($query, $i), comma); - } - - $query-string: breakpoint-parse($mq); - } - @else { - $query-string: ''; - @for $i from 1 through $length { - $query-string: $query-string + if($i == 1, '', ', ') + breakpoint-parse(nth($query, $i)); - } - } - } - - $return: ('query': $query-string, - 'fallback': $query-fallback, - 'context holder': $private-breakpoint-context-holder, - 'query count': $private-breakpoint-query-count - ); - @if length($contexts) > 0 and nth($contexts, 1) != false { - @if $query-fallback != false { - $context-setter: private-breakpoint-set-context('no-query', $query-fallback); - } - $context-map: (); - @each $context in $contexts { - $context-map: map-merge($context-map, ($context: breakpoint-get-context($context))); - } - $return: map-merge($return, (context: $context-map)); - } - - // Reset Global Private Breakpoint Context - $private-breakpoint-context-holder: () !global; - $private-breakpoint-query-count: 0 !global; - - @if $Memo-Exists { - $holder: memo-set(breakpoint, breakpoint $query $contexts, $return); - } - } - - @return $return; -} - -////////////////////////////// -// General Breakpoint Parser -////////////////////////////// -@function breakpoint-parse($query) { - // Increase number of 'and' queries - $private-breakpoint-query-count: $private-breakpoint-query-count + 1 !global; - - // Set up Media Type - $query-print: ''; - - $force-all: ((breakpoint-get('force all media type') == true) and (breakpoint-get('default media') == 'all')); - $empty-media: true; - @if ($force-all == true) or (breakpoint-get('default media') != 'all') { - // Force the print of the default media type if (force all is true and default media type is all) or (default media type is not all) - $query-print: breakpoint-get('default media'); - $empty-media: false; - } - - - $query-resolution: false; - - $query-holder: breakpoint-parse-query($query); - - - - // Loop over each parsed out query and write it to $query-print - $first: true; - - @each $feature in $query-holder { - $length: length($feature); - - // Parse a single feature - @if ($length == 1) { - // Feature is currently a list, grab the actual value - $feature: nth($feature, 1); - - // Media Type must by convention be the first item, so it's safe to flat override $query-print, which right now should only be the default media type - @if (breakpoint-is-media($feature)) { - @if ($force-all == true) or ($feature != 'all') { - // Force the print of the default media type if (force all is true and default media type is all) or (default media type is not all) - $query-print: $feature; - $empty-media: false; - - // Set Context - $context-setter: private-breakpoint-set-context(media, $query-print); - } - } - @else { - $parsed: breakpoint-parse-single($feature, $empty-media, $first); - $query-print: '#{$query-print} #{$parsed}'; - $first: false; - } - } - // Parse a double feature - @else if ($length == 2) { - @if (breakpoint-is-resolution($feature) != false) { - $query-resolution: $feature; - } - @else { - $parsed: null; - // If it's a string/number pair, - // we check to see if one is a single-string value, - // then we parse it as a normal double - $alpha: nth($feature, 1); - $beta: nth($feature, 2); - @if breakpoint-single-string($alpha) or breakpoint-single-string($beta) { - $parsed: breakpoint-parse-single($alpha, $empty-media, $first); - $query-print: '#{$query-print} #{$parsed}'; - $first: false; - $parsed: breakpoint-parse-single($beta, $empty-media, $first); - $query-print: '#{$query-print} #{$parsed}'; - } - @else { - $parsed: breakpoint-parse-double($feature, $empty-media, $first); - $query-print: '#{$query-print} #{$parsed}'; - $first: false; - } - } - } - // Parse a triple feature - @else if ($length == 3) { - $parsed: breakpoint-parse-triple($feature, $empty-media, $first); - $query-print: '#{$query-print} #{$parsed}'; - $first: false; - } - - } - - @if ($query-resolution != false) { - $query-print: breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first); - } - - // Loop through each feature that's been detected so far and append 'false' to the the value list to increment their counters - @each $f, $v in $private-breakpoint-context-holder { - $v-holder: $v; - $length: length($v-holder); - @if length($v-holder) < $private-breakpoint-query-count { - @for $i from $length to $private-breakpoint-query-count { - @if $f == 'media' { - $v-holder: append($v-holder, breakpoint-get('default media')); - } - @else { - $v-holder: append($v-holder, false); - } - } - } - $private-breakpoint-context-holder: map-merge($private-breakpoint-context-holder, ($f: $v-holder)) !global; - } - - @return $query-print; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss b/_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss deleted file mode 100644 index e2462c5..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_respond-to.scss +++ /dev/null @@ -1,82 +0,0 @@ -//////////////////////// -// Default the Breakpoints variable -//////////////////////// -$breakpoints: () !default; -$BREAKPOINTS: () !default; - -//////////////////////// -// Respond-to API Mixin -//////////////////////// -@mixin respond-to($context, $no-query: false) { - @if length($breakpoints) > 0 and length($BREAKPOINTS) == 0 { - @warn "In order to avoid variable namespace collisions, we have updated the way to add breakpoints for respond-to. Please change all instances of `$breakpoints: add-breakpoint()` to `@include add-breakpoint()`. The `add-breakpoint()` function will be deprecated in a future release."; - $BREAKPOINTS: $breakpoints !global; - $breakpoints: () !global; - } - - @if type-of($BREAKPOINTS) != 'map' { - // Just in case someone writes gibberish to the $breakpoints variable. - @warn "Your breakpoints aren't a map! `respond-to` expects a map. Please check the value of $BREAKPOINTS variable."; - @content; - } - @else if map-has-key($BREAKPOINTS, $context) { - @include breakpoint(map-get($BREAKPOINTS, $context), $no-query) { - @content; - } - } - @else if not map-has-key($BREAKPOINTS, $context) { - @warn "`#{$context}` isn't a defined breakpoint! Please add it using `$breakpoints: add-breakpoint(`#{$context}`, $value);`"; - @content; - } - @else { - @warn "You haven't created any breakpoints yet! Make some already! `@include add-breakpoint($name, $bkpt)`"; - @content; - } -} - -////////////////////////////// -// Add Breakpoint to Breakpoints -// TODO: Remove function in next release -////////////////////////////// -@function add-breakpoint($name, $bkpt, $overwrite: false) { - $output: ($name: $bkpt); - - @if length($breakpoints) == 0 { - @return $output; - } - @else { - @if map-has-key($breakpoints, $name) and $overwrite != true { - @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; - @return $breakpoints; - } - @else if not map-has-key($breakpoints, $name) or $overwrite == true { - @return map-merge($breakpoints, $output); - } - } -} - -@mixin add-breakpoint($name, $bkpt, $overwrite: false) { - $output: ($name: $bkpt); - - @if length($BREAKPOINTS) == 0 { - $BREAKPOINTS: $output !global; - } - @else { - @if map-has-key($BREAKPOINTS, $name) and $overwrite != true { - @warn "You already have a breakpoint named `#{$name}`, please choose another breakpoint name, or pass in `$overwrite: true` to overwrite the previous breakpoint."; - $BREAKPOINTS: $BREAKPOINTS !global; - } - @else if not map-has-key($BREAKPOINTS, $name) or $overwrite == true { - $BREAKPOINTS: map-merge($BREAKPOINTS, $output) !global; - } - } -} - -@function get-breakpoint($name: false) { - @if $name == false { - @return $BREAKPOINTS; - } - @else { - @return map-get($BREAKPOINTS, $name); - } -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/_settings.scss b/_sass/minimal-mistakes/vendor/breakpoint/_settings.scss deleted file mode 100644 index 05ee689..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/_settings.scss +++ /dev/null @@ -1,71 +0,0 @@ -////////////////////////////// -// Has Setting -////////////////////////////// -@function breakpoint-has($setting) { - @if map-has-key($breakpoint, $setting) { - @return true; - } - @else { - @return false; - } -} - -////////////////////////////// -// Get Settings -////////////////////////////// -@function breakpoint-get($setting) { - @if breakpoint-has($setting) { - @return map-get($breakpoint, $setting); - } - @else { - @return map-get($Breakpoint-Settings, $setting); - } -} - -////////////////////////////// -// Set Settings -////////////////////////////// -@function breakpoint-set($setting, $value) { - @if (str-index($setting, '-') or str-index($setting, '_')) and str-index($setting, ' ') == null { - @warn "Words in Breakpoint settings should be separated by spaces, not dashes or underscores. Please replace dashes and underscores between words with spaces. Settings will not work as expected until changed."; - } - $breakpoint: map-merge($breakpoint, ($setting: $value)) !global; - @return true; -} - -@mixin breakpoint-change($setting, $value) { - $breakpoint-change: breakpoint-set($setting, $value); -} - -@mixin breakpoint-set($setting, $value) { - @include breakpoint-change($setting, $value); -} - -@mixin bkpt-change($setting, $value) { - @include breakpoint-change($setting, $value); -} -@mixin bkpt-set($setting, $value) { - @include breakpoint-change($setting, $value); -} - -////////////////////////////// -// Remove Setting -////////////////////////////// -@function breakpoint-reset($settings...) { - @if length($settings) == 1 { - $settings: nth($settings, 1); - } - - @each $setting in $settings { - $breakpoint: map-remove($breakpoint, $setting) !global; - } - @return true; -} - -@mixin breakpoint-reset($settings...) { - $breakpoint-reset: breakpoint-reset($settings); -} - -@mixin bkpt-reset($settings...) { - $breakpoint-reset: breakpoint-reset($settings); -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss deleted file mode 100644 index 24580c1..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_double.scss +++ /dev/null @@ -1,33 +0,0 @@ -////////////////////////////// -// Import Pieces -////////////////////////////// -@import "double/default-pair"; -@import "double/double-string"; -@import "double/default"; - -@function breakpoint-parse-double($feature, $empty-media, $first) { - $parsed: ''; - $leader: ''; - // If we're forcing - @if not ($empty-media) or not ($first) { - $leader: 'and '; - } - - $first: nth($feature, 1); - $second: nth($feature, 2); - - // If we've got two numbers, we know we need to use the default pair because there are no media queries that has a media feature that is a number - @if type-of($first) == 'number' and type-of($second) == 'number' { - $parsed: breakpoint-parse-default-pair($first, $second); - } - // If they are both strings, we send it through the string parser - @else if type-of($first) == 'string' and type-of($second) == 'string' { - $parsed: breakpoint-parse-double-string($first, $second); - } - // If it's a string/number pair, we parse it as a normal double - @else { - $parsed: breakpoint-parse-double-default($first, $second); - } - - @return $leader + $parsed; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss deleted file mode 100644 index b138b39..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_query.scss +++ /dev/null @@ -1,82 +0,0 @@ -@function breakpoint-parse-query($query) { - // Parse features out of an individual query - $feature-holder: (); - $query-holder: (); - $length: length($query); - - @if $length == 2 { - // If we've got a string/number, number/string, check to see if it's a valid string/number pair or two singles - @if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'number') or (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'string') { - - $number: ''; - $value: ''; - - @if type-of(nth($query, 1)) == 'string' { - $number: nth($query, 2); - $value: nth($query, 1); - } - @else { - $number: nth($query, 1); - $value: nth($query, 2); - } - - // If the string value can be a single value, check to see if the number passed in is a valid input for said single value. Fortunately, all current single-value options only accept unitless numbers, so this check is easy. - @if breakpoint-single-string($value) { - @if unitless($number) { - $feature-holder: append($value, $number, space); - $query-holder: append($query-holder, $feature-holder, comma); - @return $query-holder; - } - } - // If the string is a media type, split the query - @if breakpoint-is-media($value) { - $query-holder: append($query-holder, nth($query, 1)); - $query-holder: append($query-holder, nth($query, 2)); - @return $query-holder; - } - // If it's not a single feature, we're just going to assume it's a proper string/value pair, and roll with it. - @else { - $feature-holder: append($value, $number, space); - $query-holder: append($query-holder, $feature-holder, comma); - @return $query-holder; - } - - } - // If they're both numbers, we assume it's a double and roll with that - @else if (type-of(nth($query, 1)) == 'number' and type-of(nth($query, 2)) == 'number') { - $feature-holder: append(nth($query, 1), nth($query, 2), space); - $query-holder: append($query-holder, $feature-holder, comma); - @return $query-holder; - } - // If they're both strings and neither are singles, we roll with that. - @else if (type-of(nth($query, 1)) == 'string' and type-of(nth($query, 2)) == 'string') { - @if not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) { - $feature-holder: append(nth($query, 1), nth($query, 2), space); - $query-holder: append($query-holder, $feature-holder, comma); - @return $query-holder; - } - } - } - @else if $length == 3 { - // If we've got three items and none is a list, we check to see - @if type-of(nth($query, 1)) != 'list' and type-of(nth($query, 2)) != 'list' and type-of(nth($query, 3)) != 'list' { - // If none of the items are single string values and none of the values are media values, we're good. - @if (not breakpoint-single-string(nth($query, 1)) and not breakpoint-single-string(nth($query, 2)) and not breakpoint-single-string(nth($query, 3))) and ((not breakpoint-is-media(nth($query, 1)) and not breakpoint-is-media(nth($query, 2)) and not breakpoint-is-media(nth($query, 3)))) { - $feature-holder: append(nth($query, 1), nth($query, 2), space); - $feature-holder: append($feature-holder, nth($query, 3), space); - $query-holder: append($query-holder, $feature-holder, comma); - @return $query-holder; - } - // let's check to see if the first item is a media type - @else if breakpoint-is-media(nth($query, 1)) { - $query-holder: append($query-holder, nth($query, 1)); - $feature-holder: append(nth($query, 2), nth($query, 3), space); - $query-holder: append($query-holder, $feature-holder); - @return $query-holder; - } - } - } - - // If it's a single item, or if it's not a special case double or triple, we can simply return the query. - @return $query; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss deleted file mode 100644 index 19769ad..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_resolution.scss +++ /dev/null @@ -1,31 +0,0 @@ -@import "resolution/resolution"; - -@function breakpoint-build-resolution($query-print, $query-resolution, $empty-media, $first) { - $leader: ''; - // If we're forcing - @if not ($empty-media) or not ($first) { - $leader: 'and '; - } - - @if breakpoint-get('transform resolutions') and $query-resolution { - $resolutions: breakpoint-make-resolutions($query-resolution); - $length: length($resolutions); - $query-holder: ''; - - @for $i from 1 through $length { - $query: '#{$query-print} #{$leader}#{nth($resolutions, $i)}'; - @if $i == 1 { - $query-holder: $query; - } - @else { - $query-holder: '#{$query-holder}, #{$query}'; - } - } - - @return $query-holder; - } - @else { - // Return with attached resolution - @return $query-print; - } -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss deleted file mode 100644 index d9fd764..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_single.scss +++ /dev/null @@ -1,26 +0,0 @@ -////////////////////////////// -// Import Pieces -////////////////////////////// -@import "single/default"; - -@function breakpoint-parse-single($feature, $empty-media, $first) { - $parsed: ''; - $leader: ''; - // If we're forcing - @if not ($empty-media) or not ($first) { - $leader: 'and '; - } - - // If it's a single feature that can stand alone, we let it - @if (breakpoint-single-string($feature)) { - $parsed: $feature; - // Set Context - $context-setter: private-breakpoint-set-context($feature, $feature); - } - // If it's not a stand alone feature, we pass it off to the default handler. - @else { - $parsed: breakpoint-parse-default($feature); - } - - @return $leader + '(' + $parsed + ')'; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss deleted file mode 100644 index e273206..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/_triple.scss +++ /dev/null @@ -1,36 +0,0 @@ -////////////////////////////// -// Import Pieces -////////////////////////////// -@import "triple/default"; - -@function breakpoint-parse-triple($feature, $empty-media, $first) { - $parsed: ''; - $leader: ''; - - // If we're forcing - @if not ($empty-media) or not ($first) { - $leader: 'and '; - } - - // separate the string features from the value numbers - $string: null; - $numbers: null; - @each $val in $feature { - @if type-of($val) == string { - $string: $val; - } - @else { - @if type-of($numbers) == 'null' { - $numbers: $val; - } - @else { - $numbers: append($numbers, $val); - } - } - } - - $parsed: breakpoint-parse-triple-default($string, nth($numbers, 1), nth($numbers, 2)); - - @return $leader + $parsed; - -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss deleted file mode 100644 index f88432c..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default-pair.scss +++ /dev/null @@ -1,21 +0,0 @@ -@function breakpoint-parse-default-pair($first, $second) { - $default: breakpoint-get('default pair'); - $min: ''; - $max: ''; - - // Sort into min and max - $min: min($first, $second); - $max: max($first, $second); - - // Set Context - $context-setter: private-breakpoint-set-context(min-#{$default}, $min); - $context-setter: private-breakpoint-set-context(max-#{$default}, $max); - - // Make them EMs if need be - @if (breakpoint-get('to ems') == true) { - $min: breakpoint-to-base-em($min); - $max: breakpoint-to-base-em($max); - } - - @return '(min-#{$default}: #{$min}) and (max-#{$default}: #{$max})'; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss deleted file mode 100644 index 73190ed..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_default.scss +++ /dev/null @@ -1,22 +0,0 @@ -@function breakpoint-parse-double-default($first, $second) { - $feature: ''; - $value: ''; - - @if type-of($first) == 'string' { - $feature: $first; - $value: $second; - } - @else { - $feature: $second; - $value: $first; - } - - // Set Context - $context-setter: private-breakpoint-set-context($feature, $value); - - @if (breakpoint-get('to ems') == true) { - $value: breakpoint-to-base-em($value); - } - - @return '(#{$feature}: #{$value})' -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss deleted file mode 100644 index c6fd0cb..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/double/_double-string.scss +++ /dev/null @@ -1,22 +0,0 @@ -@function breakpoint-parse-double-string($first, $second) { - $feature: ''; - $value: ''; - - // Test to see which is the feature and which is the value - @if (breakpoint-string-value($first) == true) { - $feature: $first; - $value: $second; - } - @else if (breakpoint-string-value($second) == true) { - $feature: $second; - $value: $first; - } - @else { - @warn "Neither #{$first} nor #{$second} is a valid media query name."; - } - - // Set Context - $context-setter: private-breakpoint-set-context($feature, $value); - - @return '(#{$feature}: #{$value})'; -} \ No newline at end of file diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss deleted file mode 100644 index 3680421..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/resolution/_resolution.scss +++ /dev/null @@ -1,60 +0,0 @@ -@function breakpoint-make-resolutions($resolution) { - $length: length($resolution); - - $output: (); - - @if $length == 2 { - $feature: ''; - $value: ''; - - // Find which is number - @if type-of(nth($resolution, 1)) == 'number' { - $value: nth($resolution, 1); - } - @else { - $value: nth($resolution, 2); - } - - // Determine min/max/standard - @if index($resolution, 'min-resolution') { - $feature: 'min-'; - } - @else if index($resolution, 'max-resolution') { - $feature: 'max-'; - } - - $standard: '(#{$feature}resolution: #{$value})'; - - // If we're not dealing with dppx, - @if unit($value) != 'dppx' { - $base: 96dpi; - @if unit($value) == 'dpcm' { - $base: 243.84dpcm; - } - // Write out feature tests - $webkit: ''; - $moz: ''; - $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / $base})'; - $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / $base})'; - // Append to output - $output: append($output, $standard, space); - $output: append($output, $webkit, space); - $output: append($output, $moz, space); - } - @else { - $webkit: ''; - $moz: ''; - $webkit: '(-webkit-#{$feature}device-pixel-ratio: #{$value / 1dppx})'; - $moz: '(#{$feature}-moz-device-pixel-ratio: #{$value / 1dppx})'; - $fallback: '(#{$feature}resolution: #{$value / 1dppx * 96dpi})'; - // Append to output - $output: append($output, $standard, space); - $output: append($output, $webkit, space); - $output: append($output, $moz, space); - $output: append($output, $fallback, space); - } - - } - - @return $output; -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss deleted file mode 100644 index 503ef42..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/single/_default.scss +++ /dev/null @@ -1,13 +0,0 @@ -@function breakpoint-parse-default($feature) { - $default: breakpoint-get('default feature'); - - // Set Context - $context-setter: private-breakpoint-set-context($default, $feature); - - @if (breakpoint-get('to ems') == true) and (type-of($feature) == 'number') { - @return '#{$default}: #{breakpoint-to-base-em($feature)}'; - } - @else { - @return '#{$default}: #{$feature}'; - } -} diff --git a/_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss b/_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss deleted file mode 100644 index 7fa418d..0000000 --- a/_sass/minimal-mistakes/vendor/breakpoint/parsers/triple/_default.scss +++ /dev/null @@ -1,18 +0,0 @@ -@function breakpoint-parse-triple-default($feature, $first, $second) { - - // Sort into min and max - $min: min($first, $second); - $max: max($first, $second); - - // Set Context - $context-setter: private-breakpoint-set-context(min-#{$feature}, $min); - $context-setter: private-breakpoint-set-context(max-#{$feature}, $max); - - // Make them EMs if need be - @if (breakpoint-get('to ems') == true) { - $min: breakpoint-to-base-em($min); - $max: breakpoint-to-base-em($max); - } - - @return '(min-#{$feature}: #{$min}) and (max-#{$feature}: #{$max})'; -} diff --git a/_sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss b/_sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss deleted file mode 100644 index 27b27bc..0000000 --- a/_sass/minimal-mistakes/vendor/magnific-popup/_magnific-popup.scss +++ /dev/null @@ -1,649 +0,0 @@ -/* Magnific Popup CSS */ - -@import "settings"; - -//////////////////////// -// -// Contents: -// -// 1. Default Settings -// 2. General styles -// - Transluscent overlay -// - Containers, wrappers -// - Cursors -// - Helper classes -// 3. Appearance -// - Preloader & text that displays error messages -// - CSS reset for buttons -// - Close icon -// - "1 of X" counter -// - Navigation (left/right) arrows -// - Iframe content type styles -// - Image content type styles -// - Media query where size of arrows is reduced -// - IE7 support -// -//////////////////////// - - - -//////////////////////// -// 1. Default Settings -//////////////////////// - -$mfp-overlay-color: #0b0b0b !default; -$mfp-overlay-opacity: 0.8 !default; -$mfp-shadow: 0 0 8px rgba(0, 0, 0, 0.6) !default; // shadow on image or iframe -$mfp-popup-padding-left: 8px !default; // Padding from left and from right side -$mfp-popup-padding-left-mobile: 6px !default; // Same as above, but is applied when width of window is less than 800px - -$mfp-z-index-base: 1040 !default; // Base z-index of popup -$mfp-include-arrows: true !default; // include styles for nav arrows -$mfp-controls-opacity: 0.65 !default; -$mfp-controls-color: #FFF !default; -$mfp-controls-border-color: #3F3F3F !default; -$mfp-inner-close-icon-color: #333 !default; -$mfp-controls-text-color: #CCC !default; // Color of preloader and "1 of X" indicator -$mfp-controls-text-color-hover: #FFF !default; -$mfp-IE7support: true !default; // Very basic IE7 support - -// Iframe-type options -$mfp-include-iframe-type: true !default; -$mfp-iframe-padding-top: 40px !default; -$mfp-iframe-background: #000 !default; -$mfp-iframe-max-width: 900px !default; -$mfp-iframe-ratio: 9/16 !default; - -// Image-type options -$mfp-include-image-type: true !default; -$mfp-image-background: #444 !default; -$mfp-image-padding-top: 40px !default; -$mfp-image-padding-bottom: 40px !default; -$mfp-include-mobile-layout-for-image: true !default; // Removes paddings from top and bottom - -// Image caption options -$mfp-caption-title-color: #F3F3F3 !default; -$mfp-caption-subtitle-color: #BDBDBD !default; - -// A11y -$mfp-use-visuallyhidden: false !default; // Hide content from browsers, but make it available for screen readers - - - -//////////////////////// -// 2. General styles -//////////////////////// - -// Transluscent overlay -.mfp-bg { - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: $mfp-z-index-base + 2; - overflow: hidden; - position: fixed; - - background: $mfp-overlay-color; - opacity: $mfp-overlay-opacity; - @if $mfp-IE7support { - filter: unquote("alpha(opacity=#{$mfp-overlay-opacity*100})"); - } -} - -// Wrapper for popup -.mfp-wrap { - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: $mfp-z-index-base + 3; - position: fixed; - outline: none !important; - -webkit-backface-visibility: hidden; // fixes webkit bug that can cause "false" scrollbar -} - -// Root container -.mfp-container { - text-align: center; - position: absolute; - width: 100%; - height: 100%; - left: 0; - top: 0; - padding: 0 $mfp-popup-padding-left; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -// Vertical centerer helper -.mfp-container { - &:before { - content: ''; - display: inline-block; - height: 100%; - vertical-align: middle; - } -} - -// Remove vertical centering when popup has class `mfp-align-top` -.mfp-align-top { - .mfp-container { - &:before { - display: none; - } - } -} - -// Popup content holder -.mfp-content { - position: relative; - display: inline-block; - vertical-align: middle; - margin: 0 auto; - text-align: left; - z-index: $mfp-z-index-base + 5; -} -.mfp-inline-holder, -.mfp-ajax-holder { - .mfp-content { - width: 100%; - cursor: auto; - } -} - -// Cursors -.mfp-ajax-cur { - cursor: progress; -} -.mfp-zoom-out-cur { - &, .mfp-image-holder .mfp-close { - cursor: -moz-zoom-out; - cursor: -webkit-zoom-out; - cursor: zoom-out; - } -} -.mfp-zoom { - cursor: pointer; - cursor: -webkit-zoom-in; - cursor: -moz-zoom-in; - cursor: zoom-in; -} -.mfp-auto-cursor { - .mfp-content { - cursor: auto; - } -} - -.mfp-close, -.mfp-arrow, -.mfp-preloader, -.mfp-counter { - -webkit-user-select:none; - -moz-user-select: none; - user-select: none; -} - -// Hide the image during the loading -.mfp-loading { - &.mfp-figure { - display: none; - } -} - -// Helper class that hides stuff -@if $mfp-use-visuallyhidden { - // From HTML5 Boilerplate https://github.com/h5bp/html5-boilerplate/blob/v4.2.0/doc/css.md#visuallyhidden - .mfp-hide { - border: 0 !important; - clip: rect(0 0 0 0) !important; - height: 1px !important; - margin: -1px !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - width: 1px !important; - } -} @else { - .mfp-hide { - display: none !important; - } -} - - -//////////////////////// -// 3. Appearance -//////////////////////// - -// Preloader and text that displays error messages -.mfp-preloader { - color: $mfp-controls-text-color; - position: absolute; - top: 50%; - width: auto; - text-align: center; - margin-top: -0.8em; - left: 8px; - right: 8px; - z-index: $mfp-z-index-base + 4; - a { - color: $mfp-controls-text-color; - &:hover { - color: $mfp-controls-text-color-hover; - } - } -} - -// Hide preloader when content successfully loaded -.mfp-s-ready { - .mfp-preloader { - display: none; - } -} - -// Hide content when it was not loaded -.mfp-s-error { - .mfp-content { - display: none; - } -} - -// CSS-reset for buttons -button { - &.mfp-close, - &.mfp-arrow { - overflow: visible; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; - display: block; - outline: none; - padding: 0; - z-index: $mfp-z-index-base + 6; - -webkit-box-shadow: none; - box-shadow: none; - } - &::-moz-focus-inner { - padding: 0; - border: 0 - } -} - - -// Close icon -.mfp-close { - width: 44px; - height: 44px; - line-height: 44px; - - position: absolute; - right: 0; - top: 0; - text-decoration: none; - text-align: center; - opacity: $mfp-controls-opacity; - @if $mfp-IE7support { - filter: unquote("alpha(opacity=#{$mfp-controls-opacity*100})"); - } - padding: 0 0 18px 10px; - color: $mfp-controls-color; - - font-style: normal; - font-size: 28px; - font-family: $serif; - - &:hover, - &:focus { - opacity: 1; - @if $mfp-IE7support { - filter: unquote("alpha(opacity=#{1*100})"); - } - } - - &:active { - top: 1px; - } -} -.mfp-close-btn-in { - .mfp-close { - color: $mfp-inner-close-icon-color; - } -} -.mfp-image-holder, -.mfp-iframe-holder { - .mfp-close { - color: $mfp-controls-color; - right: -6px; - text-align: right; - padding-right: 6px; - width: 100%; - } -} - -// "1 of X" counter -.mfp-counter { - position: absolute; - top: 0; - right: 0; - color: $mfp-controls-text-color; - font-size: 12px; - line-height: 18px; -} - -// Navigation arrows -@if $mfp-include-arrows { - .mfp-arrow { - position: absolute; - opacity: $mfp-controls-opacity; - @if $mfp-IE7support { - filter: unquote("alpha(opacity=#{$mfp-controls-opacity*100})"); - } - margin: 0; - top: 50%; - margin-top: -55px; - padding: 0; - width: 90px; - height: 110px; - -webkit-tap-highlight-color: rgba(0,0,0,0); - &:active { - margin-top: -54px; - } - &:hover, - &:focus { - opacity: 1; - @if $mfp-IE7support { - filter: unquote("alpha(opacity=#{1*100})"); - } - } - &:before, - &:after, - .mfp-b, - .mfp-a { - content: ''; - display: block; - width: 0; - height: 0; - position: absolute; - left: 0; - top: 0; - margin-top: 35px; - margin-left: 35px; - border: medium inset transparent; - } - - &:after, - .mfp-a { - - border-top-width: 13px; - border-bottom-width: 13px; - top:8px; - } - - &:before, - .mfp-b { - border-top-width: 21px; - border-bottom-width: 21px; - opacity: 0.7; - } - - } - - .mfp-arrow-left { - left: 0; - - &:after, - .mfp-a { - border-right: 17px solid $mfp-controls-color; - margin-left: 31px; - } - &:before, - .mfp-b { - margin-left: 25px; - border-right: 27px solid $mfp-controls-border-color; - } - } - - .mfp-arrow-right { - right: 0; - &:after, - .mfp-a { - border-left: 17px solid $mfp-controls-color; - margin-left: 39px - } - &:before, - .mfp-b { - border-left: 27px solid $mfp-controls-border-color; - } - } -} - - - -// Iframe content type -@if $mfp-include-iframe-type { - .mfp-iframe-holder { - padding-top: $mfp-iframe-padding-top; - padding-bottom: $mfp-iframe-padding-top; - .mfp-content { - line-height: 0; - width: 100%; - max-width: $mfp-iframe-max-width; - } - .mfp-close { - top: -40px; - } - } - .mfp-iframe-scaler { - width: 100%; - height: 0; - overflow: hidden; - padding-top: $mfp-iframe-ratio * 100%; - iframe { - position: absolute; - display: block; - top: 0; - left: 0; - width: 100%; - height: 100%; - box-shadow: $mfp-shadow; - background: $mfp-iframe-background; - } - } -} - - - -// Image content type -@if $mfp-include-image-type { - - /* Main image in popup */ - img { - &.mfp-img { - width: auto; - max-width: 100%; - height: auto; - display: block; - line-height: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: $mfp-image-padding-top 0 $mfp-image-padding-bottom; - margin: 0 auto; - } - } - - /* The shadow behind the image */ - .mfp-figure { - line-height: 0; - &:after { - content: ''; - position: absolute; - left: 0; - top: $mfp-image-padding-top; - bottom: $mfp-image-padding-bottom; - display: block; - right: 0; - width: auto; - height: auto; - z-index: -1; - box-shadow: $mfp-shadow; - background: $mfp-image-background; - } - small { - color: $mfp-caption-subtitle-color; - display: block; - font-size: 12px; - line-height: 14px; - } - figure { - margin: 0; - } - figcaption { - margin-top: 0; - margin-bottom: 0; // reset for bottom spacing - } - } - .mfp-bottom-bar { - margin-top: -$mfp-image-padding-bottom + 4; - position: absolute; - top: 100%; - left: 0; - width: 100%; - cursor: auto; - } - .mfp-title { - text-align: left; - line-height: 18px; - color: $mfp-caption-title-color; - word-wrap: break-word; - padding-right: 36px; // leave some space for counter at right side - } - - .mfp-image-holder { - .mfp-content { - max-width: 100%; - } - } - - .mfp-gallery { - .mfp-image-holder { - .mfp-figure { - cursor: pointer; - } - } - } - - - @if $mfp-include-mobile-layout-for-image { - @media screen and (max-width: 800px) and (orientation:landscape), screen and (max-height: 300px) { - /** - * Remove all paddings around the image on small screen - */ - .mfp-img-mobile { - .mfp-image-holder { - padding-left: 0; - padding-right: 0; - } - img { - &.mfp-img { - padding: 0; - } - } - .mfp-figure { - // The shadow behind the image - &:after { - top: 0; - bottom: 0; - } - small { - display: inline; - margin-left: 5px; - } - } - .mfp-bottom-bar { - background: rgba(0,0,0,0.6); - bottom: 0; - margin: 0; - top: auto; - padding: 3px 5px; - position: fixed; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - &:empty { - padding: 0; - } - } - .mfp-counter { - right: 5px; - top: 3px; - } - .mfp-close { - top: 0; - right: 0; - width: 35px; - height: 35px; - line-height: 35px; - background: rgba(0, 0, 0, 0.6); - position: fixed; - text-align: center; - padding: 0; - } - } - } - } -} - - - -// Scale navigation arrows and reduce padding from sides -@media all and (max-width: 900px) { - .mfp-arrow { - -webkit-transform: scale(0.75); - transform: scale(0.75); - } - .mfp-arrow-left { - -webkit-transform-origin: 0; - transform-origin: 0; - } - .mfp-arrow-right { - -webkit-transform-origin: 100%; - transform-origin: 100%; - } - .mfp-container { - padding-left: $mfp-popup-padding-left-mobile; - padding-right: $mfp-popup-padding-left-mobile; - } -} - - - -// IE7 support -// Styles that make popup look nicier in old IE -@if $mfp-IE7support { - .mfp-ie7 { - .mfp-img { - padding: 0; - } - .mfp-bottom-bar { - width: 600px; - left: 50%; - margin-left: -300px; - margin-top: 5px; - padding-bottom: 5px; - } - .mfp-container { - padding: 0; - } - .mfp-content { - padding-top: 44px; - } - .mfp-close { - top: 0; - right: 0; - padding-top: 0; - } - } -} diff --git a/_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss b/_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss deleted file mode 100644 index e7866b3..0000000 --- a/_sass/minimal-mistakes/vendor/magnific-popup/_settings.scss +++ /dev/null @@ -1,46 +0,0 @@ -//////////////////////// -// Settings // -//////////////////////// - -// overlay -$mfp-overlay-color: #000; // Color of overlay screen -$mfp-overlay-opacity: 0.8; // Opacity of overlay screen -$mfp-shadow: 0 0 8px rgba(0, 0, 0, 0.6); // Shadow on image or iframe - -// spacing -$mfp-popup-padding-left: 8px; // Padding from left and from right side -$mfp-popup-padding-left-mobile: 6px; // Same as above, but is applied when width of window is less than 800px - -$mfp-z-index-base: 1040; // Base z-index of popup - -// controls -$mfp-include-arrows: true; // Include styles for nav arrows -$mfp-controls-opacity: 1; // Opacity of controls -$mfp-controls-color: #fff; // Color of controls -$mfp-controls-border-color: #fff; // Border color of controls -$mfp-inner-close-icon-color: #fff; // Color of close button when inside -$mfp-controls-text-color: #ccc; // Color of preloader and "1 of X" indicator -$mfp-controls-text-color-hover: #fff; // Hover color of preloader and "1 of X" indicator -$mfp-IE7support: true; // Very basic IE7 support - -// Iframe-type options -$mfp-include-iframe-type: true; // Enable Iframe-type popups -$mfp-iframe-padding-top: 40px; // Iframe padding top -$mfp-iframe-background: #000; // Background color of iframes -$mfp-iframe-max-width: 900px; // Maximum width of iframes -$mfp-iframe-ratio: 9/16; // Ratio of iframe (9/16 = widescreen, 3/4 = standard, etc.) - -// Image-type options -$mfp-include-image-type: true; // Enable Image-type popups -$mfp-image-background: #444 !default; -$mfp-image-padding-top: 40px; // Image padding top -$mfp-image-padding-bottom: 40px; // Image padding bottom -$mfp-include-mobile-layout-for-image: true; // Removes paddings from top and bottom - -// Image caption options -$mfp-caption-title-color: #f3f3f3; // Caption title color -$mfp-caption-subtitle-color: #bdbdbd; // Caption subtitle color -.mfp-counter { font-family: $serif; } // Caption font family - -// A11y -$mfp-use-visuallyhidden: false; \ No newline at end of file diff --git a/_sass/minimal-mistakes/vendor/susy/_su.scss b/_sass/minimal-mistakes/vendor/susy/_su.scss deleted file mode 100644 index 83386ad..0000000 --- a/_sass/minimal-mistakes/vendor/susy/_su.scss +++ /dev/null @@ -1,4 +0,0 @@ -// Su -// == - -@import 'susy/su'; diff --git a/_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss b/_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss deleted file mode 100644 index 185b356..0000000 --- a/_sass/minimal-mistakes/vendor/susy/_susy-prefix.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Susy (Prefixed) -// =============== - -$susy-version: 3; - -@import 'susy/utilities'; -@import 'susy/su-validate'; -@import 'susy/su-math'; -@import 'susy/settings'; -@import 'susy/normalize'; -@import 'susy/parse'; -@import 'susy/syntax-helpers'; -@import 'susy/api'; diff --git a/_sass/minimal-mistakes/vendor/susy/_susy.scss b/_sass/minimal-mistakes/vendor/susy/_susy.scss deleted file mode 100644 index bfda3d0..0000000 --- a/_sass/minimal-mistakes/vendor/susy/_susy.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Susy (Un-Prefixed) -// ================== - -@import 'susy-prefix'; -@import 'susy/unprefix'; diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss b/_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss deleted file mode 100644 index 99db8d1..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/_svg-grid.scss +++ /dev/null @@ -1,5 +0,0 @@ -// SVG Grid Background -// =================== - -@import 'svg-grid/prefix'; -@import 'svg-grid/svg-unprefix'; diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss b/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss deleted file mode 100644 index 21fb45f..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_prefix.scss +++ /dev/null @@ -1,7 +0,0 @@ -// Prefixed SVG Plugin -// =================== - -@import 'svg-settings'; -@import 'svg-utilities'; -@import 'svg-grid-math'; -@import 'svg-api'; diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss b/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss deleted file mode 100644 index 7d880e3..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-api.scss +++ /dev/null @@ -1,114 +0,0 @@ -/// Plugin: SVG Grid Image -/// ====================== -/// @group plugin_svg-grid -/// @see susy-svg-grid - - - -/// ## Overview -/// If you want to generate svg-backgrounds -/// for help visualizing and debugging your grids, -/// import the SVG Grid Plugin. -/// -/// The plugin adds `svg-grid-colors` setting -/// to your global defaults, -/// which you can override in `$susy`. -/// It also provides you with a new function, -/// `susy-svg-grid()`, -/// which will return inline svg for use in -/// backgrounds or generated content. -/// -/// This function come with an unprefixed alias by default, -/// using the `svg-grid` import. -/// If you only only want prefixed versions of the API, -/// import the `svg-grid/prefix` partial instead. -/// -/// @group plugin_svg-grid -/// -/// @example scss - importing the plugin -/// // The full path to import Susy will depend on your setup… -/// -/// // unprefixed -/// @import 'plugins/svg-grid'; -/// -/// // prefixed -/// @import 'plugins/svg-grid/prefix'; -/// -/// @example scss - generating background grids -/// .grid { -/// background: susy-svg-grid() no-repeat scroll; -/// } - - - -// SVG Grid -// -------- -/// Return inline svg-data in to display the grid. -/// -/// @group plugin_svg-grid -/// -/// @param {Map | List} $grid [$susy] - -/// Map or shorthand defining the current grid -/// @param {Color | List | null} $colors [null] - -/// Column color, or list of colors for column-gradient, -/// used to override the global `svg-grid-colors` setting -/// @param {Length | null} $offset [null] - -/// Manually override the default grid-image offset, -/// to account for grid edges -/// -/// @return {String} - -/// CSS inline-data SVG string, in `url()` format, -/// for use in image or content properties -/// @example scss -/// .grid { -/// background: susy-svg-grid() no-repeat scroll; -/// } -@function susy-svg-grid( - $grid: $susy, - $colors: null, - $offset: null -) { - // Grid parsing & normalizing - $grid: susy-compile($grid, $context-only: true); - - // Color and gradient handling - $gradient: ''; - - @if (not $colors) { - $colors: susy-get('svg-grid-colors'); - } - - @if length($colors) > 1 { - $gradient: _susy-svg-gradient($colors); - $colors: 'url(%23susy-svg-gradient)'; - } @else { - $colors: _susy-svg-color($colors); - } - - // Get a default image-width - $span: ( - 'span': map-get($grid, 'columns'), - 'spread': map-get($grid, 'container-spread'), - ); - $span: map-merge($grid, $span); - $image-width: su-call('su-span', $span); - $image-width: if((type-of($image-width) == 'number'), $image-width, 100%); - - // SVG construction - $columns: map-get($grid, 'columns'); - $offset: $offset or _susy-svg-offset($grid); - - $attrs: 'fill="#{$colors}" width="#{$image-width}"'; - $svg: 'data:image/svg+xml,'; - $svg: $svg + '%3Csvg xmlns="http://www.w3.org/2000/svg" #{$attrs} %3E'; - $svg: $svg + $gradient; - - @for $column from 1 through length($columns) { - $width: susy-span(1 narrow at $column, $grid); - $x: _susy-svg-column-position($column, $grid); - - $svg: $svg + _susy-svg-rect($x, $width, $offset); - } - - @return url('#{$svg}%3C/svg%3E'); -} diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss b/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss deleted file mode 100644 index 044801a..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-grid-math.scss +++ /dev/null @@ -1,67 +0,0 @@ -// SVG Grid Math -// ============= - - - -// SVG Column Position -// ------------------- -/// Determine the proper horizontal position -/// for a column rectangle -/// -/// @access private -/// -/// @param {Integer} $column - -/// 1-indexed column location on the grid -/// @param {Map} $grid - -/// Normalized settings map representing the current grid -/// -/// @return {Length} - -/// Horizontal position of svg column rectangle, -/// as distance from the grid edge -@function _susy-svg-column-position( - $column, - $grid -) { - $x: $column - 1; - - @if ($x > 0) { - $x: susy-span(first $x wide, $grid); - } - - @return $x; -} - - - -// SVG Offset -// ---------- -/// Determine if a grid image needs to be offset, -/// to account for edge gutters. -/// -/// @access private -/// -/// @param {Map} $grid - -/// Normalized settings map representing the current grid -/// -/// @return {Length | null} - -/// Expected distance from container edge to first column, -/// based on spread values and gutter-widths -@function _susy-svg-offset( - $grid -) { - $columns: su-valid-columns(map-get($grid, 'columns')); - $gutters: su-valid-gutters(map-get($grid, 'gutters')); - $container: su-valid-spread(map-get($grid, 'container-spread')) + 1; - - @if ($container == 0) { - @return null; - } - - $gutter: su-call('su-gutter', $grid); - - @if (type-of($gutter) == 'string') { - @return 'calc(#{$container} * #{$gutter} / 2)'; - } - - @return $container * $gutter / 2; -} diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss b/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss deleted file mode 100644 index 3fcc91f..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-settings.scss +++ /dev/null @@ -1,14 +0,0 @@ -// SVG Settings -// ============ - - -// Susy SVG Defaults -// ================= -/// This plugin adds the `svg-grid-colors` property -/// and default value to `$_susy-defaults` — -/// you can override that value in `$susy` -/// or any other grid settings map. -/// @group plugin_svg-grid -$_susy-defaults: map-merge(( - 'svg-grid-colors': hsla(120, 50%, 50%, 0.5) hsla(120, 50%, 75%, 0.5), - ), $_susy-defaults); diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss b/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss deleted file mode 100644 index 187157c..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-unprefix.scss +++ /dev/null @@ -1,18 +0,0 @@ -// Unprefix Susy SVG Grid -// ====================== - - - -// SVG Grid -// -------- -/// Un-prefixed alias for `susy-svg-grid` -/// -/// @group plugin_svg-grid -/// @alias susy-svg-grid -@function svg-grid( - $grid: $susy, - $colors: susy-get('svg-grid-colors'), - $offset: null -) { - @return susy-svg-grid($grid, $colors, $offset); -} diff --git a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss b/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss deleted file mode 100644 index e4bf18f..0000000 --- a/_sass/minimal-mistakes/vendor/susy/plugins/svg-grid/_svg-utilities.scss +++ /dev/null @@ -1,133 +0,0 @@ -// SVG Utilities -// ============= - - - -// SVG Validate Units -// ------------------ -/// Make sure a length is supported in svg -/// -/// @access private -/// -/// @param {Length} $length - -/// The length to validate -/// @param {String} $name [null] - -/// Optional name of length origin, -/// for error reporting -/// -/// @return {Length} - -/// An svg-validated length, or comparable valid length -@function _susy-svg-validate-units( - $length, - $name: null -) { - $_svg-units: ('em', 'ex', 'px', 'pt', 'pc', 'cm', 'mm', 'in', '%'); - $string: type-of($length) == 'string'; - - @if ($length == 0) or ($string) or index($_svg-units, unit($length)) { - @return $length; - } - - @return _susy-error( - '`#{unit($length)}` #{$name} units are not supported in SVG', - '_susy-svg-validate-units'); -} - - - -// SVG Rect -// -------- -/// Build a single svg rectangle -/// -/// @access private -/// -/// @param {Length} $x - -/// Horizontal position for the rectangle -/// @param {Length} $width - -/// Width of the rectangle -/// @param {Length} $offset [null] - -/// Offset the rectangle, to account for edge gutters -/// -/// @return {String} - -/// Escaped string representing one svg rectangle -@function _susy-svg-rect( - $x, - $width, - $offset: null -) { - $x: _susy-svg-validate-units($x); - $width: _susy-svg-validate-units($width); - $offset: if($offset == 0, null, $offset); - - @if (type-of($offset) == 'number') and (type-of($x) == 'number') { - @if comparable($x, $offset) { - $x: $x + $offset; - } @else { - $x: 'calc(#{$x} + #{$offset})'; - } - } @else if $offset and ($x != 0) { - $x: 'calc(#{$x} + #{$offset})'; - } @else if $offset { - $x: $offset; - } - - @return '%3Crect x="#{$x}" width="#{$width}" height="100%"/%3E'; -} - - - -// SVG Color -// --------- -/// Stringify colors, and escape hex symbol -/// -/// @access private -/// -/// @param {Color} $color - -/// Color to stringify and escape -/// -/// @return {String} - -/// Escaped string value of color -@function _susy-svg-color( - $color -) { - $color: inspect($color); // convert to string - - @if (str-index($color, '#') == 1) { - $color: '%23' + str-slice($color, 2); - } - - @return $color; -} - - - -// SVG Gradient -// ------------ -/// Create a multi-color svg gradient -/// -/// @access private -/// -/// @param {List} $colors - -/// List of colors to be equally spaced from `0%` to `100%` -/// in each column rectangle -/// -/// @return {String} - -/// Escaped string representing one svg gradient -/// (`id="susy-svg-gradient"`) -@function _susy-svg-gradient( - $colors -) { - $gradient: '%3Cdefs%3E%3ClinearGradient spreadMethod="pad"'; - $gradient: '#{$gradient} id="susy-svg-gradient"'; - $gradient: '#{$gradient} x1="0%" y1="0%" x2="100%" y2="0%"%3E'; - - @for $i from 1 through length($colors) { - $color: _susy-svg-color(nth($colors, $i)); - $offset: percentage(($i - 1) / (length($colors) - 1)); - $stop: '%3Cstop offset="#{$offset}" style="stop-color:#{$color};" /%3E'; - - $gradient: $gradient + $stop; - } - - @return $gradient + '%3C/linearGradient%3E%3C/defs%3E'; -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_api.scss b/_sass/minimal-mistakes/vendor/susy/susy/_api.scss deleted file mode 100644 index de8c9bd..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_api.scss +++ /dev/null @@ -1,318 +0,0 @@ -/// Susy3 API Functions -/// =================== -/// These three functions form the core of Susy's -/// layout-building grid API. -/// -/// - Use `span()` and `gutter()` to return any grid-width, -/// and apply the results wherever you need them: -/// CSS `width`, `margin`, `padding`, `flex-basis`, `transform`, etc. -/// - For asymmetrical-fluid grids, -/// `slice()` can help manage your nesting context. -/// -/// All three functions come with an unprefixed alias by default, -/// using the `susy` import. -/// Import the `susy-prefix` partial instead, -/// if you only only want prefixed versions of the API. -/// -/// This is a thin syntax-sugar shell around -/// the "Su" core-math functions: `su-span`, `su-gutter`, and `su-slice`. -/// If you prefer the more constrained syntax of the math engine, -/// you are welcome to use those functions instead. -/// -/// @group b-api -/// @see susy-span -/// @see susy-gutter -/// @see susy-slice -/// @see su-span -/// @see su-gutter -/// @see su-slice - - - -/// ## Shorthand -/// -/// All functions draw on the same shorthand syntax in two parts, -/// seperated by the word `of`. -/// -/// ### Span Syntax: `` [`` ``] -/// The first part describes the -/// **span** width, location, and spread in any order. -/// Only the width is required: -/// -/// - `span(2)` will return the width of 2 columns. -/// - `span(3 wide)` will return 3-columns, with an additional gutter. -/// - location is only needed with asymmetrical grids, -/// where `span(3 at 2)` will return the width of -/// specific columns on the grid. -/// Since these are functions, they will not handle placement for you. -/// -/// ### Context Syntax: `[of ]` -/// The second half of Susy's shorthand -/// describes the grid-**context** – -/// available columns, container-spread, and optional gutter override – -/// in any order. -/// All of these settings have globally-defined defaults: -/// -/// - `span(2 of 6)` will set the context to -/// a slice of 6 columns from the global grid. -/// More details below. -/// - `span(2 of 12 wide)` changes the container-spread -/// as well as the column-context. -/// - `span(2 of 12 set-gutters 0.5em)` -/// will override the global gutters setting -/// for this one calculation. -/// -/// A single unitless number for `columns` -/// will be treated as a slice of the parent grid. -/// On a grid with `columns: susy-repeat(12, 120px)`, -/// the shorthand `of 4` will use the parent `120px` column-width. -/// You can also be more explicit, -/// and say `of susy-repeat(4, 100px)`. -/// If you are using asymmetrical grids, -/// like `columns: (1 1 2 3 5 8)`, -/// Susy can't slice it for you without knowing which columns you want. -/// The `slice` function accepts exactly the same syntax as `span`, -/// but returns a list of columns rather than a width. -/// Use it in your context like `of slice(first 3)`. -/// -/// @group b-api - - - -// Susy Span -// --------- -/// This is the primary function in Susy — -/// used to return the width of a span across one or more columns, -/// and any relevant gutters along the way. -/// With the default settings, -/// `span(3)` will return the width of 3 columns, -/// and the 2 intermediate gutters. -/// This can be used to set the `width` property of grid elements, -/// or `margin` and `padding` -/// to push, pull, and pad your elements. -/// -/// - This is a thin syntax-sugar shell around -/// the core-math `su-span()` function. -/// - The un-prefixed alias `span()` is available by default. -/// -/// @group b-api -/// @see su-span -/// @see $susy -/// -/// @param {list} $span - -/// Shorthand expression to define the width of the span, -/// optionally containing: -/// - a count, length, or column-list span. -/// - `at $n`, `first`, or `last` location on asymmetrical grids, -/// where `at 1 == first`, -/// and `last` will calculate the proper location -/// based on columns and span. -/// - `narrow`, `wide`, or `wider` for optionally spreading -/// across adjacent gutters. -/// - `of $n ` for available grid columns -/// and spread of the container. -/// Span counts like `of 6` are valid -/// in the context of symmetrical grids, -/// where Susy can safely infer a slice of the parent columns. -/// - and `set-gutters $n` to override global gutter settings. -/// -/// @param {map} $config [()] - -/// Optional map of Susy grid configuration settings. -/// See `$susy` documentation for details. -/// -/// @return {length} - -/// Calculated length value, using the units given, -/// or converting to `%` for fraction-based grids, -/// or a full `calc` function when units/fractions -/// are not comparable outside the browser. -/// -/// @example scss - span half the grid -/// .foo { -/// // the result is a bit under 50% to account for gutters -/// width: susy-span(6 of 12); -/// } -/// -/// @example scss - span a specific segment of asymmetrical grid -/// .foo { -/// width: susy-span(3 at 3 of (1 2 3 5 8)); -/// } -@function susy-span( - $span, - $config: () -) { - $output: susy-compile($span, $config); - - @if map-get($output, 'span') { - @return su-call('su-span', $output); - } - - $actual: '[#{type-of($span)}] `#{inspect($span)}`'; - @return _susy-error( - 'Unable to determine span value from #{$actual}.', - 'susy-span'); -} - - - -// Susy Gutter -// ----------- -/// The gutter function returns -/// the width of a single gutter on your grid, -/// to be applied where you see fit – -/// on `margins`, `padding`, `transform`, or element `width`. -/// -/// - This is a thin syntax-sugar shell around -/// the core-math `su-gutter()` function. -/// - The un-prefixed alias `gutter()` is available by default. -/// -/// @group b-api -/// @see su-gutter -/// @see $susy -/// -/// @param {list | number} $context [null] - -/// Optional context for nested gutters, -/// including shorthand for -/// `columns`, `gutters`, and `container-spread` -/// (additional shorthand will be ignored) -/// -/// @param {map} $config [()] - -/// Optional map of Susy grid configuration settings. -/// See `$susy` documentation for details. -/// -/// @return {length} - -/// Width of a gutter as `%` of current context, -/// or in the units defined by `column-width` when available -/// -/// @example scss - add gutters before or after an element -/// .floats { -/// float: left; -/// width: span(3 of 6); -/// margin-left: gutter(of 6); -/// } -/// -/// @example scss - add gutters to padding -/// .flexbox { -/// flex: 1 1 span(3 wide of 6 wide); -/// padding: gutter(of 6) / 2; -/// } -/// -@function susy-gutter( - $context: susy-get('columns'), - $config: () -) { - $context: susy-compile($context, $config, 'context-only'); - - @return su-call('su-gutter', $context); -} - - - -// Susy Slice -// ---------- -/// Working with asymmetrical grids (un-equal column widths) -/// can be challenging –  -/// expecially when they involve fluid/fractional elements. -/// Describing a context `of (15em 6em 6em 6em 15em)` is a lot -/// to put inside the span or gutter function shorthand. -/// This slice function returns a sub-slice of asymmetrical columns to use -/// for a nested context. -/// `slice(3 at 2)` will give you a subset of the global grid, -/// spanning 3 columns, starting with the second. -/// -/// - This is a thin syntax-sugar shell around -/// the core-math `su-slice()` function. -/// - The un-prefixed alias `slice()` is available by default. -/// -/// @group b-api -/// @see su-slice -/// @see $susy -/// -/// @param {list} $span - -/// Shorthand expression to define the subset span, optionally containing: -/// - `at $n`, `first`, or `last` location on asymmetrical grids; -/// - `of $n ` for available grid columns -/// and spread of the container -/// - Span-counts like `of 6` are only valid -/// in the context of symmetrical grids -/// - Valid spreads include `narrow`, `wide`, or `wider` -/// -/// @param {map} $config [()] - -/// Optional map of Susy grid configuration settings. -/// See `$susy` documentation for details. -/// -/// @return {list} - -/// Subset list of columns for use for a nested context -/// -/// @example scss - Return a nested segment of asymmetrical grid -/// $context: susy-slice(3 at 3 of (1 2 3 5 8)); -/// /* $context: #{$context}; */ -@function susy-slice( - $span, - $config: () -) { - $span: susy-compile($span, $config); - - @return su-call('su-slice', $span); -} - - - -/// ## Building Grids -/// The web has come a long way -/// since the days of double-margin-hacks -/// and inconsistent subpixel rounding. -/// In addition to floats and tables, -/// we can now use much more powerful tools, -/// like flexbox and CSS grid, -/// to build more interesting and responsive layouts. -/// -/// With Susy3, we hope you'll start moving in that direction. -/// You can still build classic 12-column Grid Systems, -/// and we'll help you get there, -/// but Susy3 is primarily designed for a grid-math-on-demand -/// approach to layout: -/// applying our functions only where you really need grid math. -/// Read the [intro article by OddBird][welcome] for more details. -/// -/// [welcome]: http://oddbird.net/2017/06/28/susy3/ -/// -/// @group b-api -/// @link http://oddbird.net/2017/06/28/susy3/ Article: Welcome to Susy3 -/// -/// @example scss - floats -/// .float { -/// width: span(3); -/// margin-right: gutter(); -/// } -/// -/// @example scss - flexbox -/// .flexbox { -/// flex: 1 1 span(3); -/// // half a gutter on either side… -/// padding: 0 gutter() / 2; -/// } -/// -/// @example scss - pushing and pulling -/// .push-3 { -/// margin-left: span(3 wide); -/// } -/// -/// .pull-3 { -/// margin-left: 0 - span(3 wide); -/// } -/// -/// @example scss - building an attribute system -/// // markup example:
-/// [data-span] { -/// float: left; -/// -/// &:not([data-span*='last']) { -/// margin-right: gutter(); -/// } -/// } -/// -/// @for $span from 1 through length(susy-get('columns')) { -/// [data-span*='#{$span}'] { -/// width: span($span); -/// } -/// } diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_normalize.scss b/_sass/minimal-mistakes/vendor/susy/susy/_normalize.scss deleted file mode 100644 index a988504..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_normalize.scss +++ /dev/null @@ -1,261 +0,0 @@ -/// Syntax Normalization -/// ==================== -/// Susy is divided into two layers: -/// "Su" provides the core math functions with a stripped-down syntax, -/// while "Susy" adds global settings, shorthand syntax, -/// and other helpers. -/// Each setting (e.g. span, location, columns, spread, etc.) -/// has a single canonical syntax in Su. -/// -/// This normalization module helps translate between those layers, -/// transforming parsed Susy input into -/// values that Su will understand. -/// -/// @group x-normal -/// -/// @see susy-normalize -/// @see susy-normalize-span -/// @see susy-normalize-columns -/// @see susy-normalize-spread -/// @see susy-normalize-location - - - -// Susy Normalize -// -------------- -/// Normalize the values in a configuration map. -/// In addition to the global `$susy` properties, -/// this map can include local span-related imformation, -/// like `span` and `location`. -/// -/// Normalization does not check that values are valid, -/// which will happen in the Su math layer. -/// These functions merely look for known Susy syntax – -/// returning a map with those shorthand values -/// converted into low-level data for Su. -/// For example `span: all` and `location: first` -/// will be converted into specific numbers. -/// -/// @group x-normal -/// @see $susy -/// @see susy-parse -/// -/// @param {map} $config - -/// Map of Susy configuration settings to normalize. -/// See `$susy` and `susy-parse()` documentation for details. -/// @param {map | null} $context [null] - -/// Map of Susy configuration settings to use as global reference, -/// or `null` to use global settings. -/// -/// @return {map} - -/// Map of Susy configuration settings, -/// with all values normalized for Su math functions. -@function susy-normalize( - $config, - $context: null -) { - // Spread - @each $setting in ('spread', 'container-spread') { - $value: map-get($config, $setting); - - @if $value { - $value: susy-normalize-spread($value); - $config: map-merge($config, ($setting: $value)); - } - } - - // Columns - $columns: map-get($config, 'columns'); - - @if $columns { - $columns: susy-normalize-columns($columns, $context); - $config: map-merge($config, ('columns': $columns)); - } - - @if not $columns { - $map: type-of($context) == 'map'; - $columns: if($map, map-get($context, 'columns'), null); - $columns: $columns or susy-get('columns'); - } - - // Span - $span: map-get($config, 'span'); - - @if $span { - $span: susy-normalize-span($span, $columns); - $config: map-merge($config, ('span': $span)); - } - - // Location - $location: map-get($config, 'location'); - - @if $location { - $location: susy-normalize-location($span, $location, $columns); - $config: map-merge($config, ('location': $location)); - } - - @return $config; -} - - - -// Normalize Span -// -------------- -/// Normalize `span` shorthand for Su. -/// Su span syntax allows an explicit length (e.g. `3em`), -/// unitless column-span number (e.g. `3` columns), -/// or an explicit list of columns (e.g. `(3 5 8)`). -/// -/// Susy span syntax also allows the `all` keyword, -/// which will be converted to a slice of the context -/// in normalization. -/// -/// @group x-normal -/// -/// @param {number | list | 'all'} $span - -/// Span value to normalize. -/// @param {list} $columns - -/// Normalized list of columns in the grid -/// -/// @return {number | list} - -/// Number or list value for `$span` -@function susy-normalize-span( - $span, - $columns: susy-get('columns') -) { - @if ($span == 'all') { - @return length($columns); - } - - @return $span; -} - - - -// Normalize Columns -// ----------------- -/// Normalize `column` shorthand for Su. -/// Su column syntax only allows column lists (e.g. `120px 1 1 1 120px`). -/// -/// Susy span syntax also allows a unitless `slice` number (e.g `of 5`), -/// which will be converted to a slice of the context -/// in normalization. -/// -/// @group x-normal -/// -/// @param {list | integer} $columns - -/// List of available columns, -/// or unitless integer representing a slice of -/// the available context. -/// @param {map | null} $context [null] - -/// Map of Susy configuration settings to use as global reference, -/// or `null` to access global settings. -/// -/// @return {list} - -/// Columns list value, normalized for Su input. -/// -/// @throws -/// when attempting to access a slice of asymmetrical context -@function susy-normalize-columns( - $columns, - $context: null -) { - $context: $context or susy-settings(); - - @if type-of($columns) == 'list' { - @return _susy-flatten($columns); - } - - @if (type-of($columns) == 'number') and (unitless($columns)) { - $span: $columns; - $context: map-get($context, 'columns'); - $symmetrical: susy-repeat(length($context), nth($context, 1)); - - @if ($context == $symmetrical) { - @return susy-repeat($span, nth($context, 1)); - } @else { - $actual: 'of `#{$span}`'; - $columns: 'grid-columns `#{$context}`'; - @return _susy-error( - 'context-slice #{$actual} can not be determined based on #{$columns}.', - 'susy-normalize-columns'); - } - } - - @return $columns; -} - - - -// Normalize Spread -// ---------------- -/// Normalize `spread` shorthand for Su. -/// Su spread syntax only allows the numbers `-1`, `0`, or `1` – -/// representing the number of gutters covered -/// in relation to columns spanned. -/// -/// Susy spread syntax also allows keywords for each value – -/// `narrow` for `-1`, `wide` for `0`, or `wider` for `1` – -/// which will be converted to their respective integers -/// in normalization. -/// -/// @group x-normal -/// -/// @param {0 | 1 | -1 | 'narrow' | 'wide' | 'wider'} $spread - -/// Spread across adjacent gutters, relative to a column-count — -/// either `narrow` (-1), `wide` (0), or `wider` (1) -/// -/// @return {number} - -/// Numeric value for `$spread` -@function susy-normalize-spread( - $spread -) { - $normal-spread: ( - 'narrow': -1, - 'wide': 0, - 'wider': 1, - ); - - @return map-get($normal-spread, $spread) or $spread; -} - - - -// Normalize Location -// ------------------ -/// Normalize `location` shorthand for Su. -/// Su location syntax requires the (1-indexed) number for a column. -/// -/// Susy also allows the `first` and `last` keywords, -/// where `first` is always `1`, -/// and `last` is calculated based on span and column values. -/// Both keywords are normalized into an integer index -/// in normalization. -/// -/// @group x-normal -/// -/// @param {number} $span - -/// Number of grid-columns to be spanned -/// @param {integer | 'first' | 'last'} $location - -/// Starting (1-indexed) column position of a span, -/// or a named location keyword. -/// @param {list} $columns - -/// Already-normalized list of columns in the grid. -/// -/// @return {integer} - -/// Numeric value for `$location` -@function susy-normalize-location( - $span, - $location, - $columns -) { - $count: length($columns); - $normal-locations: ( - 'first': 1, - 'alpha': 1, - 'last': $count - $span + 1, - 'omega': $count - $span + 1, - ); - - @return map-get($normal-locations, $location) or $location; -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_parse.scss b/_sass/minimal-mistakes/vendor/susy/susy/_parse.scss deleted file mode 100644 index 98aa40a..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_parse.scss +++ /dev/null @@ -1,163 +0,0 @@ -/// Shorthand Syntax Parser -/// ======================= -/// The syntax parser converts [shorthand syntax][short] -/// into a map of settings that can be compared/merged with -/// other config maps and global setting. -/// -/// [short]: b-api.html -/// -/// @group x-parser - - - -// Parse -// ----- -/// The `parse` function provides all the syntax-sugar in Susy, -/// converting user shorthand -/// into a usable map of keys and values -/// that can be normalized and passed to Su. -/// -/// @group x-parser -/// @see $susy -/// -/// @param {list} $shorthand - -/// Shorthand expression to define the width of the span, -/// optionally containing: -/// - a count, length, or column-list span; -/// - `at $n`, `first`, or `last` location on asymmetrical grids; -/// - `narrow`, `wide`, or `wider` for optionally spreading -/// across adjacent gutters; -/// - `of $n ` for available grid columns -/// and spread of the container -/// (span counts like `of 6` are only valid -/// in the context of symmetrical grids); -/// - and `set-gutters $n` to override global gutter settings -/// @param {bool} $context-only [false] - -/// Allow the parser to ignore span and span-spread values, -/// only parsing context and container-spread. -/// This makes it possible to accept spanless values, -/// like the `gutters()` syntax. -/// When parsing context-only, -/// the `of` indicator is optional. -/// -/// @return {map} - -/// Map of span and grid settings -/// parsed from shorthand input – -/// including all the properties available globally – -/// `columns`, `gutters`, `spread`, `container-spread` – -/// along with the span-specific properties -/// `span`, and `location`. -/// -/// @throw -/// when a shorthand value is not recognized -@function susy-parse( - $shorthand, - $context-only: false -) { - $parse-error: 'Unknown shorthand property:'; - $options: ( - 'first': 'location', - 'last': 'location', - 'alpha': 'location', - 'omega': 'location', - 'narrow': 'spread', - 'wide': 'spread', - 'wider': 'spread', - ); - - $return: (); - $span: null; - $columns: null; - - $of: null; - $next: false; - - // Allow context-only shorthand, without span - @if ($context-only) and (not index($shorthand, 'of')) { - @if su-valid-columns($shorthand, 'fail-silent') { - $shorthand: 'of' $shorthand; - } @else { - $shorthand: join('of', $shorthand); - } - } - - // loop through the shorthand list - @for $i from 1 through length($shorthand) { - $item: nth($shorthand, $i); - $type: type-of($item); - $error: false; - $details: '[#{$type}] `#{$item}`'; - - // if we know what's supposed to be coming next… - @if $next { - - // Add to the return map - $return: map-merge($return, ($next: $item)); - - // Reset next to `false` - $next: false; - - } @else { // If we don't know what's supposed to be coming… - - // Keywords… - @if ($type == 'string') { - // Check the map for keywords… - @if map-has-key($options, $item) { - $setting: map-get($options, $item); - - // Spread could be on the span or the container… - @if ($setting == 'spread') and ($of) { - $return: map-merge($return, ('container-spread': $item)); - } @else { - $return: map-merge($return, ($setting: $item)); - } - - } @else if ($item == 'all') { - // `All` is a span shortcut - $span: 'all'; - } @else if ($item == 'at') { - // Some keywords setup what's next… - $next: 'location'; - } @else if ($item == 'set-gutters') { - $next: 'gutters'; - } @else if ($item == 'of') { - $of: true; - } @else { - $error: true; - } - - } @else if ($type == 'number') or ($type == 'list') { // Numbers & lists… - - @if not ($span or $of) { - // We don't have a span, and we're not expecting context… - $span: $item; - } @else if ($of) and (not $columns) { - // We are expecting context… - $columns: $item; - } @else { - $error: true; - } - - } @else { - $error: true; - } - } - - @if $error { - @return _susy-error('#{$parse-error} #{$details}', 'susy-parse'); - } - } - - // If we have span, merge it in - @if $span { - $return: map-merge($return, ('span': $span)); - } - - // If we have columns, merge them in - @if $columns { - $return: map-merge($return, ('columns': $columns)); - } - - // Return the map of settings… - @return $return; -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_settings.scss b/_sass/minimal-mistakes/vendor/susy/susy/_settings.scss deleted file mode 100644 index b824477..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_settings.scss +++ /dev/null @@ -1,329 +0,0 @@ -/// Susy3 Configuration -/// =================== -/// Susy3 has 4 core settings, in a single settings map. -/// You'll notice a few differences from Susy2: -/// -/// **Columns** no longer accept a single number, like `12`, -/// but use a syntax more similar to the new -/// CSS [grid-template-columns][columns] – -/// a list of relative sizes for each column on the grid. -/// Unitless numbers in Susy act very similar to `fr` units in CSS, -/// and the `susy-repeat()` function (similar to the css `repeat()`) -/// helps quickly establish equal-width columns. -/// -/// [columns]: https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns -/// -/// - `susy-repeat(12)` will create 12 fluid, equal-width columns -/// - `susy-repeat(6, 120px)` will create 6 equal `120px`-wide columns -/// - `120px susy-repeat(4) 120px` will create 6 columns, -/// the first and last are `120px`, -/// while the middle 4 are equal fractions of the remainder. -/// Susy will output `calc()` values in order to achieve this. -/// -/// **Gutters** haven't changed – -/// a single fraction or explicit width – -/// but the `calc()` output feature -/// means you can now use any combination of units and fractions -/// to create static-gutters on a fluid grid, etc. -/// -/// **Spread** existed in the Susy2 API as a span option, -/// and was otherwise handled behind the scenes. -/// Now we're giving you full control over all spread issues. -/// You can find a more [detailed explanation of spread on the blog][spread]. -/// -/// [spread]: http://oddbird.net/2017/06/13/susy-spread/ -/// -/// You can access your global settings at any time -/// with the `susy-settings()` function, -/// or grab a single setting from the global scope -/// with `susy-get('columns')`, `susy-get('gutters')` etc. -/// -/// @group a-config -/// @link http://oddbird.net/2017/06/13/susy-spread/ -/// Article: Understanding Spread in Susy3 -/// -/// @see $susy -/// @see susy-settings -/// @see susy-get - - - -// Susy -// ---- -/// The grid is defined in a single map variable, -/// with four initial properties: -/// `columns`, `gutters`, `spread` and `container-spread`. -/// Anything you put in the root `$susy` variable map -/// will be treated as a global project default. -/// You can create similar configuration maps -/// under different variable names, -/// to override the defaults as-needed. -/// -/// @group a-config -/// @type Map -/// -/// @see $_susy-defaults -/// @see {function} susy-repeat -/// @link -/// https://codepen.io/mirisuzanne/pen/EgmJJp?editors=1100 -/// Spread examples on CodePen -/// -/// @prop {list} columns - -/// Columns are described by a list of numbers, -/// representing the relative width of each column. -/// The syntax is a simplified version of CSS native -/// `grid-template-columns`, -/// expecting a list of grid-column widths. -/// Unitless numbers create fractional fluid columns -/// (similar to the CSS-native `fr` unit), -/// while length values (united numbers) -/// are used to define static columns. -/// You can mix-and match units and fractions, -/// to create a mixed grid. -/// Susy will generate `calc()` values when necessary, -/// to make all your units work together. -/// -/// Use the `susy-repeat($count, $value)` function -/// to more easily repetative columns, -/// similar to the CSS-native `repeat()`. -/// -/// - `susy-repeat(8)`: -/// an 8-column, symmetrical, fluid grid. -///
Identical to `(1 1 1 1 1 1 1 1)`. -/// - `susy-repeat(6, 8em)`: -/// a 6-column, symmetrical, em-based grid. -///
Identical to `(8em 8em 8em 8em 8em 8em)`. -/// - `(300px susy-repeat(4) 300px)`: -/// a 6-column, asymmetrical, mixed fluid/static grid -/// using `calc()` output. -///
Identical to `(300px 1 1 1 1 300px)`. -/// -/// **NOTE** that `12` is no longer a valid 12-column grid definition, -/// and you must list all the columns individually -/// (or by using the `susy-repeat()` function). -/// -/// @prop {number} gutters - -/// Gutters are defined as a single width, -/// or fluid ratio, similar to the native-CSS -/// `grid-column-gap` syntax. -/// Similar to columns, -/// gutters can use any valid CSS length unit, -/// or unitless numbers to define a relative fraction. -/// -/// - `0.5`: -/// a fluid gutter, half the size of a single-fraction column. -/// - `1em`: -/// a static gutter, `1em` wide. -/// -/// Mix static gutters with fluid columns, or vice versa, -/// and Susy will generate the required `calc()` to make it work. -/// -/// @prop {string} spread [narrow] - -/// Spread of an element across adjacent gutters: -/// either `narrow` (none), `wide` (one), or `wider` (two) -/// -/// - Both spread settings default to `narrow`, -/// the most common use-case. -/// A `narrow` spread only has gutters *between* columns -/// (one less gutter than columns). -/// This is how all css-native grids work, -/// and most margin-based grid systems. -/// - A `wide` spread includes the same number of gutters as columns, -/// spanning across a single side-gutter. -/// This is how most padding-based grid systems often work, -/// and is also useful for pushing and pulling elements into place. -/// - The rare `wider` spread includes gutters -/// on both sides of the column-span -/// (one more gutters than columns). -/// -/// @prop {string} container-spread [narrow] - -/// Spread of a container around adjacent gutters: -/// either `narrow` (none), `wide` (one), or `wider` (two). -/// See `spread` property for details. -/// -/// @since 3.0.0-beta.1 - -/// `columns` setting no longer accepts numbers -/// (e.g. `12`) for symmetrical fluid grids, -/// or the initial `12 x 120px` syntax for -/// symmetrical fixed-unit grids. -/// Use `susy-repeat(12)` or `susy-repeat(12, 120px)` instead. -/// -/// @example scss - default values -/// // 4 symmetrical, fluid columns -/// // gutters are 1/4 the size of a column -/// // elements span 1 less gutter than columns -/// // containers span 1 less gutter as well -/// $susy: ( -/// 'columns': susy-repeat(4), -/// 'gutters': 0.25, -/// 'spread': 'narrow', -/// 'container-spread': 'narrow', -/// ); -/// -/// @example scss - inside-static gutters -/// // 6 symmetrical, fluid columns… -/// // gutters are static, triggering calc()… -/// // elements span equal columns & gutters… -/// // containers span equal columns & gutters… -/// $susy: ( -/// 'columns': susy-repeat(6), -/// 'gutters': 0.5em, -/// 'spread': 'wide', -/// 'container-spread': 'wide', -/// ); -$susy: () !default; - - - -// Susy Repeat -// ----------- -/// Similar to the `repeat(, )` function -/// that is available in native CSS Grid templates, -/// the `susy-repeat()` function helps generate repetative layouts -/// by repeating any value a given number of times. -/// Where Susy previously allowed `8` as a column definition -/// for 8 equal columns, you should now use `susy-repeat(8)`. -/// -/// @group a-config -/// -/// @param {integer} $count - -/// The number of repetitions, e.g. `12` for a 12-column grid. -/// @param {*} $value [1] - -/// The value to be repeated. -/// Technically any value can be repeated here, -/// but the function exists to repeat column-width descriptions: -/// e.g. the default `1` for single-fraction fluid columns, -/// `5em` for a static column, -/// or even `5em 120px` if you are alternating column widths. -/// -/// @return {list} - -/// List of repeated values -/// -/// @example scss -/// // 12 column grid, with 5em columns -/// $susy: ( -/// columns: susy-repeat(12, 5em), -/// ); -/// -/// @example scss -/// // asymmetrical 5-column grid -/// $susy: ( -/// columns: 20px susy-repeat(3, 100px) 20px, -/// ); -/// -/// /* result: #{susy-get('columns')} */ -@function susy-repeat( - $count, - $value: 1 -) { - $return: (); - - @for $i from 1 through $count { - $return: join($return, $value); - } - - @return $return; -} - - - -// Susy Defaults -// ------------- -/// Configuration map of Susy factory defaults. -/// Do not override this map directly – -/// use `$susy` for user and project setting overrides. -/// -/// @access private -/// @type Map -/// -/// @see $susy -/// -/// @prop {number | list} columns [susy-repeat(4)] -/// @prop {number} gutters [0.25] -/// @prop {string} spread ['narrow'] -/// @prop {string} container-spread ['narrow'] -$_susy-defaults: ( - 'columns': susy-repeat(4), - 'gutters': 0.25, - 'spread': 'narrow', - 'container-spread': 'narrow', -); - - - -// Susy Settings -// ------------- -/// Return a combined map of Susy settings, -/// based on the factory defaults (`$_susy-defaults`), -/// user-defined project configuration (`$susy`), -/// and any local overrides required – -/// such as a configuration map passed into a function. -/// -/// @group a-config -/// -/// @param {maps} $overrides… - -/// Optional map override of global configuration settings. -/// See `$susy` above for properties. -/// -/// @return {map} - -/// Combined map of Susy configuration settings, -/// in order of specificity: -/// any `$overrides...`, -/// then `$susy` project settings, -/// and finally the `$_susy-defaults` -/// -/// @example scss - global settings -/// @each $key, $value in susy-settings() { -/// /* #{$key}: #{$value} */ -/// } -/// -/// @example scss - local settings -/// $local: ('columns': 1 2 3 5 8); -/// -/// @each $key, $value in susy-settings($local) { -/// /* #{$key}: #{$value} */ -/// } -@function susy-settings( - $overrides... -) { - $settings: map-merge($_susy-defaults, $susy); - - @each $config in $overrides { - $settings: map-merge($settings, $config); - } - - @return $settings; -} - - - -// Susy Get -// -------- -/// Return the current global value of any Susy setting -/// -/// @group a-config -/// -/// @param {string} $key - -/// Setting to retrieve from the configuration. -/// -/// @return {*} - -/// Value mapped to `$key` in the configuration maps, -/// in order of specificity: -/// `$susy`, then `$_susy-defaults` -/// -/// @example scss - -/// /* columns: #{susy-get('columns')} */ -/// /* gutters: #{susy-get('gutters')} */ -@function susy-get( - $key -) { - $settings: susy-settings(); - - @if not map-has-key($settings, $key) { - @return _susy-error( - 'There is no Susy setting called `#{$key}`', - 'susy-get'); - } - - @return map-get($settings, $key); -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_su-math.scss b/_sass/minimal-mistakes/vendor/susy/susy/_su-math.scss deleted file mode 100644 index 1e88528..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_su-math.scss +++ /dev/null @@ -1,441 +0,0 @@ -/// Grid Math Engine -/// ================ -/// The `su` functions give you direct access to the math layer, -/// without any syntax-sugar like shorthand parsing, and normalization. -/// If you prefer named arguments, and stripped-down syntax, -/// you can use these functions directly in your code – -/// replacing `span`, `gutter`, and `slice`. -/// -/// These functions are also useful -/// for building mixins or other extensions to Susy. -/// Apply the Susy syntax to new mixins and functions, -/// using our "Plugin Helpers", -/// or write your own syntax and pass the normalized results along -/// to `su` for compilation. -/// -/// @group su-math -/// -/// @see su-span -/// @see su-gutter -/// @see su-slice -/// @ignore _su-sum -/// @ignore _su-calc-span -/// @ignore _su-calc-sum -/// @ignore _su-needs-calc-output - - - -// Su Span -// ------- -/// Calculates and returns a CSS-ready span width, -/// based on normalized span and context data – -/// a low-level version of `susy-span`, -/// with all of the logic and none of the syntax sugar. -/// -/// - Grids defined with unitless numbers will return `%` values. -/// - Grids defined with comparable units -/// will return a value in the units provided. -/// - Grids defined with a mix of units, -/// or a combination of untiless numbers and unit-lengths, -/// will return a `calc()` string. -/// -/// @group su-math -/// @see susy-span -/// -/// @param {number | list} $span - -/// Number or list of grid columns to span -/// @param {list} $columns - -/// List of columns available -/// @param {number} $gutters - -/// Width of a gutter in column-comparable units -/// @param {0 | 1 | -1} $spread - -/// Number of gutters spanned, -/// relative to `span` count -/// @param {0 | 1 | -1} $container-spread [$spread] - -/// Number of gutters spanned, -/// relative to `columns` count -/// @param {integer} $location [1] - -/// Optional position of sub-span among full set of columns -/// -/// @return {length} - -/// Relative or static length of a span on the grid -@function su-span( - $span, - $columns, - $gutters, - $spread, - $container-spread: $spread, - $location: 1 -) { - $span: su-valid-span($span); - $columns: su-valid-columns($columns); - $gutters: su-valid-gutters($gutters); - $spread: su-valid-spread($spread); - - @if (type-of($span) == 'number') { - @if (not unitless($span)) { - @return $span; - } - - $location: su-valid-location($span, $location, $columns); - $span: su-slice($span, $columns, $location, $validate: false); - } - - @if _su-needs-calc-output($span, $columns, $gutters, $spread, not 'validate') { - @return _su-calc-span($span, $columns, $gutters, $spread, $container-spread, not 'validate'); - } - - $span-width: _su-sum($span, $gutters, $spread, $validate: false); - - @if unitless($span-width) { - $container-spread: su-valid-spread($container-spread); - $container: _su-sum($columns, $gutters, $container-spread, $validate: false); - @return percentage($span-width / $container); - } - - @return $span-width; -} - - - -// Su Gutter -// --------- -/// Calculates and returns a CSS-ready gutter width, -/// based on normalized grid data – -/// a low-level version of `susy-gutter`, -/// with all of the logic and none of the syntax sugar. -/// -/// - Grids defined with unitless numbers will return `%` values. -/// - Grids defined with comparable units -/// will return a value in the units provided. -/// - Grids defined with a mix of units, -/// or a combination of untiless numbers and unit-lengths, -/// will return a `calc()` string. -/// -/// @group su-math -/// @see susy-gutter -/// -/// @param {list} $columns - -/// List of columns in the grid -/// @param {number} $gutters - -/// Width of a gutter in column-comparable units -/// @param {0 | 1 | -1} $container-spread - -/// Number of gutters spanned, -/// relative to `columns` count -/// -/// @return {length} - -/// Relative or static length of one gutter in a grid -@function su-gutter( - $columns, - $gutters, - $container-spread -) { - @if (type-of($gutters) == 'number') { - @if ($gutters == 0) or (not unitless($gutters)) { - @return $gutters; - } - } - - @if _su-needs-calc-output($gutters, $columns, $gutters, -1, not 'validate') { - @return _su-calc-span($gutters, $columns, $gutters, -1, $container-spread, not 'validate'); - } - - $container: _su-sum($columns, $gutters, $container-spread); - @return percentage($gutters / $container); -} - - - -// Su Slice -// -------- -/// Returns a list of columns -/// based on a given span/location slice of the grid – -/// a low-level version of `susy-slice`, -/// with all of the logic and none of the syntax sugar. -/// -/// @group su-math -/// @see susy-slice -/// -/// @param {number} $span - -/// Number of grid columns to span -/// @param {list} $columns - -/// List of columns in the grid -/// @param {number} $location [1] - -/// Starting index of a span in the list of columns -/// @param {bool} $validate [true] - -/// Check that arguments are valid before proceeding -/// -/// @return {list} - -/// Subset list of grid columns, based on span and location -@function su-slice( - $span, - $columns, - $location: 1, - $validate: true -) { - @if $validate { - $columns: su-valid-columns($columns); - $location: su-valid-location($span, $location, $columns); - } - - $floor: floor($span); - $sub-columns: (); - - @for $i from $location to ($location + $floor) { - $sub-columns: append($sub-columns, nth($columns, $i)); - } - - @if $floor != $span { - $remainder: $span - $floor; - $column: $location + $floor; - $sub-columns: append($sub-columns, nth($columns, $column) * $remainder); - } - - @return $sub-columns; -} - - - -// Su Sum -// ------ -/// Get the total sum of column-units in a layout. -/// -/// @group su-math -/// @access private -/// -/// @param {list} $columns - -/// List of columns in the grid -/// @param {number} $gutters - -/// Width of a gutter in column-comparable units -/// @param {0 | 1 | -1} $spread - -/// Number of gutters spanned, -/// relative to `columns` count -/// @param {bool} $validate [true] - -/// Check that arguments are valid before proceeding -/// -/// @return {number} - -/// Total sum of column-units in a grid -@function _su-sum( - $columns, - $gutters, - $spread, - $validate: true -) { - @if $validate { - $columns: su-valid-span($columns); - $gutters: su-valid-gutters($gutters); - $spread: su-valid-spread($spread); - } - - // Calculate column-sum - $column-sum: 0; - @each $column in $columns { - $column-sum: $column-sum + $column; - } - - $gutter-sum: (ceil(length($columns)) + $spread) * $gutters; - $total: if(($gutter-sum > 0), $column-sum + $gutter-sum, $column-sum); - - @return $total; -} - - - -// Su Calc -// ------- -/// Return a usable span width as a `calc()` function, -/// in order to create mixed-unit grids. -/// -/// @group su-math -/// @access private -/// -/// @param {number | list} $span - -/// Pre-sliced list of grid columns to span -/// @param {list} $columns - -/// List of columns available -/// @param {number} $gutters - -/// Width of a gutter in column-comparable units -/// @param {0 | 1 | -1} $spread - -/// Number of gutters spanned, -/// relative to `span` count -/// @param {0 | 1 | -1} $container-spread [$spread] - -/// Number of gutters spanned, -/// relative to `columns` count -/// @param {bool} $validate [true] - -/// Check that arguments are valid before proceeding -/// -/// @return {length} - -/// Relative or static length of a span on the grid -@function _su-calc-span( - $span, - $columns, - $gutters, - $spread, - $container-spread: $spread, - $validate: true -) { - @if $validate { - $span: su-valid-span($span); - $columns: su-valid-columns($columns); - $gutters: su-valid-gutters($gutters); - $spread: su-valid-spread($spread); - $container-spread: su-valid-spread($container-spread); - } - - // Span and context - $span: _su-calc-sum($span, $gutters, $spread, not 'validate'); - $context: _su-calc-sum($columns, $gutters, $container-spread, not 'validate'); - - // Fixed and fluid - $fixed-span: map-get($span, 'fixed'); - $fluid-span: map-get($span, 'fluid'); - $fixed-context: map-get($context, 'fixed'); - $fluid-context: map-get($context, 'fluid'); - - $calc: '#{$fixed-span}'; - $fluid-calc: '(100% - #{$fixed-context})'; - - // Fluid-values - @if (not $fluid-span) { - $fluid-calc: null; - } @else if ($fluid-span != $fluid-context) { - $fluid-span: '* #{$fluid-span}'; - $fluid-context: if($fluid-context, '/ #{$fluid-context}', ''); - $fluid-calc: '(#{$fluid-calc $fluid-context $fluid-span})'; - } - - @if $fluid-calc { - $calc: if(($calc != ''), '#{$calc} + ', ''); - $calc: '#{$calc + $fluid-calc}'; - } - - @return calc(#{unquote($calc)}); -} - - - -// Su Calc-Sum -// ----------- -/// Get the total sum of fixed and fluid column-units -/// for creating a mixed-unit layout with `calc()` values. -/// -/// @group su-math -/// @access private -/// -/// @param {list} $columns - -/// List of columns available -/// @param {number} $gutters - -/// Width of a gutter in column-comparable units -/// @param {0 | 1 | -1} $spread - -/// Number of gutters spanned, -/// relative to `span` count -/// @param {bool} $validate [true] - -/// Check that arguments are valid before proceeding -/// -/// @return {map} - -/// Map with `fixed` and `fluid` keys -/// containing the proper math as strings -@function _su-calc-sum( - $columns, - $gutters, - $spread, - $validate: true -) { - @if $validate { - $columns: su-valid-span($columns); - $gutters: su-valid-gutters($gutters); - $spread: su-valid-spread($spread); - } - - $fluid: 0; - $fixed: (); - $calc: null; - - // Gutters - $gutters: $gutters * (length($columns) + $spread); - - // Columns - @each $col in append($columns, $gutters) { - @if unitless($col) { - $fluid: $fluid + $col; - } @else { - $fixed: _su-map-add-units($fixed, $col); - } - } - - // Compile Fixed Units - @each $unit, $total in $fixed { - @if ($total != (0 * $total)) { - $calc: if($calc, '#{$calc} + #{$total}', '#{$total}'); - } - } - - // Calc null or string - @if $calc { - $calc: if(str-index($calc, '+'), '(#{$calc})', '#{$calc}'); - } - - // Fluid 0 => null - $fluid: if(($fluid == 0), null, $fluid); - - - // Return map - $return: ( - 'fixed': $calc, - 'fluid': $fluid, - ); - - @return $return; -} - - - -// Needs Calc -// ---------- -/// Check if `calc()` will be needed in defining a span, -/// if the necessary units in a grid are not comparable. -/// -/// @group su-math -/// @access private -/// -/// @param {list} $span - -/// Slice of columns to span -/// @param {list} $columns - -/// List of available columns in the grid -/// @param {number} $gutters - -/// Width of a gutter -/// @param {0 | 1 | -1} $spread - -/// Number of gutters spanned, -/// relative to `span` count -/// @param {bool} $validate [true] - -/// Check that arguments are valid before proceeding -/// -/// @return {bool} - -/// `True` when units do not match, and `calc()` will be required -@function _su-needs-calc-output( - $span, - $columns, - $gutters, - $spread, - $validate: true -) { - @if $validate { - $span: su-valid-span($span); - $columns: su-valid-columns($columns); - $gutters: su-valid-gutters($gutters); - } - - $has-gutter: if((length($span) > 1) or ($spread >= 0), true, false); - $check: if($has-gutter, append($span, $gutters), $span); - $safe-span: _su-is-comparable($check...); - - @if ($safe-span == 'static') { - @return false; - } @else if (not $safe-span) { - @return true; - } - - $safe-fluid: _su-is-comparable($gutters, $columns...); - - @return not $safe-fluid; -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss b/_sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss deleted file mode 100644 index 5befad3..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_su-validate.scss +++ /dev/null @@ -1,213 +0,0 @@ -/// Validation -/// ========== -/// Each argument to Su has a single canonical syntax. -/// These validation functions check to ensure -/// that each argument is valid, -/// in order to provide useful errors -/// before attempting to calculate the results/ -/// -/// @group x-validation -/// -/// @see su-valid-columns -/// @see su-valid-gutters -/// @see su-valid-spread -/// @see su-valid-location - - - -// Valid Span -// ---------- -/// Check that the `span` argument -/// is a number, length, or column-list -/// -/// @group x-validation -/// -/// @param {number | list} $span - -/// Number of columns, or length of span -/// -/// @return {number | list} - -/// Validated `$span` number, length, or columns list -/// -/// @throw -/// when span value is not a number, or valid column list -@function su-valid-span( - $span -) { - $type: type-of($span); - @if ($type == 'number') { - @return $span; - } @else if ($type == 'list') and su-valid-columns($span, 'silent-failure') { - @return $span; - } - - $actual: '[#{type-of($span)}] `#{inspect($span)}`'; - @return _susy-error( - '#{$actual} is not a valid number, length, or column-list for $span.', - 'su-valid-span'); -} - - - -// Valid Columns -// ------------- -/// Check that the `columns` argument is a valid -/// list of column-lengths -/// -/// @group x-validation -/// -/// @param {list} $columns - -/// List of column-lengths -/// @param {bool} $silent-failure [true] - -/// Set false to return null on failure -/// -/// @return {list} - -/// Validated `$columns` list -/// -/// @throw -/// when column value is not a valid list of numbers -@function su-valid-columns( - $columns, - $silent-failure: false -) { - @if (type-of($columns) == 'list') { - $fail: false; - - @each $col in $columns { - @if (type-of($col) != 'number') { - $fail: true; - } - } - - @if not $fail { - @return $columns; - } - } - - // Silent Failure - @if $silent-failure { - @return null; - } - - // Error Message - $actual: '[#{type-of($columns)}] `#{inspect($columns)}`'; - - @return _susy-error( - '#{$actual} is not a valid list of numbers for $columns.', - 'su-valid-columns'); -} - - - -// Valid Gutters -// ------------- -/// Check that the `gutters` argument is a valid number -/// -/// @group x-validation -/// -/// @param {number} $gutters - -/// Width of a gutter -/// -/// @return {number} - -/// Validated `$gutters` number -/// -/// @throw -/// when gutter value is not a number -@function su-valid-gutters( - $gutters -) { - $type: type-of($gutters); - - @if ($type == 'number') { - @return $gutters; - } - - $actual: '[#{$type}] `#{inspect($gutters)}`'; - @return _susy-error( - '#{$actual} is not a number or length for $gutters.', - 'su-valid-gutters'); -} - - - -// Valid Spread -// ------------ -/// Check that the `spread` argument is a valid -/// intiger between `-1` and `1` -/// -/// @group x-validation -/// -/// @param {0 | 1 | -1} $spread - -/// Number of gutters to include in a span, -/// relative to the number columns -/// -/// @return {0 | 1 | -1} - -/// Validated `$spread` number -/// -/// @throw -/// when spread value is not a valid spread -@function su-valid-spread( - $spread -) { - @if index(0 1 -1, $spread) { - @return $spread; - } - - $actual: '[#{type-of($spread)}] `#{inspect($spread)}`'; - @return _susy-error( - '#{$actual} is not a normalized [0 | 1 | -1] value for `$spread`.', - 'su-valid-spread'); -} - - - -// Valid Location -// -------------- -/// Check that the `location` argument is a valid number, -/// within the scope of available columns -/// -/// @group x-validation -/// -/// @param {number} $span - -/// Number of grid-columns to be spanned -/// @param {integer | string} $location - -/// Starting (1-indexed) column-position of that span -/// @param {list} $columns - -/// List of available columns in the grid -/// -/// @return {integer} - -/// Validated `$location` intiger -/// -/// @throw -/// when location value is not a valid index, -/// given the context and span. -@function su-valid-location( - $span, - $location, - $columns -) { - $count: length($columns); - - @if $location { - @if (type-of($location) != 'number') or (not unitless($location)) { - $actual: '[#{type-of($location)}] `#{$location}`'; - @return _susy-error( - '#{$actual} is not a unitless number for $location.', - 'su-valid-location'); - } @else if (round($location) != $location) { - @return _susy-error( - 'Location (`#{$location}`) must be a 1-indexed intiger position.', - 'su-valid-location'); - } @else if ($location > $count) or ($location < 1) { - @return _susy-error( - 'Position `#{$location}` does not exist in grid `#{$columns}`.', - 'su-valid-location'); - } @else if ($location + $span - 1 > $count) { - $details: 'grid `#{$columns}` for span `#{$span}` at `#{$location}`'; - @return _susy-error( - 'There are not enough columns in #{$details}.', - 'su-valid-location'); - } - } - - @return $location; -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss b/_sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss deleted file mode 100644 index f6043ea..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_syntax-helpers.scss +++ /dev/null @@ -1,191 +0,0 @@ -/// Syntax Utilities for Extending Susy -/// =================================== -/// There are many steps involved -/// when translating between the Susy syntax layer, -/// and the Su core math. -/// That entire process can be condensed with these two functions. -/// For anyone that wants to access the full power of Susy, -/// and build their own plugins, functions, or mixins – -/// this is the primary API for compiling user input, -/// and accessing the core math. -/// -/// This is the same technique we use internally, -/// to keep our API layer simple and light-weight. -/// Every function accepts two arguments, -/// a "shorthand" description of the span or context, -/// and an optional settings-map to override global defaults. -/// -/// - Use `susy-compile()` to parse, merge, and normalize -/// all the user settings into a single map. -/// - Then use `su-call()` to call one of the core math functions, -/// with whatever data is needed for that function. -/// -/// @group plugin-utils -/// @see susy-compile -/// @see su-call -/// -/// @example scss - Susy API `gutter` function -/// @function susy-gutter( -/// $context: susy-get('columns'), -/// $config: () -/// ) { -/// // compile and normalize all user arguments and global settings -/// $context: susy-compile($context, $config, 'context-only'); -/// // call `su-gutter` with the appropriate data -/// @return su-call('su-gutter', $context); -/// } -/// -/// @example scss - Sample `span` mixin for floated grids -/// @mixin span( -/// $span, -/// $config: () -/// ) { -/// $context: susy-compile($span, $config); -/// width: su-call('su-span', $context); -/// -/// @if index($span, 'last') { -/// float: right; -/// } @else { -/// float: left; -/// margin-right: su-call('su-gutter', $context); -/// } -/// } - - - -// Compile -// ------- -/// Susy's syntax layer has various moving parts, -/// with syntax-parsing for the grid/span shorthand, -/// and normalization for each of the resulting values. -/// The compile function rolls this all together -/// in a single call – -/// for quick access from our internal API functions, -/// or any additional functions and mixins you add to your project. -/// Pass user input and configuration maps to the compiler, -/// and it will hand back a map of values ready for Su. -/// Combine this with the `su-call` function -/// to quickly parse, normalize, and process grid calculations. -/// -/// @group plugin-utils -/// @see su-call -/// -/// @param {list | map} $shorthand - -/// Shorthand expression to define the width of the span, -/// optionally containing: -/// - a count, length, or column-list span; -/// - `at $n`, `first`, or `last` location on asymmetrical grids; -/// - `narrow`, `wide`, or `wider` for optionally spreading -/// across adjacent gutters; -/// - `of $n ` for available grid columns -/// and spread of the container -/// (span counts like `of 6` are only valid -/// in the context of symmetrical grids); -/// - and `set-gutters $n` to override global gutter settings -/// @param {map} $config [null] - -/// Optional map of Susy grid configuration settings -/// @param {bool} $context-only [false] - -/// Allow the parser to ignore span and span-spread values, -/// only parsing context and container-spread -/// -/// @return {map} - -/// Parsed and normalized map of settings, -/// based on global and local configuration, -/// alongwith shorthad adjustments. -/// -/// @example scss - -/// $user-input: 3 wide of susy-repeat(6, 120px) set-gutters 10px; -/// $grid-data: susy-compile($user-input, $susy); -/// -/// @each $key, $value in $grid-data { -/// /* #{$key}: #{$value}, */ -/// } -@function susy-compile( - $short, - $config: null, - $context-only: false -) { - // Get and normalize config - $config: if($config, susy-settings($config), susy-settings()); - $normal-config: susy-normalize($config); - - // Parse and normalize shorthand - @if (type-of($short) != 'map') and (length($short) > 0) { - $short: susy-parse($short, $context-only); - } - - $normal-short: susy-normalize($short, $normal-config); - - // Merge and return - @return map-merge($normal-config, $normal-short); -} - - - -// Call -// ---- -/// The Susy parsing and normalization process -/// results in a map of configuration settings, -/// much like the global `$susy` settings map. -/// In order to pass that information along to Su math functions, -/// the proper values have to be picked out, -/// and converted to arguments. -/// -/// The `su-call` function streamlines that process, -/// weeding out the unnecessary data, -/// and passing the rest along to Su in the proper format. -/// Combine this with `susy-compile` to quickly parse, -/// normalize, and process grid calculations. -/// -/// @group plugin-utils -/// -/// @require su-span -/// @require su-gutter -/// @require su-slice -/// @see susy-compile -/// -/// @param {'su-span' | 'su-gutter' | 'su-slice'} $name - -/// Name of the Su math function to call. -/// @param {map} $config - -/// Parsed and normalized map of Susy configuration settings -/// to use for math-function arguments. -/// -/// @return {*} - -/// Results of the function being called. -/// -/// @example scss - -/// $user-input: 3 wide of susy-repeat(6, 120px) set-gutters 10px; -/// $grid-data: susy-compile($user-input, $susy); -/// -/// .su-span { -/// width: su-call('su-span', $grid-data); -/// } -@function su-call( - $name, - $config -) { - $grid-function-args: ( - 'su-span': ('span', 'columns', 'gutters', 'spread', 'container-spread', 'location'), - 'su-gutter': ('columns', 'gutters', 'container-spread'), - 'su-slice': ('span', 'columns', 'location'), - ); - - $args: map-get($grid-function-args, $name); - - @if not $args { - $options: 'Try one of these: #{map-keys($grid-function-args)}'; - @return _susy-error( - '#{$name} is not a public Su function. #{$options}', - 'su-call'); - } - - $call: if(function-exists('get-function'), get-function($name), $name); - $output: (); - - @each $arg in $args { - $value: map-get($config, $arg); - $output: if($value, map-merge($output, ($arg: $value)), $output); - } - - @return call($call, $output...); -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss b/_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss deleted file mode 100644 index 2cfd1b8..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_unprefix.scss +++ /dev/null @@ -1,56 +0,0 @@ -// Unprefix Susy -// ============= - - -// Span -// ---- -/// Un-prefixed alias for `susy-span` -/// (available by default) -/// -/// @group api -/// @alias susy-span -/// -/// @param {list} $span -/// @param {map} $config [()] -@function span( - $span, - $config: () -) { - @return susy-span($span, $config); -} - - -// Gutter -// ------ -/// Un-prefixed alias for `susy-gutter` -/// (available by default) -/// -/// @group api -/// @alias susy-gutter -/// -/// @param {integer | list} $context [null] - -/// @param {map} $config [()] -@function gutter( - $context: susy-get('columns'), - $config: () -) { - @return susy-gutter($context, $config); -} - - -// Slice -// ----- -/// Un-prefixed alias for `susy-slice` -/// (available by default) -/// -/// @group api -/// @alias susy-slice -/// -/// @param {list} $span -/// @param {map} $config [()] -@function slice( - $span, - $config: () -) { - @return susy-slice($span, $config); -} diff --git a/_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss b/_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss deleted file mode 100644 index 3c62de2..0000000 --- a/_sass/minimal-mistakes/vendor/susy/susy/_utilities.scss +++ /dev/null @@ -1,167 +0,0 @@ -// Sass Utilities -// ============== -// - Susy Error Output Override [variable] -// - Susy Error [function] - - - -// Susy Error Output Override -// -------------------------- -/// Turn off error output for testing -/// @group x-utility -/// @access private -$_susy-error-output-override: false !default; - - - -// Susy Error -// ---------- -/// Optionally return error messages without failing, -/// as a way to test error cases -/// -/// @group x-utility -/// @access private -/// -/// @param {string} $message - -/// A useful error message, explaining the problem -/// @param {string} $source - -/// The original source of the error for debugging -/// @param {bool} $override [$_susy-error-output-override] - -/// Optionally return the error rather than failing -/// @return {string} - -/// Combined error with source and message -/// @throws When `$override == true` -@function _susy-error( - $message, - $source, - $override: $_susy-error-output-override -) { - @if $override { - @return 'ERROR [#{$source}] #{$message}'; - } - - @error '[#{$source}] #{$message}'; -} - - -// Su Is Comparable -// ---------------- -/// Check that the units in a grid are comparable -/// -/// @group x-validation -/// @access private -/// -/// @param {numbers} $lengths… - -/// Arglist of all the number values to compare -/// (columns, gutters, span, etc) -/// -/// @return {'fluid' | 'static' | false} - -/// The type of span (fluid or static) when units match, -/// or `false` for mismatched units -@function _su-is-comparable( - $lengths... -) { - $first: nth($lengths, 1); - - @if (length($lengths) == 1) { - @return if(unitless($first), 'fluid', 'static'); - } - - @for $i from 2 through length($lengths) { - $comp: nth($lengths, $i); - - $fail: not comparable($first, $comp); - $fail: $fail or (unitless($first) and not unitless($comp)); - $fail: $fail or (unitless($comp) and not unitless($first)); - - @if $fail { - @return false; - } - } - - @return if(unitless($first), 'fluid', 'static'); -} - - -// Su Map Add Units -// ---------------- -/// The calc features use a map of units and values -/// to compile the proper algorythm. -/// This function adds a new value to any comparable existing unit/value, -/// or adds a new unit/value pair to the map -/// -/// @group x-utility -/// @access private -/// -/// @param {map} $map - -/// A map of unit/value pairs, e.g. ('px': 120px) -/// @param {length} $value - -/// A new length to be added to the map -/// @return {map} - -/// The updated map, with new value added -/// -/// @example scss - -/// $map: (0px: 120px); -/// $map: _su-map-add-units($map, 1in); // add a comparable unit -/// $map: _su-map-add-units($map, 3vw); // add a new unit -/// -/// @each $units, $value in $map { -/// /* #{$units}: #{$value} */ -/// } -@function _su-map-add-units( - $map, - $value -) { - $unit: $value * 0; - $has: map-get($map, $unit) or 0; - - @if ($has == 0) { - @each $try, $could in $map { - $match: comparable($try, $value); - $unit: if($match, $try, $unit); - $has: if($match, $could, $has); - } - } - - @return map-merge($map, ($unit: $has + $value)); -} - - -// Susy Flatten -// ------------ -/// Flatten a multidimensional list -/// -/// @group x-utility -/// @access private -/// -/// @param {list} $list - -/// The list to be flattened -/// @return {list} - -/// The flattened list -/// -/// @example scss - -/// $list: 120px (30em 30em) 120px; -/// /* #{_susy-flatten($list)} */ -@function _susy-flatten( - $list -) { - $flat: (); - - // Don't iterate over maps - @if (type-of($list) == 'map') { - @return $list; - } - - // Iterate over lists (or single items) - @each $item in $list { - @if (type-of($item) == 'list') { - $item: _susy-flatten($item); - $flat: join($flat, $item); - } @else { - $flat: append($flat, $item); - } - } - - // Return flattened list - @return $flat; -} diff --git a/assets/css/main.scss b/assets/css/main.scss deleted file mode 100644 index 23346e7..0000000 --- a/assets/css/main.scss +++ /dev/null @@ -1,8 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- - -@charset "utf-8"; - -@import "minimal-mistakes/skins/{{ site.minimal_mistakes_skin | default: 'default' }}"; // skin -@import "minimal-mistakes"; // main partials \ No newline at end of file diff --git a/assets/images/proxmox-part2-topology.svg b/assets/images/proxmox-part2-topology.svg new file mode 100644 index 0000000..252e67d --- /dev/null +++ b/assets/images/proxmox-part2-topology.svg @@ -0,0 +1,23 @@ + + +Firewall / Router + + + +Managed Switch + + + +hv1 +VLAN 90 / 99 + + + +hv2 +VLAN 90 / 99 + + + +hv3 +VLAN 90 / 99 + \ No newline at end of file diff --git a/assets/img/404-southpark.jpg b/assets/img/404-southpark.jpg deleted file mode 100644 index 354eb125760a5e383e6fd228b073b6c7239b963b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60624 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%0DZj`xuY4VXMw<;sB+NX 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 diff --git a/assets/img/bgimage.png b/assets/img/bgimage.png deleted file mode 100644 index 9e2d35969fa8817425b2c1e2f8a32b054508829c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2135 zcmV-d2&ngoP)geL@>Er9^*nt4 z=H=twcbslnw>geO{?dRy{;pXMv zg4L_`R5X8u5Y0Mtg<-c={;iPk{y1ofguMp=zOsV&W}vF%NG zP;0rnL$9I#bR-J9d#P6{^~h0HTUssIWRRsd#Z zC#tvuvO2^S{)K6tpPs0Q&=Sd$eNj!P*B+t1YlhZ zFzzELwG#lHRurME$ksTsk-Mk{Dh*~z>D-#(XICqSzVL2(&QYZea44j}8s^mF8me|{1LX!HWzfqG>yVZY`@KUr0cBuAp_b<_o-sw;~$=IIu+ zrdEMq!hu=!-aKUBlxz)D z|J>oCy31-obeszPqM6m*j4w=DOrsHQs_tA|*?q6j2(zIEyby%JC*!&V^Ul?lO0|dJ zGQpcG3Q;-nVBD08u#*(hDM9N8oG(RhO|*d1i3j7VT(~f~Ksu4$dae0V)gM+DPSfeK z8zHLdMrp(JJssL`QPoUgPcxy$GZ+1Wx4Rv!)24c5({AH@Q}E8Lj_}X&4XR+l==n?P zH(+pqs)o@wyi?a_sC6P;6K~FRrc^YrMMtPBCQ>c4Vkv}z3Wa+Ot`d$;76#>YUsquSZ?VN*RffsI`F`EY>;URQH2;!Yt~ zH#VJ7jU-AiXq?Duz>No)f@3L7wzeU`jDN?c{KEB1IS2))-cX{)Gx`M?4SZl1$ zjueIp-pXH6>dalxTVm^UPJk_%A1TGRg^imY2Spp2&J|GRh!OM206P)5#hONb_|1p8v3U9uRPIz>2>@x->(k|W76G^f=ZDLcGFbzx(La|fZ~=}vXecRM zqCI!X(u76BpHKRQ9b*~Peke&^pc-mJz+7aD^5JUy5uzwRo2Jj54Vr%JlyDH^6TmL>OKz5W``e7w-0K3&um2b z`s){V08G~S^5_@A?XzEeY6ieGS#b9g9*j$ab{ME!Hh|I=E~S!fc<~Ak#x;jh z{znjkAs)KJpk*Amn7QaYE>FhAWko^DBkCPyUB>4ep}~*h83Vv<&0wiL6uJUXyU-Yd zOZ{9N_E<4F^C>{31!>$v3&AtK100r+KlZWV;y*?K{?myy?v&cnx?;?STK#oiBcq>v z(EizZYYs^cIqKffY6(PFJc#OYh10Wl)61m#e&*S`QfVA0G4EY?i;I{U6JbWogf6sJ8$B N002ovPDHLkV1lS}G`s)+ diff --git a/assets/img/hello_world.jpeg b/assets/img/hello_world.jpeg deleted file mode 100644 index 488f785bad3455246c685a48ec34a7578c511e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18136 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

8!AkYTp9XOW)16?tuS80 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

VEmIWCHXJL1=kcDGj&(Z&K{T1SUsH36$W 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 z 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

p#<{QL#u|;?W%HY1 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

x-Q=np-2lKnvIsi;>VikJKkL5vrZz2@CQ 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

mVv4;1Zp5}l+aumw1KA7 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 z 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�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

W!J@-Fc*FZEI_>vAvs@-G21 zFa@(G`*JW1^Dq%JF%?rKBXBVt^D!YaG9?od3v)6p^D;3rGYzvcHM284^D{w{EIBhY zNwYLf^E8EWG*NRkS+g}=lO$F1HDz-)X|py(F*a>8H+6G2c@q(Fvp0b=IE9lpe{(pE z^Ei>SG>bDinX@^a(=nIxIi+(tsq-$QvpTUeJGB!muX8)S^E<(FDZ4W~$+JAo(fb*v;IBdGd|@LBHwd9?ejkIGZX7GKl!si{nIxa^FIZ2KnavG1GGR9G(i=V z_aJaV9rQsRbU%HvV`PRD7?DE3W)#!T0hj;{+CdaIv_n6%C5XmjJfS5p)M7M7FyF&t z20|430T8~10R|63+fzbKGDRN;a#%t~S9B45)Ivk?8b%Id(qKr7^kR;bL}TVedz1$} z=0^duMKR_@L$MG%225;pJ#n-ob#zCaG)ONLN-Il8#05wVnH4!oO6Rkm0F~$sX0vm2XPUVGG zZB-^-)njCpQZL3*Th%Y=G*lDy6CKrJqF_~7LQ+L_RGYI@MeCfcs_PA@3_VG{hnYc3{hb2cX|R#Y7!W*DFoa$+C$h6OGr1+V}UwsuEaH5-Ni zXuY;$jq_taGGxbLWSe$XF%M`hrVHkFVr`Wl1R-W33n!rAa36;O%r!@j_HSB(Nhnun zeFAlh_Hp&0bS)-v^&w(;lwhMaCyv!()&M8|!eg316l8*Ri$-*dl_k0sCur9JEHx-1 z7EE+-cs=wPfM9sVfLn2bT!EGWyaFfcHc`1^YDcssq+tgirwJ4;M==*LcCWXgZjN$C!+j*G7_e ziGfy-aKd3JcZ%uwUNx6u*^rU?|9p<(7@49A!|gPkz~SJnAKfDmJ3!-7v34vqoO zVx~@9xua{Do{za`0B90g*rm_l5`K1SlVS+&fX#HuWAclb{w+3dr6^{$U_Y)wg^g4r zy!lFuK^kDdW3<2<7TOrHPMn3&oSV<8O9HD&BAx%Hp23DAblCys>|mE>bJ-L(Vg}0E z_+qF4mRZ@Ny;@K|BB|30t}z9p=^7()S3pGi;F?H@Jw}W8VGz=Kr&ao{Svn(<_X*mA zY69A07(h#U*RC^SvcEc||E7Lbc6TiM;NZ+OTr}N42$wONSgG0>wOaX78zfeHt`GKc zBBM}wM-~2{2%LFG$J%4I01^mUU9d!>8)kzMRwJ}{zJPlp^17lATY}?yxHY1$Y0gy` z`C?F-I3PQUio3MctC$lTBa#=V02^bVYnCZHJKPrj3Hs)7l*?k%z^r5T+pali(S{nD znyua1xGR*D&ib^Ov9*QIzefa{TAQn5x4D0`k^ljKmpHdECJIEE0l0)E@HCl~>oaKi zlk+?F{))7T<-#ijuQ~i8N?Di*$*$vj3Zlxe>r}fDgt=SVjg7^_iCKwa+J4u&hL0d- z+PWgJfqa8GzbqoJrJ28%5x`rowfzu9u<1n1xRDKTm&U! z%P-mAygb9}I?NM0xi5mFku@B2d6qo=Vt{xmY5;Z5-6I zThoOd(eeATPra*Gx>5t3BXV~WX!n&SoVpQ))@vB2vgX#sY0hKD&fk12`uDRx+|>QN zXbR=blNs4do!uR0(3>3@pS=sig%6c{{iJ=~9xU0(+I1Oh-SxMC8KNb;{U-dB0Zbrf zdKf5v8)KjV6E0!qX};!D0ZJ^wdb}w7qOS~TY`P!@yRfx;=?lUTP<1169X0}9(6c_*S+!PWYS%sss zAGNVdV(rCywAy~04c$bfohK;FzwaI>^8QB)cnZQnA3(5ZzWwn-fhGLDPDHrykAz!A zhaYI$Ddb+cv%bVV#tGuU{%u|0L^I;$F-H8!-!RTy>xUlQvwS1U++$+Qd}_$ zpPPd_W?mX}0m6a6fu0N)Jc#fhp@9SuCSoXX4MJ)$Ad*oC(ZQH@2K)ue_=MC!iV(Aq zGoUR;Mll=@GRhbQ(>sLDRQc(GE}_njJRpWdcx?tm23{^vB2s1C&ZSJ7I(-T?s?@1e zt6IH^HLKRGT)TSx3O4LcePYX+ZA$j6zO_%&E?o;(t-qcOr;Lls_TXHfq}Gxgy5vO0 zhz9lTWf*cTHkA-J!sRz;umc7wAlh}yv{A;32n$IjhnegRjrhRDEwYY_Z06)#kDNftjp)Z+f{@p1mC+*%#%gHxQn? zz9_2$v>x=#AHbOe6{8NIXb`4{LZz;v+MR09sF5PZDWc#(L(g-1#150>u%0bjN%wo?59nBB}py>3BBt*0@5CcnK z5&lPxQJIUbfRYpu^a)4A;muV3d>!`KWiLu7My$>IU{xG@3)M4#fGv>NaRl6yG(-f= z#2s1(6{=GT8#MQjOg?;WLi|KhM8`{<5pbgDX`G!wi4J51-v>eSM-f!#t;8Ofc+NAu zJAsbGKueg;j?J>qPJ8XPCxr9uQswR*@4EjE{7zgp{dDlgACG+U$}c~x@5~$E{Ibta z|GPDeYf%pM+HcQ&_uexf{qo_9HU9VJ+xO4F45e{?`|iIFfBZDdUp`p%%a4Cn(cEFl zAHFgq1uErlfCMa{0poW+<0TMT2W((i%*7DJIdFm$te^#Bwm{%z@Mah6;8Y;!{-n%# zaD*f*p$XfwLEWVgKPPM<+XiC=0lIL8G_0Wwp+`Tp_{S+Lyy5mBm<6r*aEL@Kq5*qY zJ0u>&Kh0925tHW#=}abYMSG$ZuZTtNIZ<|7Tw)Wm2*xmqag1aPP#0%*#{V$ojAd-2 z8{Y^=8nO|Cy{p+AT!?oyW`8csKzz&agc;8q#-HjN0)6ekb*pV%8A(|ROPIO@rZJC+Og9oUP0L&+^TH*V6l{WeiRfCic!03}nKdF;_kpGZ zqzR=(-0B1@Nv1h{=*%)T6HMLW747=rgD_-|A2a$A=th?U*omc@QJG6N#qtjwSjsHh z6d_mmITd)y6G}5#gcVF-fPI)uHP9KGLC=X%0;ZEp>--Wmk}|VJq)aE(2w<5S(E>P> zZ6D5<1RqAa6@-=toA3$fK+954u*ftjC6!@6cyLpl5JGXkhy)REl+mPWbeH>C=11=m zvwZ*prnS<-MbU!EvIOO0@Y(6f{u#5Je#NU#X@pe~qKz7i!f+CV(jdf8Po>JWeH$H9 zN7uMRt1yu%PxYM|v%0&y;_g3tO-~J|dXSs~_AQuPELID1Nw)qlVhdL-3t6uTR+x#^ zE0=A`W>Iojw(i6cQ}EMVPkX+)ifNI8%_LSGI~7Jw1f)x81X3sBgeB?YAAq=((7=$r z-Ynum48TGa*W!;qkiwf?h+QMdpbtny&H+p~13Jh8Ps_B-0EZY|2%WPAeu&cnP*@T) zfaZV`5Dk;h74J9!){)+(7hsWPOCq?r6Y&Dd32-pzP<7(Zg`r3qLl6uD0;e^9hKp*& zt)gC}CK&a~Fs zRlk!luF<^f04_+Qb#dFte|16;2vIm>vpNWkRovf^nEn(YhsafnPs8Eqez>xzt#a>} z+Mh2n_L8e)i;oE?UpN}zLbM}Qy) zCS;-*P~tOJ7v%+1%)}q67GhfGa0N_o#2JfVLh*RgnnNdgCeZK!miQrvFbvxOA^X-& z8X*Qu>p2=jaC9MJTqqrUJ0Uyu2c8wZ=RViU{>h;oPFpQjTEk94+3ny*OKuHtM&CA| z!ud{aXL}NHE1KQrrm~ek9v0PxDUGmQA`in1y)UOcuPA3yQqmI0lvpYeVX(77u0exN z)K?#c$W$o%XCap%Om)a-V_Lkgx zB3Teb8yvzJ&7j%vbqBfazany4X1V14CdVtv@ly0Iw`t5Pr#h`&9*(>m0EOLqfpl@g}mYmIP!2?1k9gD(EC17LN1DKl%e z@g2}t2<#(c&GCE*F?NYXaEO&6iZf?_@CBLUcV~cq4~P)?XKan2ct%qOjZiWMaT^rk zfGHD!w+DnFhh=5KdpNXZtwm-jr-Xwwe2mj5m_&2k00f*67dBONJH!Z7fOdxfe{(^0 z)~AJ-p%2<%1I5#QJ9ir7VPF0^xN-})a#ccGjX+ua_9XTNe_X~EcH;s~a0Zvh2>9h2 zL-Jz?;cGIL2vz`7a}iYCS6ggIhR_!;_||}WcYp@5dW2YknW2R`p$#}tJc@9B27nDT zKvgo8g(tsztH^#!N^cL>9X@Af1CDPV&~f){0qHFyx# zaD26eUmC`c0>lW-#r_mBRgH1Aj@jXP1;-Tl$Pdr}2u<*91nGX(WB`T08NM-(A4Lu- zX%LpTDEQS`z(|w3Glb-$Wk5M)=la*uKy*X2*!h>c7% z7i~ZmjL4Hu$4^XjlzAnM`oN8OabKC!j!21y79(&eVv;h2j|S=zsC@8Bem2CYY9s za(5(22xr+GiNJh6$Oz1b2m+{%k6DwYNfpA#OGJo-W5G_e)f6~q2Up-ZBq@PT;cEkT zQQpXx0x3dd{zaSU7?TF|m6bRZhLD5xxDzP3fB#sJJ3(N#b(@c75YGSvSa1p6z#C#k zn+Wxn2#F&7&@TQP$I&HnDuU(m=I}YY_ypWpG8&_H(GJXO~VO$RgqJ& zs1vmKb_qd&`e>3+A_&YEouCCFhTwKCF_5sR6NBJ^-Ki5h)d*eCi=G9cXjKDSml7h8 z2m<(lF43S4DMA#woVGCt@wuBI>Nq~ocR3&mENKw%%UGGz^Gni=ickp~x0^GK3_ z8iV>bsB6FoM5+j6;0O&mnltI8U5c7b6{h+zrb|(EOOk;jAp>Wcc4szGBr2DQWddv0 zARgEehc~AksuNq45EQX>>d2wZDHT~aO_rD|spk?3*&BiYDQhWXDw?cvDx%8as4>KE zlsKu<3MD?^1{mphkVl9-;H=e=1=1j{MXH0wil|Atn+Z{wr_qqKsd;Rdq7wygg0TK? z9|Z{eTC03|tN)p+`f*oc8bHS2u^(#;)3#<1_@XEUXHfDCl@MHNh6Sj=5g+*nLd9fCWQvs7zuy$Dn6+b9ahbaGa(I+qMW;APECm1CVe9E^7eJ00=M`ui9z= zgfkElmKkM$XgPwjL!h&U#|QfgumVz@atpIEn}!5SnTi9mP4H~A>2EEoXH|7z^H zHv&;z=s*pF%XAj@P2KCgp&KDB3$h@2cPAEhxf{L5Y7mM5gB6J`vzs>-b(nKWnSc=o zmq($G1HIDAc0SNG>!&a5JGvK}vG=jD@iUr)q@-B!Q3iM$M2Z!PK#_*S!4E9L-4nrT zva9e@!GmV~|YC-XqEK0Z47!CPA5f??_lXgob$+_Qo(b&TIV3sl3hmoELX|&-#r1jLV!=cHCOytj*?3(cqKD z$g-NaL(rET%;Efw{M^ffEXvjF(Eu&cCGF4kY|RZV&DRXlV-bJQ9M0b?(5U>+qa4y; zCeI+f$MDS16%EwlbI~`0lwaD=Y|PCp_s+?f&w$*|yX?;s&4f$c(>k5fb)3-&EzbdM z)u&v~R;_YN=zBMv(K)Tu(^%9>c+&42)NP$S=$tdEDb=J4)4wOtNeI!+9LLqH(sljS zX`P)k!^;Tus(x-F`T&*OR^0bM4ldZ98yHjCEAWEFIX6 z4bI~H&{BQZi>-2Oeb9G3+N7P;WzCcOeAI*O(9!;E+jITVGY!)SEm(<-(gUs8!M)i- zjnSVi+{caFu|(YIoZQXr+;PO&R|dt;P2JU3u}s-Pvul5AdMg@h!sTEj_8pJ&UjhdQb`hl3aU`2Rmv&(tru_P2lWJJrisn zj<5#{zTkQw2WWQ|j-Uqy$Q26C;0&$@+jS6&a0ly`5PGOe| zjt36b5t6{-E?$>+;3XD*;a^j(OM6_Q|rIAUOLF z340*3+1m#hZV-!r<2tVAT4dna?NNR3Z9pCe?obukPzR1DzXlHgzp{xpxE2bcO3kTBrY(FYat z7IWcyQ0dZO2MZnt z9&Ql$&fv+O5beGPBW@7W&<9`6{#$#12SQY>My?YkzTgjz5`F**(BKCHpCg(s=gU6u z=m6uye(KNy@%rxJ2LI*T@CSR43738c<}mU5?i8n98?TNP(C%WSt_cX?>>KXw27u(_ z4)h0J?wSl0=+5m1aOu-z4MFY>;qv7M0PRI14S66E{QwBs{*ro-<_14aaIW?4fb5sT z^iB^B+8_tm;0K|=>}a3!qlN1HK;`Mu2btgw*8t@cj|p{93U-g>kzfi}4hfoY=9BRE zJs@i;(a7zHUMOFZ&ua^nta`Un1eP;S3+&a97_FIIl8!pcK|%2O^PN#2)rc z(g)K->N5M}keK;#@cVn93Dh78OD_l0k3}{ZI+(py+pw2QH8H-5U1R59D(&p_q{V*#QueNEsklu;9NxaM~Hr=4Vfwa{D0d zfn(63MShavm?OAI&%lC?_JAU|4^Tyd&``OP*yql=i!o)+q*>GEO`JJ(?&R6i=TD$P zg$^ZJ)aX&9NtG^T+SDmQeNUw(jp|fi)tOkQ%3QR^>mE9%2wv;6sbIr52D16dg9+YQ zKWPb4(_`wHB#QnE7vU*4w@;{xWX%#pJ6DgKzJ+5t`e@*v9CQZAc5)`kB}Zy5VH#L; zCo;l2APM?QNU-0ZJM0WV$}^52Ha~+6(2cV>WaE7TWg>+0mZ2YorUB(4XS1IqII24~ z4!H-g0n#Whb``bN`gQEtwQuL%-TQa&;l)E8A71Oyt2NJS_vqT9NRou(j>dZjoP61j zyyA)DjUexW9%0TP_~4RDBu&ODiz_|cD~KAe@{r@32lp7vq||=P&_IH$>7yc(;&6u` z{hl)b!HZx^P@6gWO3@Azf0JuD2Y34;6W==8qq>4T0x3F~3M_9(B8xQgNF}Y<{*sGAS?-F z^F8Ji%Pc{IJmfQyKGFix05k_I(;_r0qDDG{vcW?vgBoJAP8%~>Q#LeT8tso6Ez+;c zCqor=R8mVd^;A@SvNF}5Rt0Lx^wj&Vv&bwWOS(nE{KpSVw9J$s20YQ=zTQ{+pBQ|X=DGl5?@(>4_`zW=x z97(D@=nqg!0)#L5M4Tz3P78vKTfbyeOh7da;0F*r5@z*bh$EJGVu~xy$yJMK!uY9; z{+l|@vx^qiqm+FQRqoNfHLBO+<+pfFc(rilX*J;Z6zAdyKnxg&oK zfD;wOFaiW*gGdW=pJ?nb#c1O8ktWdFL{l)6f9Oahwn$3Bc^W%-4rh{hnZ`DcOXRRE zKurS#3_>{E`DZu^ZynJfYFgvF*RC>g2O8iOB5@Bs1v~|wjP~d?W5^?yd~(Vwx5{#y zI)<{lhQ7+zF*^2x)BtGg@X9`d8rOqI!o7;4I0Lr%V~;w>AuErmE$UkIf=-jp!@4XY z?JGtN_|mI7?gO_E-m|tSw>|PW1x?4*a_Ek4VqU!?wGD#pj?X#!>Z_3nlE$I_hhPW3 zMx)2~yd+4N*CV+ezw)f5(?`dAfByUT|Nn?-j&cG-4*(4anzsc-8*)&N0Uh{22u4tX z4F{ccMP=q5SVF?Q;!3!cKg(hSYBpx@Eeo%rVETmx#ZFoZ# zuFzsSED8^C7@od`0}{dcVG)gZL?qJChZ9?(P@0%T>;R8`P^4lNt$0PqJrQDBY!w#0 z_(d>=QH)UJBCE>SlQV8HRu^02R;HAlH$E_qp_(Il+GvqFeld?@9; z%Vol{jlq0nHMJAVQ33LpR4Qa7r^!uBM&*!i^d>C}X#ht0(wymGXB|CB&P9$hox-H0 zBG(ztZq^f>pVTKk>DkV1789W7wC6s>dCz=CNuCHDC^)OsPJ`mJp$CO$LK`X*i&E60 z`!r}o75dI-Hgcg7)#xMP=~00aa-9AB>NgyuFlo2xU6Vb{b|*-9u}vI zy$Lo&l}5qh(U#6!rIqCQQ>KPBu5eW;V)=R4aK2TpL5-?k`$^J;RyDG2?Pyh-O4HWT zRj6#e>TG2i)xBOcv2V>QZ800$WkU3%oD3~+!TH(SnijC}eClAgiqNr^HmDRe>|RIf zS!yy?ySdbu6|G&1``YDd@}$xg?MCD2+PhNMxb=mt zX-6B_Urv;-_hcqN%}ZAN4w$BqZL4~N8(#&l7ruin{;PuBsb7)8x49WMt9TI{UcFwJ z!^735c(;3EUv`%&O9d~8iQ3-$YIU`j{VGv+`^~8)mBa-mv$uMEUn&s}wtnmSu3Hiv;cN@LG@6PIj!9 zy`5%vTioL&ce$Va?Q5D_-Rov|yGs~uWqt?V?xuIW?R{@pq8pC*=6ApS{qH2ryOZ(; zc)<;RaD;PA-}z2>!yW!`h}SZL0_SeT5-|n#Erk$Vs8v(0L4!{i@!}a5%E)D6^2lXF z2o5+w8q~7#mUCz09cRkSnPP}8(3~d!&_NqSg>#)>gc>pM#7$66B$cx~4UE8oIBddm zpVP$VL(#?!){sPs1C!vKv-(A*zLTRjof@X0;I%^v zz$&r5jX}8!TcZD)2}Zy;CrT<+xvaD?2xM5GNpl7UTyX2>yeGn859z1}E6R@7RYykiVTcL4y!NA|wd>)4U&i3L`uU z9?S^_%n2l%xP_AvL9#KUN-`H)y+WEfeW*H5fCL!`ymFWlepmz-Z~!KF0}_OaM<@c8 z`vP*f3Ne%hB5;5-I4FPMfic*pvg-nNutTfUhmFHS2Vej!Foh{OjxtolQ_u%~2m}YH zLAqJKf+^xE=dF`aE&x9!zMTb@GA&% zJb^`=L`%HH$RI~)d^;|HhLuyq+=&Tn&_oAt0$PL)Kv=^{B!h{x#3U?;VJya5JUqUM z0a7@GHH1imkOqf50ezeeV5~&P;{rrf$e3sZ^=ld)5QA(qfJ4v%NPt1Y=sE*9#5{ya zfeA+}7@b7mf^PVO6A(w4u(^A*Mr<^bu1f^Kt3(mxN2PRtf=r!iY{sZ;NWk+)ka)^` zR1Rb;!xIoZ1HgtH2*|6OI+F~`l$?ze^q#h~#H;&8qBIeHhy*!&NIs!TOT0=#*n(Qo zh8!@w(cl68A|%LZEC_$N$cpqv3p`6@WC)+^$3;Xumki3y#FiM4zBh4zs55|fB!$&u z1hiDklpsc9T+6$x#18DA0vwW5LcsN+Dl5AQFT^C9tGXq?0#tB@NO*xVc!#S<1QUP* zZ*YYmSOE*vhecRUZ}2--tU5Vhf;hN@Z=j_^Fubc^1QUS4tDuG!5Cua_0Vc?VWAHmF zaJt{X1aE+bAW%Pj_=Q7IKVv9{^B6iTxP(-YgiO!}S0n^600Qkpg?HEoLCD8cumm}% zLoker0_6ffz=Up4LpTTm=7fY8ut|Mr1QuYGY)k|OSOVsx&nEzh zY{-EhjRYBJ!E^LUlv7UTbWZ4GA8eR`8FUOCFo7~Ci9wLjLMYN>fYCBA9LNL$;WP$S z_=BmzPyH+ghQQL{4ALR>MkY7{=JdNN)w~$+g5m7GIW>S^kOmmo1Y>B2NS)M5%@RFu zQ5cm`&^&@KXi`8hzk*d(BiR zmD2ePf>HAh74Ofe}R7zb4lY>`Oy;0ip z2Rn7qJk6b8ja6cu)&J0eHTBm)H~}5JRmrQm6^PdxJ&{d)(HNcAdc9W%s?GAaO;OT9 z4^unLygJ|HyQ))6CA2^kJ%}B!Ky2_ymXU#sy@4kfzixWRQP2k=41*jvJAI%>*GN22 z5GPk0Bv%}{IugQCgp~qyfHim{YIuQ7(5MNe%c3(xh9$fc7}Bdygeee*{Yud=Dx-!5D{2d6)y>(O^`?jcydvKTFu8ms=-MG8Ey9I(naCdii3-0dj zZoxGKNFYFf&h53RtW zmqHaj2&&(X8PagthOvnVyx^F-5Y-FJ3`BnkC+iPdjMjaCI*L$O7S}cpV(7lE737IX zA=%Tqa@ftlJuDPb3%Xgkx!p!$LjncpBXlobn@OwkW@Vbg-46kkSWkwEdlPgnZAdd4LFLfT#S#pkzkSP)(Oll>4(G)AZ2@y>{szEhL5_{?=8#7mqveOQ$&5~E@5fiNiS z{>GP=qKGVBXOPf#sCB0~lAO2XqGu~8!7Mo&yB&TfAZL2FnTC`!7*nHffdtVo*U05! zrk5qC$_+{h$?PYiQc-p>ibOac%n*;JejmKV$h)mGv<0Rf6drq+uUI=jx=3gU<<~Mm z&X!$O**1vM%b^0$^Z`h9&d{}G2_cq8CUlm)Vml$|LT#>abcCTI^1*l|V+Ry)O|4tt zXk`JMei-=zwG`&dO!wnz^Dg>nOX_8dF{qHwt&=f6gE*v;`1RuDExVu1`o%HDGXpHY z&q&_pns$C`-;9NBYV9w6KJ!$(Yyt0?AXqu|KsQO+i7MN*(nZ)%z(|P0o4&QjX*F~n zJ*_;npNm8Do*iGWvx4m(GEGqsNs9z=Oc&z7lheQ(j7;w!7+-zd{sDUm#ce-awltq- zeZe))WDl2zdl`IhTmSR);59!1KR(g1W+IC|=%6Jf427e{rdo3(o%forXuiVkL;;jo@ABsS4l>ZG_4nZ{7 zV`Q_?O#S`US%>9WAjPGg;SGGB%vk~i?=VJ^xCG(1TkR3PS4FqCxtWf!7%hwvWn zgi-(ckQxs1Zz*07l=t(LbN=!+`V_HDPWIU4{ksnxt0!?k5Ge@0Z?9TW)O6y~x{mwa zQS!+kjtBM6erJup{qApd4wmUn{-Ip^!%OmqMEoW9X*hz#toxamOgi!-I-&%J@UVR_ zC##_Bm+yFZowscJvAr(rh_0Z%+mY=R(u{!x>Tt2gugc^RL{g!|ZK50C(Q9UTQQHsi z^7O1f`I|rS9w1AG(6k=$CmF#!4Or0Qk~6^ei@0yXo&;4G&jt(WhLz)x3Vra{Fq_kx zeeNtCatIa;>9-Ko$=fGEw2})uk}5;i%Ad%jcvQv*BKYrwJ)Az^4R9*#$iDRei~>2e z;YQp-7(_!!_|^Dlkz1!dADoYpv-g7Aj&<=3^eqiF;*a_KfBb;8B&E6X>~)nFf1ogd zku}!LS%wh}&=($?&g_dg>%AWHc~tNH5)5|FPVk<0>qvPxG0}32yL>`W-OC<3El-aj ziZIH@_0-FRRiAb?MW4UPvlnEoZjg@$MSlcuw25#u4s zuS0+{)j%+^0IxSF>Toa&ftZJAq+yRTky$H@Q~+=&YRe9mPcr8Rlm*6^(RoiZoR9$> z1TcvU@Q0RU^Kn^CmovB#%7fxaGsG*uTS#(oi(=Vxk6@_6vRd@ARHQHtL=nh+b3^tx z2D&3m5oe&PM&+})bFF3$XkN>thcu^9ug@W>m)nqw#j$vC9#1CT>&(`8aam14?!PyD z65zIh-T1&A>3Y6MPGGT#x1y6!9tcv{^K``vfmer(QS=4E+a={Id0CYEWfaxS;A#jR zghpRUrm4;0*E;vFE+BJ{nPcTv;6~rbIF~iv^C#vPEZ3{AAX^1I6FIHLcT2~wUD>Bc z&lZ@*IBG_iLA@7|c8TIT=P(8Nb=E@RnKaWLP=J}LlsOmQ3$=&u6Cgulhx3g}bHN$H zy%OvNz<-y*RA7TKfv1}l=M>Xf8{Z2JO4_qhjc(m9BXJ_A6<0uItS==sWzjjCr12}z zP$y6KJdB~?!y3-@*mGE?q$MX#K!TOq(=3u>&Xvqdh0GzD*R^H6R}IEMz@kh%7^xp7 zScNtXk_qRy83oWb1}q06vw5ybjb%1t;(65FCBWLqo2S6e0o%^>*N%)wXs=&gB=vgk zY48lBL-|c3={aTRdALGUN)2#65{>y71u;-X(iNG-zO5j2B}2`{bdye2isRnT3=_tR z;+kZz)hq}`SAj@i-Ed9Qe5>|_C<&D}m==|;hq#)nNzqLjMFTVP%^OB#S>@Wcpb4y2 z6WIuTlZlIxnG_8}np2*P=ZM@d}2>WpRE zytr6^p$>vz%`8Su*VFB1QXd`@5;wDiMkEQZKW zO}=SPv8wqu@%Y0LuolkE4>Kvu;5aM_)*Lif;72iq#t8--4HYJ}2ZcM?xffsyj#K}M zWzJ|*Y0H#*u%S6x7Th=S$tY+lU%J>7yoYTGK2kUQBT+g!Z5%vKZsi3^MBx>BW30(T z6^G$O@31d9pabS}yjEDvfVsr0Ae>pg@FpYERxIIxj?WZT)tf}v$$UXj*XCMkO7E*q zq0UXNb;k~+;fS1D93>QedZ^(P@5bI|@Kg9>nDjqFd2|hgA}UQB&cW`3IM)H9?mAqX zvcCp`xoD5!O&E4z-+Ay+eY~-y(kmJVjSka)n2uETjl?at9$_{GMC)!-5p-pwIeIM^ zlAuu&O<9j}6#-&x^{Ij2s&Pq{POLbm9BQ&l>oK7ZXfc-E1aF_u#@@qlCIoSdk|OG4 zfpoDF!}MvWNzTW|&l+NUeQ9W!Z6@S6RTDG1<%xJYCX|9WQ?z4fi0Bz7)rvS%tEShP z7!PIWdK*(4b7)!ZY^L-MIMdZ)Xqmj807e&_8H1#BfM}a(vjeP*LiLl;g9;2w&6CW< zyBKbOnu0YISN7&M9beb^j1e|Yc0vaoJ^7Dm@jR}q6`CW#zVlg+L9V>-IrLJ)UNSza zw>jtBr~DH#itdU_`M;V^-k0lO2A^;hT$Rv^kzCA&gK$$GYmUS(1?E4L9cK}foJk^g zD#j7x7DB}`$jE_h7n6(J67c+vWa%4~{j+{>QQV)&!%r$MeB~+?++kGmxmXepYl{3G zVk2qsYhl5t=lPNT6 z7Iy8mKbUL9SM?^$v3c;bw$MsZp0!5IN@`?uB|7)7Qw`01X15%oYO5*1(M66R6jz?Z zY7Tgn_9R=XxOx^#9=ptWHh{GOt9Ve}{+k3SK*bPT4G54mpGAz{8LeRtbVVVypN`>* ziO8qybp|7A=rf|F{m=xWG=$C$GJ2hgU1PtOOSlR{Xs4=nAZw`JWNhTE$uwcbIi>mn z-1I1K@A>StkxgU|&nm0M9Ywqd$~F~TO^742m6Vu>*w#Ivygfvsp60`u{7z8)@|xkp zL;7V+_qNZZ`^K*@!wBs&e#`5}T5skFQ|O^bznpgfy^4J}c)f)l49z+YYSI}F+tO|p zIOg-#lK?vPZ?qS3SzjKpBC>bTC|@FmH`ywX>pv8dtR%xQeF!+tzcM#TCL8CrcW*j! z)b!UE)!l+j_^dQY@DyGK@ZQ8&M5l!K)3=lJPRASvVZjl93LtZqkETD%wD-hGM95RZ zJO&qc5KUEFHQn63^kq9d^5+$h6K#+#hqeqF=A#ARv?6F={z)ewj4Xo7TBMH2ehUq&+Ph32if@vNdS?62-f4Z zPTg^vMad_&Z+D}Yw!ZNaQMJ>Q>=TpifIfc3MoMx2Jpe8Dfiq>{__D-cQ#5*>7hloE zLZO&?$Mfx5EGNuMowjd)T?CJ{QNL5gXLom4r7VI7{I4e2x`+Cgdt`(YIz52N<88M=0?vV@wGPf~dR^D6%M` zTCFKD4co<;)^B6TLIwy&=WE^v%&+l~j1!8?4@Q_qbf;rd!E5!ywIG=bvlo~uI8dQ| zQp5@S@W&0n$_F6Lf->p)bF$}0pFPArY^j$?LY`lpg!k&D5;;)xG3{a}D&*|8<4|wD zS`(pujisNqd&}FGfPluk@106U$v>+-d_LHOgp(4fr4#k~HL@{*Hb>-MXqb3w$1r9v z|J@ZnJK43(UC@^?QRKz)UYT_qcMzkGe0!iI<}8iJ^YYFPk+e@gbc;4B82ktgX;A*I z%mlJPTtFmgYvPjvJjU7!39M~i=nebLR(YhyBRBT53_g6 z5~G>wL+Nm67*KpHGWR_&dz@FIk-&W%Na_z&Fpi?;2!x7Kj6GimFFr-U#snHk%!->s zhJpnacOXSfWJCZ0dJKXUg@>v0#F=@gpSgp=iTWwf7FpNBV72X=U=s{ z#LbkxLaix?16mcSDa>*zV*qqPa`K3Z+QDe+Y23XdXBnE&%6P5KNHtel3 z&^0$7s3_7%Db6vNLVcm8Oqvu&4+10|?g&f@pAahZ)2v1u+UJz$R+y{%=BnP9HK&-T zeJz1jhtJQVx%%C5wN8Ez92_0zl#L2V){j$UXRF9D| zRd5pi!>04Q>i8veZ`BxnVd-OQ5Riem=?3wo#n85M6Sv9ub|+RSH^Ynv^g}fyAEiI+ zPys!6J?~9lLI|UX#QEHJFj>WeBhgEp->P$iV0jO@*x>lTp?WEVX;-AFG9+dYhFOdvybK(;1e{dsE2zQ5qKD{eAE8<=O1^um6peIZ|1NCaX5L1YmP&pA zP9&reU}h>AD#KCkiarSHHIU-D=HgtDBg zw{)!&Z|jz^s6w;cg>oJwGO)Mm+YYdQD;LiF-GSYqHUN$THIk8}V<2=c3#2xRCQyHPsWG)>AYfm^hZJKVUEy zCx%lHbEbYYKg!%eE6NPR%z(l-4l)WE<~H3NXSbO zmcXu$L!H;g$Vt=JLcw6a=-9+zwK5Q+Qs`qMe-Yt;L9I9ui=xxSLePIii!V#)4mr=D zGqYaZbWV!Wgg;Lx8_6tVB)=Wg>LEN*PD^~7mE5?RhBq*0Gxq4W`u>P7S_d*3x;r6I#@u}Cf)JCyMdP6?_BFPq|p1K@|SfWV<^KT zA)`6m#Z8R2`Pp*-7Nd$rm0*BKReHqtbKj)N;2z}i?+jrxp$Ul{%$)^ zC`f|xafHHt*d!)m57}^(R`*6bP=1&c+FMMB&@xGu9{JrUtB9oo6%%N_N?n~1C_jWI zx^?%JQOWoGxDaMLvFu01S~hpkVn10#&|$i1w?tgd1!`_*ZfB<3 zC}gq_ayPTQw0#B#b5Naa(cm1EE@jX6fc~6uZ9GF<Id!A@jSQ*MLRTp^6|l) zD$TDWjkcAeHDp07_Tpa&Jcovb^x{pT%fK2y0NuWHwus!jgZ#9_g7J1B%#+^Bn$AV-?wv0d3n~! zBE2|AN@+_PMu~y1_&blH%Bl$%P-k-Mrxt^iXZD1Sj%S+Aa94}wWps}3PNb4L=}!fB z18?fS^kPsYSaC6tRCbS_zGeFfn*3O#^$mYmC2M9sN$CpPAqUQBUH9m^i2i%jQKb1d zS!MRl3aO8v%iQJD3l#P>ux!rSTf_jikbnc!K)Rs7IIPM^EA#Fsx<{xrJP=`t!}cu{ zqoMV;1eDK^^k1T`2qc&>@7Z5Q*$&cJLV6eoc-XWp0x_L;K+6L( zn<4R4^aSe?uZkl~MVV)Y98#jNqr4L5y>J|@2|UA4hQ~)f8#^u$QQgMJ66WG~pRJ>H zD_(>TOtlY1ilV=xNO%&$s|MJai#IsQHwZ*QRzEQFx7;>iKqusKn!p}>s2?tQd-I~J zNR*#*FMI5W6>a(!-X}0YogoyH+#ChB(T0>$nj?Uj35HxPRb!#Slw*{v%UoP^H?rgw zJUH`)kV7^KF-;yHe3k1W8&%4!SRhACO)*JR^RvDT^H8oejzuV5+i_fpjYIuwy}8?n z)+3#cuQ-g)Hma}`6-V*8^;z|vxa77&WyJ>?@?#r>5@d3A6vR4|u?aCxPILY0UK%zu zIWi)M#8Dxmqk~WgiyNRKl0}haUZ%20%{_b(+rN&Z#-QG*qBZl&MxS4@gXkzZARoP; zry1isCK--$p)QmuhsbSa8WA$VziRyv;;_(BjBnUQ{l==gv^m9z9>4$ry57EzfxVTb& zq;!e+^bvQvK`QOf$hTCRp03}|vZ6_7qI=!Z4i`guaPeN3@fF5|@L}A;5*6Bu0v|=4 z+z~uZ1c;%3d82hQs0?Al{VEg_WLfAK;U+MV=)}wXT=dz3`255%jnj(oS1Gj)j(8;4 zS!aDe(z{A(p@ck1MIgQE6WXubpuO8KG<6F$p1{sDY5sJ{ilI*Y{mwcJ=+D2s8>rPB zKV!KXq?D5Qj6uyMUPR{BVwI1~rWnP1=Ig>!@j=(|Y4!0*Z1Ap*#?AZW(~bd*Sy ze_0xRui{7!8i;ts86X%tdNtoR4P*tF8%{4zJ&kFHZv#}K{xgAWr6OFwn zG0mlN`5tTo@ZUG{-@Cn^F$R)n#K4-{S#`^ve14tbE+}n(9b+L!(-t`YlyqL~|I-8O z#t&>@9QUO@yNh--#U!vf*V=xIpN0sV#L!oo6`@j!M1WF#e10DY z(w`?wDVraNmiHYD8{1IOk3rxj(IGKQa{c|Y8&5G->k*1q+{ z{%jT{Mu+p>QLI#|o~P{;FmxOENqC%4n%jc3m6YE_*Ejp3M705tOYrIp%X}g@hP2sh zy#l#1I6lf*z9SWvng}gC?xiZyreridl2~HWxpJ(Fsvq zB5VnhXzK;2k{S8go4Xw$58tOB=WA`B$UphNK0iG?{Qe^12Su9D4+GDV&_on_ z$T3P-i6j#kDIb?;iNrLlB7;WJ+YXoNF+B)_XN7N4hyz=nIS?BRUKj}BMBlW+1eA1I zm;2>yP@*9@{b0btIk-W{dM_{S!mNZly#PdV8g{5{eFTgmvUW#e))S&FhEFY;-yEbs z9`pw_RHg+?lA!SjBhhf=>zKn|qj#Q6ag4EWWs^#~NhT3!i(XT(-7kz{$VZ@oP>$GO zD&uGm+G$t?ce>SR(-69fhoudrhXN3+JTc{Je_}yqsX|s`Jc#7Pu>nO=79vxv1Z##K z5?V7L+cBZAs=E$VvcR85uyxF{Vgn3G_ z&oG-2xF~ga_0Bv7QP`*J*LdY1E5DKd*s5*YIdX%eN66tR5bSieJxC4~<<+60K`v&7 z@9Zr`r)RO;yDAVPO&DYn2*jB+M@W!|D;Fwp?SJDBXR-m!!W0L63SXL+bx~E@OMLl+ zJDqh2-S$nl=JOD~x;^apw?+HLbG;dDkT_Uc4xCEL@iT!Dm(_g7-;<)YjNwIFi)XcW zl}Q!|dyJh;!v9X%rXQ%v$t<@~#y&Z|Bd3=?2FQ28Y<&DaFj~25sV3+5SlO5p?#3G- zIrrua(XA2<*`vOLozr)ry{Y-RaMdg5om=hjqV0z%J8zTZ=C#I#ox!(Ed64Bv2 zls&v>?71!&oEXs!4#Ib$0%axaLGvDA|1_Fim~?Ij)(Z4hntmD>yURJ zK&DKVTBbw6DMCHOlNnQ@C%0$9&L0mZfLQ~1mjuuh+xK7*3oKaC&-R_{&jRSanuP6B z5l;y>a3c7cU}HhX&4Q44nGLa`b(V|#CtD@hcjH8Dg-E}BSQ-hBz~ZweDfZjr!wc<+ z=V9ugFk1hBB{|GwVk0w*UxF3vuX1P-+=TlqT!ew7DrNk=$q<%NYfK^z;M&=Rw1t~e z{|)OP_6_Os8_dT<0>YBmw7W6%$Db^SbTmmoZ0+BWhQ41gm*t=%9LI7b@6`R7)Jwgv46ocFQX|@?4{l{=QL@ zh|iox8Fw-5(>#Q7G=Rh6-`{<39;~z@y~?IJq+B4RKv}{KL+o3K6VI`DQz1a1>vju@ zTvS2AFRL@xFOb3O(^kvg#V!90FjM^8uJ#hK;A|^zMl?sayyY-cA@vS3oneEvmO~>= z2uoc|CymLEKM1*4TaMV!oS?Zvfn1d}M|lfAeaPmUi(IO$+Jt9U!>`GA)^g0>&}9jl zWHm%na+uH2RJC&YLz8T>^;Mnl;JlBut?VD5h4&TH!vQHdQru za%=iS9l$9@z;?aun1DQ-2CmA&NueTFMQRKX$6cma(#<)?AB#(s%Q;?rM`Wd)39mt3 z1}Qyl#1X{ks%v)i9JX<%R@*d7;oS<$bv%gX@*V@YW2JGa+uO3tdOv)qIddgNQKNdYe7}C=1aXtx%F0VVpAg8 zHb(rkP>#{78}g}B9rb#-+bK_d;GJ-El}4kV#_8KFo`7}@npaill1%O&DV4O%tre=bev_p1vsIFv3o7D}L%>`1}m(MQ0#Ehnp zxNZzm$gjUKvs*5V!m8H;Z@%lOeb8!8yJ_v%xvElG-$H`%2w7?fAJds0@M@5 z3*qgyO{(Pq2SPIlAUg|O7qC)@ToHY)k_Y-Z&2^|*h{~Yf}E_1fE zFFTZ&+4Gl%qK+#lIG|b2mYTD2?UY}%TQh0lPL^|!WVgW$5E)E>%w($)^rX-9Usx)wdH?@OhrW}9CFb7 z38zB%L?#y#WJaUL`VOtHLf( zaxa8nxV>JjbAcV>eOrpH_o`T};bZrrAQ8;inwvLCQ$7>r?{cprM>~NjTH}i!ken9=f20w{k+bel|p%;I9V-1M>(L#V|OUI{-iqFalycm zFyW4=kY|78Oyg#diZ4>X}D~h5xK(t6XckrgJ)d?|+0^Jyh z$FPq&&*G{}0pA-escM`h{B5Uw7&DIoHwQ=*SA}IBBn`DM4F~65KTTM5fJAZW#snN3v%7R`o$W@>o2A@Xn=g!>~?Lkcs)aKzmcAKWs*d0M&p zn-a95-Wm$lpkNyo(~`3wcRJFOdA=Y^>z~e&Xaj3-DqGkp zY^R*%_=#*S2tQXDu;-AlyDBO&upZ2*sTBKlI8nV*S;^MTvv{y~FgDT`2c%P2(0q!Gq8 zy+^^6{6-B5)pUr{9EL0-wiABp>WXW31)R1D9+7Oy?8>Mg z6?RhOuvSFTQdLMkZv9+VS-4Z8{+NvbnN7+ghu0#*vtq}wqV~SUjsj0zDpg%>MV+!n zT>wv1{a#&fMZ*YB(@aCtswGCXMZpG7%T+_mBUQ^MRYeC+I`Ce>FI78wMLQl(Cz&TY zB$X}mJdG6}3VhtcFyD+El%+6}>(@eG&~lR2O|%8vXKS{d0BO<$L|D z6@xE$3R5fhN2yqsxQcu+2DdG;E$Wr+6}x92f#cG#-+3IG>16Y{f#|C;Ch^AmD<

", " " | - replace:"", " " | - replace:"", " " | - replace:"", " " | - replace:"", " "| - strip_html | strip_newlines | jsonify }}, - {%- else -%} - {{ doc.content | newline_to_br | - replace:"
", " " | - replace:"

", " " | - replace:"", " " | - replace:"", " " | - replace:"", " " | - replace:"", " " | - replace:"", " " | - replace:"", " "| - strip_html | strip_newlines | truncatewords: 50 | jsonify }}, - {%- endif -%} - "categories": {{ doc.categories | jsonify }}, - "tags": {{ doc.tags | jsonify }}, - "url": {{ doc.url | absolute_url | jsonify }}, - "teaser": {{ teaser | absolute_url | jsonify }} - }{%- unless forloop.last and l -%},{%- endunless -%} - {%- endfor -%} - {%- endfor -%}] diff --git a/assets/js/lunr/lunr.js b/assets/js/lunr/lunr.js deleted file mode 100644 index b37984a..0000000 --- a/assets/js/lunr/lunr.js +++ /dev/null @@ -1,3484 +0,0 @@ -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.5 - * Copyright (C) 2018 Oliver Nightingale - * @license MIT - */ - -;(function(){ - -/** - * A convenience function for configuring and constructing - * a new lunr Index. - * - * A lunr.Builder instance is created and the pipeline setup - * with a trimmer, stop word filter and stemmer. - * - * This builder object is yielded to the configuration function - * that is passed as a parameter, allowing the list of fields - * and other builder parameters to be customised. - * - * All documents _must_ be added within the passed config function. - * - * @example - * var idx = lunr(function () { - * this.field('title') - * this.field('body') - * this.ref('id') - * - * documents.forEach(function (doc) { - * this.add(doc) - * }, this) - * }) - * - * @see {@link lunr.Builder} - * @see {@link lunr.Pipeline} - * @see {@link lunr.trimmer} - * @see {@link lunr.stopWordFilter} - * @see {@link lunr.stemmer} - * @namespace {function} lunr - */ -var lunr = function (config) { - var builder = new lunr.Builder - - builder.pipeline.add( - lunr.trimmer, - lunr.stopWordFilter, - lunr.stemmer - ) - - builder.searchPipeline.add( - lunr.stemmer - ) - - config.call(builder, builder) - return builder.build() -} - -lunr.version = "2.3.5" -/*! - * lunr.utils - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * A namespace containing utils for the rest of the lunr library - * @namespace lunr.utils - */ -lunr.utils = {} - -/** - * Print a warning message to the console. - * - * @param {String} message The message to be printed. - * @memberOf lunr.utils - * @function - */ -lunr.utils.warn = (function (global) { - /* eslint-disable no-console */ - return function (message) { - if (global.console && console.warn) { - console.warn(message) - } - } - /* eslint-enable no-console */ -})(this) - -/** - * Convert an object to a string. - * - * In the case of `null` and `undefined` the function returns - * the empty string, in all other cases the result of calling - * `toString` on the passed object is returned. - * - * @param {Any} obj The object to convert to a string. - * @return {String} string representation of the passed object. - * @memberOf lunr.utils - */ -lunr.utils.asString = function (obj) { - if (obj === void 0 || obj === null) { - return "" - } else { - return obj.toString() - } -} - -/** - * Clones an object. - * - * Will create a copy of an existing object such that any mutations - * on the copy cannot affect the original. - * - * Only shallow objects are supported, passing a nested object to this - * function will cause a TypeError. - * - * Objects with primitives, and arrays of primitives are supported. - * - * @param {Object} obj The object to clone. - * @return {Object} a clone of the passed object. - * @throws {TypeError} when a nested object is passed. - * @memberOf Utils - */ -lunr.utils.clone = function (obj) { - if (obj === null || obj === undefined) { - return obj - } - - var clone = Object.create(null), - keys = Object.keys(obj) - - for (var i = 0; i < keys.length; i++) { - var key = keys[i], - val = obj[key] - - if (Array.isArray(val)) { - clone[key] = val.slice() - continue - } - - if (typeof val === 'string' || - typeof val === 'number' || - typeof val === 'boolean') { - clone[key] = val - continue - } - - throw new TypeError("clone is not deep and does not support nested objects") - } - - return clone -} -lunr.FieldRef = function (docRef, fieldName, stringValue) { - this.docRef = docRef - this.fieldName = fieldName - this._stringValue = stringValue -} - -lunr.FieldRef.joiner = "/" - -lunr.FieldRef.fromString = function (s) { - var n = s.indexOf(lunr.FieldRef.joiner) - - if (n === -1) { - throw "malformed field ref string" - } - - var fieldRef = s.slice(0, n), - docRef = s.slice(n + 1) - - return new lunr.FieldRef (docRef, fieldRef, s) -} - -lunr.FieldRef.prototype.toString = function () { - if (this._stringValue == undefined) { - this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef - } - - return this._stringValue -} -/*! - * lunr.Set - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * A lunr set. - * - * @constructor - */ -lunr.Set = function (elements) { - this.elements = Object.create(null) - - if (elements) { - this.length = elements.length - - for (var i = 0; i < this.length; i++) { - this.elements[elements[i]] = true - } - } else { - this.length = 0 - } -} - -/** - * A complete set that contains all elements. - * - * @static - * @readonly - * @type {lunr.Set} - */ -lunr.Set.complete = { - intersect: function (other) { - return other - }, - - union: function (other) { - return other - }, - - contains: function () { - return true - } -} - -/** - * An empty set that contains no elements. - * - * @static - * @readonly - * @type {lunr.Set} - */ -lunr.Set.empty = { - intersect: function () { - return this - }, - - union: function (other) { - return other - }, - - contains: function () { - return false - } -} - -/** - * Returns true if this set contains the specified object. - * - * @param {object} object - Object whose presence in this set is to be tested. - * @returns {boolean} - True if this set contains the specified object. - */ -lunr.Set.prototype.contains = function (object) { - return !!this.elements[object] -} - -/** - * Returns a new set containing only the elements that are present in both - * this set and the specified set. - * - * @param {lunr.Set} other - set to intersect with this set. - * @returns {lunr.Set} a new set that is the intersection of this and the specified set. - */ - -lunr.Set.prototype.intersect = function (other) { - var a, b, elements, intersection = [] - - if (other === lunr.Set.complete) { - return this - } - - if (other === lunr.Set.empty) { - return other - } - - if (this.length < other.length) { - a = this - b = other - } else { - a = other - b = this - } - - elements = Object.keys(a.elements) - - for (var i = 0; i < elements.length; i++) { - var element = elements[i] - if (element in b.elements) { - intersection.push(element) - } - } - - return new lunr.Set (intersection) -} - -/** - * Returns a new set combining the elements of this and the specified set. - * - * @param {lunr.Set} other - set to union with this set. - * @return {lunr.Set} a new set that is the union of this and the specified set. - */ - -lunr.Set.prototype.union = function (other) { - if (other === lunr.Set.complete) { - return lunr.Set.complete - } - - if (other === lunr.Set.empty) { - return this - } - - return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements))) -} -/** - * A function to calculate the inverse document frequency for - * a posting. This is shared between the builder and the index - * - * @private - * @param {object} posting - The posting for a given term - * @param {number} documentCount - The total number of documents. - */ -lunr.idf = function (posting, documentCount) { - var documentsWithTerm = 0 - - for (var fieldName in posting) { - if (fieldName == '_index') continue // Ignore the term index, its not a field - documentsWithTerm += Object.keys(posting[fieldName]).length - } - - var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5) - - return Math.log(1 + Math.abs(x)) -} - -/** - * A token wraps a string representation of a token - * as it is passed through the text processing pipeline. - * - * @constructor - * @param {string} [str=''] - The string token being wrapped. - * @param {object} [metadata={}] - Metadata associated with this token. - */ -lunr.Token = function (str, metadata) { - this.str = str || "" - this.metadata = metadata || {} -} - -/** - * Returns the token string that is being wrapped by this object. - * - * @returns {string} - */ -lunr.Token.prototype.toString = function () { - return this.str -} - -/** - * A token update function is used when updating or optionally - * when cloning a token. - * - * @callback lunr.Token~updateFunction - * @param {string} str - The string representation of the token. - * @param {Object} metadata - All metadata associated with this token. - */ - -/** - * Applies the given function to the wrapped string token. - * - * @example - * token.update(function (str, metadata) { - * return str.toUpperCase() - * }) - * - * @param {lunr.Token~updateFunction} fn - A function to apply to the token string. - * @returns {lunr.Token} - */ -lunr.Token.prototype.update = function (fn) { - this.str = fn(this.str, this.metadata) - return this -} - -/** - * Creates a clone of this token. Optionally a function can be - * applied to the cloned token. - * - * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token. - * @returns {lunr.Token} - */ -lunr.Token.prototype.clone = function (fn) { - fn = fn || function (s) { return s } - return new lunr.Token (fn(this.str, this.metadata), this.metadata) -} -/*! - * lunr.tokenizer - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * A function for splitting a string into tokens ready to be inserted into - * the search index. Uses `lunr.tokenizer.separator` to split strings, change - * the value of this property to change how strings are split into tokens. - * - * This tokenizer will convert its parameter to a string by calling `toString` and - * then will split this string on the character in `lunr.tokenizer.separator`. - * Arrays will have their elements converted to strings and wrapped in a lunr.Token. - * - * Optional metadata can be passed to the tokenizer, this metadata will be cloned and - * added as metadata to every token that is created from the object to be tokenized. - * - * @static - * @param {?(string|object|object[])} obj - The object to convert into tokens - * @param {?object} metadata - Optional metadata to associate with every token - * @returns {lunr.Token[]} - * @see {@link lunr.Pipeline} - */ -lunr.tokenizer = function (obj, metadata) { - if (obj == null || obj == undefined) { - return [] - } - - if (Array.isArray(obj)) { - return obj.map(function (t) { - return new lunr.Token( - lunr.utils.asString(t).toLowerCase(), - lunr.utils.clone(metadata) - ) - }) - } - - var str = obj.toString().trim().toLowerCase(), - len = str.length, - tokens = [] - - for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) { - var char = str.charAt(sliceEnd), - sliceLength = sliceEnd - sliceStart - - if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) { - - if (sliceLength > 0) { - var tokenMetadata = lunr.utils.clone(metadata) || {} - tokenMetadata["position"] = [sliceStart, sliceLength] - tokenMetadata["index"] = tokens.length - - tokens.push( - new lunr.Token ( - str.slice(sliceStart, sliceEnd), - tokenMetadata - ) - ) - } - - sliceStart = sliceEnd + 1 - } - - } - - return tokens -} - -/** - * The separator used to split a string into tokens. Override this property to change the behaviour of - * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens. - * - * @static - * @see lunr.tokenizer - */ -lunr.tokenizer.separator = /[\s\-]+/ -/*! - * lunr.Pipeline - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * lunr.Pipelines maintain an ordered list of functions to be applied to all - * tokens in documents entering the search index and queries being ran against - * the index. - * - * An instance of lunr.Index created with the lunr shortcut will contain a - * pipeline with a stop word filter and an English language stemmer. Extra - * functions can be added before or after either of these functions or these - * default functions can be removed. - * - * When run the pipeline will call each function in turn, passing a token, the - * index of that token in the original list of all tokens and finally a list of - * all the original tokens. - * - * The output of functions in the pipeline will be passed to the next function - * in the pipeline. To exclude a token from entering the index the function - * should return undefined, the rest of the pipeline will not be called with - * this token. - * - * For serialisation of pipelines to work, all functions used in an instance of - * a pipeline should be registered with lunr.Pipeline. Registered functions can - * then be loaded. If trying to load a serialised pipeline that uses functions - * that are not registered an error will be thrown. - * - * If not planning on serialising the pipeline then registering pipeline functions - * is not necessary. - * - * @constructor - */ -lunr.Pipeline = function () { - this._stack = [] -} - -lunr.Pipeline.registeredFunctions = Object.create(null) - -/** - * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token - * string as well as all known metadata. A pipeline function can mutate the token string - * or mutate (or add) metadata for a given token. - * - * A pipeline function can indicate that the passed token should be discarded by returning - * null. This token will not be passed to any downstream pipeline functions and will not be - * added to the index. - * - * Multiple tokens can be returned by returning an array of tokens. Each token will be passed - * to any downstream pipeline functions and all will returned tokens will be added to the index. - * - * Any number of pipeline functions may be chained together using a lunr.Pipeline. - * - * @interface lunr.PipelineFunction - * @param {lunr.Token} token - A token from the document being processed. - * @param {number} i - The index of this token in the complete list of tokens for this document/field. - * @param {lunr.Token[]} tokens - All tokens for this document/field. - * @returns {(?lunr.Token|lunr.Token[])} - */ - -/** - * Register a function with the pipeline. - * - * Functions that are used in the pipeline should be registered if the pipeline - * needs to be serialised, or a serialised pipeline needs to be loaded. - * - * Registering a function does not add it to a pipeline, functions must still be - * added to instances of the pipeline for them to be used when running a pipeline. - * - * @param {lunr.PipelineFunction} fn - The function to check for. - * @param {String} label - The label to register this function with - */ -lunr.Pipeline.registerFunction = function (fn, label) { - if (label in this.registeredFunctions) { - lunr.utils.warn('Overwriting existing registered function: ' + label) - } - - fn.label = label - lunr.Pipeline.registeredFunctions[fn.label] = fn -} - -/** - * Warns if the function is not registered as a Pipeline function. - * - * @param {lunr.PipelineFunction} fn - The function to check for. - * @private - */ -lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) { - var isRegistered = fn.label && (fn.label in this.registeredFunctions) - - if (!isRegistered) { - lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn) - } -} - -/** - * Loads a previously serialised pipeline. - * - * All functions to be loaded must already be registered with lunr.Pipeline. - * If any function from the serialised data has not been registered then an - * error will be thrown. - * - * @param {Object} serialised - The serialised pipeline to load. - * @returns {lunr.Pipeline} - */ -lunr.Pipeline.load = function (serialised) { - var pipeline = new lunr.Pipeline - - serialised.forEach(function (fnName) { - var fn = lunr.Pipeline.registeredFunctions[fnName] - - if (fn) { - pipeline.add(fn) - } else { - throw new Error('Cannot load unregistered function: ' + fnName) - } - }) - - return pipeline -} - -/** - * Adds new functions to the end of the pipeline. - * - * Logs a warning if the function has not been registered. - * - * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline. - */ -lunr.Pipeline.prototype.add = function () { - var fns = Array.prototype.slice.call(arguments) - - fns.forEach(function (fn) { - lunr.Pipeline.warnIfFunctionNotRegistered(fn) - this._stack.push(fn) - }, this) -} - -/** - * Adds a single function after a function that already exists in the - * pipeline. - * - * Logs a warning if the function has not been registered. - * - * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. - * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. - */ -lunr.Pipeline.prototype.after = function (existingFn, newFn) { - lunr.Pipeline.warnIfFunctionNotRegistered(newFn) - - var pos = this._stack.indexOf(existingFn) - if (pos == -1) { - throw new Error('Cannot find existingFn') - } - - pos = pos + 1 - this._stack.splice(pos, 0, newFn) -} - -/** - * Adds a single function before a function that already exists in the - * pipeline. - * - * Logs a warning if the function has not been registered. - * - * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline. - * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline. - */ -lunr.Pipeline.prototype.before = function (existingFn, newFn) { - lunr.Pipeline.warnIfFunctionNotRegistered(newFn) - - var pos = this._stack.indexOf(existingFn) - if (pos == -1) { - throw new Error('Cannot find existingFn') - } - - this._stack.splice(pos, 0, newFn) -} - -/** - * Removes a function from the pipeline. - * - * @param {lunr.PipelineFunction} fn The function to remove from the pipeline. - */ -lunr.Pipeline.prototype.remove = function (fn) { - var pos = this._stack.indexOf(fn) - if (pos == -1) { - return - } - - this._stack.splice(pos, 1) -} - -/** - * Runs the current list of functions that make up the pipeline against the - * passed tokens. - * - * @param {Array} tokens The tokens to run through the pipeline. - * @returns {Array} - */ -lunr.Pipeline.prototype.run = function (tokens) { - var stackLength = this._stack.length - - for (var i = 0; i < stackLength; i++) { - var fn = this._stack[i] - var memo = [] - - for (var j = 0; j < tokens.length; j++) { - var result = fn(tokens[j], j, tokens) - - if (result === void 0 || result === '') continue - - if (Array.isArray(result)) { - for (var k = 0; k < result.length; k++) { - memo.push(result[k]) - } - } else { - memo.push(result) - } - } - - tokens = memo - } - - return tokens -} - -/** - * Convenience method for passing a string through a pipeline and getting - * strings out. This method takes care of wrapping the passed string in a - * token and mapping the resulting tokens back to strings. - * - * @param {string} str - The string to pass through the pipeline. - * @param {?object} metadata - Optional metadata to associate with the token - * passed to the pipeline. - * @returns {string[]} - */ -lunr.Pipeline.prototype.runString = function (str, metadata) { - var token = new lunr.Token (str, metadata) - - return this.run([token]).map(function (t) { - return t.toString() - }) -} - -/** - * Resets the pipeline by removing any existing processors. - * - */ -lunr.Pipeline.prototype.reset = function () { - this._stack = [] -} - -/** - * Returns a representation of the pipeline ready for serialisation. - * - * Logs a warning if the function has not been registered. - * - * @returns {Array} - */ -lunr.Pipeline.prototype.toJSON = function () { - return this._stack.map(function (fn) { - lunr.Pipeline.warnIfFunctionNotRegistered(fn) - - return fn.label - }) -} -/*! - * lunr.Vector - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * A vector is used to construct the vector space of documents and queries. These - * vectors support operations to determine the similarity between two documents or - * a document and a query. - * - * Normally no parameters are required for initializing a vector, but in the case of - * loading a previously dumped vector the raw elements can be provided to the constructor. - * - * For performance reasons vectors are implemented with a flat array, where an elements - * index is immediately followed by its value. E.g. [index, value, index, value]. This - * allows the underlying array to be as sparse as possible and still offer decent - * performance when being used for vector calculations. - * - * @constructor - * @param {Number[]} [elements] - The flat list of element index and element value pairs. - */ -lunr.Vector = function (elements) { - this._magnitude = 0 - this.elements = elements || [] -} - - -/** - * Calculates the position within the vector to insert a given index. - * - * This is used internally by insert and upsert. If there are duplicate indexes then - * the position is returned as if the value for that index were to be updated, but it - * is the callers responsibility to check whether there is a duplicate at that index - * - * @param {Number} insertIdx - The index at which the element should be inserted. - * @returns {Number} - */ -lunr.Vector.prototype.positionForIndex = function (index) { - // For an empty vector the tuple can be inserted at the beginning - if (this.elements.length == 0) { - return 0 - } - - var start = 0, - end = this.elements.length / 2, - sliceLength = end - start, - pivotPoint = Math.floor(sliceLength / 2), - pivotIndex = this.elements[pivotPoint * 2] - - while (sliceLength > 1) { - if (pivotIndex < index) { - start = pivotPoint - } - - if (pivotIndex > index) { - end = pivotPoint - } - - if (pivotIndex == index) { - break - } - - sliceLength = end - start - pivotPoint = start + Math.floor(sliceLength / 2) - pivotIndex = this.elements[pivotPoint * 2] - } - - if (pivotIndex == index) { - return pivotPoint * 2 - } - - if (pivotIndex > index) { - return pivotPoint * 2 - } - - if (pivotIndex < index) { - return (pivotPoint + 1) * 2 - } -} - -/** - * Inserts an element at an index within the vector. - * - * Does not allow duplicates, will throw an error if there is already an entry - * for this index. - * - * @param {Number} insertIdx - The index at which the element should be inserted. - * @param {Number} val - The value to be inserted into the vector. - */ -lunr.Vector.prototype.insert = function (insertIdx, val) { - this.upsert(insertIdx, val, function () { - throw "duplicate index" - }) -} - -/** - * Inserts or updates an existing index within the vector. - * - * @param {Number} insertIdx - The index at which the element should be inserted. - * @param {Number} val - The value to be inserted into the vector. - * @param {function} fn - A function that is called for updates, the existing value and the - * requested value are passed as arguments - */ -lunr.Vector.prototype.upsert = function (insertIdx, val, fn) { - this._magnitude = 0 - var position = this.positionForIndex(insertIdx) - - if (this.elements[position] == insertIdx) { - this.elements[position + 1] = fn(this.elements[position + 1], val) - } else { - this.elements.splice(position, 0, insertIdx, val) - } -} - -/** - * Calculates the magnitude of this vector. - * - * @returns {Number} - */ -lunr.Vector.prototype.magnitude = function () { - if (this._magnitude) return this._magnitude - - var sumOfSquares = 0, - elementsLength = this.elements.length - - for (var i = 1; i < elementsLength; i += 2) { - var val = this.elements[i] - sumOfSquares += val * val - } - - return this._magnitude = Math.sqrt(sumOfSquares) -} - -/** - * Calculates the dot product of this vector and another vector. - * - * @param {lunr.Vector} otherVector - The vector to compute the dot product with. - * @returns {Number} - */ -lunr.Vector.prototype.dot = function (otherVector) { - var dotProduct = 0, - a = this.elements, b = otherVector.elements, - aLen = a.length, bLen = b.length, - aVal = 0, bVal = 0, - i = 0, j = 0 - - while (i < aLen && j < bLen) { - aVal = a[i], bVal = b[j] - if (aVal < bVal) { - i += 2 - } else if (aVal > bVal) { - j += 2 - } else if (aVal == bVal) { - dotProduct += a[i + 1] * b[j + 1] - i += 2 - j += 2 - } - } - - return dotProduct -} - -/** - * Calculates the similarity between this vector and another vector. - * - * @param {lunr.Vector} otherVector - The other vector to calculate the - * similarity with. - * @returns {Number} - */ -lunr.Vector.prototype.similarity = function (otherVector) { - return this.dot(otherVector) / this.magnitude() || 0 -} - -/** - * Converts the vector to an array of the elements within the vector. - * - * @returns {Number[]} - */ -lunr.Vector.prototype.toArray = function () { - var output = new Array (this.elements.length / 2) - - for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) { - output[j] = this.elements[i] - } - - return output -} - -/** - * A JSON serializable representation of the vector. - * - * @returns {Number[]} - */ -lunr.Vector.prototype.toJSON = function () { - return this.elements -} -/* eslint-disable */ -/*! - * lunr.stemmer - * Copyright (C) 2018 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ - -/** - * lunr.stemmer is an english language stemmer, this is a JavaScript - * implementation of the PorterStemmer taken from http://tartarus.org/~martin - * - * @static - * @implements {lunr.PipelineFunction} - * @param {lunr.Token} token - The string to stem - * @returns {lunr.Token} - * @see {@link lunr.Pipeline} - * @function - */ -lunr.stemmer = (function(){ - var step2list = { - "ational" : "ate", - "tional" : "tion", - "enci" : "ence", - "anci" : "ance", - "izer" : "ize", - "bli" : "ble", - "alli" : "al", - "entli" : "ent", - "eli" : "e", - "ousli" : "ous", - "ization" : "ize", - "ation" : "ate", - "ator" : "ate", - "alism" : "al", - "iveness" : "ive", - "fulness" : "ful", - "ousness" : "ous", - "aliti" : "al", - "iviti" : "ive", - "biliti" : "ble", - "logi" : "log" - }, - - step3list = { - "icate" : "ic", - "ative" : "", - "alize" : "al", - "iciti" : "ic", - "ical" : "ic", - "ful" : "", - "ness" : "" - }, - - c = "[^aeiou]", // consonant - v = "[aeiouy]", // vowel - C = c + "[^aeiouy]*", // consonant sequence - V = v + "[aeiou]*", // vowel sequence - - mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0 - meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1 - mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1 - s_v = "^(" + C + ")?" + v; // vowel in stem - - var re_mgr0 = new RegExp(mgr0); - var re_mgr1 = new RegExp(mgr1); - var re_meq1 = new RegExp(meq1); - var re_s_v = new RegExp(s_v); - - var re_1a = /^(.+?)(ss|i)es$/; - var re2_1a = /^(.+?)([^s])s$/; - var re_1b = /^(.+?)eed$/; - var re2_1b = /^(.+?)(ed|ing)$/; - var re_1b_2 = /.$/; - var re2_1b_2 = /(at|bl|iz)$/; - var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$"); - var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - - var re_1c = /^(.+?[^aeiou])y$/; - var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - - var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - - var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - var re2_4 = /^(.+?)(s|t)(ion)$/; - - var re_5 = /^(.+?)e$/; - var re_5_1 = /ll$/; - var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - - var porterStemmer = function porterStemmer(w) { - var stem, - suffix, - firstch, - re, - re2, - re3, - re4; - - if (w.length < 3) { return w; } - - firstch = w.substr(0,1); - if (firstch == "y") { - w = firstch.toUpperCase() + w.substr(1); - } - - // Step 1a - re = re_1a - re2 = re2_1a; - - if (re.test(w)) { w = w.replace(re,"$1$2"); } - else if (re2.test(w)) { w = w.replace(re2,"$1$2"); } - - // Step 1b - re = re_1b; - re2 = re2_1b; - if (re.test(w)) { - var fp = re.exec(w); - re = re_mgr0; - if (re.test(fp[1])) { - re = re_1b_2; - w = w.replace(re,""); - } - } else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = re_s_v; - if (re2.test(stem)) { - w = stem; - re2 = re2_1b_2; - re3 = re3_1b_2; - re4 = re4_1b_2; - if (re2.test(w)) { w = w + "e"; } - else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); } - else if (re4.test(w)) { w = w + "e"; } - } - } - - // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say) - re = re_1c; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - w = stem + "i"; - } - - // Step 2 - re = re_2; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = re_mgr0; - if (re.test(stem)) { - w = stem + step2list[suffix]; - } - } - - // Step 3 - re = re_3; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = re_mgr0; - if (re.test(stem)) { - w = stem + step3list[suffix]; - } - } - - // Step 4 - re = re_4; - re2 = re2_4; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = re_mgr1; - if (re.test(stem)) { - w = stem; - } - } else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = re_mgr1; - if (re2.test(stem)) { - w = stem; - } - } - - // Step 5 - re = re_5; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = re_mgr1; - re2 = re_meq1; - re3 = re3_5; - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) { - w = stem; - } - } - - re = re_5_1; - re2 = re_mgr1; - if (re.test(w) && re2.test(w)) { - re = re_1b_2; - w = w.replace(re,""); - } - - // and turn initial Y back to y - - if (firstch == "y") { - w = firstch.toLowerCase() + w.substr(1); - } - - return w; - }; - - return function (token) { - return token.update(porterStemmer); - } -})(); - -lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer') -/*! - * lunr.stopWordFilter - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * lunr.generateStopWordFilter builds a stopWordFilter function from the provided - * list of stop words. - * - * The built in lunr.stopWordFilter is built using this generator and can be used - * to generate custom stopWordFilters for applications or non English languages. - * - * @function - * @param {Array} token The token to pass through the filter - * @returns {lunr.PipelineFunction} - * @see lunr.Pipeline - * @see lunr.stopWordFilter - */ -lunr.generateStopWordFilter = function (stopWords) { - var words = stopWords.reduce(function (memo, stopWord) { - memo[stopWord] = stopWord - return memo - }, {}) - - return function (token) { - if (token && words[token.toString()] !== token.toString()) return token - } -} - -/** - * lunr.stopWordFilter is an English language stop word list filter, any words - * contained in the list will not be passed through the filter. - * - * This is intended to be used in the Pipeline. If the token does not pass the - * filter then undefined will be returned. - * - * @function - * @implements {lunr.PipelineFunction} - * @params {lunr.Token} token - A token to check for being a stop word. - * @returns {lunr.Token} - * @see {@link lunr.Pipeline} - */ -lunr.stopWordFilter = lunr.generateStopWordFilter([ - 'a', - 'able', - 'about', - 'across', - 'after', - 'all', - 'almost', - 'also', - 'am', - 'among', - 'an', - 'and', - 'any', - 'are', - 'as', - 'at', - 'be', - 'because', - 'been', - 'but', - 'by', - 'can', - 'cannot', - 'could', - 'dear', - 'did', - 'do', - 'does', - 'either', - 'else', - 'ever', - 'every', - 'for', - 'from', - 'get', - 'got', - 'had', - 'has', - 'have', - 'he', - 'her', - 'hers', - 'him', - 'his', - 'how', - 'however', - 'i', - 'if', - 'in', - 'into', - 'is', - 'it', - 'its', - 'just', - 'least', - 'let', - 'like', - 'likely', - 'may', - 'me', - 'might', - 'most', - 'must', - 'my', - 'neither', - 'no', - 'nor', - 'not', - 'of', - 'off', - 'often', - 'on', - 'only', - 'or', - 'other', - 'our', - 'own', - 'rather', - 'said', - 'say', - 'says', - 'she', - 'should', - 'since', - 'so', - 'some', - 'than', - 'that', - 'the', - 'their', - 'them', - 'then', - 'there', - 'these', - 'they', - 'this', - 'tis', - 'to', - 'too', - 'twas', - 'us', - 'wants', - 'was', - 'we', - 'were', - 'what', - 'when', - 'where', - 'which', - 'while', - 'who', - 'whom', - 'why', - 'will', - 'with', - 'would', - 'yet', - 'you', - 'your' -]) - -lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter') -/*! - * lunr.trimmer - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * lunr.trimmer is a pipeline function for trimming non word - * characters from the beginning and end of tokens before they - * enter the index. - * - * This implementation may not work correctly for non latin - * characters and should either be removed or adapted for use - * with languages with non-latin characters. - * - * @static - * @implements {lunr.PipelineFunction} - * @param {lunr.Token} token The token to pass through the filter - * @returns {lunr.Token} - * @see lunr.Pipeline - */ -lunr.trimmer = function (token) { - return token.update(function (s) { - return s.replace(/^\W+/, '').replace(/\W+$/, '') - }) -} - -lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer') -/*! - * lunr.TokenSet - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * A token set is used to store the unique list of all tokens - * within an index. Token sets are also used to represent an - * incoming query to the index, this query token set and index - * token set are then intersected to find which tokens to look - * up in the inverted index. - * - * A token set can hold multiple tokens, as in the case of the - * index token set, or it can hold a single token as in the - * case of a simple query token set. - * - * Additionally token sets are used to perform wildcard matching. - * Leading, contained and trailing wildcards are supported, and - * from this edit distance matching can also be provided. - * - * Token sets are implemented as a minimal finite state automata, - * where both common prefixes and suffixes are shared between tokens. - * This helps to reduce the space used for storing the token set. - * - * @constructor - */ -lunr.TokenSet = function () { - this.final = false - this.edges = {} - this.id = lunr.TokenSet._nextId - lunr.TokenSet._nextId += 1 -} - -/** - * Keeps track of the next, auto increment, identifier to assign - * to a new tokenSet. - * - * TokenSets require a unique identifier to be correctly minimised. - * - * @private - */ -lunr.TokenSet._nextId = 1 - -/** - * Creates a TokenSet instance from the given sorted array of words. - * - * @param {String[]} arr - A sorted array of strings to create the set from. - * @returns {lunr.TokenSet} - * @throws Will throw an error if the input array is not sorted. - */ -lunr.TokenSet.fromArray = function (arr) { - var builder = new lunr.TokenSet.Builder - - for (var i = 0, len = arr.length; i < len; i++) { - builder.insert(arr[i]) - } - - builder.finish() - return builder.root -} - -/** - * Creates a token set from a query clause. - * - * @private - * @param {Object} clause - A single clause from lunr.Query. - * @param {string} clause.term - The query clause term. - * @param {number} [clause.editDistance] - The optional edit distance for the term. - * @returns {lunr.TokenSet} - */ -lunr.TokenSet.fromClause = function (clause) { - if ('editDistance' in clause) { - return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance) - } else { - return lunr.TokenSet.fromString(clause.term) - } -} - -/** - * Creates a token set representing a single string with a specified - * edit distance. - * - * Insertions, deletions, substitutions and transpositions are each - * treated as an edit distance of 1. - * - * Increasing the allowed edit distance will have a dramatic impact - * on the performance of both creating and intersecting these TokenSets. - * It is advised to keep the edit distance less than 3. - * - * @param {string} str - The string to create the token set from. - * @param {number} editDistance - The allowed edit distance to match. - * @returns {lunr.Vector} - */ -lunr.TokenSet.fromFuzzyString = function (str, editDistance) { - var root = new lunr.TokenSet - - var stack = [{ - node: root, - editsRemaining: editDistance, - str: str - }] - - while (stack.length) { - var frame = stack.pop() - - // no edit - if (frame.str.length > 0) { - var char = frame.str.charAt(0), - noEditNode - - if (char in frame.node.edges) { - noEditNode = frame.node.edges[char] - } else { - noEditNode = new lunr.TokenSet - frame.node.edges[char] = noEditNode - } - - if (frame.str.length == 1) { - noEditNode.final = true - } - - stack.push({ - node: noEditNode, - editsRemaining: frame.editsRemaining, - str: frame.str.slice(1) - }) - } - - // deletion - // can only do a deletion if we have enough edits remaining - // and if there are characters left to delete in the string - if (frame.editsRemaining > 0 && frame.str.length > 1) { - var char = frame.str.charAt(1), - deletionNode - - if (char in frame.node.edges) { - deletionNode = frame.node.edges[char] - } else { - deletionNode = new lunr.TokenSet - frame.node.edges[char] = deletionNode - } - - if (frame.str.length <= 2) { - deletionNode.final = true - } else { - stack.push({ - node: deletionNode, - editsRemaining: frame.editsRemaining - 1, - str: frame.str.slice(2) - }) - } - } - - // deletion - // just removing the last character from the str - if (frame.editsRemaining > 0 && frame.str.length == 1) { - frame.node.final = true - } - - // substitution - // can only do a substitution if we have enough edits remaining - // and if there are characters left to substitute - if (frame.editsRemaining > 0 && frame.str.length >= 1) { - if ("*" in frame.node.edges) { - var substitutionNode = frame.node.edges["*"] - } else { - var substitutionNode = new lunr.TokenSet - frame.node.edges["*"] = substitutionNode - } - - if (frame.str.length == 1) { - substitutionNode.final = true - } else { - stack.push({ - node: substitutionNode, - editsRemaining: frame.editsRemaining - 1, - str: frame.str.slice(1) - }) - } - } - - // insertion - // can only do insertion if there are edits remaining - if (frame.editsRemaining > 0) { - if ("*" in frame.node.edges) { - var insertionNode = frame.node.edges["*"] - } else { - var insertionNode = new lunr.TokenSet - frame.node.edges["*"] = insertionNode - } - - if (frame.str.length == 0) { - insertionNode.final = true - } else { - stack.push({ - node: insertionNode, - editsRemaining: frame.editsRemaining - 1, - str: frame.str - }) - } - } - - // transposition - // can only do a transposition if there are edits remaining - // and there are enough characters to transpose - if (frame.editsRemaining > 0 && frame.str.length > 1) { - var charA = frame.str.charAt(0), - charB = frame.str.charAt(1), - transposeNode - - if (charB in frame.node.edges) { - transposeNode = frame.node.edges[charB] - } else { - transposeNode = new lunr.TokenSet - frame.node.edges[charB] = transposeNode - } - - if (frame.str.length == 1) { - transposeNode.final = true - } else { - stack.push({ - node: transposeNode, - editsRemaining: frame.editsRemaining - 1, - str: charA + frame.str.slice(2) - }) - } - } - } - - return root -} - -/** - * Creates a TokenSet from a string. - * - * The string may contain one or more wildcard characters (*) - * that will allow wildcard matching when intersecting with - * another TokenSet. - * - * @param {string} str - The string to create a TokenSet from. - * @returns {lunr.TokenSet} - */ -lunr.TokenSet.fromString = function (str) { - var node = new lunr.TokenSet, - root = node - - /* - * Iterates through all characters within the passed string - * appending a node for each character. - * - * When a wildcard character is found then a self - * referencing edge is introduced to continually match - * any number of any characters. - */ - for (var i = 0, len = str.length; i < len; i++) { - var char = str[i], - final = (i == len - 1) - - if (char == "*") { - node.edges[char] = node - node.final = final - - } else { - var next = new lunr.TokenSet - next.final = final - - node.edges[char] = next - node = next - } - } - - return root -} - -/** - * Converts this TokenSet into an array of strings - * contained within the TokenSet. - * - * @returns {string[]} - */ -lunr.TokenSet.prototype.toArray = function () { - var words = [] - - var stack = [{ - prefix: "", - node: this - }] - - while (stack.length) { - var frame = stack.pop(), - edges = Object.keys(frame.node.edges), - len = edges.length - - if (frame.node.final) { - /* In Safari, at this point the prefix is sometimes corrupted, see: - * https://github.com/olivernn/lunr.js/issues/279 Calling any - * String.prototype method forces Safari to "cast" this string to what - * it's supposed to be, fixing the bug. */ - frame.prefix.charAt(0) - words.push(frame.prefix) - } - - for (var i = 0; i < len; i++) { - var edge = edges[i] - - stack.push({ - prefix: frame.prefix.concat(edge), - node: frame.node.edges[edge] - }) - } - } - - return words -} - -/** - * Generates a string representation of a TokenSet. - * - * This is intended to allow TokenSets to be used as keys - * in objects, largely to aid the construction and minimisation - * of a TokenSet. As such it is not designed to be a human - * friendly representation of the TokenSet. - * - * @returns {string} - */ -lunr.TokenSet.prototype.toString = function () { - // NOTE: Using Object.keys here as this.edges is very likely - // to enter 'hash-mode' with many keys being added - // - // avoiding a for-in loop here as it leads to the function - // being de-optimised (at least in V8). From some simple - // benchmarks the performance is comparable, but allowing - // V8 to optimize may mean easy performance wins in the future. - - if (this._str) { - return this._str - } - - var str = this.final ? '1' : '0', - labels = Object.keys(this.edges).sort(), - len = labels.length - - for (var i = 0; i < len; i++) { - var label = labels[i], - node = this.edges[label] - - str = str + label + node.id - } - - return str -} - -/** - * Returns a new TokenSet that is the intersection of - * this TokenSet and the passed TokenSet. - * - * This intersection will take into account any wildcards - * contained within the TokenSet. - * - * @param {lunr.TokenSet} b - An other TokenSet to intersect with. - * @returns {lunr.TokenSet} - */ -lunr.TokenSet.prototype.intersect = function (b) { - var output = new lunr.TokenSet, - frame = undefined - - var stack = [{ - qNode: b, - output: output, - node: this - }] - - while (stack.length) { - frame = stack.pop() - - // NOTE: As with the #toString method, we are using - // Object.keys and a for loop instead of a for-in loop - // as both of these objects enter 'hash' mode, causing - // the function to be de-optimised in V8 - var qEdges = Object.keys(frame.qNode.edges), - qLen = qEdges.length, - nEdges = Object.keys(frame.node.edges), - nLen = nEdges.length - - for (var q = 0; q < qLen; q++) { - var qEdge = qEdges[q] - - for (var n = 0; n < nLen; n++) { - var nEdge = nEdges[n] - - if (nEdge == qEdge || qEdge == '*') { - var node = frame.node.edges[nEdge], - qNode = frame.qNode.edges[qEdge], - final = node.final && qNode.final, - next = undefined - - if (nEdge in frame.output.edges) { - // an edge already exists for this character - // no need to create a new node, just set the finality - // bit unless this node is already final - next = frame.output.edges[nEdge] - next.final = next.final || final - - } else { - // no edge exists yet, must create one - // set the finality bit and insert it - // into the output - next = new lunr.TokenSet - next.final = final - frame.output.edges[nEdge] = next - } - - stack.push({ - qNode: qNode, - output: next, - node: node - }) - } - } - } - } - - return output -} -lunr.TokenSet.Builder = function () { - this.previousWord = "" - this.root = new lunr.TokenSet - this.uncheckedNodes = [] - this.minimizedNodes = {} -} - -lunr.TokenSet.Builder.prototype.insert = function (word) { - var node, - commonPrefix = 0 - - if (word < this.previousWord) { - throw new Error ("Out of order word insertion") - } - - for (var i = 0; i < word.length && i < this.previousWord.length; i++) { - if (word[i] != this.previousWord[i]) break - commonPrefix++ - } - - this.minimize(commonPrefix) - - if (this.uncheckedNodes.length == 0) { - node = this.root - } else { - node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child - } - - for (var i = commonPrefix; i < word.length; i++) { - var nextNode = new lunr.TokenSet, - char = word[i] - - node.edges[char] = nextNode - - this.uncheckedNodes.push({ - parent: node, - char: char, - child: nextNode - }) - - node = nextNode - } - - node.final = true - this.previousWord = word -} - -lunr.TokenSet.Builder.prototype.finish = function () { - this.minimize(0) -} - -lunr.TokenSet.Builder.prototype.minimize = function (downTo) { - for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) { - var node = this.uncheckedNodes[i], - childKey = node.child.toString() - - if (childKey in this.minimizedNodes) { - node.parent.edges[node.char] = this.minimizedNodes[childKey] - } else { - // Cache the key for this node since - // we know it can't change anymore - node.child._str = childKey - - this.minimizedNodes[childKey] = node.child - } - - this.uncheckedNodes.pop() - } -} -/*! - * lunr.Index - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * An index contains the built index of all documents and provides a query interface - * to the index. - * - * Usually instances of lunr.Index will not be created using this constructor, instead - * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be - * used to load previously built and serialized indexes. - * - * @constructor - * @param {Object} attrs - The attributes of the built search index. - * @param {Object} attrs.invertedIndex - An index of term/field to document reference. - * @param {Object} attrs.fieldVectors - Field vectors - * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens. - * @param {string[]} attrs.fields - The names of indexed document fields. - * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms. - */ -lunr.Index = function (attrs) { - this.invertedIndex = attrs.invertedIndex - this.fieldVectors = attrs.fieldVectors - this.tokenSet = attrs.tokenSet - this.fields = attrs.fields - this.pipeline = attrs.pipeline -} - -/** - * A result contains details of a document matching a search query. - * @typedef {Object} lunr.Index~Result - * @property {string} ref - The reference of the document this result represents. - * @property {number} score - A number between 0 and 1 representing how similar this document is to the query. - * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match. - */ - -/** - * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple - * query language which itself is parsed into an instance of lunr.Query. - * - * For programmatically building queries it is advised to directly use lunr.Query, the query language - * is best used for human entered text rather than program generated text. - * - * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported - * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello' - * or 'world', though those that contain both will rank higher in the results. - * - * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can - * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding - * wildcards will increase the number of documents that will be found but can also have a negative - * impact on query performance, especially with wildcards at the beginning of a term. - * - * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term - * hello in the title field will match this query. Using a field not present in the index will lead - * to an error being thrown. - * - * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term - * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported - * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2. - * Avoid large values for edit distance to improve query performance. - * - * Each term also supports a presence modifier. By default a term's presence in document is optional, however - * this can be changed to either required or prohibited. For a term's presence to be required in a document the - * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and - * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not - * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'. - * - * To escape special characters the backslash character '\' can be used, this allows searches to include - * characters that would normally be considered modifiers, e.g. `foo\~2` will search for a term "foo~2" instead - * of attempting to apply a boost of 2 to the search term "foo". - * - * @typedef {string} lunr.Index~QueryString - * @example Simple single term query - * hello - * @example Multiple term query - * hello world - * @example term scoped to a field - * title:hello - * @example term with a boost of 10 - * hello^10 - * @example term with an edit distance of 2 - * hello~2 - * @example terms with presence modifiers - * -foo +bar baz - */ - -/** - * Performs a search against the index using lunr query syntax. - * - * Results will be returned sorted by their score, the most relevant results - * will be returned first. For details on how the score is calculated, please see - * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}. - * - * For more programmatic querying use lunr.Index#query. - * - * @param {lunr.Index~QueryString} queryString - A string containing a lunr query. - * @throws {lunr.QueryParseError} If the passed query string cannot be parsed. - * @returns {lunr.Index~Result[]} - */ -lunr.Index.prototype.search = function (queryString) { - return this.query(function (query) { - var parser = new lunr.QueryParser(queryString, query) - parser.parse() - }) -} - -/** - * A query builder callback provides a query object to be used to express - * the query to perform on the index. - * - * @callback lunr.Index~queryBuilder - * @param {lunr.Query} query - The query object to build up. - * @this lunr.Query - */ - -/** - * Performs a query against the index using the yielded lunr.Query object. - * - * If performing programmatic queries against the index, this method is preferred - * over lunr.Index#search so as to avoid the additional query parsing overhead. - * - * A query object is yielded to the supplied function which should be used to - * express the query to be run against the index. - * - * Note that although this function takes a callback parameter it is _not_ an - * asynchronous operation, the callback is just yielded a query object to be - * customized. - * - * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query. - * @returns {lunr.Index~Result[]} - */ -lunr.Index.prototype.query = function (fn) { - // for each query clause - // * process terms - // * expand terms from token set - // * find matching documents and metadata - // * get document vectors - // * score documents - - var query = new lunr.Query(this.fields), - matchingFields = Object.create(null), - queryVectors = Object.create(null), - termFieldCache = Object.create(null), - requiredMatches = Object.create(null), - prohibitedMatches = Object.create(null) - - /* - * To support field level boosts a query vector is created per - * field. An empty vector is eagerly created to support negated - * queries. - */ - for (var i = 0; i < this.fields.length; i++) { - queryVectors[this.fields[i]] = new lunr.Vector - } - - fn.call(query, query) - - for (var i = 0; i < query.clauses.length; i++) { - /* - * Unless the pipeline has been disabled for this term, which is - * the case for terms with wildcards, we need to pass the clause - * term through the search pipeline. A pipeline returns an array - * of processed terms. Pipeline functions may expand the passed - * term, which means we may end up performing multiple index lookups - * for a single query term. - */ - var clause = query.clauses[i], - terms = null, - clauseMatches = lunr.Set.complete - - if (clause.usePipeline) { - terms = this.pipeline.runString(clause.term, { - fields: clause.fields - }) - } else { - terms = [clause.term] - } - - for (var m = 0; m < terms.length; m++) { - var term = terms[m] - - /* - * Each term returned from the pipeline needs to use the same query - * clause object, e.g. the same boost and or edit distance. The - * simplest way to do this is to re-use the clause object but mutate - * its term property. - */ - clause.term = term - - /* - * From the term in the clause we create a token set which will then - * be used to intersect the indexes token set to get a list of terms - * to lookup in the inverted index - */ - var termTokenSet = lunr.TokenSet.fromClause(clause), - expandedTerms = this.tokenSet.intersect(termTokenSet).toArray() - - /* - * If a term marked as required does not exist in the tokenSet it is - * impossible for the search to return any matches. We set all the field - * scoped required matches set to empty and stop examining any further - * clauses. - */ - if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) { - for (var k = 0; k < clause.fields.length; k++) { - var field = clause.fields[k] - requiredMatches[field] = lunr.Set.empty - } - - break - } - - for (var j = 0; j < expandedTerms.length; j++) { - /* - * For each term get the posting and termIndex, this is required for - * building the query vector. - */ - var expandedTerm = expandedTerms[j], - posting = this.invertedIndex[expandedTerm], - termIndex = posting._index - - for (var k = 0; k < clause.fields.length; k++) { - /* - * For each field that this query term is scoped by (by default - * all fields are in scope) we need to get all the document refs - * that have this term in that field. - * - * The posting is the entry in the invertedIndex for the matching - * term from above. - */ - var field = clause.fields[k], - fieldPosting = posting[field], - matchingDocumentRefs = Object.keys(fieldPosting), - termField = expandedTerm + "/" + field, - matchingDocumentsSet = new lunr.Set(matchingDocumentRefs) - - /* - * if the presence of this term is required ensure that the matching - * documents are added to the set of required matches for this clause. - * - */ - if (clause.presence == lunr.Query.presence.REQUIRED) { - clauseMatches = clauseMatches.union(matchingDocumentsSet) - - if (requiredMatches[field] === undefined) { - requiredMatches[field] = lunr.Set.complete - } - } - - /* - * if the presence of this term is prohibited ensure that the matching - * documents are added to the set of prohibited matches for this field, - * creating that set if it does not yet exist. - */ - if (clause.presence == lunr.Query.presence.PROHIBITED) { - if (prohibitedMatches[field] === undefined) { - prohibitedMatches[field] = lunr.Set.empty - } - - prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet) - - /* - * Prohibited matches should not be part of the query vector used for - * similarity scoring and no metadata should be extracted so we continue - * to the next field - */ - continue - } - - /* - * The query field vector is populated using the termIndex found for - * the term and a unit value with the appropriate boost applied. - * Using upsert because there could already be an entry in the vector - * for the term we are working with. In that case we just add the scores - * together. - */ - queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b }) - - /** - * If we've already seen this term, field combo then we've already collected - * the matching documents and metadata, no need to go through all that again - */ - if (termFieldCache[termField]) { - continue - } - - for (var l = 0; l < matchingDocumentRefs.length; l++) { - /* - * All metadata for this term/field/document triple - * are then extracted and collected into an instance - * of lunr.MatchData ready to be returned in the query - * results - */ - var matchingDocumentRef = matchingDocumentRefs[l], - matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field), - metadata = fieldPosting[matchingDocumentRef], - fieldMatch - - if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) { - matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata) - } else { - fieldMatch.add(expandedTerm, field, metadata) - } - - } - - termFieldCache[termField] = true - } - } - } - - /** - * If the presence was required we need to update the requiredMatches field sets. - * We do this after all fields for the term have collected their matches because - * the clause terms presence is required in _any_ of the fields not _all_ of the - * fields. - */ - if (clause.presence === lunr.Query.presence.REQUIRED) { - for (var k = 0; k < clause.fields.length; k++) { - var field = clause.fields[k] - requiredMatches[field] = requiredMatches[field].intersect(clauseMatches) - } - } - } - - /** - * Need to combine the field scoped required and prohibited - * matching documents into a global set of required and prohibited - * matches - */ - var allRequiredMatches = lunr.Set.complete, - allProhibitedMatches = lunr.Set.empty - - for (var i = 0; i < this.fields.length; i++) { - var field = this.fields[i] - - if (requiredMatches[field]) { - allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field]) - } - - if (prohibitedMatches[field]) { - allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field]) - } - } - - var matchingFieldRefs = Object.keys(matchingFields), - results = [], - matches = Object.create(null) - - /* - * If the query is negated (contains only prohibited terms) - * we need to get _all_ fieldRefs currently existing in the - * index. This is only done when we know that the query is - * entirely prohibited terms to avoid any cost of getting all - * fieldRefs unnecessarily. - * - * Additionally, blank MatchData must be created to correctly - * populate the results. - */ - if (query.isNegated()) { - matchingFieldRefs = Object.keys(this.fieldVectors) - - for (var i = 0; i < matchingFieldRefs.length; i++) { - var matchingFieldRef = matchingFieldRefs[i] - var fieldRef = lunr.FieldRef.fromString(matchingFieldRef) - matchingFields[matchingFieldRef] = new lunr.MatchData - } - } - - for (var i = 0; i < matchingFieldRefs.length; i++) { - /* - * Currently we have document fields that match the query, but we - * need to return documents. The matchData and scores are combined - * from multiple fields belonging to the same document. - * - * Scores are calculated by field, using the query vectors created - * above, and combined into a final document score using addition. - */ - var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]), - docRef = fieldRef.docRef - - if (!allRequiredMatches.contains(docRef)) { - continue - } - - if (allProhibitedMatches.contains(docRef)) { - continue - } - - var fieldVector = this.fieldVectors[fieldRef], - score = queryVectors[fieldRef.fieldName].similarity(fieldVector), - docMatch - - if ((docMatch = matches[docRef]) !== undefined) { - docMatch.score += score - docMatch.matchData.combine(matchingFields[fieldRef]) - } else { - var match = { - ref: docRef, - score: score, - matchData: matchingFields[fieldRef] - } - matches[docRef] = match - results.push(match) - } - } - - /* - * Sort the results objects by score, highest first. - */ - return results.sort(function (a, b) { - return b.score - a.score - }) -} - -/** - * Prepares the index for JSON serialization. - * - * The schema for this JSON blob will be described in a - * separate JSON schema file. - * - * @returns {Object} - */ -lunr.Index.prototype.toJSON = function () { - var invertedIndex = Object.keys(this.invertedIndex) - .sort() - .map(function (term) { - return [term, this.invertedIndex[term]] - }, this) - - var fieldVectors = Object.keys(this.fieldVectors) - .map(function (ref) { - return [ref, this.fieldVectors[ref].toJSON()] - }, this) - - return { - version: lunr.version, - fields: this.fields, - fieldVectors: fieldVectors, - invertedIndex: invertedIndex, - pipeline: this.pipeline.toJSON() - } -} - -/** - * Loads a previously serialized lunr.Index - * - * @param {Object} serializedIndex - A previously serialized lunr.Index - * @returns {lunr.Index} - */ -lunr.Index.load = function (serializedIndex) { - var attrs = {}, - fieldVectors = {}, - serializedVectors = serializedIndex.fieldVectors, - invertedIndex = Object.create(null), - serializedInvertedIndex = serializedIndex.invertedIndex, - tokenSetBuilder = new lunr.TokenSet.Builder, - pipeline = lunr.Pipeline.load(serializedIndex.pipeline) - - if (serializedIndex.version != lunr.version) { - lunr.utils.warn("Version mismatch when loading serialised index. Current version of lunr '" + lunr.version + "' does not match serialized index '" + serializedIndex.version + "'") - } - - for (var i = 0; i < serializedVectors.length; i++) { - var tuple = serializedVectors[i], - ref = tuple[0], - elements = tuple[1] - - fieldVectors[ref] = new lunr.Vector(elements) - } - - for (var i = 0; i < serializedInvertedIndex.length; i++) { - var tuple = serializedInvertedIndex[i], - term = tuple[0], - posting = tuple[1] - - tokenSetBuilder.insert(term) - invertedIndex[term] = posting - } - - tokenSetBuilder.finish() - - attrs.fields = serializedIndex.fields - - attrs.fieldVectors = fieldVectors - attrs.invertedIndex = invertedIndex - attrs.tokenSet = tokenSetBuilder.root - attrs.pipeline = pipeline - - return new lunr.Index(attrs) -} -/*! - * lunr.Builder - * Copyright (C) 2018 Oliver Nightingale - */ - -/** - * lunr.Builder performs indexing on a set of documents and - * returns instances of lunr.Index ready for querying. - * - * All configuration of the index is done via the builder, the - * fields to index, the document reference, the text processing - * pipeline and document scoring parameters are all set on the - * builder before indexing. - * - * @constructor - * @property {string} _ref - Internal reference to the document reference field. - * @property {string[]} _fields - Internal reference to the document fields to index. - * @property {object} invertedIndex - The inverted index maps terms to document fields. - * @property {object} documentTermFrequencies - Keeps track of document term frequencies. - * @property {object} documentLengths - Keeps track of the length of documents added to the index. - * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing. - * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing. - * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index. - * @property {number} documentCount - Keeps track of the total number of documents indexed. - * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75. - * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2. - * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space. - * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index. - */ -lunr.Builder = function () { - this._ref = "id" - this._fields = Object.create(null) - this._documents = Object.create(null) - this.invertedIndex = Object.create(null) - this.fieldTermFrequencies = {} - this.fieldLengths = {} - this.tokenizer = lunr.tokenizer - this.pipeline = new lunr.Pipeline - this.searchPipeline = new lunr.Pipeline - this.documentCount = 0 - this._b = 0.75 - this._k1 = 1.2 - this.termIndex = 0 - this.metadataWhitelist = [] -} - -/** - * Sets the document field used as the document reference. Every document must have this field. - * The type of this field in the document should be a string, if it is not a string it will be - * coerced into a string by calling toString. - * - * The default ref is 'id'. - * - * The ref should _not_ be changed during indexing, it should be set before any documents are - * added to the index. Changing it during indexing can lead to inconsistent results. - * - * @param {string} ref - The name of the reference field in the document. - */ -lunr.Builder.prototype.ref = function (ref) { - this._ref = ref -} - -/** - * A function that is used to extract a field from a document. - * - * Lunr expects a field to be at the top level of a document, if however the field - * is deeply nested within a document an extractor function can be used to extract - * the right field for indexing. - * - * @callback fieldExtractor - * @param {object} doc - The document being added to the index. - * @returns {?(string|object|object[])} obj - The object that will be indexed for this field. - * @example Extracting a nested field - * function (doc) { return doc.nested.field } - */ - -/** - * Adds a field to the list of document fields that will be indexed. Every document being - * indexed should have this field. Null values for this field in indexed documents will - * not cause errors but will limit the chance of that document being retrieved by searches. - * - * All fields should be added before adding documents to the index. Adding fields after - * a document has been indexed will have no effect on already indexed documents. - * - * Fields can be boosted at build time. This allows terms within that field to have more - * importance when ranking search results. Use a field boost to specify that matches within - * one field are more important than other fields. - * - * @param {string} fieldName - The name of a field to index in all documents. - * @param {object} attributes - Optional attributes associated with this field. - * @param {number} [attributes.boost=1] - Boost applied to all terms within this field. - * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document. - * @throws {RangeError} fieldName cannot contain unsupported characters '/' - */ -lunr.Builder.prototype.field = function (fieldName, attributes) { - if (/\//.test(fieldName)) { - throw new RangeError ("Field '" + fieldName + "' contains illegal character '/'") - } - - this._fields[fieldName] = attributes || {} -} - -/** - * A parameter to tune the amount of field length normalisation that is applied when - * calculating relevance scores. A value of 0 will completely disable any normalisation - * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b - * will be clamped to the range 0 - 1. - * - * @param {number} number - The value to set for this tuning parameter. - */ -lunr.Builder.prototype.b = function (number) { - if (number < 0) { - this._b = 0 - } else if (number > 1) { - this._b = 1 - } else { - this._b = number - } -} - -/** - * A parameter that controls the speed at which a rise in term frequency results in term - * frequency saturation. The default value is 1.2. Setting this to a higher value will give - * slower saturation levels, a lower value will result in quicker saturation. - * - * @param {number} number - The value to set for this tuning parameter. - */ -lunr.Builder.prototype.k1 = function (number) { - this._k1 = number -} - -/** - * Adds a document to the index. - * - * Before adding fields to the index the index should have been fully setup, with the document - * ref and all fields to index already having been specified. - * - * The document must have a field name as specified by the ref (by default this is 'id') and - * it should have all fields defined for indexing, though null or undefined values will not - * cause errors. - * - * Entire documents can be boosted at build time. Applying a boost to a document indicates that - * this document should rank higher in search results than other documents. - * - * @param {object} doc - The document to add to the index. - * @param {object} attributes - Optional attributes associated with this document. - * @param {number} [attributes.boost=1] - Boost applied to all terms within this document. - */ -lunr.Builder.prototype.add = function (doc, attributes) { - var docRef = doc[this._ref], - fields = Object.keys(this._fields) - - this._documents[docRef] = attributes || {} - this.documentCount += 1 - - for (var i = 0; i < fields.length; i++) { - var fieldName = fields[i], - extractor = this._fields[fieldName].extractor, - field = extractor ? extractor(doc) : doc[fieldName], - tokens = this.tokenizer(field, { - fields: [fieldName] - }), - terms = this.pipeline.run(tokens), - fieldRef = new lunr.FieldRef (docRef, fieldName), - fieldTerms = Object.create(null) - - this.fieldTermFrequencies[fieldRef] = fieldTerms - this.fieldLengths[fieldRef] = 0 - - // store the length of this field for this document - this.fieldLengths[fieldRef] += terms.length - - // calculate term frequencies for this field - for (var j = 0; j < terms.length; j++) { - var term = terms[j] - - if (fieldTerms[term] == undefined) { - fieldTerms[term] = 0 - } - - fieldTerms[term] += 1 - - // add to inverted index - // create an initial posting if one doesn't exist - if (this.invertedIndex[term] == undefined) { - var posting = Object.create(null) - posting["_index"] = this.termIndex - this.termIndex += 1 - - for (var k = 0; k < fields.length; k++) { - posting[fields[k]] = Object.create(null) - } - - this.invertedIndex[term] = posting - } - - // add an entry for this term/fieldName/docRef to the invertedIndex - if (this.invertedIndex[term][fieldName][docRef] == undefined) { - this.invertedIndex[term][fieldName][docRef] = Object.create(null) - } - - // store all whitelisted metadata about this token in the - // inverted index - for (var l = 0; l < this.metadataWhitelist.length; l++) { - var metadataKey = this.metadataWhitelist[l], - metadata = term.metadata[metadataKey] - - if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) { - this.invertedIndex[term][fieldName][docRef][metadataKey] = [] - } - - this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata) - } - } - - } -} - -/** - * Calculates the average document length for this index - * - * @private - */ -lunr.Builder.prototype.calculateAverageFieldLengths = function () { - - var fieldRefs = Object.keys(this.fieldLengths), - numberOfFields = fieldRefs.length, - accumulator = {}, - documentsWithField = {} - - for (var i = 0; i < numberOfFields; i++) { - var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), - field = fieldRef.fieldName - - documentsWithField[field] || (documentsWithField[field] = 0) - documentsWithField[field] += 1 - - accumulator[field] || (accumulator[field] = 0) - accumulator[field] += this.fieldLengths[fieldRef] - } - - var fields = Object.keys(this._fields) - - for (var i = 0; i < fields.length; i++) { - var fieldName = fields[i] - accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName] - } - - this.averageFieldLength = accumulator -} - -/** - * Builds a vector space model of every document using lunr.Vector - * - * @private - */ -lunr.Builder.prototype.createFieldVectors = function () { - var fieldVectors = {}, - fieldRefs = Object.keys(this.fieldTermFrequencies), - fieldRefsLength = fieldRefs.length, - termIdfCache = Object.create(null) - - for (var i = 0; i < fieldRefsLength; i++) { - var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]), - fieldName = fieldRef.fieldName, - fieldLength = this.fieldLengths[fieldRef], - fieldVector = new lunr.Vector, - termFrequencies = this.fieldTermFrequencies[fieldRef], - terms = Object.keys(termFrequencies), - termsLength = terms.length - - - var fieldBoost = this._fields[fieldName].boost || 1, - docBoost = this._documents[fieldRef.docRef].boost || 1 - - for (var j = 0; j < termsLength; j++) { - var term = terms[j], - tf = termFrequencies[term], - termIndex = this.invertedIndex[term]._index, - idf, score, scoreWithPrecision - - if (termIdfCache[term] === undefined) { - idf = lunr.idf(this.invertedIndex[term], this.documentCount) - termIdfCache[term] = idf - } else { - idf = termIdfCache[term] - } - - score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf) - score *= fieldBoost - score *= docBoost - scoreWithPrecision = Math.round(score * 1000) / 1000 - // Converts 1.23456789 to 1.234. - // Reducing the precision so that the vectors take up less - // space when serialised. Doing it now so that they behave - // the same before and after serialisation. Also, this is - // the fastest approach to reducing a number's precision in - // JavaScript. - - fieldVector.insert(termIndex, scoreWithPrecision) - } - - fieldVectors[fieldRef] = fieldVector - } - - this.fieldVectors = fieldVectors -} - -/** - * Creates a token set of all tokens in the index using lunr.TokenSet - * - * @private - */ -lunr.Builder.prototype.createTokenSet = function () { - this.tokenSet = lunr.TokenSet.fromArray( - Object.keys(this.invertedIndex).sort() - ) -} - -/** - * Builds the index, creating an instance of lunr.Index. - * - * This completes the indexing process and should only be called - * once all documents have been added to the index. - * - * @returns {lunr.Index} - */ -lunr.Builder.prototype.build = function () { - this.calculateAverageFieldLengths() - this.createFieldVectors() - this.createTokenSet() - - return new lunr.Index({ - invertedIndex: this.invertedIndex, - fieldVectors: this.fieldVectors, - tokenSet: this.tokenSet, - fields: Object.keys(this._fields), - pipeline: this.searchPipeline - }) -} - -/** - * Applies a plugin to the index builder. - * - * A plugin is a function that is called with the index builder as its context. - * Plugins can be used to customise or extend the behaviour of the index - * in some way. A plugin is just a function, that encapsulated the custom - * behaviour that should be applied when building the index. - * - * The plugin function will be called with the index builder as its argument, additional - * arguments can also be passed when calling use. The function will be called - * with the index builder as its context. - * - * @param {Function} plugin The plugin to apply. - */ -lunr.Builder.prototype.use = function (fn) { - var args = Array.prototype.slice.call(arguments, 1) - args.unshift(this) - fn.apply(this, args) -} -/** - * Contains and collects metadata about a matching document. - * A single instance of lunr.MatchData is returned as part of every - * lunr.Index~Result. - * - * @constructor - * @param {string} term - The term this match data is associated with - * @param {string} field - The field in which the term was found - * @param {object} metadata - The metadata recorded about this term in this field - * @property {object} metadata - A cloned collection of metadata associated with this document. - * @see {@link lunr.Index~Result} - */ -lunr.MatchData = function (term, field, metadata) { - var clonedMetadata = Object.create(null), - metadataKeys = Object.keys(metadata || {}) - - // Cloning the metadata to prevent the original - // being mutated during match data combination. - // Metadata is kept in an array within the inverted - // index so cloning the data can be done with - // Array#slice - for (var i = 0; i < metadataKeys.length; i++) { - var key = metadataKeys[i] - clonedMetadata[key] = metadata[key].slice() - } - - this.metadata = Object.create(null) - - if (term !== undefined) { - this.metadata[term] = Object.create(null) - this.metadata[term][field] = clonedMetadata - } -} - -/** - * An instance of lunr.MatchData will be created for every term that matches a - * document. However only one instance is required in a lunr.Index~Result. This - * method combines metadata from another instance of lunr.MatchData with this - * objects metadata. - * - * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one. - * @see {@link lunr.Index~Result} - */ -lunr.MatchData.prototype.combine = function (otherMatchData) { - var terms = Object.keys(otherMatchData.metadata) - - for (var i = 0; i < terms.length; i++) { - var term = terms[i], - fields = Object.keys(otherMatchData.metadata[term]) - - if (this.metadata[term] == undefined) { - this.metadata[term] = Object.create(null) - } - - for (var j = 0; j < fields.length; j++) { - var field = fields[j], - keys = Object.keys(otherMatchData.metadata[term][field]) - - if (this.metadata[term][field] == undefined) { - this.metadata[term][field] = Object.create(null) - } - - for (var k = 0; k < keys.length; k++) { - var key = keys[k] - - if (this.metadata[term][field][key] == undefined) { - this.metadata[term][field][key] = otherMatchData.metadata[term][field][key] - } else { - this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key]) - } - - } - } - } -} - -/** - * Add metadata for a term/field pair to this instance of match data. - * - * @param {string} term - The term this match data is associated with - * @param {string} field - The field in which the term was found - * @param {object} metadata - The metadata recorded about this term in this field - */ -lunr.MatchData.prototype.add = function (term, field, metadata) { - if (!(term in this.metadata)) { - this.metadata[term] = Object.create(null) - this.metadata[term][field] = metadata - return - } - - if (!(field in this.metadata[term])) { - this.metadata[term][field] = metadata - return - } - - var metadataKeys = Object.keys(metadata) - - for (var i = 0; i < metadataKeys.length; i++) { - var key = metadataKeys[i] - - if (key in this.metadata[term][field]) { - this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key]) - } else { - this.metadata[term][field][key] = metadata[key] - } - } -} -/** - * A lunr.Query provides a programmatic way of defining queries to be performed - * against a {@link lunr.Index}. - * - * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method - * so the query object is pre-initialized with the right index fields. - * - * @constructor - * @property {lunr.Query~Clause[]} clauses - An array of query clauses. - * @property {string[]} allFields - An array of all available fields in a lunr.Index. - */ -lunr.Query = function (allFields) { - this.clauses = [] - this.allFields = allFields -} - -/** - * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause. - * - * This allows wildcards to be added to the beginning and end of a term without having to manually do any string - * concatenation. - * - * The wildcard constants can be bitwise combined to select both leading and trailing wildcards. - * - * @constant - * @default - * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour - * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists - * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists - * @see lunr.Query~Clause - * @see lunr.Query#clause - * @see lunr.Query#term - * @example query term with trailing wildcard - * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING }) - * @example query term with leading and trailing wildcard - * query.term('foo', { - * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING - * }) - */ - -lunr.Query.wildcard = new String ("*") -lunr.Query.wildcard.NONE = 0 -lunr.Query.wildcard.LEADING = 1 -lunr.Query.wildcard.TRAILING = 2 - -/** - * Constants for indicating what kind of presence a term must have in matching documents. - * - * @constant - * @enum {number} - * @see lunr.Query~Clause - * @see lunr.Query#clause - * @see lunr.Query#term - * @example query term with required presence - * query.term('foo', { presence: lunr.Query.presence.REQUIRED }) - */ -lunr.Query.presence = { - /** - * Term's presence in a document is optional, this is the default value. - */ - OPTIONAL: 1, - - /** - * Term's presence in a document is required, documents that do not contain - * this term will not be returned. - */ - REQUIRED: 2, - - /** - * Term's presence in a document is prohibited, documents that do contain - * this term will not be returned. - */ - PROHIBITED: 3 -} - -/** - * A single clause in a {@link lunr.Query} contains a term and details on how to - * match that term against a {@link lunr.Index}. - * - * @typedef {Object} lunr.Query~Clause - * @property {string[]} fields - The fields in an index this clause should be matched against. - * @property {number} [boost=1] - Any boost that should be applied when matching this clause. - * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be. - * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline. - * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended. - * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents. - */ - -/** - * Adds a {@link lunr.Query~Clause} to this query. - * - * Unless the clause contains the fields to be matched all fields will be matched. In addition - * a default boost of 1 is applied to the clause. - * - * @param {lunr.Query~Clause} clause - The clause to add to this query. - * @see lunr.Query~Clause - * @returns {lunr.Query} - */ -lunr.Query.prototype.clause = function (clause) { - if (!('fields' in clause)) { - clause.fields = this.allFields - } - - if (!('boost' in clause)) { - clause.boost = 1 - } - - if (!('usePipeline' in clause)) { - clause.usePipeline = true - } - - if (!('wildcard' in clause)) { - clause.wildcard = lunr.Query.wildcard.NONE - } - - if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) { - clause.term = "*" + clause.term - } - - if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) { - clause.term = "" + clause.term + "*" - } - - if (!('presence' in clause)) { - clause.presence = lunr.Query.presence.OPTIONAL - } - - this.clauses.push(clause) - - return this -} - -/** - * A negated query is one in which every clause has a presence of - * prohibited. These queries require some special processing to return - * the expected results. - * - * @returns boolean - */ -lunr.Query.prototype.isNegated = function () { - for (var i = 0; i < this.clauses.length; i++) { - if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) { - return false - } - } - - return true -} - -/** - * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause} - * to the list of clauses that make up this query. - * - * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion - * to a token or token-like string should be done before calling this method. - * - * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an - * array, each term in the array will share the same options. - * - * @param {object|object[]} term - The term(s) to add to the query. - * @param {object} [options] - Any additional properties to add to the query clause. - * @returns {lunr.Query} - * @see lunr.Query#clause - * @see lunr.Query~Clause - * @example adding a single term to a query - * query.term("foo") - * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard - * query.term("foo", { - * fields: ["title"], - * boost: 10, - * wildcard: lunr.Query.wildcard.TRAILING - * }) - * @example using lunr.tokenizer to convert a string to tokens before using them as terms - * query.term(lunr.tokenizer("foo bar")) - */ -lunr.Query.prototype.term = function (term, options) { - if (Array.isArray(term)) { - term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this) - return this - } - - var clause = options || {} - clause.term = term.toString() - - this.clause(clause) - - return this -} -lunr.QueryParseError = function (message, start, end) { - this.name = "QueryParseError" - this.message = message - this.start = start - this.end = end -} - -lunr.QueryParseError.prototype = new Error -lunr.QueryLexer = function (str) { - this.lexemes = [] - this.str = str - this.length = str.length - this.pos = 0 - this.start = 0 - this.escapeCharPositions = [] -} - -lunr.QueryLexer.prototype.run = function () { - var state = lunr.QueryLexer.lexText - - while (state) { - state = state(this) - } -} - -lunr.QueryLexer.prototype.sliceString = function () { - var subSlices = [], - sliceStart = this.start, - sliceEnd = this.pos - - for (var i = 0; i < this.escapeCharPositions.length; i++) { - sliceEnd = this.escapeCharPositions[i] - subSlices.push(this.str.slice(sliceStart, sliceEnd)) - sliceStart = sliceEnd + 1 - } - - subSlices.push(this.str.slice(sliceStart, this.pos)) - this.escapeCharPositions.length = 0 - - return subSlices.join('') -} - -lunr.QueryLexer.prototype.emit = function (type) { - this.lexemes.push({ - type: type, - str: this.sliceString(), - start: this.start, - end: this.pos - }) - - this.start = this.pos -} - -lunr.QueryLexer.prototype.escapeCharacter = function () { - this.escapeCharPositions.push(this.pos - 1) - this.pos += 1 -} - -lunr.QueryLexer.prototype.next = function () { - if (this.pos >= this.length) { - return lunr.QueryLexer.EOS - } - - var char = this.str.charAt(this.pos) - this.pos += 1 - return char -} - -lunr.QueryLexer.prototype.width = function () { - return this.pos - this.start -} - -lunr.QueryLexer.prototype.ignore = function () { - if (this.start == this.pos) { - this.pos += 1 - } - - this.start = this.pos -} - -lunr.QueryLexer.prototype.backup = function () { - this.pos -= 1 -} - -lunr.QueryLexer.prototype.acceptDigitRun = function () { - var char, charCode - - do { - char = this.next() - charCode = char.charCodeAt(0) - } while (charCode > 47 && charCode < 58) - - if (char != lunr.QueryLexer.EOS) { - this.backup() - } -} - -lunr.QueryLexer.prototype.more = function () { - return this.pos < this.length -} - -lunr.QueryLexer.EOS = 'EOS' -lunr.QueryLexer.FIELD = 'FIELD' -lunr.QueryLexer.TERM = 'TERM' -lunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE' -lunr.QueryLexer.BOOST = 'BOOST' -lunr.QueryLexer.PRESENCE = 'PRESENCE' - -lunr.QueryLexer.lexField = function (lexer) { - lexer.backup() - lexer.emit(lunr.QueryLexer.FIELD) - lexer.ignore() - return lunr.QueryLexer.lexText -} - -lunr.QueryLexer.lexTerm = function (lexer) { - if (lexer.width() > 1) { - lexer.backup() - lexer.emit(lunr.QueryLexer.TERM) - } - - lexer.ignore() - - if (lexer.more()) { - return lunr.QueryLexer.lexText - } -} - -lunr.QueryLexer.lexEditDistance = function (lexer) { - lexer.ignore() - lexer.acceptDigitRun() - lexer.emit(lunr.QueryLexer.EDIT_DISTANCE) - return lunr.QueryLexer.lexText -} - -lunr.QueryLexer.lexBoost = function (lexer) { - lexer.ignore() - lexer.acceptDigitRun() - lexer.emit(lunr.QueryLexer.BOOST) - return lunr.QueryLexer.lexText -} - -lunr.QueryLexer.lexEOS = function (lexer) { - if (lexer.width() > 0) { - lexer.emit(lunr.QueryLexer.TERM) - } -} - -// This matches the separator used when tokenising fields -// within a document. These should match otherwise it is -// not possible to search for some tokens within a document. -// -// It is possible for the user to change the separator on the -// tokenizer so it _might_ clash with any other of the special -// characters already used within the search string, e.g. :. -// -// This means that it is possible to change the separator in -// such a way that makes some words unsearchable using a search -// string. -lunr.QueryLexer.termSeparator = lunr.tokenizer.separator - -lunr.QueryLexer.lexText = function (lexer) { - while (true) { - var char = lexer.next() - - if (char == lunr.QueryLexer.EOS) { - return lunr.QueryLexer.lexEOS - } - - // Escape character is '\' - if (char.charCodeAt(0) == 92) { - lexer.escapeCharacter() - continue - } - - if (char == ":") { - return lunr.QueryLexer.lexField - } - - if (char == "~") { - lexer.backup() - if (lexer.width() > 0) { - lexer.emit(lunr.QueryLexer.TERM) - } - return lunr.QueryLexer.lexEditDistance - } - - if (char == "^") { - lexer.backup() - if (lexer.width() > 0) { - lexer.emit(lunr.QueryLexer.TERM) - } - return lunr.QueryLexer.lexBoost - } - - // "+" indicates term presence is required - // checking for length to ensure that only - // leading "+" are considered - if (char == "+" && lexer.width() === 1) { - lexer.emit(lunr.QueryLexer.PRESENCE) - return lunr.QueryLexer.lexText - } - - // "-" indicates term presence is prohibited - // checking for length to ensure that only - // leading "-" are considered - if (char == "-" && lexer.width() === 1) { - lexer.emit(lunr.QueryLexer.PRESENCE) - return lunr.QueryLexer.lexText - } - - if (char.match(lunr.QueryLexer.termSeparator)) { - return lunr.QueryLexer.lexTerm - } - } -} - -lunr.QueryParser = function (str, query) { - this.lexer = new lunr.QueryLexer (str) - this.query = query - this.currentClause = {} - this.lexemeIdx = 0 -} - -lunr.QueryParser.prototype.parse = function () { - this.lexer.run() - this.lexemes = this.lexer.lexemes - - var state = lunr.QueryParser.parseClause - - while (state) { - state = state(this) - } - - return this.query -} - -lunr.QueryParser.prototype.peekLexeme = function () { - return this.lexemes[this.lexemeIdx] -} - -lunr.QueryParser.prototype.consumeLexeme = function () { - var lexeme = this.peekLexeme() - this.lexemeIdx += 1 - return lexeme -} - -lunr.QueryParser.prototype.nextClause = function () { - var completedClause = this.currentClause - this.query.clause(completedClause) - this.currentClause = {} -} - -lunr.QueryParser.parseClause = function (parser) { - var lexeme = parser.peekLexeme() - - if (lexeme == undefined) { - return - } - - switch (lexeme.type) { - case lunr.QueryLexer.PRESENCE: - return lunr.QueryParser.parsePresence - case lunr.QueryLexer.FIELD: - return lunr.QueryParser.parseField - case lunr.QueryLexer.TERM: - return lunr.QueryParser.parseTerm - default: - var errorMessage = "expected either a field or a term, found " + lexeme.type - - if (lexeme.str.length >= 1) { - errorMessage += " with value '" + lexeme.str + "'" - } - - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } -} - -lunr.QueryParser.parsePresence = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - switch (lexeme.str) { - case "-": - parser.currentClause.presence = lunr.Query.presence.PROHIBITED - break - case "+": - parser.currentClause.presence = lunr.Query.presence.REQUIRED - break - default: - var errorMessage = "unrecognised presence operator'" + lexeme.str + "'" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - var errorMessage = "expecting term or field, found nothing" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.FIELD: - return lunr.QueryParser.parseField - case lunr.QueryLexer.TERM: - return lunr.QueryParser.parseTerm - default: - var errorMessage = "expecting term or field, found '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseField = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - if (parser.query.allFields.indexOf(lexeme.str) == -1) { - var possibleFields = parser.query.allFields.map(function (f) { return "'" + f + "'" }).join(', '), - errorMessage = "unrecognised field '" + lexeme.str + "', possible fields: " + possibleFields - - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - parser.currentClause.fields = [lexeme.str] - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - var errorMessage = "expecting term, found nothing" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - return lunr.QueryParser.parseTerm - default: - var errorMessage = "expecting term, found '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseTerm = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - parser.currentClause.term = lexeme.str.toLowerCase() - - if (lexeme.str.indexOf("*") != -1) { - parser.currentClause.usePipeline = false - } - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - parser.nextClause() - return - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - parser.nextClause() - return lunr.QueryParser.parseTerm - case lunr.QueryLexer.FIELD: - parser.nextClause() - return lunr.QueryParser.parseField - case lunr.QueryLexer.EDIT_DISTANCE: - return lunr.QueryParser.parseEditDistance - case lunr.QueryLexer.BOOST: - return lunr.QueryParser.parseBoost - case lunr.QueryLexer.PRESENCE: - parser.nextClause() - return lunr.QueryParser.parsePresence - default: - var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseEditDistance = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - var editDistance = parseInt(lexeme.str, 10) - - if (isNaN(editDistance)) { - var errorMessage = "edit distance must be numeric" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - parser.currentClause.editDistance = editDistance - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - parser.nextClause() - return - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - parser.nextClause() - return lunr.QueryParser.parseTerm - case lunr.QueryLexer.FIELD: - parser.nextClause() - return lunr.QueryParser.parseField - case lunr.QueryLexer.EDIT_DISTANCE: - return lunr.QueryParser.parseEditDistance - case lunr.QueryLexer.BOOST: - return lunr.QueryParser.parseBoost - case lunr.QueryLexer.PRESENCE: - parser.nextClause() - return lunr.QueryParser.parsePresence - default: - var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - -lunr.QueryParser.parseBoost = function (parser) { - var lexeme = parser.consumeLexeme() - - if (lexeme == undefined) { - return - } - - var boost = parseInt(lexeme.str, 10) - - if (isNaN(boost)) { - var errorMessage = "boost must be numeric" - throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end) - } - - parser.currentClause.boost = boost - - var nextLexeme = parser.peekLexeme() - - if (nextLexeme == undefined) { - parser.nextClause() - return - } - - switch (nextLexeme.type) { - case lunr.QueryLexer.TERM: - parser.nextClause() - return lunr.QueryParser.parseTerm - case lunr.QueryLexer.FIELD: - parser.nextClause() - return lunr.QueryParser.parseField - case lunr.QueryLexer.EDIT_DISTANCE: - return lunr.QueryParser.parseEditDistance - case lunr.QueryLexer.BOOST: - return lunr.QueryParser.parseBoost - case lunr.QueryLexer.PRESENCE: - parser.nextClause() - return lunr.QueryParser.parsePresence - default: - var errorMessage = "Unexpected lexeme type '" + nextLexeme.type + "'" - throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end) - } -} - - /** - * export the module via AMD, CommonJS or as a browser global - * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js - */ - ;(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(factory) - } else if (typeof exports === 'object') { - /** - * Node. Does not work with strict CommonJS, but - * only CommonJS-like enviroments that support module.exports, - * like Node. - */ - module.exports = factory() - } else { - // Browser globals (root is window) - root.lunr = factory() - } - }(this, function () { - /** - * Just return a value to define the module export. - * This example returns an object, but the module - * can return a function as the exported value. - */ - return lunr - })) -})(); diff --git a/assets/js/lunr/lunr.min.js b/assets/js/lunr/lunr.min.js deleted file mode 100644 index f45a81e..0000000 --- a/assets/js/lunr/lunr.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var t,l,c,e,r,h,d,f,p,y,m,g,x,v,w,Q,k,S,E,L,b,P,T,O,I,i,n,s,z=function(e){var t=new z.Builder;return t.pipeline.add(z.trimmer,z.stopWordFilter,z.stemmer),t.searchPipeline.add(z.stemmer),e.call(t,t),t.build()};z.version="2.3.5",z.utils={},z.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)}),z.utils.asString=function(e){return null==e?"":e.toString()},z.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i=this.length)return z.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},z.QueryLexer.prototype.width=function(){return this.pos-this.start},z.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},z.QueryLexer.prototype.backup=function(){this.pos-=1},z.QueryLexer.prototype.acceptDigitRun=function(){for(var e,t;47<(t=(e=this.next()).charCodeAt(0))&&t<58;);e!=z.QueryLexer.EOS&&this.backup()},z.QueryLexer.prototype.more=function(){return this.pos>10|55296,1023&n|56320))}function i(){C()}var e,p,x,o,a,h,d,m,w,u,l,C,T,s,E,g,c,v,y,S="sizzle"+ +new Date,b=n.document,k=0,r=0,A=ue(),N=ue(),j=ue(),I=ue(),L=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],O=t.pop,P=t.push,H=t.push,q=t.slice,M=function(e,t){for(var n=0,r=e.length;n+~]|"+$+")"+$+"*"),Q=new RegExp($+"|>"),Y=new RegExp(F),V=new RegExp("^"+R+"$"),G={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+$+"*(even|odd|(([+-]|)(\\d*)n|)"+$+"*(?:([+-]|)"+$+"*(\\d+)|))"+$+"*\\)|)","i"),bool:new RegExp("^(?:"+_+")$","i"),needsContext:new RegExp("^"+$+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+$+"*((?:-\\d)?\\d*)"+$+"*\\)|)(?=[^-]|$)","i")},K=/HTML$/i,Z=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,ee=/^[^{]+\{\s*\[native \w/,te=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ne=/[+~]/,re=new RegExp("\\\\[\\da-fA-F]{1,6}"+$+"?|\\\\([^\\r\\n\\f])","g"),ie=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,oe=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ae=xe(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=q.call(b.childNodes),b.childNodes),t[b.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){P.apply(e,q.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,d=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==d&&9!==d&&11!==d)return n;if(!r&&(C(e),e=e||T,E)){if(11!==d&&(u=te.exec(t)))if(i=u[1]){if(9===d){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&p.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(p.qsa&&!I[t+" "]&&(!g||!g.test(t))&&(1!==d||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===d&&(Q.test(t)||X.test(t))){for((f=ne.test(t)&&ve(e.parentNode)||e)===e&&p.scope||((s=e.getAttribute("id"))?s=s.replace(ie,oe):e.setAttribute("id",s=S)),o=(l=h(t)).length;o--;)l[o]=(s?"#"+s:":scope")+" "+be(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){I(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return m(t.replace(W,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>x.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){for(var n=e.split("|"),r=n.length;r--;)x.attrHandle[n[r]]=t}function de(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function pe(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function me(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ge(a){return le(function(o){return o=+o,le(function(e,t){for(var n,r=a([],e.length,o),i=r.length;i--;)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(e in p=se.support={},a=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!K.test(t||n&&n.nodeName||"HTML")},C=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:b;return r!=T&&9===r.nodeType&&r.documentElement&&(s=(T=r).documentElement,E=!a(T),b!=T&&(n=T.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",i,!1):n.attachEvent&&n.attachEvent("onunload",i)),p.scope=ce(function(e){return s.appendChild(e).appendChild(T.createElement("div")),void 0!==e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),p.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),p.getElementsByTagName=ce(function(e){return e.appendChild(T.createComment("")),!e.getElementsByTagName("*").length}),p.getElementsByClassName=ee.test(T.getElementsByClassName),p.getById=ce(function(e){return s.appendChild(e).id=S,!T.getElementsByName||!T.getElementsByName(S).length}),p.getById?(x.filter.ID=function(e){var t=e.replace(re,f);return function(e){return e.getAttribute("id")===t}},x.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(x.filter.ID=function(e){var n=e.replace(re,f);return function(e){var t=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},x.find.ID=function(e,t){if(void 0!==t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];for(i=t.getElementsByName(e),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),x.find.TAG=p.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):p.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"!==e)return o;for(;n=o[i++];)1===n.nodeType&&r.push(n);return r},x.find.CLASS=p.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&E)return t.getElementsByClassName(e)},c=[],g=[],(p.qsa=ee.test(T.querySelectorAll))&&(ce(function(e){var t;s.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+$+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+$+"*(?:value|"+_+")"),e.querySelectorAll("[id~="+S+"-]").length||g.push("~="),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||g.push("\\["+$+"*name"+$+"*="+$+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||g.push(".#.+[+~]"),e.querySelectorAll("\\\f"),g.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=T.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+$+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),s.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(p.matchesSelector=ee.test(v=s.matches||s.webkitMatchesSelector||s.mozMatchesSelector||s.oMatchesSelector||s.msMatchesSelector))&&ce(function(e){p.disconnectedMatch=v.call(e,"*"),v.call(e,"[s!='']:x"),c.push("!=",F)}),g=g.length&&new RegExp(g.join("|")),c=c.length&&new RegExp(c.join("|")),t=ee.test(s.compareDocumentPosition),y=t||ee.test(s.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},L=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!p.sortDetached&&t.compareDocumentPosition(e)===n?e==T||e.ownerDocument==b&&y(b,e)?-1:t==T||t.ownerDocument==b&&y(b,t)?1:u?M(u,e)-M(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==T?-1:t==T?1:i?-1:o?1:u?M(u,e)-M(u,t):0;if(i===o)return de(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;a[r]===s[r];)r++;return r?de(a[r],s[r]):a[r]==b?-1:s[r]==b?1:0}),T},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(C(e),p.matchesSelector&&E&&!I[t+" "]&&(!c||!c.test(t))&&(!g||!g.test(t)))try{var n=v.call(e,t);if(n||p.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){I(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(re,f),e[3]=(e[3]||e[4]||e[5]||"").replace(re,f),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&Y.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(re,f).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=A[e+" "];return t||(t=new RegExp("(^|"+$+")"+e+"("+$+"|$)"))&&A(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return b(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||I,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):b(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)b(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}).prototype=S.fn,I=S(E);var D=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var me={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ge(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var ye=/<|&#?\w+;/;function be(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),d=[],p=0,h=e.length;p\s*$/g;function Le(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(V.hasData(e)&&(s=V.get(e).events))for(i in V.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var tn,nn=[],rn=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=nn.pop()||S.expando+"_"+Ot.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(rn.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&rn.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=b(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(rn,"$1"+r):!1!==e.jsonp&&(e.url+=(Pt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=T[r],T[r]=function(){o=arguments},n.always(function(){void 0===i?S(T).removeProp(r):T[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,nn.push(r)),o&&b(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((tn=E.implementation.createHTMLDocument("").body).innerHTML="
",2===tn.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=be([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),i=("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,r.left):(a=parseFloat(o)||0,parseFloat(u)||0),b(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===S.css(e,"position");)e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return F(this,function(e,t,n){var r;if(m(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Ze(y.pixelPosition,function(e,t){if(t)return t=Ke(e,n),Xe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return F(this,function(e,t,n){var r;return m(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0x

',t.appendChild(r.childNodes[1])}return e&&o.extend(n,e),this.each(function(){var e=['iframe[src*="player.vimeo.com"]','iframe[src*="youtube.com"]','iframe[src*="youtube-nocookie.com"]','iframe[src*="kickstarter.com"][src*="video.html"]',"object","embed"];n.customSelector&&e.push(n.customSelector);var i=".fitvidsignore";n.ignore&&(i=i+", "+n.ignore);var t=o(this).find(e.join(","));(t=(t=t.not("object object")).not(i)).each(function(e){var t=o(this);if(!(0').parent(".fluid-width-video-wrapper").css("padding-top",100*n+"%"),t.removeAttr("height").removeAttr("width")}})})}}(window.jQuery||window.Zepto),$(function(){var r,i,e,o,t=$("nav.greedy-nav .greedy-nav__toggle"),a=$("nav.greedy-nav .visible-links"),s=$("nav.greedy-nav .hidden-links"),n=$("nav.greedy-nav"),u=$("nav.greedy-nav .site-logo"),l=$("nav.greedy-nav .site-logo img"),c=$("nav.greedy-nav .site-title"),f=$("nav.greedy-nav button.search__toggle");function d(){function n(e,t){i+=t,r+=1,o.push(i)}i=r=0,e=1e3,o=[],a.children().outerWidth(n),s.children().each(function(){var e,t;e=$(this),(t=e.clone()).css("visibility","hidden"),a.append(t),n(0,t.outerWidth()),t.remove()})}d();var p,h,m,g,v=$(window).width(),y=v<768?0:v<1024?1:v<1280?2:3;function b(){var e=(v=$(window).width())<768?0:v<1024?1:v<1280?2:3;e!==y&&d(),y=e,h=a.children().length,p=n.innerWidth()-(0!==u.length?u.outerWidth(!0):0)-c.outerWidth(!0)-(0!==f.length?f.outerWidth(!0):0)-(h!==o.length?t.outerWidth(!0):0),m=o[h-1],po[h]&&(s.children().first().appendTo(a),h+=1,b()),t.attr("count",r-h),h===r?t.addClass("hidden"):t.removeClass("hidden")}$(window).resize(function(){b()}),t.on("click",function(){s.toggleClass("hidden"),clearTimeout(g)}),s.on("mouseleave",function(){g=setTimeout(function(){s.addClass("hidden")},e)}).on("mouseenter",function(){clearTimeout(g)}),0===l.length||l[0].complete||0!==l[0].naturalWidth?b():l.one("load error",b)}),function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?e(require("jquery")):e(window.jQuery||window.Zepto)}(function(c){function e(){}function f(e,t){m.ev.on("mfp"+e+x,t)}function d(e,t,n,r){var i=document.createElement("div");return i.className="mfp-"+e,n&&(i.innerHTML=n),r?t&&t.appendChild(i):(i=c(i),t&&i.appendTo(t)),i}function p(e,t){m.ev.triggerHandler("mfp"+e,t),m.st.callbacks&&(e=e.charAt(0).toLowerCase()+e.slice(1),m.st.callbacks[e]&&m.st.callbacks[e].apply(m,c.isArray(t)?t:[t]))}function h(e){return e===t&&m.currTemplate.closeBtn||(m.currTemplate.closeBtn=c(m.st.closeMarkup.replace("%title%",m.st.tClose)),t=e),m.currTemplate.closeBtn}function o(){c.magnificPopup.instance||((m=new e).init(),c.magnificPopup.instance=m)}var m,r,g,i,v,t,u="Close",l="BeforeClose",y="MarkupParse",b="Open",x=".mfp",w="mfp-ready",n="mfp-removing",a="mfp-prevent-close",s=!!window.jQuery,C=c(window);e.prototype={constructor:e,init:function(){var e=navigator.appVersion;m.isLowIE=m.isIE8=document.all&&!document.addEventListener,m.isAndroid=/android/gi.test(e),m.isIOS=/iphone|ipad|ipod/gi.test(e),m.supportsTransition=function(){var e=document.createElement("p").style,t=["ms","O","Moz","Webkit"];if(void 0!==e.transition)return!0;for(;t.length;)if(t.pop()+"Transition"in e)return!0;return!1}(),m.probablyMobile=m.isAndroid||m.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),g=c(document),m.popupsCache={}},open:function(e){var t;if(!1===e.isObj){m.items=e.items.toArray(),m.index=0;var n,r=e.items;for(t=0;t(e||C.height())},_setFocus:function(){(m.st.focus?m.content.find(m.st.focus).eq(0):m.wrap).focus()},_onFocusIn:function(e){if(e.target!==m.wrap[0]&&!c.contains(m.wrap[0],e.target))return m._setFocus(),!1},_parseMarkup:function(i,e,t){var o;t.data&&(e=c.extend(t.data,e)),p(y,[i,e,t]),c.each(e,function(e,t){if(void 0===t||!1===t)return!0;if(1<(o=e.split("_")).length){var n=i.find(x+"-"+o[0]);if(0").attr("src",t).attr("class",n.attr("class"))):n.attr(o[1],t)}}else i.find(x+"-"+e).html(t)})},_getScrollbarSize:function(){if(void 0===m.scrollbarSize){var e=document.createElement("div");e.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(e),m.scrollbarSize=e.offsetWidth-e.clientWidth,document.body.removeChild(e)}return m.scrollbarSize}},c.magnificPopup={instance:null,proto:e.prototype,modules:[],open:function(e,t){return o(),(e=e?c.extend(!0,{},e):{}).isObj=!0,e.index=t||0,this.instance.open(e)},close:function(){return c.magnificPopup.instance&&c.magnificPopup.instance.close()},registerModule:function(e,t){t.options&&(c.magnificPopup.defaults[e]=t.options),c.extend(this.proto,t.proto),this.modules.push(e)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},c.fn.magnificPopup=function(e){o();var t=c(this);if("string"==typeof e)if("open"===e){var n,r=s?t.data("magnificPopup"):t[0].magnificPopup,i=parseInt(arguments[1],10)||0;n=r.items?r.items[i]:(n=t,r.delegate&&(n=n.find(r.delegate)),n.eq(i)),m._openClick({mfpEl:n},t,r)}else m.isOpen&&m[e].apply(m,Array.prototype.slice.call(arguments,1));else e=c.extend(!0,{},e),s?t.data("magnificPopup",e):t[0].magnificPopup=e,m.addGroup(t,e);return t};function T(){k&&(S.after(k.addClass(E)).detach(),k=null)}var E,S,k,A="inline";c.magnificPopup.registerModule(A,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){m.types.push(A),f(u+"."+A,function(){T()})},getInline:function(e,t){if(T(),e.src){var n=m.st.inline,r=c(e.src);if(r.length){var i=r[0].parentNode;i&&i.tagName&&(S||(E=n.hiddenClass,S=d(E),E="mfp-"+E),k=r.after(S).detach().removeClass(E)),m.updateStatus("ready")}else m.updateStatus("error",n.tNotFound),r=c("
");return e.inlineElement=r}return m.updateStatus("ready"),m._parseMarkup(t,{},e),t}}});function N(){I&&c(document.body).removeClass(I)}function j(){N(),m.req&&m.req.abort()}var I,L="ajax";c.magnificPopup.registerModule(L,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'The content could not be loaded.'},proto:{initAjax:function(){m.types.push(L),I=m.st.ajax.cursor,f(u+"."+L,j),f("BeforeChange."+L,j)},getAjax:function(i){I&&c(document.body).addClass(I),m.updateStatus("loading");var e=c.extend({url:i.src,success:function(e,t,n){var r={data:e,xhr:n};p("ParseAjax",r),m.appendContent(c(r.data),L),i.finished=!0,N(),m._setFocus(),setTimeout(function(){m.wrap.addClass(w)},16),m.updateStatus("ready"),p("AjaxContentAdded")},error:function(){N(),i.finished=i.loadError=!0,m.updateStatus("error",m.st.ajax.tError.replace("%url%",i.src))}},m.st.ajax.settings);return m.req=c.ajax(e),""}}});var D;c.magnificPopup.registerModule("image",{options:{markup:'
',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'The image could not be loaded.'},proto:{initImage:function(){var e=m.st.image,t=".image";m.types.push("image"),f(b+t,function(){"image"===m.currItem.type&&e.cursor&&c(document.body).addClass(e.cursor)}),f(u+t,function(){e.cursor&&c(document.body).removeClass(e.cursor),C.off("resize"+x)}),f("Resize"+t,m.resizeImage),m.isLowIE&&f("AfterChange",m.resizeImage)},resizeImage:function(){var e=m.currItem;if(e&&e.img&&m.st.image.verticalFit){var t=0;m.isLowIE&&(t=parseInt(e.img.css("padding-top"),10)+parseInt(e.img.css("padding-bottom"),10)),e.img.css("max-height",m.wH-t)}},_onImageHasSize:function(e){e.img&&(e.hasSize=!0,D&&clearInterval(D),e.isCheckingImgSize=!1,p("ImageHasSize",e),e.imgHidden&&(m.content&&m.content.removeClass("mfp-loading"),e.imgHidden=!1))},findImageSize:function(t){var n=0,r=t.img[0],i=function(e){D&&clearInterval(D),D=setInterval(function(){0
',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){m.types.push(H),f("BeforeChange",function(e,t,n){t!==n&&(t===H?P():n===H&&P(!0))}),f(u+"."+H,function(){P()})},getIframe:function(e,t){var n=e.src,r=m.st.iframe;c.each(r.patterns,function(){if(-1',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var o=m.st.gallery,e=".mfp-gallery";if(m.direction=!0,!o||!o.enabled)return!1;v+=" mfp-gallery",f(b+e,function(){o.navigateByImgClick&&m.wrap.on("click"+e,".mfp-img",function(){if(1=m.index,m.index=e,m.updateItemHTML()},preloadNearbyImages:function(){var e,t=m.st.gallery.preload,n=Math.min(t[0],m.items.length),r=Math.min(t[1],m.items.length);for(e=1;e<=(m.direction?r:n);e++)m._preloadItem(m.index+e);for(e=1;e<=(m.direction?n:r);e++)m._preloadItem(m.index-e)},_preloadItem:function(e){if(e=q(e),!m.items[e].preloaded){var t=m.items[e];t.parsed||(t=m.parseEl(e)),p("LazyLoad",t),"image"===t.type&&(t.img=c('').on("load.mfploader",function(){t.hasSize=!0}).on("error.mfploader",function(){t.hasSize=!0,t.loadError=!0,p("LazyLoadError",t)}).attr("src",t.src)),t.preloaded=!0}}}});var _="retina";c.magnificPopup.registerModule(_,{options:{replaceSrc:function(e){return e.src.replace(/\.\w+$/,function(e){return"@2x"+e})},ratio:1},proto:{initRetina:function(){if(1r.durationMax?r.durationMax:r.durationMin&&i=y)return k.cancelScroll(!0),r=t,i=l,0===(n=a)&&document.body.focus(),i||(n.focus(),document.activeElement!==n&&(n.setAttribute("tabindex","-1"),n.focus(),n.style.outline="none"),A.scrollTo(0,r)),L("scrollStop",u,a,s),!(S=f=null)},C=function(e){var t,n,r;b+=e-(f=f||e),d=c+v*(n=o=1<(o=0===x?0:b/x)?1:o,"easeInQuad"===(t=u).easing&&(r=n*n),"easeOutQuad"===t.easing&&(r=n*(2-n)),"easeInOutQuad"===t.easing&&(r=n<.5?2*n*n:(4-2*n)*n-1),"easeInCubic"===t.easing&&(r=n*n*n),"easeOutCubic"===t.easing&&(r=--n*n*n+1),"easeInOutCubic"===t.easing&&(r=n<.5?4*n*n*n:(n-1)*(2*n-2)*(2*n-2)+1),"easeInQuart"===t.easing&&(r=n*n*n*n),"easeOutQuart"===t.easing&&(r=1- --n*n*n*n),"easeInOutQuart"===t.easing&&(r=n<.5?8*n*n*n*n:1-8*--n*n*n*n),"easeInQuint"===t.easing&&(r=n*n*n*n*n),"easeOutQuint"===t.easing&&(r=1+--n*n*n*n*n),"easeInOutQuint"===t.easing&&(r=n<.5?16*n*n*n*n*n:1+16*--n*n*n*n*n),t.customEasing&&(r=t.customEasing(n)),r||n),A.scrollTo(0,Math.floor(d)),w(d,g)||(S=A.requestAnimationFrame(C),f=e)};0===A.pageYOffset&&A.scrollTo(0,0),p=a,h=u,l||history.pushState&&h.updateURL&&history.pushState({smoothScroll:JSON.stringify(h),anchor:p.id},document.title,p===document.documentElement?"#top":"#"+p.id),"matchMedia"in A&&A.matchMedia("(prefers-reduced-motion)").matches?A.scrollTo(0,Math.floor(g)):(L("scrollStart",u,a,s),k.cancelScroll(!0),A.requestAnimationFrame(C))}};function t(e){if(!e.defaultPrevented&&!(0!==e.button||e.metaKey||e.ctrlKey||e.shiftKey)&&"closest"in e.target&&(i=e.target.closest(r))&&"a"===i.tagName.toLowerCase()&&!e.target.closest(T.ignore)&&i.hostname===A.location.hostname&&i.pathname===A.location.pathname&&/#/.test(i.href)){var t,n;try{t=o(decodeURIComponent(i.hash))}catch(e){t=o(i.hash)}if("#"===t){if(!T.topOnEmptyHash)return;n=document.documentElement}else n=document.querySelector(t);(n=n||"#top"!==t?n:document.documentElement)&&(e.preventDefault(),function(e){if(history.replaceState&&e.updateURL&&!history.state){var t=A.location.hash;t=t||"",history.replaceState({smoothScroll:JSON.stringify(e),anchor:t||A.pageYOffset},document.title,t||A.location.href)}}(T),k.animateScroll(n,i))}}function n(e){if(null!==history.state&&history.state.smoothScroll&&history.state.smoothScroll===JSON.stringify(T)){var t=history.state.anchor;"string"==typeof t&&t&&!(t=document.querySelector(o(history.state.anchor)))||k.animateScroll(t,null,{updateURL:!1})}}k.destroy=function(){T&&(document.removeEventListener("click",t,!1),A.removeEventListener("popstate",n,!1),k.cancelScroll(),S=E=i=T=null)};return function(){if(!("querySelector"in document&&"addEventListener"in A&&"requestAnimationFrame"in A&&"closest"in A.Element.prototype))throw"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.";k.destroy(),T=N(D,e||{}),E=T.header?document.querySelector(T.header):null,document.addEventListener("click",t,!1),T.updateURL&&T.popstate&&A.addEventListener("popstate",n,!1)}(),k}}),function(e,t){"function"==typeof define&&define.amd?define([],function(){return t(e)}):"object"==typeof exports?module.exports=t(e):e.Gumshoe=t(e)}("undefined"!=typeof global?global:"undefined"!=typeof window?window:this,function(c){"use strict";function f(e,t,n){if(n.settings.events){var r=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:n});t.dispatchEvent(r)}}function n(e){var t=0;if(e.offsetParent)for(;e;)t+=e.offsetTop,e=e.offsetParent;return 0<=t?t:0}function d(e){e&&e.sort(function(e,t){return n(e.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)}function p(e,t){var n,r,i=e[e.length-1];if(n=i,r=t,s()&&a(n.content,r,!0))return i;for(var o=e.length-1;0<=o;o--)if(a(e[o].content,t))return e[o]}function h(e,t){if(e){var n=e.nav.closest("li");n&&(n.classList.remove(t.navClass),e.content.classList.remove(t.contentClass),r(n,t),f("gumshoeDeactivate",n,{link:e.nav,content:e.content,settings:t}))}}var m={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},r=function(e,t){if(t.nested){var n=e.parentNode.closest("li");n&&(n.classList.remove(t.nestedClass),r(n,t))}},g=function(e,t){if(t.nested){var n=e.parentNode.closest("li");n&&(n.classList.add(t.nestedClass),g(n,t))}};return function(e,t){var n,r,i,o,a,s={};s.setup=function(){n=document.querySelectorAll(e),r=[],Array.prototype.forEach.call(n,function(e){var t=document.getElementById(decodeURIComponent(e.hash.substr(1)));t&&r.push({nav:e,content:t})}),d(r)},s.detect=function(){var e=p(r,a);e?i&&e.content===i.content||(h(i,a),function(e,t){if(e){var n=e.nav.closest("li");n&&(n.classList.add(t.navClass),e.content.classList.add(t.contentClass),g(n,t),f("gumshoeActivate",n,{link:e.nav,content:e.content,settings:t}))}}(e,a),i=e):i&&(h(i,a),i=null)};function u(e){o&&c.cancelAnimationFrame(o),o=c.requestAnimationFrame(s.detect)}function l(e){o&&c.cancelAnimationFrame(o),o=c.requestAnimationFrame(function(){d(r),s.detect()})}s.destroy=function(){i&&h(i,a),c.removeEventListener("scroll",u,!1),a.reflow&&c.removeEventListener("resize",l,!1),a=o=i=n=r=null};return a=function(){var n={};return Array.prototype.forEach.call(arguments,function(e){for(var t in e){if(!e.hasOwnProperty(t))return;n[t]=e[t]}}),n}(m,t||{}),s.setup(),s.detect(),c.addEventListener("scroll",u,!1),a.reflow&&c.addEventListener("resize",l,!1),s}}),$(document).ready(function(){$("#main").fitVids();function e(){(0===$(".author__urls-wrapper button").length?1024<$(window).width():!$(".author__urls-wrapper button").is(":visible"))?$(".sidebar").addClass("sticky"):$(".sidebar").removeClass("sticky")}e(),$(window).resize(function(){e()}),$(".author__urls-wrapper button").on("click",function(){$(".author__urls").toggleClass("is--visible"),$(".author__urls-wrapper button").toggleClass("open")}),$(document).keyup(function(e){27===e.keyCode&&$(".initial-content").hasClass("is--hidden")&&($(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"))}),$(".search__toggle").on("click",function(){$(".search-content").toggleClass("is--visible"),$(".initial-content").toggleClass("is--hidden"),setTimeout(function(){$(".search-content input").focus()},400)});new SmoothScroll('a[href*="#"]',{offset:20,speed:400,speedAsDuration:!0,durationMax:500});if(0<$("nav.toc").length)new Gumshoe("nav.toc a",{navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:20,reflow:!0,events:!0});$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif']").addClass("image-popup"),$(".image-popup").magnificPopup({type:"image",tLoading:"Loading image #%curr%...",gallery:{enabled:!0,navigateByImgClick:!0,preload:[0,1]},image:{tError:'Image #%curr% could not be loaded.'},removalDelay:500,mainClass:"mfp-zoom-in",callbacks:{beforeOpen:function(){this.st.image.markup=this.st.image.markup.replace("mfp-figure","mfp-figure mfp-with-anim")}},closeOnContentClick:!0,midClick:!0}),$(".page__content").find("h1, h2, h3, h4, h5, h6").each(function(){var e=$(this).attr("id");if(e){var t=document.createElement("a");t.className="header-link",t.href="#"+e,t.innerHTML='Permalink',t.title="Permalink",$(this).append(t)}})}); \ No newline at end of file diff --git a/assets/js/plugins/gumshoe.js b/assets/js/plugins/gumshoe.js deleted file mode 100644 index 713b6eb..0000000 --- a/assets/js/plugins/gumshoe.js +++ /dev/null @@ -1,484 +0,0 @@ -/*! - * gumshoejs v5.1.1 - * A simple, framework-agnostic scrollspy script. - * (c) 2019 Chris Ferdinandi - * MIT License - * https://github.com/cferdinandi/gumshoe - */ - -(function (root, factory) { - if ( typeof define === 'function' && define.amd ) { - define([], (function () { - return factory(root); - })); - } else if ( typeof exports === 'object' ) { - module.exports = factory(root); - } else { - root.Gumshoe = factory(root); - } -})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, (function (window) { - - 'use strict'; - - // - // Defaults - // - - var defaults = { - - // Active classes - navClass: 'active', - contentClass: 'active', - - // Nested navigation - nested: false, - nestedClass: 'active', - - // Offset & reflow - offset: 0, - reflow: false, - - // Event support - events: true - - }; - - - // - // Methods - // - - /** - * Merge two or more objects together. - * @param {Object} objects The objects to merge together - * @returns {Object} Merged values of defaults and options - */ - var extend = function () { - var merged = {}; - Array.prototype.forEach.call(arguments, (function (obj) { - for (var key in obj) { - if (!obj.hasOwnProperty(key)) return; - merged[key] = obj[key]; - } - })); - return merged; - }; - - /** - * Emit a custom event - * @param {String} type The event type - * @param {Node} elem The element to attach the event to - * @param {Object} detail Any details to pass along with the event - */ - var emitEvent = function (type, elem, detail) { - - // Make sure events are enabled - if (!detail.settings.events) return; - - // Create a new event - var event = new CustomEvent(type, { - bubbles: true, - cancelable: true, - detail: detail - }); - - // Dispatch the event - elem.dispatchEvent(event); - - }; - - /** - * Get an element's distance from the top of the Document. - * @param {Node} elem The element - * @return {Number} Distance from the top in pixels - */ - var getOffsetTop = function (elem) { - var location = 0; - if (elem.offsetParent) { - while (elem) { - location += elem.offsetTop; - elem = elem.offsetParent; - } - } - return location >= 0 ? location : 0; - }; - - /** - * Sort content from first to last in the DOM - * @param {Array} contents The content areas - */ - var sortContents = function (contents) { - if(contents) { - contents.sort((function (item1, item2) { - var offset1 = getOffsetTop(item1.content); - var offset2 = getOffsetTop(item2.content); - if (offset1 < offset2) return -1; - return 1; - })); - } - }; - - /** - * Get the offset to use for calculating position - * @param {Object} settings The settings for this instantiation - * @return {Float} The number of pixels to offset the calculations - */ - var getOffset = function (settings) { - - // if the offset is a function run it - if (typeof settings.offset === 'function') { - return parseFloat(settings.offset()); - } - - // Otherwise, return it as-is - return parseFloat(settings.offset); - - }; - - /** - * Get the document element's height - * @private - * @returns {Number} - */ - var getDocumentHeight = function () { - return Math.max( - document.body.scrollHeight, document.documentElement.scrollHeight, - document.body.offsetHeight, document.documentElement.offsetHeight, - document.body.clientHeight, document.documentElement.clientHeight - ); - }; - - /** - * Determine if an element is in view - * @param {Node} elem The element - * @param {Object} settings The settings for this instantiation - * @param {Boolean} bottom If true, check if element is above bottom of viewport instead - * @return {Boolean} Returns true if element is in the viewport - */ - var isInView = function (elem, settings, bottom) { - var bounds = elem.getBoundingClientRect(); - var offset = getOffset(settings); - if (bottom) { - return parseInt(bounds.bottom, 10) < (window.innerHeight || document.documentElement.clientHeight); - } - return parseInt(bounds.top, 10) <= offset; - }; - - /** - * Check if at the bottom of the viewport - * @return {Boolean} If true, page is at the bottom of the viewport - */ - var isAtBottom = function () { - if (window.innerHeight + window.pageYOffset >= getDocumentHeight()) return true; - return false; - }; - - /** - * Check if the last item should be used (even if not at the top of the page) - * @param {Object} item The last item - * @param {Object} settings The settings for this instantiation - * @return {Boolean} If true, use the last item - */ - var useLastItem = function (item, settings) { - if (isAtBottom() && isInView(item.content, settings, true)) return true; - return false; - }; - - /** - * Get the active content - * @param {Array} contents The content areas - * @param {Object} settings The settings for this instantiation - * @return {Object} The content area and matching navigation link - */ - var getActive = function (contents, settings) { - var last = contents[contents.length-1]; - if (useLastItem(last, settings)) return last; - for (var i = contents.length - 1; i >= 0; i--) { - if (isInView(contents[i].content, settings)) return contents[i]; - } - }; - - /** - * Deactivate parent navs in a nested navigation - * @param {Node} nav The starting navigation element - * @param {Object} settings The settings for this instantiation - */ - var deactivateNested = function (nav, settings) { - - // If nesting isn't activated, bail - if (!settings.nested) return; - - // Get the parent navigation - var li = nav.parentNode.closest('li'); - if (!li) return; - - // Remove the active class - li.classList.remove(settings.nestedClass); - - // Apply recursively to any parent navigation elements - deactivateNested(li, settings); - - }; - - /** - * Deactivate a nav and content area - * @param {Object} items The nav item and content to deactivate - * @param {Object} settings The settings for this instantiation - */ - var deactivate = function (items, settings) { - - // Make sure their are items to deactivate - if (!items) return; - - // Get the parent list item - var li = items.nav.closest('li'); - if (!li) return; - - // Remove the active class from the nav and content - li.classList.remove(settings.navClass); - items.content.classList.remove(settings.contentClass); - - // Deactivate any parent navs in a nested navigation - deactivateNested(li, settings); - - // Emit a custom event - emitEvent('gumshoeDeactivate', li, { - link: items.nav, - content: items.content, - settings: settings - }); - - }; - - - /** - * Activate parent navs in a nested navigation - * @param {Node} nav The starting navigation element - * @param {Object} settings The settings for this instantiation - */ - var activateNested = function (nav, settings) { - - // If nesting isn't activated, bail - if (!settings.nested) return; - - // Get the parent navigation - var li = nav.parentNode.closest('li'); - if (!li) return; - - // Add the active class - li.classList.add(settings.nestedClass); - - // Apply recursively to any parent navigation elements - activateNested(li, settings); - - }; - - /** - * Activate a nav and content area - * @param {Object} items The nav item and content to activate - * @param {Object} settings The settings for this instantiation - */ - var activate = function (items, settings) { - - // Make sure their are items to activate - if (!items) return; - - // Get the parent list item - var li = items.nav.closest('li'); - if (!li) return; - - // Add the active class to the nav and content - li.classList.add(settings.navClass); - items.content.classList.add(settings.contentClass); - - // Activate any parent navs in a nested navigation - activateNested(li, settings); - - // Emit a custom event - emitEvent('gumshoeActivate', li, { - link: items.nav, - content: items.content, - settings: settings - }); - - }; - - /** - * Create the Constructor object - * @param {String} selector The selector to use for navigation items - * @param {Object} options User options and settings - */ - var Constructor = function (selector, options) { - - // - // Variables - // - - var publicAPIs = {}; - var navItems, contents, current, timeout, settings; - - - // - // Methods - // - - /** - * Set variables from DOM elements - */ - publicAPIs.setup = function () { - - // Get all nav items - navItems = document.querySelectorAll(selector); - - // Create contents array - contents = []; - - // Loop through each item, get it's matching content, and push to the array - Array.prototype.forEach.call(navItems, (function (item) { - - // Get the content for the nav item - var content = document.getElementById(decodeURIComponent(item.hash.substr(1))); - if (!content) return; - - // Push to the contents array - contents.push({ - nav: item, - content: content - }); - - })); - - // Sort contents by the order they appear in the DOM - sortContents(contents); - - }; - - /** - * Detect which content is currently active - */ - publicAPIs.detect = function () { - - // Get the active content - var active = getActive(contents, settings); - - // if there's no active content, deactivate and bail - if (!active) { - if (current) { - deactivate(current, settings); - current = null; - } - return; - } - - // If the active content is the one currently active, do nothing - if (current && active.content === current.content) return; - - // Deactivate the current content and activate the new content - deactivate(current, settings); - activate(active, settings); - - // Update the currently active content - current = active; - - }; - - /** - * Detect the active content on scroll - * Debounced for performance - */ - var scrollHandler = function (event) { - - // If there's a timer, cancel it - if (timeout) { - window.cancelAnimationFrame(timeout); - } - - // Setup debounce callback - timeout = window.requestAnimationFrame(publicAPIs.detect); - - }; - - /** - * Update content sorting on resize - * Debounced for performance - */ - var resizeHandler = function (event) { - - // If there's a timer, cancel it - if (timeout) { - window.cancelAnimationFrame(timeout); - } - - // Setup debounce callback - timeout = window.requestAnimationFrame((function () { - sortContents(contents); - publicAPIs.detect(); - })); - - }; - - /** - * Destroy the current instantiation - */ - publicAPIs.destroy = function () { - - // Undo DOM changes - if (current) { - deactivate(current, settings); - } - - // Remove event listeners - window.removeEventListener('scroll', scrollHandler, false); - if (settings.reflow) { - window.removeEventListener('resize', resizeHandler, false); - } - - // Reset variables - contents = null; - navItems = null; - current = null; - timeout = null; - settings = null; - - }; - - /** - * Initialize the current instantiation - */ - var init = function () { - - // Merge user options into defaults - settings = extend(defaults, options || {}); - - // Setup variables based on the current DOM - publicAPIs.setup(); - - // Find the currently active content - publicAPIs.detect(); - - // Setup event listeners - window.addEventListener('scroll', scrollHandler, false); - if (settings.reflow) { - window.addEventListener('resize', resizeHandler, false); - } - - }; - - - // - // Initialize and return the public APIs - // - - init(); - return publicAPIs; - - }; - - - // - // Return the Constructor - // - - return Constructor; - -})); \ No newline at end of file diff --git a/assets/js/plugins/jquery.ba-throttle-debounce.js b/assets/js/plugins/jquery.ba-throttle-debounce.js deleted file mode 100644 index fa30bdf..0000000 --- a/assets/js/plugins/jquery.ba-throttle-debounce.js +++ /dev/null @@ -1,252 +0,0 @@ -/*! - * jQuery throttle / debounce - v1.1 - 3/7/2010 - * http://benalman.com/projects/jquery-throttle-debounce-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ - -// Script: jQuery throttle / debounce: Sometimes, less is more! -// -// *Version: 1.1, Last updated: 3/7/2010* -// -// Project Home - http://benalman.com/projects/jquery-throttle-debounce-plugin/ -// GitHub - https://github.com/cowboy/jquery-throttle-debounce/ -// Source - https://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.js -// (Minified) - https://github.com/cowboy/jquery-throttle-debounce/raw/master/jquery.ba-throttle-debounce.min.js (0.7kb) -// -// About: License -// -// Copyright (c) 2010 "Cowboy" Ben Alman, -// Dual licensed under the MIT and GPL licenses. -// http://benalman.com/about/license/ -// -// About: Examples -// -// These working examples, complete with fully commented code, illustrate a few -// ways in which this plugin can be used. -// -// Throttle - http://benalman.com/code/projects/jquery-throttle-debounce/examples/throttle/ -// Debounce - http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/ -// -// About: Support and Testing -// -// Information about what version or versions of jQuery this plugin has been -// tested with, what browsers it has been tested in, and where the unit tests -// reside (so you can test it yourself). -// -// jQuery Versions - none, 1.3.2, 1.4.2 -// Browsers Tested - Internet Explorer 6-8, Firefox 2-3.6, Safari 3-4, Chrome 4-5, Opera 9.6-10.1. -// Unit Tests - http://benalman.com/code/projects/jquery-throttle-debounce/unit/ -// -// About: Release History -// -// 1.1 - (3/7/2010) Fixed a bug in where trailing callbacks -// executed later than they should. Reworked a fair amount of internal -// logic as well. -// 1.0 - (3/6/2010) Initial release as a stand-alone project. Migrated over -// from jquery-misc repo v0.4 to jquery-throttle repo v1.0, added the -// no_trailing throttle parameter and debounce functionality. -// -// Topic: Note for non-jQuery users -// -// jQuery isn't actually required for this plugin, because nothing internal -// uses any jQuery methods or properties. jQuery is just used as a namespace -// under which these methods can exist. -// -// Since jQuery isn't actually required for this plugin, if jQuery doesn't exist -// when this plugin is loaded, the method described below will be created in -// the `Cowboy` namespace. Usage will be exactly the same, but instead of -// $.method() or jQuery.method(), you'll need to use Cowboy.method(). - -(function(window,undefined){ - '$:nomunge'; // Used by YUI compressor. - - // Since jQuery really isn't required for this plugin, use `jQuery` as the - // namespace only if it already exists, otherwise use the `Cowboy` namespace, - // creating it if necessary. - var $ = window.jQuery || window.Cowboy || ( window.Cowboy = {} ), - - // Internal method reference. - jq_throttle; - - // Method: jQuery.throttle - // - // Throttle execution of a function. Especially useful for rate limiting - // execution of handlers on events like resize and scroll. If you want to - // rate-limit execution of a function to a single time, see the - // method. - // - // In this visualization, | is a throttled-function call and X is the actual - // callback execution: - // - // > Throttled with `no_trailing` specified as false or unspecified: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X X X X X X X X X X X - // > - // > Throttled with `no_trailing` specified as true: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X X X X X X X X X - // - // Usage: - // - // > var throttled = jQuery.throttle( delay, [ no_trailing, ] callback ); - // > - // > jQuery('selector').bind( 'someevent', throttled ); - // > jQuery('selector').unbind( 'someevent', throttled ); - // - // This also works in jQuery 1.4+: - // - // > jQuery('selector').bind( 'someevent', jQuery.throttle( delay, [ no_trailing, ] callback ) ); - // > jQuery('selector').unbind( 'someevent', callback ); - // - // Arguments: - // - // delay - (Number) A zero-or-greater delay in milliseconds. For event - // callbacks, values around 100 or 250 (or even higher) are most useful. - // no_trailing - (Boolean) Optional, defaults to false. If no_trailing is - // true, callback will only execute every `delay` milliseconds while the - // throttled-function is being called. If no_trailing is false or - // unspecified, callback will be executed one final time after the last - // throttled-function call. (After the throttled-function has not been - // called for `delay` milliseconds, the internal counter is reset) - // callback - (Function) A function to be executed after delay milliseconds. - // The `this` context and all arguments are passed through, as-is, to - // `callback` when the throttled-function is executed. - // - // Returns: - // - // (Function) A new, throttled, function. - - $.throttle = jq_throttle = function( delay, no_trailing, callback, debounce_mode ) { - // After wrapper has stopped being called, this timeout ensures that - // `callback` is executed at the proper times in `throttle` and `end` - // debounce modes. - var timeout_id, - - // Keep track of the last time `callback` was executed. - last_exec = 0; - - // `no_trailing` defaults to falsy. - if ( typeof no_trailing !== 'boolean' ) { - debounce_mode = callback; - callback = no_trailing; - no_trailing = undefined; - } - - // The `wrapper` function encapsulates all of the throttling / debouncing - // functionality and when executed will limit the rate at which `callback` - // is executed. - function wrapper() { - var that = this, - elapsed = +new Date() - last_exec, - args = arguments; - - // Execute `callback` and update the `last_exec` timestamp. - function exec() { - last_exec = +new Date(); - callback.apply( that, args ); - }; - - // If `debounce_mode` is true (at_begin) this is used to clear the flag - // to allow future `callback` executions. - function clear() { - timeout_id = undefined; - }; - - if ( debounce_mode && !timeout_id ) { - // Since `wrapper` is being called for the first time and - // `debounce_mode` is true (at_begin), execute `callback`. - exec(); - } - - // Clear any existing timeout. - timeout_id && clearTimeout( timeout_id ); - - if ( debounce_mode === undefined && elapsed > delay ) { - // In throttle mode, if `delay` time has been exceeded, execute - // `callback`. - exec(); - - } else if ( no_trailing !== true ) { - // In trailing throttle mode, since `delay` time has not been - // exceeded, schedule `callback` to execute `delay` ms after most - // recent execution. - // - // If `debounce_mode` is true (at_begin), schedule `clear` to execute - // after `delay` ms. - // - // If `debounce_mode` is false (at end), schedule `callback` to - // execute after `delay` ms. - timeout_id = setTimeout( debounce_mode ? clear : exec, debounce_mode === undefined ? delay - elapsed : delay ); - } - }; - - // Set the guid of `wrapper` function to the same of original callback, so - // it can be removed in jQuery 1.4+ .unbind or .die by using the original - // callback as a reference. - if ( $.guid ) { - wrapper.guid = callback.guid = callback.guid || $.guid++; - } - - // Return the wrapper function. - return wrapper; - }; - - // Method: jQuery.debounce - // - // Debounce execution of a function. Debouncing, unlike throttling, - // guarantees that a function is only executed a single time, either at the - // very beginning of a series of calls, or at the very end. If you want to - // simply rate-limit execution of a function, see the - // method. - // - // In this visualization, | is a debounced-function call and X is the actual - // callback execution: - // - // > Debounced with `at_begin` specified as false or unspecified: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X - // > - // > Debounced with `at_begin` specified as true: - // > ||||||||||||||||||||||||| (pause) ||||||||||||||||||||||||| - // > X X - // - // Usage: - // - // > var debounced = jQuery.debounce( delay, [ at_begin, ] callback ); - // > - // > jQuery('selector').bind( 'someevent', debounced ); - // > jQuery('selector').unbind( 'someevent', debounced ); - // - // This also works in jQuery 1.4+: - // - // > jQuery('selector').bind( 'someevent', jQuery.debounce( delay, [ at_begin, ] callback ) ); - // > jQuery('selector').unbind( 'someevent', callback ); - // - // Arguments: - // - // delay - (Number) A zero-or-greater delay in milliseconds. For event - // callbacks, values around 100 or 250 (or even higher) are most useful. - // at_begin - (Boolean) Optional, defaults to false. If at_begin is false or - // unspecified, callback will only be executed `delay` milliseconds after - // the last debounced-function call. If at_begin is true, callback will be - // executed only at the first debounced-function call. (After the - // throttled-function has not been called for `delay` milliseconds, the - // internal counter is reset) - // callback - (Function) A function to be executed after delay milliseconds. - // The `this` context and all arguments are passed through, as-is, to - // `callback` when the debounced-function is executed. - // - // Returns: - // - // (Function) A new, debounced, function. - - $.debounce = function( delay, at_begin, callback ) { - return callback === undefined - ? jq_throttle( delay, at_begin, false ) - : jq_throttle( delay, callback, at_begin !== false ); - }; - -})(this); diff --git a/assets/js/plugins/jquery.fitvids.js b/assets/js/plugins/jquery.fitvids.js deleted file mode 100644 index 5c2f85c..0000000 --- a/assets/js/plugins/jquery.fitvids.js +++ /dev/null @@ -1,82 +0,0 @@ -/*jshint browser:true */ -/*! -* FitVids 1.1 -* -* Copyright 2013, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com -* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/ -* Released under the WTFPL license - http://sam.zoy.org/wtfpl/ -* -*/ - -;(function( $ ){ - - 'use strict'; - - $.fn.fitVids = function( options ) { - var settings = { - customSelector: null, - ignore: null - }; - - if(!document.getElementById('fit-vids-style')) { - // appendStyles: https://github.com/toddmotto/fluidvids/blob/master/dist/fluidvids.js - var head = document.head || document.getElementsByTagName('head')[0]; - 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%;}'; - var div = document.createElement("div"); - div.innerHTML = '

x

'; - head.appendChild(div.childNodes[1]); - } - - if ( options ) { - $.extend( settings, options ); - } - - return this.each(function(){ - var selectors = [ - 'iframe[src*="player.vimeo.com"]', - 'iframe[src*="youtube.com"]', - 'iframe[src*="youtube-nocookie.com"]', - 'iframe[src*="kickstarter.com"][src*="video.html"]', - 'object', - 'embed' - ]; - - if (settings.customSelector) { - selectors.push(settings.customSelector); - } - - var ignoreList = '.fitvidsignore'; - - if(settings.ignore) { - ignoreList = ignoreList + ', ' + settings.ignore; - } - - var $allVideos = $(this).find(selectors.join(',')); - $allVideos = $allVideos.not('object object'); // SwfObj conflict patch - $allVideos = $allVideos.not(ignoreList); // Disable FitVids on this video. - - $allVideos.each(function(count){ - var $this = $(this); - if($this.parents(ignoreList).length > 0) { - return; // Disable FitVids on this video. - } - if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; } - if ((!$this.css('height') && !$this.css('width')) && (isNaN($this.attr('height')) || isNaN($this.attr('width')))) - { - $this.attr('height', 9); - $this.attr('width', 16); - } - var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(), - width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(), - aspectRatio = height / width; - if(!$this.attr('id')){ - var videoID = 'fitvid' + count; - $this.attr('id', videoID); - } - $this.wrap('
').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+'%'); - $this.removeAttr('height').removeAttr('width'); - }); - }); - }; -// Works with either jQuery or Zepto -})( window.jQuery || window.Zepto ); \ No newline at end of file diff --git a/assets/js/plugins/jquery.greedy-navigation.js b/assets/js/plugins/jquery.greedy-navigation.js deleted file mode 100644 index 5a93a41..0000000 --- a/assets/js/plugins/jquery.greedy-navigation.js +++ /dev/null @@ -1,126 +0,0 @@ -/* -GreedyNav.js - http://lukejacksonn.com/actuate -Licensed under the MIT license - http://opensource.org/licenses/MIT -Copyright (c) 2015 Luke Jackson -*/ - -$(function() { - - var $btn = $("nav.greedy-nav .greedy-nav__toggle"); - var $vlinks = $("nav.greedy-nav .visible-links"); - var $hlinks = $("nav.greedy-nav .hidden-links"); - var $nav = $("nav.greedy-nav"); - var $logo = $('nav.greedy-nav .site-logo'); - var $logoImg = $('nav.greedy-nav .site-logo img'); - var $title = $("nav.greedy-nav .site-title"); - var $search = $('nav.greedy-nav button.search__toggle'); - - var numOfItems, totalSpace, closingTime, breakWidths; - - // This function measures both hidden and visible links and sets the navbar breakpoints - // This is called the first time the script runs and everytime the "check()" function detects a change of window width that reached a different CSS width breakpoint, which affects the size of navbar Items - // Please note that "CSS width breakpoints" (which are only 4) !== "navbar breakpoints" (which are as many as the number of items on the navbar) - function measureLinks(){ - numOfItems = 0; - totalSpace = 0; - closingTime = 1000; - breakWidths = []; - - // Adds the width of a navItem in order to create breakpoints for the navbar - function addWidth(i, w) { - totalSpace += w; - numOfItems += 1; - breakWidths.push(totalSpace); - } - - // Measures the width of hidden links by making a temporary clone of them and positioning under visible links - function hiddenWidth(obj){ - var clone = obj.clone(); - clone.css("visibility","hidden"); - $vlinks.append(clone); - addWidth(0, clone.outerWidth()); - clone.remove(); - } - // Measure both visible and hidden links widths - $vlinks.children().outerWidth(addWidth); - $hlinks.children().each(function(){hiddenWidth($(this))}); - } - // Get initial state - measureLinks(); - - var winWidth = $( window ).width(); - // Set the last measured CSS width breakpoint: 0: <768px, 1: <1024px, 2: < 1280px, 3: >= 1280px. - var lastBreakpoint = winWidth < 768 ? 0 : winWidth < 1024 ? 1 : winWidth < 1280 ? 2 : 3; - - var availableSpace, numOfVisibleItems, requiredSpace, timer; - - function check() { - - winWidth = $( window ).width(); - // Set the current CSS width breakpoint: 0: <768px, 1: <1024px, 2: < 1280px, 3: >= 1280px. - var curBreakpoint = winWidth < 768 ? 0 : winWidth < 1024 ? 1 : winWidth < 1280 ? 2 : 3; - // If current breakpoint is different from last measured breakpoint, measureLinks again - if(curBreakpoint !== lastBreakpoint) measureLinks(); - // Set the last measured CSS width breakpoint with the current breakpoint - lastBreakpoint = curBreakpoint; - - // Get instant state - numOfVisibleItems = $vlinks.children().length; - // Decrease the width of visible elements from the nav innerWidth to find out the available space for navItems - availableSpace = /* nav */ $nav.innerWidth() - - /* logo */ ($logo.length !== 0 ? $logo.outerWidth(true) : 0) - - /* title */ $title.outerWidth(true) - - /* search */ ($search.length !== 0 ? $search.outerWidth(true) : 0) - - /* toggle */ (numOfVisibleItems !== breakWidths.length ? $btn.outerWidth(true) : 0); - requiredSpace = breakWidths[numOfVisibleItems - 1]; - - // There is not enought space - if (requiredSpace > availableSpace) { - $vlinks.children().last().prependTo($hlinks); - numOfVisibleItems -= 1; - check(); - // There is more than enough space. If only one element is hidden, add the toggle width to the available space - } else if (availableSpace + (numOfVisibleItems === breakWidths.length - 1?$btn.outerWidth(true):0) > breakWidths[numOfVisibleItems]) { - $hlinks.children().first().appendTo($vlinks); - numOfVisibleItems += 1; - check(); - } - // Update the button accordingly - $btn.attr("count", numOfItems - numOfVisibleItems); - if (numOfVisibleItems === numOfItems) { - $btn.addClass('hidden'); - } else $btn.removeClass('hidden'); - } - - // Window listeners - $(window).resize(function() { - check(); - }); - - $btn.on('click', function() { - $hlinks.toggleClass('hidden'); - clearTimeout(timer); - }); - - $hlinks.on('mouseleave', function() { - // Mouse has left, start the timer - timer = setTimeout(function() { - $hlinks.addClass('hidden'); - }, closingTime); - }).on('mouseenter', function() { - // Mouse is back, cancel the timer - clearTimeout(timer); - }) - - // check if page has a logo - if($logoImg.length !== 0){ - // check if logo is not loaded - if(!($logoImg[0].complete || $logoImg[0].naturalWidth !== 0)){ - // if logo is not loaded wait for logo to load or fail to check - $logoImg.one("load error", check); - // if logo is already loaded just check - } else check(); - // if page does not have a logo just check - } else check(); - -}); diff --git a/assets/js/plugins/jquery.magnific-popup.js b/assets/js/plugins/jquery.magnific-popup.js deleted file mode 100644 index 7d1d197..0000000 --- a/assets/js/plugins/jquery.magnific-popup.js +++ /dev/null @@ -1,1860 +0,0 @@ -/*! Magnific Popup - v1.1.0 - 2016-02-20 -* http://dimsemenov.com/plugins/magnific-popup/ -* Copyright (c) 2016 Dmitry Semenov; */ -;(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS - factory(require('jquery')); - } else { - // Browser globals - factory(window.jQuery || window.Zepto); - } - }(function($) { - - /*>>core*/ - /** - * - * Magnific Popup Core JS file - * - */ - - - /** - * Private static constants - */ - var CLOSE_EVENT = 'Close', - BEFORE_CLOSE_EVENT = 'BeforeClose', - AFTER_CLOSE_EVENT = 'AfterClose', - BEFORE_APPEND_EVENT = 'BeforeAppend', - MARKUP_PARSE_EVENT = 'MarkupParse', - OPEN_EVENT = 'Open', - CHANGE_EVENT = 'Change', - NS = 'mfp', - EVENT_NS = '.' + NS, - READY_CLASS = 'mfp-ready', - REMOVING_CLASS = 'mfp-removing', - PREVENT_CLOSE_CLASS = 'mfp-prevent-close'; - - - /** - * Private vars - */ - /*jshint -W079 */ - var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this' - MagnificPopup = function(){}, - _isJQ = !!(window.jQuery), - _prevStatus, - _window = $(window), - _document, - _prevContentType, - _wrapClasses, - _currPopupType; - - - /** - * Private functions - */ - var _mfpOn = function(name, f) { - mfp.ev.on(NS + name + EVENT_NS, f); - }, - _getEl = function(className, appendTo, html, raw) { - var el = document.createElement('div'); - el.className = 'mfp-'+className; - if(html) { - el.innerHTML = html; - } - if(!raw) { - el = $(el); - if(appendTo) { - el.appendTo(appendTo); - } - } else if(appendTo) { - appendTo.appendChild(el); - } - return el; - }, - _mfpTrigger = function(e, data) { - mfp.ev.triggerHandler(NS + e, data); - - if(mfp.st.callbacks) { - // converts "mfpEventName" to "eventName" callback and triggers it if it's present - e = e.charAt(0).toLowerCase() + e.slice(1); - if(mfp.st.callbacks[e]) { - mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]); - } - } - }, - _getCloseBtn = function(type) { - if(type !== _currPopupType || !mfp.currTemplate.closeBtn) { - mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) ); - _currPopupType = type; - } - return mfp.currTemplate.closeBtn; - }, - // Initialize Magnific Popup only when called at least once - _checkInstance = function() { - if(!$.magnificPopup.instance) { - /*jshint -W020 */ - mfp = new MagnificPopup(); - mfp.init(); - $.magnificPopup.instance = mfp; - } - }, - // CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr - supportsTransitions = function() { - var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist - v = ['ms','O','Moz','Webkit']; // 'v' for vendor - - if( s['transition'] !== undefined ) { - return true; - } - - while( v.length ) { - if( v.pop() + 'Transition' in s ) { - return true; - } - } - - return false; - }; - - - - /** - * Public functions - */ - MagnificPopup.prototype = { - - constructor: MagnificPopup, - - /** - * Initializes Magnific Popup plugin. - * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed - */ - init: function() { - var appVersion = navigator.appVersion; - mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener; - mfp.isAndroid = (/android/gi).test(appVersion); - mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion); - mfp.supportsTransition = supportsTransitions(); - - // We disable fixed positioned lightbox on devices that don't handle it nicely. - // If you know a better way of detecting this - let me know. - mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) ); - _document = $(document); - - mfp.popupsCache = {}; - }, - - /** - * Opens popup - * @param data [description] - */ - open: function(data) { - - var i; - - if(data.isObj === false) { - // convert jQuery collection to array to avoid conflicts later - mfp.items = data.items.toArray(); - - mfp.index = 0; - var items = data.items, - item; - for(i = 0; i < items.length; i++) { - item = items[i]; - if(item.parsed) { - item = item.el[0]; - } - if(item === data.el[0]) { - mfp.index = i; - break; - } - } - } else { - mfp.items = $.isArray(data.items) ? data.items : [data.items]; - mfp.index = data.index || 0; - } - - // if popup is already opened - we just update the content - if(mfp.isOpen) { - mfp.updateItemHTML(); - return; - } - - mfp.types = []; - _wrapClasses = ''; - if(data.mainEl && data.mainEl.length) { - mfp.ev = data.mainEl.eq(0); - } else { - mfp.ev = _document; - } - - if(data.key) { - if(!mfp.popupsCache[data.key]) { - mfp.popupsCache[data.key] = {}; - } - mfp.currTemplate = mfp.popupsCache[data.key]; - } else { - mfp.currTemplate = {}; - } - - - - mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); - mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos; - - if(mfp.st.modal) { - mfp.st.closeOnContentClick = false; - mfp.st.closeOnBgClick = false; - mfp.st.showCloseBtn = false; - mfp.st.enableEscapeKey = false; - } - - - // Building markup - // main containers are created only once - if(!mfp.bgOverlay) { - - // Dark overlay - mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() { - mfp.close(); - }); - - mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) { - if(mfp._checkIfClose(e.target)) { - mfp.close(); - } - }); - - mfp.container = _getEl('container', mfp.wrap); - } - - mfp.contentContainer = _getEl('content'); - if(mfp.st.preloader) { - mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading); - } - - - // Initializing modules - var modules = $.magnificPopup.modules; - for(i = 0; i < modules.length; i++) { - var n = modules[i]; - n = n.charAt(0).toUpperCase() + n.slice(1); - mfp['init'+n].call(mfp); - } - _mfpTrigger('BeforeOpen'); - - - if(mfp.st.showCloseBtn) { - // Close button - if(!mfp.st.closeBtnInside) { - mfp.wrap.append( _getCloseBtn() ); - } else { - _mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) { - values.close_replaceWith = _getCloseBtn(item.type); - }); - _wrapClasses += ' mfp-close-btn-in'; - } - } - - if(mfp.st.alignTop) { - _wrapClasses += ' mfp-align-top'; - } - - - - if(mfp.fixedContentPos) { - mfp.wrap.css({ - overflow: mfp.st.overflowY, - overflowX: 'hidden', - overflowY: mfp.st.overflowY - }); - } else { - mfp.wrap.css({ - top: _window.scrollTop(), - position: 'absolute' - }); - } - if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) { - mfp.bgOverlay.css({ - height: _document.height(), - position: 'absolute' - }); - } - - - - if(mfp.st.enableEscapeKey) { - // Close on ESC key - _document.on('keyup' + EVENT_NS, function(e) { - if(e.keyCode === 27) { - mfp.close(); - } - }); - } - - _window.on('resize' + EVENT_NS, function() { - mfp.updateSize(); - }); - - - if(!mfp.st.closeOnContentClick) { - _wrapClasses += ' mfp-auto-cursor'; - } - - if(_wrapClasses) - mfp.wrap.addClass(_wrapClasses); - - - // this triggers recalculation of layout, so we get it once to not to trigger twice - var windowHeight = mfp.wH = _window.height(); - - - var windowStyles = {}; - - if( mfp.fixedContentPos ) { - if(mfp._hasScrollBar(windowHeight)){ - var s = mfp._getScrollbarSize(); - if(s) { - windowStyles.marginRight = s; - } - } - } - - if(mfp.fixedContentPos) { - if(!mfp.isIE7) { - windowStyles.overflow = 'hidden'; - } else { - // ie7 double-scroll bug - $('body, html').css('overflow', 'hidden'); - } - } - - - - var classesToadd = mfp.st.mainClass; - if(mfp.isIE7) { - classesToadd += ' mfp-ie7'; - } - if(classesToadd) { - mfp._addClassToMFP( classesToadd ); - } - - // add content - mfp.updateItemHTML(); - - _mfpTrigger('BuildControls'); - - // remove scrollbar, add margin e.t.c - $('html').css(windowStyles); - - // add everything to DOM - mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) ); - - // Save last focused element - mfp._lastFocusedEl = document.activeElement; - - // Wait for next cycle to allow CSS transition - setTimeout(function() { - - if(mfp.content) { - mfp._addClassToMFP(READY_CLASS); - mfp._setFocus(); - } else { - // if content is not defined (not loaded e.t.c) we add class only for BG - mfp.bgOverlay.addClass(READY_CLASS); - } - - // Trap the focus in popup - _document.on('focusin' + EVENT_NS, mfp._onFocusIn); - - }, 16); - - mfp.isOpen = true; - mfp.updateSize(windowHeight); - _mfpTrigger(OPEN_EVENT); - - return data; - }, - - /** - * Closes the popup - */ - close: function() { - if(!mfp.isOpen) return; - _mfpTrigger(BEFORE_CLOSE_EVENT); - - mfp.isOpen = false; - // for CSS3 animation - if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition ) { - mfp._addClassToMFP(REMOVING_CLASS); - setTimeout(function() { - mfp._close(); - }, mfp.st.removalDelay); - } else { - mfp._close(); - } - }, - - /** - * Helper for close() function - */ - _close: function() { - _mfpTrigger(CLOSE_EVENT); - - var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' '; - - mfp.bgOverlay.detach(); - mfp.wrap.detach(); - mfp.container.empty(); - - if(mfp.st.mainClass) { - classesToRemove += mfp.st.mainClass + ' '; - } - - mfp._removeClassFromMFP(classesToRemove); - - if(mfp.fixedContentPos) { - var windowStyles = {marginRight: ''}; - if(mfp.isIE7) { - $('body, html').css('overflow', ''); - } else { - windowStyles.overflow = ''; - } - $('html').css(windowStyles); - } - - _document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS); - mfp.ev.off(EVENT_NS); - - // clean up DOM elements that aren't removed - mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style'); - mfp.bgOverlay.attr('class', 'mfp-bg'); - mfp.container.attr('class', 'mfp-container'); - - // remove close button from target element - if(mfp.st.showCloseBtn && - (!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) { - if(mfp.currTemplate.closeBtn) - mfp.currTemplate.closeBtn.detach(); - } - - - if(mfp.st.autoFocusLast && mfp._lastFocusedEl) { - $(mfp._lastFocusedEl).focus(); // put tab focus back - } - mfp.currItem = null; - mfp.content = null; - mfp.currTemplate = null; - mfp.prevHeight = 0; - - _mfpTrigger(AFTER_CLOSE_EVENT); - }, - - updateSize: function(winHeight) { - - if(mfp.isIOS) { - // fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2 - var zoomLevel = document.documentElement.clientWidth / window.innerWidth; - var height = window.innerHeight * zoomLevel; - mfp.wrap.css('height', height); - mfp.wH = height; - } else { - mfp.wH = winHeight || _window.height(); - } - // Fixes #84: popup incorrectly positioned with position:relative on body - if(!mfp.fixedContentPos) { - mfp.wrap.css('height', mfp.wH); - } - - _mfpTrigger('Resize'); - - }, - - /** - * Set content of popup based on current index - */ - updateItemHTML: function() { - var item = mfp.items[mfp.index]; - - // Detach and perform modifications - mfp.contentContainer.detach(); - - if(mfp.content) - mfp.content.detach(); - - if(!item.parsed) { - item = mfp.parseEl( mfp.index ); - } - - var type = item.type; - - _mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]); - // BeforeChange event works like so: - // _mfpOn('BeforeChange', function(e, prevType, newType) { }); - - mfp.currItem = item; - - if(!mfp.currTemplate[type]) { - var markup = mfp.st[type] ? mfp.st[type].markup : false; - - // allows to modify markup - _mfpTrigger('FirstMarkupParse', markup); - - if(markup) { - mfp.currTemplate[type] = $(markup); - } else { - // if there is no markup found we just define that template is parsed - mfp.currTemplate[type] = true; - } - } - - if(_prevContentType && _prevContentType !== item.type) { - mfp.container.removeClass('mfp-'+_prevContentType+'-holder'); - } - - var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]); - mfp.appendContent(newContent, type); - - item.preloaded = true; - - _mfpTrigger(CHANGE_EVENT, item); - _prevContentType = item.type; - - // Append container back after its content changed - mfp.container.prepend(mfp.contentContainer); - - _mfpTrigger('AfterChange'); - }, - - - /** - * Set HTML content of popup - */ - appendContent: function(newContent, type) { - mfp.content = newContent; - - if(newContent) { - if(mfp.st.showCloseBtn && mfp.st.closeBtnInside && - mfp.currTemplate[type] === true) { - // if there is no markup, we just append close button element inside - if(!mfp.content.find('.mfp-close').length) { - mfp.content.append(_getCloseBtn()); - } - } else { - mfp.content = newContent; - } - } else { - mfp.content = ''; - } - - _mfpTrigger(BEFORE_APPEND_EVENT); - mfp.container.addClass('mfp-'+type+'-holder'); - - mfp.contentContainer.append(mfp.content); - }, - - - /** - * Creates Magnific Popup data object based on given data - * @param {int} index Index of item to parse - */ - parseEl: function(index) { - var item = mfp.items[index], - type; - - if(item.tagName) { - item = { el: $(item) }; - } else { - type = item.type; - item = { data: item, src: item.src }; - } - - if(item.el) { - var types = mfp.types; - - // check for 'mfp-TYPE' class - for(var i = 0; i < types.length; i++) { - if( item.el.hasClass('mfp-'+types[i]) ) { - type = types[i]; - break; - } - } - - item.src = item.el.attr('data-mfp-src'); - if(!item.src) { - item.src = item.el.attr('href'); - } - } - - item.type = type || mfp.st.type || 'inline'; - item.index = index; - item.parsed = true; - mfp.items[index] = item; - _mfpTrigger('ElementParse', item); - - return mfp.items[index]; - }, - - - /** - * Initializes single popup or a group of popups - */ - addGroup: function(el, options) { - var eHandler = function(e) { - e.mfpEl = this; - mfp._openClick(e, el, options); - }; - - if(!options) { - options = {}; - } - - var eName = 'click.magnificPopup'; - options.mainEl = el; - - if(options.items) { - options.isObj = true; - el.off(eName).on(eName, eHandler); - } else { - options.isObj = false; - if(options.delegate) { - el.off(eName).on(eName, options.delegate , eHandler); - } else { - options.items = el; - el.off(eName).on(eName, eHandler); - } - } - }, - _openClick: function(e, el, options) { - var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick; - - - if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey ) ) { - return; - } - - var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn; - - if(disableOn) { - if($.isFunction(disableOn)) { - if( !disableOn.call(mfp) ) { - return true; - } - } else { // else it's number - if( _window.width() < disableOn ) { - return true; - } - } - } - - if(e.type) { - e.preventDefault(); - - // This will prevent popup from closing if element is inside and popup is already opened - if(mfp.isOpen) { - e.stopPropagation(); - } - } - - options.el = $(e.mfpEl); - if(options.delegate) { - options.items = el.find(options.delegate); - } - mfp.open(options); - }, - - - /** - * Updates text on preloader - */ - updateStatus: function(status, text) { - - if(mfp.preloader) { - if(_prevStatus !== status) { - mfp.container.removeClass('mfp-s-'+_prevStatus); - } - - if(!text && status === 'loading') { - text = mfp.st.tLoading; - } - - var data = { - status: status, - text: text - }; - // allows to modify status - _mfpTrigger('UpdateStatus', data); - - status = data.status; - text = data.text; - - mfp.preloader.html(text); - - mfp.preloader.find('a').on('click', function(e) { - e.stopImmediatePropagation(); - }); - - mfp.container.addClass('mfp-s-'+status); - _prevStatus = status; - } - }, - - - /* - "Private" helpers that aren't private at all - */ - // Check to close popup or not - // "target" is an element that was clicked - _checkIfClose: function(target) { - - if($(target).hasClass(PREVENT_CLOSE_CLASS)) { - return; - } - - var closeOnContent = mfp.st.closeOnContentClick; - var closeOnBg = mfp.st.closeOnBgClick; - - if(closeOnContent && closeOnBg) { - return true; - } else { - - // We close the popup if click is on close button or on preloader. Or if there is no content. - if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) { - return true; - } - - // if click is outside the content - if( (target !== mfp.content[0] && !$.contains(mfp.content[0], target)) ) { - if(closeOnBg) { - // last check, if the clicked element is in DOM, (in case it's removed onclick) - if( $.contains(document, target) ) { - return true; - } - } - } else if(closeOnContent) { - return true; - } - - } - return false; - }, - _addClassToMFP: function(cName) { - mfp.bgOverlay.addClass(cName); - mfp.wrap.addClass(cName); - }, - _removeClassFromMFP: function(cName) { - this.bgOverlay.removeClass(cName); - mfp.wrap.removeClass(cName); - }, - _hasScrollBar: function(winHeight) { - return ( (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) ); - }, - _setFocus: function() { - (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus(); - }, - _onFocusIn: function(e) { - if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) { - mfp._setFocus(); - return false; - } - }, - _parseMarkup: function(template, values, item) { - var arr; - if(item.data) { - values = $.extend(item.data, values); - } - _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] ); - - $.each(values, function(key, value) { - if(value === undefined || value === false) { - return true; - } - arr = key.split('_'); - if(arr.length > 1) { - var el = template.find(EVENT_NS + '-'+arr[0]); - - if(el.length > 0) { - var attr = arr[1]; - if(attr === 'replaceWith') { - if(el[0] !== value[0]) { - el.replaceWith(value); - } - } else if(attr === 'img') { - if(el.is('img')) { - el.attr('src', value); - } else { - el.replaceWith( $('').attr('src', value).attr('class', el.attr('class')) ); - } - } else { - el.attr(arr[1], value); - } - } - - } else { - template.find(EVENT_NS + '-'+key).html(value); - } - }); - }, - - _getScrollbarSize: function() { - // thx David - if(mfp.scrollbarSize === undefined) { - var scrollDiv = document.createElement("div"); - scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;'; - document.body.appendChild(scrollDiv); - mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth; - document.body.removeChild(scrollDiv); - } - return mfp.scrollbarSize; - } - - }; /* MagnificPopup core prototype end */ - - - - - /** - * Public static functions - */ - $.magnificPopup = { - instance: null, - proto: MagnificPopup.prototype, - modules: [], - - open: function(options, index) { - _checkInstance(); - - if(!options) { - options = {}; - } else { - options = $.extend(true, {}, options); - } - - options.isObj = true; - options.index = index || 0; - return this.instance.open(options); - }, - - close: function() { - return $.magnificPopup.instance && $.magnificPopup.instance.close(); - }, - - registerModule: function(name, module) { - if(module.options) { - $.magnificPopup.defaults[name] = module.options; - } - $.extend(this.proto, module.proto); - this.modules.push(name); - }, - - defaults: { - - // Info about options is in docs: - // http://dimsemenov.com/plugins/magnific-popup/documentation.html#options - - disableOn: 0, - - key: null, - - midClick: false, - - mainClass: '', - - preloader: true, - - focus: '', // CSS selector of input to focus after popup is opened - - closeOnContentClick: false, - - closeOnBgClick: true, - - closeBtnInside: true, - - showCloseBtn: true, - - enableEscapeKey: true, - - modal: false, - - alignTop: false, - - removalDelay: 0, - - prependTo: null, - - fixedContentPos: 'auto', - - fixedBgPos: 'auto', - - overflowY: 'auto', - - closeMarkup: '', - - tClose: 'Close (Esc)', - - tLoading: 'Loading...', - - autoFocusLast: true - - } - }; - - - - $.fn.magnificPopup = function(options) { - _checkInstance(); - - var jqEl = $(this); - - // We call some API method of first param is a string - if (typeof options === "string" ) { - - if(options === 'open') { - var items, - itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup, - index = parseInt(arguments[1], 10) || 0; - - if(itemOpts.items) { - items = itemOpts.items[index]; - } else { - items = jqEl; - if(itemOpts.delegate) { - items = items.find(itemOpts.delegate); - } - items = items.eq( index ); - } - mfp._openClick({mfpEl:items}, jqEl, itemOpts); - } else { - if(mfp.isOpen) - mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1)); - } - - } else { - // clone options obj - options = $.extend(true, {}, options); - - /* - * As Zepto doesn't support .data() method for objects - * and it works only in normal browsers - * we assign "options" object directly to the DOM element. FTW! - */ - if(_isJQ) { - jqEl.data('magnificPopup', options); - } else { - jqEl[0].magnificPopup = options; - } - - mfp.addGroup(jqEl, options); - - } - return jqEl; - }; - - /*>>core*/ - - /*>>inline*/ - - var INLINE_NS = 'inline', - _hiddenClass, - _inlinePlaceholder, - _lastInlineElement, - _putInlineElementsBack = function() { - if(_lastInlineElement) { - _inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach(); - _lastInlineElement = null; - } - }; - - $.magnificPopup.registerModule(INLINE_NS, { - options: { - hiddenClass: 'hide', // will be appended with `mfp-` prefix - markup: '', - tNotFound: 'Content not found' - }, - proto: { - - initInline: function() { - mfp.types.push(INLINE_NS); - - _mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() { - _putInlineElementsBack(); - }); - }, - - getInline: function(item, template) { - - _putInlineElementsBack(); - - if(item.src) { - var inlineSt = mfp.st.inline, - el = $(item.src); - - if(el.length) { - - // If target element has parent - we replace it with placeholder and put it back after popup is closed - var parent = el[0].parentNode; - if(parent && parent.tagName) { - if(!_inlinePlaceholder) { - _hiddenClass = inlineSt.hiddenClass; - _inlinePlaceholder = _getEl(_hiddenClass); - _hiddenClass = 'mfp-'+_hiddenClass; - } - // replace target inline element with placeholder - _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass); - } - - mfp.updateStatus('ready'); - } else { - mfp.updateStatus('error', inlineSt.tNotFound); - el = $('
'); - } - - item.inlineElement = el; - return el; - } - - mfp.updateStatus('ready'); - mfp._parseMarkup(template, {}, item); - return template; - } - } - }); - - /*>>inline*/ - - /*>>ajax*/ - var AJAX_NS = 'ajax', - _ajaxCur, - _removeAjaxCursor = function() { - if(_ajaxCur) { - $(document.body).removeClass(_ajaxCur); - } - }, - _destroyAjaxRequest = function() { - _removeAjaxCursor(); - if(mfp.req) { - mfp.req.abort(); - } - }; - - $.magnificPopup.registerModule(AJAX_NS, { - - options: { - settings: null, - cursor: 'mfp-ajax-cur', - tError: 'The content could not be loaded.' - }, - - proto: { - initAjax: function() { - mfp.types.push(AJAX_NS); - _ajaxCur = mfp.st.ajax.cursor; - - _mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest); - _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest); - }, - getAjax: function(item) { - - if(_ajaxCur) { - $(document.body).addClass(_ajaxCur); - } - - mfp.updateStatus('loading'); - - var opts = $.extend({ - url: item.src, - success: function(data, textStatus, jqXHR) { - var temp = { - data:data, - xhr:jqXHR - }; - - _mfpTrigger('ParseAjax', temp); - - mfp.appendContent( $(temp.data), AJAX_NS ); - - item.finished = true; - - _removeAjaxCursor(); - - mfp._setFocus(); - - setTimeout(function() { - mfp.wrap.addClass(READY_CLASS); - }, 16); - - mfp.updateStatus('ready'); - - _mfpTrigger('AjaxContentAdded'); - }, - error: function() { - _removeAjaxCursor(); - item.finished = item.loadError = true; - mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src)); - } - }, mfp.st.ajax.settings); - - mfp.req = $.ajax(opts); - - return ''; - } - } - }); - - /*>>ajax*/ - - /*>>image*/ - var _imgInterval, - _getTitle = function(item) { - if(item.data && item.data.title !== undefined) - return item.data.title; - - var src = mfp.st.image.titleSrc; - - if(src) { - if($.isFunction(src)) { - return src.call(mfp, item); - } else if(item.el) { - return item.el.attr(src) || ''; - } - } - return ''; - }; - - $.magnificPopup.registerModule('image', { - - options: { - markup: '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
'+ - '
', - cursor: 'mfp-zoom-out-cur', - titleSrc: 'title', - verticalFit: true, - tError: 'The image could not be loaded.' - }, - - proto: { - initImage: function() { - var imgSt = mfp.st.image, - ns = '.image'; - - mfp.types.push('image'); - - _mfpOn(OPEN_EVENT+ns, function() { - if(mfp.currItem.type === 'image' && imgSt.cursor) { - $(document.body).addClass(imgSt.cursor); - } - }); - - _mfpOn(CLOSE_EVENT+ns, function() { - if(imgSt.cursor) { - $(document.body).removeClass(imgSt.cursor); - } - _window.off('resize' + EVENT_NS); - }); - - _mfpOn('Resize'+ns, mfp.resizeImage); - if(mfp.isLowIE) { - _mfpOn('AfterChange', mfp.resizeImage); - } - }, - resizeImage: function() { - var item = mfp.currItem; - if(!item || !item.img) return; - - if(mfp.st.image.verticalFit) { - var decr = 0; - // fix box-sizing in ie7/8 - if(mfp.isLowIE) { - decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10); - } - item.img.css('max-height', mfp.wH-decr); - } - }, - _onImageHasSize: function(item) { - if(item.img) { - - item.hasSize = true; - - if(_imgInterval) { - clearInterval(_imgInterval); - } - - item.isCheckingImgSize = false; - - _mfpTrigger('ImageHasSize', item); - - if(item.imgHidden) { - if(mfp.content) - mfp.content.removeClass('mfp-loading'); - - item.imgHidden = false; - } - - } - }, - - /** - * Function that loops until the image has size to display elements that rely on it asap - */ - findImageSize: function(item) { - - var counter = 0, - img = item.img[0], - mfpSetInterval = function(delay) { - - if(_imgInterval) { - clearInterval(_imgInterval); - } - // decelerating interval that checks for size of an image - _imgInterval = setInterval(function() { - if(img.naturalWidth > 0) { - mfp._onImageHasSize(item); - return; - } - - if(counter > 200) { - clearInterval(_imgInterval); - } - - counter++; - if(counter === 3) { - mfpSetInterval(10); - } else if(counter === 40) { - mfpSetInterval(50); - } else if(counter === 100) { - mfpSetInterval(500); - } - }, delay); - }; - - mfpSetInterval(1); - }, - - getImage: function(item, template) { - - var guard = 0, - - // image load complete handler - onLoadComplete = function() { - if(item) { - if (item.img[0].complete) { - item.img.off('.mfploader'); - - if(item === mfp.currItem){ - mfp._onImageHasSize(item); - - mfp.updateStatus('ready'); - } - - item.hasSize = true; - item.loaded = true; - - _mfpTrigger('ImageLoadComplete'); - - } - else { - // if image complete check fails 200 times (20 sec), we assume that there was an error. - guard++; - if(guard < 200) { - setTimeout(onLoadComplete,100); - } else { - onLoadError(); - } - } - } - }, - - // image error handler - onLoadError = function() { - if(item) { - item.img.off('.mfploader'); - if(item === mfp.currItem){ - mfp._onImageHasSize(item); - mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); - } - - item.hasSize = true; - item.loaded = true; - item.loadError = true; - } - }, - imgSt = mfp.st.image; - - - var el = template.find('.mfp-img'); - if(el.length) { - var img = document.createElement('img'); - img.className = 'mfp-img'; - if(item.el && item.el.find('img').length) { - img.alt = item.el.find('img').attr('alt'); - } - item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError); - img.src = item.src; - - // without clone() "error" event is not firing when IMG is replaced by new IMG - // TODO: find a way to avoid such cloning - if(el.is('img')) { - item.img = item.img.clone(); - } - - img = item.img[0]; - if(img.naturalWidth > 0) { - item.hasSize = true; - } else if(!img.width) { - item.hasSize = false; - } - } - - mfp._parseMarkup(template, { - title: _getTitle(item), - img_replaceWith: item.img - }, item); - - mfp.resizeImage(); - - if(item.hasSize) { - if(_imgInterval) clearInterval(_imgInterval); - - if(item.loadError) { - template.addClass('mfp-loading'); - mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); - } else { - template.removeClass('mfp-loading'); - mfp.updateStatus('ready'); - } - return template; - } - - mfp.updateStatus('loading'); - item.loading = true; - - if(!item.hasSize) { - item.imgHidden = true; - template.addClass('mfp-loading'); - mfp.findImageSize(item); - } - - return template; - } - } - }); - - /*>>image*/ - - /*>>zoom*/ - var hasMozTransform, - getHasMozTransform = function() { - if(hasMozTransform === undefined) { - hasMozTransform = document.createElement('p').style.MozTransform !== undefined; - } - return hasMozTransform; - }; - - $.magnificPopup.registerModule('zoom', { - - options: { - enabled: false, - easing: 'ease-in-out', - duration: 300, - opener: function(element) { - return element.is('img') ? element : element.find('img'); - } - }, - - proto: { - - initZoom: function() { - var zoomSt = mfp.st.zoom, - ns = '.zoom', - image; - - if(!zoomSt.enabled || !mfp.supportsTransition) { - return; - } - - var duration = zoomSt.duration, - getElToAnimate = function(image) { - var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'), - transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing, - cssObj = { - position: 'fixed', - zIndex: 9999, - left: 0, - top: 0, - '-webkit-backface-visibility': 'hidden' - }, - t = 'transition'; - - cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition; - - newImg.css(cssObj); - return newImg; - }, - showMainContent = function() { - mfp.content.css('visibility', 'visible'); - }, - openTimeout, - animatedImg; - - _mfpOn('BuildControls'+ns, function() { - if(mfp._allowZoom()) { - - clearTimeout(openTimeout); - mfp.content.css('visibility', 'hidden'); - - // Basically, all code below does is clones existing image, puts in on top of the current one and animated it - - image = mfp._getItemToZoom(); - - if(!image) { - showMainContent(); - return; - } - - animatedImg = getElToAnimate(image); - - animatedImg.css( mfp._getOffset() ); - - mfp.wrap.append(animatedImg); - - openTimeout = setTimeout(function() { - animatedImg.css( mfp._getOffset( true ) ); - openTimeout = setTimeout(function() { - - showMainContent(); - - setTimeout(function() { - animatedImg.remove(); - image = animatedImg = null; - _mfpTrigger('ZoomAnimationEnded'); - }, 16); // avoid blink when switching images - - }, duration); // this timeout equals animation duration - - }, 16); // by adding this timeout we avoid short glitch at the beginning of animation - - - // Lots of timeouts... - } - }); - _mfpOn(BEFORE_CLOSE_EVENT+ns, function() { - if(mfp._allowZoom()) { - - clearTimeout(openTimeout); - - mfp.st.removalDelay = duration; - - if(!image) { - image = mfp._getItemToZoom(); - if(!image) { - return; - } - animatedImg = getElToAnimate(image); - } - - animatedImg.css( mfp._getOffset(true) ); - mfp.wrap.append(animatedImg); - mfp.content.css('visibility', 'hidden'); - - setTimeout(function() { - animatedImg.css( mfp._getOffset() ); - }, 16); - } - - }); - - _mfpOn(CLOSE_EVENT+ns, function() { - if(mfp._allowZoom()) { - showMainContent(); - if(animatedImg) { - animatedImg.remove(); - } - image = null; - } - }); - }, - - _allowZoom: function() { - return mfp.currItem.type === 'image'; - }, - - _getItemToZoom: function() { - if(mfp.currItem.hasSize) { - return mfp.currItem.img; - } else { - return false; - } - }, - - // Get element postion relative to viewport - _getOffset: function(isLarge) { - var el; - if(isLarge) { - el = mfp.currItem.img; - } else { - el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem); - } - - var offset = el.offset(); - var paddingTop = parseInt(el.css('padding-top'),10); - var paddingBottom = parseInt(el.css('padding-bottom'),10); - offset.top -= ( $(window).scrollTop() - paddingTop ); - - - /* - - Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa. - - */ - var obj = { - width: el.width(), - // fix Zepto height+padding issue - height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop - }; - - // I hate to do this, but there is no another option - if( getHasMozTransform() ) { - obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)'; - } else { - obj.left = offset.left; - obj.top = offset.top; - } - return obj; - } - - } - }); - - - - /*>>zoom*/ - - /*>>iframe*/ - - var IFRAME_NS = 'iframe', - _emptyPage = '//about:blank', - - _fixIframeBugs = function(isShowing) { - if(mfp.currTemplate[IFRAME_NS]) { - var el = mfp.currTemplate[IFRAME_NS].find('iframe'); - if(el.length) { - // reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug - if(!isShowing) { - el[0].src = _emptyPage; - } - - // IE8 black screen bug fix - if(mfp.isIE8) { - el.css('display', isShowing ? 'block' : 'none'); - } - } - } - }; - - $.magnificPopup.registerModule(IFRAME_NS, { - - options: { - markup: '
'+ - '
'+ - ''+ - '
', - - srcAction: 'iframe_src', - - // we don't care and support only one default type of URL by default - patterns: { - youtube: { - index: 'youtube.com', - id: 'v=', - src: '//www.youtube.com/embed/%id%?autoplay=1' - }, - vimeo: { - index: 'vimeo.com/', - id: '/', - src: '//player.vimeo.com/video/%id%?autoplay=1' - }, - gmaps: { - index: '//maps.google.', - src: '%id%&output=embed' - } - } - }, - - proto: { - initIframe: function() { - mfp.types.push(IFRAME_NS); - - _mfpOn('BeforeChange', function(e, prevType, newType) { - if(prevType !== newType) { - if(prevType === IFRAME_NS) { - _fixIframeBugs(); // iframe if removed - } else if(newType === IFRAME_NS) { - _fixIframeBugs(true); // iframe is showing - } - }// else { - // iframe source is switched, don't do anything - //} - }); - - _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() { - _fixIframeBugs(); - }); - }, - - getIframe: function(item, template) { - var embedSrc = item.src; - var iframeSt = mfp.st.iframe; - - $.each(iframeSt.patterns, function() { - if(embedSrc.indexOf( this.index ) > -1) { - if(this.id) { - if(typeof this.id === 'string') { - embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length); - } else { - embedSrc = this.id.call( this, embedSrc ); - } - } - embedSrc = this.src.replace('%id%', embedSrc ); - return false; // break; - } - }); - - var dataObj = {}; - if(iframeSt.srcAction) { - dataObj[iframeSt.srcAction] = embedSrc; - } - mfp._parseMarkup(template, dataObj, item); - - mfp.updateStatus('ready'); - - return template; - } - } - }); - - - - /*>>iframe*/ - - /*>>gallery*/ - /** - * Get looped index depending on number of slides - */ - var _getLoopedId = function(index) { - var numSlides = mfp.items.length; - if(index > numSlides - 1) { - return index - numSlides; - } else if(index < 0) { - return numSlides + index; - } - return index; - }, - _replaceCurrTotal = function(text, curr, total) { - return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total); - }; - - $.magnificPopup.registerModule('gallery', { - - options: { - enabled: false, - arrowMarkup: '', - preload: [0,2], - navigateByImgClick: true, - arrows: true, - - tPrev: 'Previous (Left arrow key)', - tNext: 'Next (Right arrow key)', - tCounter: '%curr% of %total%' - }, - - proto: { - initGallery: function() { - - var gSt = mfp.st.gallery, - ns = '.mfp-gallery'; - - mfp.direction = true; // true - next, false - prev - - if(!gSt || !gSt.enabled ) return false; - - _wrapClasses += ' mfp-gallery'; - - _mfpOn(OPEN_EVENT+ns, function() { - - if(gSt.navigateByImgClick) { - mfp.wrap.on('click'+ns, '.mfp-img', function() { - if(mfp.items.length > 1) { - mfp.next(); - return false; - } - }); - } - - _document.on('keydown'+ns, function(e) { - if (e.keyCode === 37) { - mfp.prev(); - } else if (e.keyCode === 39) { - mfp.next(); - } - }); - }); - - _mfpOn('UpdateStatus'+ns, function(e, data) { - if(data.text) { - data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length); - } - }); - - _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) { - var l = mfp.items.length; - values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : ''; - }); - - _mfpOn('BuildControls' + ns, function() { - if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) { - var markup = gSt.arrowMarkup, - arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS), - arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS); - - arrowLeft.click(function() { - mfp.prev(); - }); - arrowRight.click(function() { - mfp.next(); - }); - - mfp.container.append(arrowLeft.add(arrowRight)); - } - }); - - _mfpOn(CHANGE_EVENT+ns, function() { - if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout); - - mfp._preloadTimeout = setTimeout(function() { - mfp.preloadNearbyImages(); - mfp._preloadTimeout = null; - }, 16); - }); - - - _mfpOn(CLOSE_EVENT+ns, function() { - _document.off(ns); - mfp.wrap.off('click'+ns); - mfp.arrowRight = mfp.arrowLeft = null; - }); - - }, - next: function() { - mfp.direction = true; - mfp.index = _getLoopedId(mfp.index + 1); - mfp.updateItemHTML(); - }, - prev: function() { - mfp.direction = false; - mfp.index = _getLoopedId(mfp.index - 1); - mfp.updateItemHTML(); - }, - goTo: function(newIndex) { - mfp.direction = (newIndex >= mfp.index); - mfp.index = newIndex; - mfp.updateItemHTML(); - }, - preloadNearbyImages: function() { - var p = mfp.st.gallery.preload, - preloadBefore = Math.min(p[0], mfp.items.length), - preloadAfter = Math.min(p[1], mfp.items.length), - i; - - for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) { - mfp._preloadItem(mfp.index+i); - } - for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) { - mfp._preloadItem(mfp.index-i); - } - }, - _preloadItem: function(index) { - index = _getLoopedId(index); - - if(mfp.items[index].preloaded) { - return; - } - - var item = mfp.items[index]; - if(!item.parsed) { - item = mfp.parseEl( index ); - } - - _mfpTrigger('LazyLoad', item); - - if(item.type === 'image') { - item.img = $('').on('load.mfploader', function() { - item.hasSize = true; - }).on('error.mfploader', function() { - item.hasSize = true; - item.loadError = true; - _mfpTrigger('LazyLoadError', item); - }).attr('src', item.src); - } - - - item.preloaded = true; - } - } - }); - - /*>>gallery*/ - - /*>>retina*/ - - var RETINA_NS = 'retina'; - - $.magnificPopup.registerModule(RETINA_NS, { - options: { - replaceSrc: function(item) { - return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; }); - }, - ratio: 1 // Function or number. Set to 1 to disable. - }, - proto: { - initRetina: function() { - if(window.devicePixelRatio > 1) { - - var st = mfp.st.retina, - ratio = st.ratio; - - ratio = !isNaN(ratio) ? ratio : ratio(); - - if(ratio > 1) { - _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) { - item.img.css({ - 'max-width': item.img[0].naturalWidth / ratio, - 'width': '100%' - }); - }); - _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) { - item.src = st.replaceSrc(item, ratio); - }); - } - } - - } - } - }); - - /*>>retina*/ - _checkInstance(); })); \ No newline at end of file diff --git a/assets/js/plugins/smooth-scroll.js b/assets/js/plugins/smooth-scroll.js deleted file mode 100644 index c4179a7..0000000 --- a/assets/js/plugins/smooth-scroll.js +++ /dev/null @@ -1,650 +0,0 @@ -/*! - * smooth-scroll v16.1.2 - * Animate scrolling to anchor links - * (c) 2020 Chris Ferdinandi - * MIT License - * https://github.com/cferdinandi/smooth-scroll - */ - -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define([], (function () { - return factory(root); - })); - } else if (typeof exports === 'object') { - module.exports = factory(root); - } else { - root.SmoothScroll = factory(root); - } -})(typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : this, (function (window) { - - 'use strict'; - - // - // Default settings - // - - var defaults = { - - // Selectors - ignore: '[data-scroll-ignore]', - header: null, - topOnEmptyHash: true, - - // Speed & Duration - speed: 500, - speedAsDuration: false, - durationMax: null, - durationMin: null, - clip: true, - offset: 0, - - // Easing - easing: 'easeInOutCubic', - customEasing: null, - - // History - updateURL: true, - popstate: true, - - // Custom Events - emitEvents: true - - }; - - - // - // Utility Methods - // - - /** - * Check if browser supports required methods - * @return {Boolean} Returns true if all required methods are supported - */ - var supports = function () { - return ( - 'querySelector' in document && - 'addEventListener' in window && - 'requestAnimationFrame' in window && - 'closest' in window.Element.prototype - ); - }; - - /** - * Merge two or more objects together. - * @param {Object} objects The objects to merge together - * @returns {Object} Merged values of defaults and options - */ - var extend = function () { - var merged = {}; - Array.prototype.forEach.call(arguments, (function (obj) { - for (var key in obj) { - if (!obj.hasOwnProperty(key)) return; - merged[key] = obj[key]; - } - })); - return merged; - }; - - /** - * Check to see if user prefers reduced motion - * @param {Object} settings Script settings - */ - var reduceMotion = function () { - if ('matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches) { - return true; - } - return false; - }; - - /** - * Get the height of an element. - * @param {Node} elem The element to get the height of - * @return {Number} The element's height in pixels - */ - var getHeight = function (elem) { - return parseInt(window.getComputedStyle(elem).height, 10); - }; - - /** - * Escape special characters for use with querySelector - * @author Mathias Bynens - * @link https://github.com/mathiasbynens/CSS.escape - * @param {String} id The anchor ID to escape - */ - var escapeCharacters = function (id) { - - // Remove leading hash - if (id.charAt(0) === '#') { - id = id.substr(1); - } - - var string = String(id); - var length = string.length; - var index = -1; - var codeUnit; - var result = ''; - var firstCodeUnit = string.charCodeAt(0); - while (++index < length) { - codeUnit = string.charCodeAt(index); - // Note: there’s no need to special-case astral symbols, surrogate - // pairs, or lone surrogates. - - // If the character is NULL (U+0000), then throw an - // `InvalidCharacterError` exception and terminate these steps. - if (codeUnit === 0x0000) { - throw new InvalidCharacterError( - 'Invalid character: the input contains U+0000.' - ); - } - - if ( - // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is - // U+007F, […] - (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || - // If the character is the first character and is in the range [0-9] - // (U+0030 to U+0039), […] - (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || - // If the character is the second character and is in the range [0-9] - // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] - ( - index === 1 && - codeUnit >= 0x0030 && codeUnit <= 0x0039 && - firstCodeUnit === 0x002D - ) - ) { - // http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point - result += '\\' + codeUnit.toString(16) + ' '; - continue; - } - - // If the character is not handled by one of the above rules and is - // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or - // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to - // U+005A), or [a-z] (U+0061 to U+007A), […] - if ( - codeUnit >= 0x0080 || - codeUnit === 0x002D || - codeUnit === 0x005F || - codeUnit >= 0x0030 && codeUnit <= 0x0039 || - codeUnit >= 0x0041 && codeUnit <= 0x005A || - codeUnit >= 0x0061 && codeUnit <= 0x007A - ) { - // the character itself - result += string.charAt(index); - continue; - } - - // Otherwise, the escaped character. - // http://dev.w3.org/csswg/cssom/#escape-a-character - result += '\\' + string.charAt(index); - - } - - // Return sanitized hash - return '#' + result; - - }; - - /** - * Calculate the easing pattern - * @link https://gist.github.com/gre/1650294 - * @param {String} type Easing pattern - * @param {Number} time Time animation should take to complete - * @returns {Number} - */ - var easingPattern = function (settings, time) { - var pattern; - - // Default Easing Patterns - if (settings.easing === 'easeInQuad') pattern = time * time; // accelerating from zero velocity - if (settings.easing === 'easeOutQuad') pattern = time * (2 - time); // decelerating to zero velocity - if (settings.easing === 'easeInOutQuad') pattern = time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time; // acceleration until halfway, then deceleration - if (settings.easing === 'easeInCubic') pattern = time * time * time; // accelerating from zero velocity - if (settings.easing === 'easeOutCubic') pattern = (--time) * time * time + 1; // decelerating to zero velocity - if (settings.easing === 'easeInOutCubic') pattern = time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1; // acceleration until halfway, then deceleration - if (settings.easing === 'easeInQuart') pattern = time * time * time * time; // accelerating from zero velocity - if (settings.easing === 'easeOutQuart') pattern = 1 - (--time) * time * time * time; // decelerating to zero velocity - if (settings.easing === 'easeInOutQuart') pattern = time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time; // acceleration until halfway, then deceleration - if (settings.easing === 'easeInQuint') pattern = time * time * time * time * time; // accelerating from zero velocity - if (settings.easing === 'easeOutQuint') pattern = 1 + (--time) * time * time * time * time; // decelerating to zero velocity - if (settings.easing === 'easeInOutQuint') pattern = time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time; // acceleration until halfway, then deceleration - - // Custom Easing Patterns - if (!!settings.customEasing) pattern = settings.customEasing(time); - - return pattern || time; // no easing, no acceleration - }; - - /** - * Determine the document's height - * @returns {Number} - */ - var getDocumentHeight = function () { - return Math.max( - document.body.scrollHeight, document.documentElement.scrollHeight, - document.body.offsetHeight, document.documentElement.offsetHeight, - document.body.clientHeight, document.documentElement.clientHeight - ); - }; - - /** - * Calculate how far to scroll - * Clip support added by robjtede - https://github.com/cferdinandi/smooth-scroll/issues/405 - * @param {Element} anchor The anchor element to scroll to - * @param {Number} headerHeight Height of a fixed header, if any - * @param {Number} offset Number of pixels by which to offset scroll - * @param {Boolean} clip If true, adjust scroll distance to prevent abrupt stops near the bottom of the page - * @returns {Number} - */ - var getEndLocation = function (anchor, headerHeight, offset, clip) { - var location = 0; - if (anchor.offsetParent) { - do { - location += anchor.offsetTop; - anchor = anchor.offsetParent; - } while (anchor); - } - location = Math.max(location - headerHeight - offset, 0); - if (clip) { - location = Math.min(location, getDocumentHeight() - window.innerHeight); - } - return location; - }; - - /** - * Get the height of the fixed header - * @param {Node} header The header - * @return {Number} The height of the header - */ - var getHeaderHeight = function (header) { - return !header ? 0 : (getHeight(header) + header.offsetTop); - }; - - /** - * Calculate the speed to use for the animation - * @param {Number} distance The distance to travel - * @param {Object} settings The plugin settings - * @return {Number} How fast to animate - */ - var getSpeed = function (distance, settings) { - var speed = settings.speedAsDuration ? settings.speed : Math.abs(distance / 1000 * settings.speed); - if (settings.durationMax && speed > settings.durationMax) return settings.durationMax; - if (settings.durationMin && speed < settings.durationMin) return settings.durationMin; - return parseInt(speed, 10); - }; - - var setHistory = function (options) { - - // Make sure this should run - if (!history.replaceState || !options.updateURL || history.state) return; - - // Get the hash to use - var hash = window.location.hash; - hash = hash ? hash : ''; - - // Set a default history - history.replaceState( - { - smoothScroll: JSON.stringify(options), - anchor: hash ? hash : window.pageYOffset - }, - document.title, - hash ? hash : window.location.href - ); - - }; - - /** - * Update the URL - * @param {Node} anchor The anchor that was scrolled to - * @param {Boolean} isNum If true, anchor is a number - * @param {Object} options Settings for Smooth Scroll - */ - var updateURL = function (anchor, isNum, options) { - - // Bail if the anchor is a number - if (isNum) return; - - // Verify that pushState is supported and the updateURL option is enabled - if (!history.pushState || !options.updateURL) return; - - // Update URL - history.pushState( - { - smoothScroll: JSON.stringify(options), - anchor: anchor.id - }, - document.title, - anchor === document.documentElement ? '#top' : '#' + anchor.id - ); - - }; - - /** - * Bring the anchored element into focus - * @param {Node} anchor The anchor element - * @param {Number} endLocation The end location to scroll to - * @param {Boolean} isNum If true, scroll is to a position rather than an element - */ - var adjustFocus = function (anchor, endLocation, isNum) { - - // Is scrolling to top of page, blur - if (anchor === 0) { - document.body.focus(); - } - - // Don't run if scrolling to a number on the page - if (isNum) return; - - // Otherwise, bring anchor element into focus - anchor.focus(); - if (document.activeElement !== anchor) { - anchor.setAttribute('tabindex', '-1'); - anchor.focus(); - anchor.style.outline = 'none'; - } - window.scrollTo(0 , endLocation); - - }; - - /** - * Emit a custom event - * @param {String} type The event type - * @param {Object} options The settings object - * @param {Node} anchor The anchor element - * @param {Node} toggle The toggle element - */ - var emitEvent = function (type, options, anchor, toggle) { - if (!options.emitEvents || typeof window.CustomEvent !== 'function') return; - var event = new CustomEvent(type, { - bubbles: true, - detail: { - anchor: anchor, - toggle: toggle - } - }); - document.dispatchEvent(event); - }; - - - // - // SmoothScroll Constructor - // - - var SmoothScroll = function (selector, options) { - - // - // Variables - // - - var smoothScroll = {}; // Object for public APIs - var settings, anchor, toggle, fixedHeader, eventTimeout, animationInterval; - - - // - // Methods - // - - /** - * Cancel a scroll-in-progress - */ - smoothScroll.cancelScroll = function (noEvent) { - cancelAnimationFrame(animationInterval); - animationInterval = null; - if (noEvent) return; - emitEvent('scrollCancel', settings); - }; - - /** - * Start/stop the scrolling animation - * @param {Node|Number} anchor The element or position to scroll to - * @param {Element} toggle The element that toggled the scroll event - * @param {Object} options - */ - smoothScroll.animateScroll = function (anchor, toggle, options) { - - // Cancel any in progress scrolls - smoothScroll.cancelScroll(); - - // Local settings - var _settings = extend(settings || defaults, options || {}); // Merge user options with defaults - - // Selectors and variables - var isNum = Object.prototype.toString.call(anchor) === '[object Number]' ? true : false; - var anchorElem = isNum || !anchor.tagName ? null : anchor; - if (!isNum && !anchorElem) return; - var startLocation = window.pageYOffset; // Current location on the page - if (_settings.header && !fixedHeader) { - // Get the fixed header if not already set - fixedHeader = document.querySelector(_settings.header); - } - var headerHeight = getHeaderHeight(fixedHeader); - var endLocation = isNum ? anchor : getEndLocation(anchorElem, headerHeight, parseInt((typeof _settings.offset === 'function' ? _settings.offset(anchor, toggle) : _settings.offset), 10), _settings.clip); // Location to scroll to - var distance = endLocation - startLocation; // distance to travel - var documentHeight = getDocumentHeight(); - var timeLapsed = 0; - var speed = getSpeed(distance, _settings); - var start, percentage, position; - - /** - * Stop the scroll animation when it reaches its target (or the bottom/top of page) - * @param {Number} position Current position on the page - * @param {Number} endLocation Scroll to location - * @param {Number} animationInterval How much to scroll on this loop - */ - var stopAnimateScroll = function (position, endLocation) { - - // Get the current location - var currentLocation = window.pageYOffset; - - // Check if the end location has been reached yet (or we've hit the end of the document) - if (position == endLocation || currentLocation == endLocation || ((startLocation < endLocation && window.innerHeight + currentLocation) >= documentHeight)) { - - // Clear the animation timer - smoothScroll.cancelScroll(true); - - // Bring the anchored element into focus - adjustFocus(anchor, endLocation, isNum); - - // Emit a custom event - emitEvent('scrollStop', _settings, anchor, toggle); - - // Reset start - start = null; - animationInterval = null; - - return true; - - } - }; - - /** - * Loop scrolling animation - */ - var loopAnimateScroll = function (timestamp) { - if (!start) { start = timestamp; } - timeLapsed += timestamp - start; - percentage = speed === 0 ? 0 : (timeLapsed / speed); - percentage = (percentage > 1) ? 1 : percentage; - position = startLocation + (distance * easingPattern(_settings, percentage)); - window.scrollTo(0, Math.floor(position)); - if (!stopAnimateScroll(position, endLocation)) { - animationInterval = window.requestAnimationFrame(loopAnimateScroll); - start = timestamp; - } - }; - - /** - * Reset position to fix weird iOS bug - * @link https://github.com/cferdinandi/smooth-scroll/issues/45 - */ - if (window.pageYOffset === 0) { - window.scrollTo(0, 0); - } - - // Update the URL - updateURL(anchor, isNum, _settings); - - // If the user prefers reduced motion, jump to location - if (reduceMotion()) { - window.scrollTo(0, Math.floor(endLocation)); - return; - } - - // Emit a custom event - emitEvent('scrollStart', _settings, anchor, toggle); - - // Start scrolling animation - smoothScroll.cancelScroll(true); - window.requestAnimationFrame(loopAnimateScroll); - - }; - - /** - * If smooth scroll element clicked, animate scroll - */ - var clickHandler = function (event) { - - // Don't run if event was canceled but still bubbled up - // By @mgreter - https://github.com/cferdinandi/smooth-scroll/pull/462/ - if (event.defaultPrevented) return; - - // Don't run if right-click or command/control + click or shift + click - if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey) return; - - // Check if event.target has closest() method - // By @totegi - https://github.com/cferdinandi/smooth-scroll/pull/401/ - if (!('closest' in event.target)) return; - - // Check if a smooth scroll link was clicked - toggle = event.target.closest(selector); - if (!toggle || toggle.tagName.toLowerCase() !== 'a' || event.target.closest(settings.ignore)) return; - - // Only run if link is an anchor and points to the current page - if (toggle.hostname !== window.location.hostname || toggle.pathname !== window.location.pathname || !/#/.test(toggle.href)) return; - - // Get an escaped version of the hash - var hash; - try { - hash = escapeCharacters(decodeURIComponent(toggle.hash)); - } catch(e) { - hash = escapeCharacters(toggle.hash); - } - - // Get the anchored element - var anchor; - if (hash === '#') { - if (!settings.topOnEmptyHash) return; - anchor = document.documentElement; - } else { - anchor = document.querySelector(hash); - } - anchor = !anchor && hash === '#top' ? document.documentElement : anchor; - - // If anchored element exists, scroll to it - if (!anchor) return; - event.preventDefault(); - setHistory(settings); - smoothScroll.animateScroll(anchor, toggle); - - }; - - /** - * Animate scroll on popstate events - */ - var popstateHandler = function (event) { - - // Stop if history.state doesn't exist (ex. if clicking on a broken anchor link). - // fixes `Cannot read property 'smoothScroll' of null` error getting thrown. - if (history.state === null) return; - - // Only run if state is a popstate record for this instantiation - if (!history.state.smoothScroll || history.state.smoothScroll !== JSON.stringify(settings)) return; - - // Only run if state includes an anchor - - // if (!history.state.anchor && history.state.anchor !== 0) return; - - // Get the anchor - var anchor = history.state.anchor; - if (typeof anchor === 'string' && anchor) { - anchor = document.querySelector(escapeCharacters(history.state.anchor)); - if (!anchor) return; - } - - // Animate scroll to anchor link - smoothScroll.animateScroll(anchor, null, {updateURL: false}); - - }; - - /** - * Destroy the current initialization. - */ - smoothScroll.destroy = function () { - - // If plugin isn't already initialized, stop - if (!settings) return; - - // Remove event listeners - document.removeEventListener('click', clickHandler, false); - window.removeEventListener('popstate', popstateHandler, false); - - // Cancel any scrolls-in-progress - smoothScroll.cancelScroll(); - - // Reset variables - settings = null; - anchor = null; - toggle = null; - fixedHeader = null; - eventTimeout = null; - animationInterval = null; - - }; - - /** - * Initialize Smooth Scroll - * @param {Object} options User settings - */ - var init = function () { - - // feature test - if (!supports()) throw 'Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.'; - - // Destroy any existing initializations - smoothScroll.destroy(); - - // Selectors and variables - settings = extend(defaults, options || {}); // Merge user options with defaults - fixedHeader = settings.header ? document.querySelector(settings.header) : null; // Get the fixed header - - // When a toggle is clicked, run the click handler - document.addEventListener('click', clickHandler, false); - - // If updateURL and popState are enabled, listen for pop events - if (settings.updateURL && settings.popstate) { - window.addEventListener('popstate', popstateHandler, false); - } - - }; - - - // - // Initialize plugin - // - - init(); - - - // - // Public APIs - // - - return smoothScroll; - - }; - - return SmoothScroll; - -})); diff --git a/assets/js/vendor/jquery/jquery-3.5.1.js b/assets/js/vendor/jquery/jquery-3.5.1.js deleted file mode 100644 index 5093733..0000000 --- a/assets/js/vendor/jquery/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( "